SULLEY安装与使用
0x00 原理
Sulley适合于网络协议的fuzzing,通过分析网络协议的交互过程,编写python脚本,定制协议报文的格式,大量发送变异报文,对目标进行模糊测试。模糊测试的效率取决于对测试协议的了解与深入分析。
0x01 安装
安装指导请参见https://github.com/OpenRCE/sulley/wiki/Windows-Installation#
安装环境:win7 + python2.7.10
安装指导中,大部分步骤都能顺利进行,这里对里面使用到的库及安装过程中遇到的一些问题进行说明,其他按指导中进行即可。
MinGW |
Windows下对linux下工具的支持,这里主要对编译器gcc等 |
Git |
Github工具,为了下载安装其他工具与库 |
Pydbg |
Python写的调试器工具 |
Libdasm |
反汇编库 |
Sulley |
Sulley主程序 |
Pcapy |
Python通过pcapy调用winpcap的接口 |
Winpcap dev kit |
编译pcapy所需要的头文件与lib文件 |
Winpcap |
Windows下的抓包工具,安装wireshark会默认安装 |
Impacket |
提供访问网络数据包的类 |
依赖关系:sulley中有两个重要的监控程序process_monitor.py与network_monitor.py
process_monitor.py依赖于pydbg与libdasm
network_monitor.py依赖于pcapy与impacket、winpcap
libdasm与pcapy安装需要依赖于MinGW下的编译器。
可能遇到的问题:
- Libdasm的编译
指定MinGW为编译器(可能会遇到版本问题)来解决
安装Microsoft Visual C++ Compiler Package for Python 2.7来解决
直接网上下载编译好的pydasm.pyd放到对应的目录中
从安装指导来看,最主要的就是site-packages下有pydasm.pyd文件,所以可以直接从网上下载该文件放到对应目录下。
2. Pcapy的编译
如果指定MinGW安装遇到编译问题,可以安装Microsoft Visual C++ Compiler Package for Python 2.7, 然后通过pip install pcapy进行安装。(pip 工具也需要安装的,网上搜索一下即可)。 找不到头文件需要指定Winpcap dev kit的include与lib路径,或者将里面的文件拷贝到python对应的文件夹下。
验证:process_monitor.py与network_monitor.py能正常运行
0x02 编写测试脚本,开始fuzzing
编写测试脚本:
from sulley import * def get_greeting_msg(sock): greet_message = sock.recv(10000) #sessions.session.log("Greeting Message -->%s" % get_greeting_msg, 2) def callback(sessions, node, edge, sock): #sessions.session.log("Data sent -->%s" % node.render(), 2) pass #通过分析协议交互报文,编写报文格式 s_initialize("helo") if s_block_start("helo"): s_static("helo") s_delim(" ") s_static("test.com") s_static("\r\n") s_block_end() s_initialize("ehlo") if s_block_start("ehlo"): s_static("ehlo") s_delim(" ") s_random("xxx.com", 5, 10) s_static("\r\n") s_block_end() s_initialize("mail from") if s_block_start("mail from"): s_static("mail from: ") s_delim("") s_delim("<") s_static("haha@ims.com") s_delim(">") s_static("\r\n") s_block_end() s_initialize("rcpt to") if s_block_start("rcpt to"): s_static("RCPT TO") s_delim(":") s_static("alice@test.com") s_static("\r\n") s_block_end() s_initialize("pre_data") if s_block_start("pre_data"): s_static("DATA\r\n") s_block_end() s_initialize("data_content") if s_block_start("data_content"): s_static("Receive:") s_string("Whatever") s_static("\r\n") s_static("Subject:") s_string("GOGOGOA"*2) s_static("\r\n") s_static("\r\n") s_string("haha") s_static("\r\n.\r\n") s_block_end() #构建session,指定目标IP与端口,发送报文开始fuzzing sess = sessions.session(log_level=100) target = sessions.target("192.168.1.115",25) sess.add_target(target) sess.connect(sess.root, s_get("helo"), callback) sess.connect(sess.root, s_get("ehlo"), callback) sess.connect(s_get("helo"), s_get("mail from"), callback) sess.connect(s_get("ehlo"), s_get("mail from"), callback) sess.connect(s_get("mail from"), s_get("rcpt to"), callback) sess.connect(s_get("rcpt to"), s_get("pre_data"), callback) sess.connect(s_get("pre_data"), s_get("data_content"), callback) sess.fuzz()
执行程序:
0x03 总结
Sulley模糊测试的效率取决于对测试协议的了解程度,需要对测试协议有深入的了解,编写对应的报文格式。 sulley作者已经停止开发,有一些版本问题,网上的一些示例可能在调用方式上有一些改变,对python熟悉可以查看sulley的源代码调整函数的调用。