首页
社区
课程
招聘
[原创]利用sulley framework进行简单的漏洞挖掘
发表于: 2008-12-19 12:03 16499

[原创]利用sulley framework进行简单的漏洞挖掘

2008-12-19 12:03
16499

利用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进行挖掘的人很少,资料也是寥寥无几,写一点简单的东西,权做引玉之砖


[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hyq
2
楼主行文思路相当清晰。
确实单纯的fuzz时代已经过去了,逆向能力,看代码能力,非常重要
2008-12-23 15:08
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好文,收下,谢谢楼主
2008-12-23 17:13
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
希望楼主能提供更多的sulley框架的资料
2009-4-30 15:12
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
按着楼主的资料再现了漏洞挖掘过程,非常感谢
2009-5-11 14:59
0
雪    币: 267
活跃值: (24)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
学习下,希望可以多发一些这方面的知识!
2009-11-21 17:11
0
雪    币: 13
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
C:\crack>python process_monitor.py -c c:\warftpd.crash -p war-ftpd.exe[04:30.36] Process Monitor PED-RPC server initialized:
[04:30.36]       crash file:  c:\warftpd.crash
[04:30.36]       # records:   0
[04:30.36]       proc name:   war-ftpd.exe
[04:30.36]       log level:   1
[04:30.36] awaiting requests...

process_monitor 26002端口 正在监听

python 部分代码:
target         = sessions.target("192.168.2.101", 21)
target.netmon  = pedrpc.client("192.168.2.101", 26001)
target.procmon = pedrpc.client("192.168.2.101", 26002)
结果:
[04:23.20] current fuzz path: __ROOT_NODE__ -> __ROOT_NODE__ -> __ROOT_NODE__ -> user
[04:23.20] fuzzed 0 of 6726 total cases
[04:23.20] fuzzing 4 of 1121
[04:23.20] xmitting: [1.1]
[04:23.20] xmitting: [1.1]
[04:23.20] xmitting: [1.1]
[04:23.20] xmitting: [1.1]
PED-RPC> unable to connect to server 192.168.2.101:26002
是不是必须要用虚拟机啊。也就是说ftp服务器,process_monitor,network_monitor都要在虚拟机上? 我全部是在本地测试的。由于没有安装虚拟机,没有测试。
2011-11-23 17:08
0
游客
登录 | 注册 方可回帖
返回
//