信息安全技术实用教程-第4版---张同光---ISBN-9787121423031---5.4.2实例——缓冲区溢出攻击WindowsXPSP3
https://www.cnblogs.com/ztguang/p/12828764.html
主 编: 张同光
ISBN号: 978-7-121-42303-1 9787121423031
出版日期: 2021-11-20
出版社: 电子工业出版社
页码: 定价:¥69.80元
5.4.2 实例——缓冲区溢出攻击Windows XP SP3
1.实验环境
实验环境如图5.17所示,使用宿主机(Windows 10)、虚拟机KaliLinux(攻击机)、虚拟机WinXPsp3(目标机),KaliLinux和WinXPsp3虚拟机的网络连接方式选择“仅主机(Host-Only)网络”。攻击机(192.168.56.109)对目标机(192.168.56.102)进行缓冲区溢出攻击。
图5.17 实验环境
从宿主机将文件slmail55_4433.exe、ImmunityDebugger_1_85_setup.exe和python-2.7.18.msi拖放到目标机(WinXPsp3)。
在目标机(WinXPsp3)中,双击slmail55_4433.exe安装邮件服务器,如图5.18、图5.19、图5.20所示,安装完成后重启系统。如图5.21所示,在命令行窗口执行命令netstat -nao,发现25、110、180端口处于监听状态,并且在“计算机管理”窗口可以看到邮件相关的三个服务已启动,说明邮件服务器安装成功。在目标机(WinXPsp3)中,接着安装python-2.7.18.msi和ImmunityDebugger_1_85_setup.exe。
从宿主机将文件mona.py拖放或复制到目标机(WinXPsp3)中Immunity Debugger的安装目录C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands里。
邮件服务器SLmail 5.5.0 Mail Server的POP3 PASS命令存在缓冲区溢出漏洞,无需身份验证即可实现远程代码执行。Immunity Debugger是动态调试工具。脚本mona.py用于定位进程模块。
为了本次实验,关闭Windows防火墙。当然,也可以打开防火墙,不过需要在防火墙增例外:pop3(110端口)和SMTP(25端口)。
图5.18 安装邮件服务器 图5.19 安装邮件服务器
图5.20 安装邮件服务器 图5.21 查看开放的端口
2.缓冲区溢出攻击过程
第1步:入侵者测试目标机的25和110端口。
在攻击机(KaliLinux)执行nc 192.168.56.102 25命令和nc 192.168.56.102 110命令测试目标机(WinXPsp3)是否开放25和110端口,结果表示已经开放,如图5.22所示。
图5.22 测试目标机(WinXPsp3)是否开放25和110端口
第2步:入侵者测试目标机缓冲区溢出。
如图5.23所示,在攻击机(KaliLinux)执行telnet 192.168.56.102 100命令,然后输入user命令和pass命令。我们已经知道SLmail 5.5.0中POP3协议的PASS(大小写均可)命令是存在缓存区溢出漏洞的,所以只要在pass后面输入的数据量达到某一个量值时,就会出现缓冲区溢出。
图5.23 手动测试缓冲区溢出漏洞 图5.24 自动化测试
手动测试缓冲区溢出漏洞的效率太低,下面通过Python脚本进行自动化测试。
Python脚本文件(overflow.py)内容如下。如图5.24所示,为overflow.py文件增加可执行权限,然后执行该脚本文件。
#!/usr/bin/python import socket buffer = ["A"] counter = 300 while len(buffer) <= 20: buffer.append("A" * counter) counter += 300 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.56.102', 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() |
现在的问题是:向邮件服务器发送这么多数据后,仍然不知道目标机是否发生了缓冲区溢出。
第3步:判断目标机是否发生缓冲区溢出。
在目标机(WinXPsp3),命令行窗口执行命令netstat -nao,查看在110端口监听的进程的PID(1840,注意,每次重启系统后,该PID的值可能都不一样),如图5.21所示。打开Immunity Debugger,依次选择菜单“File”→“Attach”,如图5.25所示,选择PID为1840(SLmail)的行,然后单击“Attach”按钮。进程默认处于暂停状态(单击“F12”可以暂停进程的执行),为了观察溢出情况,单击开始按钮或“F9”继续执行1840(SLmail)进程,如图5.26所示。
图5.25 Attach进程 图5.26 继续执行进程
在攻击机(KaliLinux),再次执行overflow.py,当发送到3000个A的时候停了下来,如图5.27所示。接下来查看目标机(WinXPsp3)的情况,如图5.28所示,查看Immunity Debugger调试器,发现进程已经崩溃,且EIP寄存器中的内容为AAAA的ASCII码值(41414141,十六进制表示),所以下一条要执行的指令的地址是代码段中位移量为41414141的指令,而这个地址基本不是一条有效指令,因此进程崩溃。
图5.27 执行overflow.py 图5.28 发生缓冲区溢出,进程崩溃
在攻击机(KaliLinux),脚本overflow.py每次递增300个字节向目标机(WinXPsp3)的SLmail发起请求数据,当发送的字节数达到3000时,进程崩溃了,说明PASS指令确实存在缓冲区溢出,接下来要做的事情是得到确切的缓冲区溢出位置,通过缓存区溢出利用EIP寄存器,进而执行Shellcode来进一步控制目标机。
第4步:得到确切缓冲区溢出位置所在的区间。