Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1244325
  • 博文数量: 164
  • 博客积分: 2993
  • 博客等级: 少校
  • 技术积分: 1718
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 11:42
文章分类

全部博文(164)

文章存档

2014年(1)

2013年(36)

2012年(90)

2011年(37)

分类: 网络与安全

2011-06-24 11:35:50

标 题: 【原创】利用sulley framework进行简单的漏洞挖掘
作 者: scuxiao
时 间: 2008-12-19,12:03
链 接: http://bbs.pediy.com/showthread.php?t=78978

利用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  功能性提供建立和执行会话模块
  \***.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进行挖掘的人很少,资料也是寥寥无几,写一点简单的东西,权做引玉之砖
阅读(4969) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:sulley 网络协议测试文档

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册