[原创]利用sulley framework进行简单的漏洞挖掘
发表于:
2008-12-19 12:03
16449
[原创]利用sulley framework进行简单的漏洞挖掘
利用sulley framework进行简单的漏洞挖掘
首先介绍sulley的目录结构,这对理解sulley框架有很大的帮助,这里列出几处,可能有所纰漏,大家还是参考使用说明
首先,在sulley这个大的目录下分布的几个文件夹,他们分别是
\archived_fuzzies 存放完成的Fuzz示例和session生成的数据
\audits 存放已经完成PCAPs ,crashbins, code coverage和生成的分析图表
\docs 相关的信息参考以及API reference
\requests 已经写好的数据格式文件,包括http ftp 等
\sully Fuzzing的主框架,无需修改
\Legos 用户定义综合的原始数据,有microsoft rpc …
\Pgraph python的图表库
\utils 各种帮助库文件
\__init__.py 初始化一些基本的信息
\blocks.py "数据块"定义文件
\predrpc.py 客户端和服务端类,用来在不同的模块及主程序间通信
\primitives.py 原始数据生成模块,定义了包括静态数据 随机数据 字符串 整数等数据结构
\session.py 功能性提供建立和执行会话模块
\sex.py 用户异常处理类
\utils 许多独立的功能
crashbin_explorer.py 用做随后分析.crashbin的信息
pcap_cleaner.py 分析网络数据的模块信息
\network_monitor.py 网络控制模块
\process_monitor.py 进程控制模块
\vmcontrol.py PedRPC-driven 虚拟机控制模块
\unit_test.py 单元测试
那么依照一个简单的例子,一步一步地研究这些模块的功能和相互的联系
Fuzzing对象:FTP服务器,存在漏洞的War-ftp
环境:host:windows xpsp2,虚拟机(这里没有使用虚拟机)
工具:sulley framework + ollydbg
首先了解要fuzzing的对象,对fuzzing对象协议的熟悉程度对fuzzing的结果有很大影响
FTP的配置就无需多说,21端口,若干FTP命令,因为我对python不是很熟悉,就只能简单构造一些用来fuzz数据
创建一个FTP.py的文件,内容如下
# ftp.py 2008-12-17
# we use this moduie to generate fuzzing data
#
from sulley import *
#########################################################
s_initialize("War-FTP")
s_group("verbs",values=["USER","PASSWORD"])
if s_block_start("body",group = "verbs"):
#以verbs形成报文的头
s_delim(" ")
s_string("A"*1000)
s_static("\r")
s_block_end()
#上面的代码片断形成一个如 "USER AAAAAAA...\r"\"PASSWORD AAAAAAAA...."的数据报文,
s_initialize()等函数在sulley\__init__.py模块中定义,是作者自己写的形成请求数据的函数
s_delim(" ")加入一个空格分隔符
s_string("A"*1000),由1000个A组成的字符串
s_static("\r"),回车字符
将ftp.py文件放入/requests目录下,作为fuzzing的数据模块调用,读者可以自行扩展,这样就粗糙的完成了构造fuzzing数据的工作.
第二步,按照自己的要求完成一个会话,命名为example.py
#sulley module test
#example.py
from sulley import *
#from primitives import *
from requests import ftp
def bind(target):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(target)
s.send("USER anonymous\n")
s.recv(buff,100)
s.send("anonymous\n")
def do_fuzz():
sess = sessions.session(session_filename ="tmp.log")
target = sessions.target("192.168.15.22",21)
#procmon used
target.procmon = pedrpc.client("192.168.15.22",26002)
target.procmon_options = \
{
"proc_name":"War-ftpd.exe"
}
sess.add_target(target)
#sess.pre_send = bind
sess.connect(s_get("War-FTP"))
sess.fuzz()
print "done fuzzing..."
if 1:
do_fuzz()
解释围绕do_fuzz()主体函数,首先建立一个会话,session.session(),将会话信息指定存在tmp.log中,会话的目标是192.168.15.22,端口22
下面是使用procmon监控fuzzing的过程,并通过26002端口建立起监控程序和客户程序的会话,所以procmon_options是必须指定的,然后将目标添加到
会话中.如果在发送fuzzing数据之前,需要预先建立连接,就使用sess.pre_send = bind,预先建立连接。
sess.connect(s_get("War-FTP")),s_get()函数将返回预先构造"War-FTP"数据块的内容,通过connect连接。
马上就可以开始了么?不,还要等一下。不要忘记我们的procmon还没有准备好,也就是监控程序。
在命令行下启动,process_monitor.py -c audits\war-ftp.crashbin -p war-ftpd.exe
-c audits\war-ftp.crashbin 需要指定fuzzing结果存放的文件
-p war-ftpd.exe 监控的进程名
运行结果:
E:\Hack_tools\FUZZTOOL\Fuzz_FrameWork\sulley>process_monitor.py -c audits\warftp
.crashbin -p war-ftpd.exe
[10:51.29] Process Monitor PED-RPC server initialized:
[10:51.29] crash file: audits\warftp.crashbin
[10:51.29] # records: 1
[10:51.29] proc name: war-ftpd.exe
[10:51.29] log level: 1
[10:51.29] awaiting requests...
运行我们建立好的example.py
E:\Hack_tools\FUZZTOOL\Fuzz_FrameWork\sulley>example.py
[10:53.43] current fuzz path: -> War-FTP
[10:53.43] fuzzed 0 of 2244 total cases
[10:53.43] fuzzing 4 of 2244
[10:53.45] xmitting: [1.4]
[10:53.46] fuzzing 5 of 2244
[10:53.46] xmitting: [1.5]
[10:53.54] procmon detected access violation on test case #5
[10:53.54] primitive lacks a name, type: delim, default value:
[10:53.54] [INVALID]:41414141 Unable to disassemble at 41414141 from thread 1500
caused access violation
[10:53.54] restarting target process
监控程序窗口出现连接的信息,说明已经开始工作了
10:53.43] updating target process name to 'War-ftpd.exe'
10:53.43] debugger thread-1229655223 looking for process name: War-ftpd.exe
10:53.43] debugger thread-1229655223 found match on pid 3676
10:53.54] debugger thread-1229655223 caught access violation: '[INVALID]:414141
1 Unable to disassemble at 41414141 from thread 1500 caused access violation'
10:53.54] debugger thread-1229655223 exiting
10:53.54] starting target process
查看新生成的warftp.crashbin文件,忘记使用什么模块了?它是utils\crashbin_explorer.py,到此结束
剩下的工作就...捡0day么,当然没有这么简单了。选取这个简单的例子只是不想在我们开始的时候就失去了乐趣。fuzzing的关键在与你fuzzing数据是否构造的好,还有就是你对fuzzing对象协议了解的程度,sulley仅仅提供一个良好的平台,大部分的工作是要靠平时的积累。
总结:
1. 在很多地方需要改进,比如数据生成。更好方法是架设虚拟机,使用虚拟机环境来完成
2. 在进行fuzzing时,总是出现假死,这里请高手指点一二
3. 个人并不喜欢用fuzzing的方法,网上利用sulley进行挖掘的人很少,资料也是寥寥无几,写一点简单的东西,权做引玉之砖
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)