OD: File Vulnerabilities & Protocols & Fuzz
IE、Office 等软件有个共同点,即用文件作为程序的主要输入,但攻击者往往会挑战程序员的假定和假设。
文件格式 Fuzz 就是利用畸形文件测试软件的稳健性,其流程一般包括:
* 以一个正常文件作为模板,按规则产生一批畸形文件
* 将畸形文件逐一送往软件进行解析,并监视异常
* 记录错误信息,如寄存器、栈状态
* 进一步分析日志等异常信息,鉴定漏洞和利用性
Blind Fuzz
即盲测,在随机位置插入随机数据产生畸形文件。
现代软件往往使用非常复杂的私有数据结构,如 PPT、word、excel、mp3、rmvb、pdf、jpeg、zip、加壳 PE。数据结构越复杂,解析逻辑越复杂,就越容易出现漏洞。
复杂的数据结构通常具备以下特征:
* 有一批预定义的静态数据,如 magic、cmd id 等
* 数据结构的内容可以动态改变
* 数据结构之间嵌套
* 数据中存在多种数据关系(sizeof、point to、reference of、CRC)
* 有意义的数据被编码或压缩,甚至用另一种文件格式存储,被挖掘出越来越多的漏洞
对于采用复杂数据结构的文件,Blind Fuzz 暴露出不足:测试用例缺少针对性,产生大量无效用例,难以发现复杂解析器的深层逻辑漏洞。
Smart Fuzz
针对 Blind Fuzz 的不足,Smart Fuzz 被越来越多地提出和应用。Smart Fuzz 有三个特征:面向逻辑、面向数据类型、基于样本。
面向逻辑,测试前明确要测试的目标是解析文件的程序逻辑,确定测试用例所试探的是哪一层解析逻辑,即明确“深度”以及畸形数据的“粒度”,这样在生成畸形数据时可以具有针对性的仅仅改动样本文件的特定位置,尽量不破坏其他数据的依赖关系。
面向数据类型,能够识别不同的类型,并且能够针对目标数据类型按照不同规则来生成畸形数据,可以生成算术类型 hex ascii unicode raw、指针型、字符串型、特殊字符型。这种方法产生的畸形数据通常都有效,能够大大减少无效用例。
基于样本:每次都从样本模板小幅度变异生成新的测试样本。但不能测试样本文件中没有包含的数据结构,所以需要有能包含所有数据结构的样本。
这三种 Fuzz 特性并不是相互独立的,可以同时使用。好的 Smart Fuzz 工具中,三种特性都会包含。
文件 Fuzz 工具 Peach 介绍
Peach 是用 Python 写的开源工具,支持基于生长(用随机或启发性的数据来填充给定的数据模型)和基于变异的两种文件生成方式。
Debug 系统需要安装 WinDbg,Debug 协议需要安装 Wireshark 或者 Winpcap。
Peach 有 EXE 和 Python 源码两种版本,可以跨平台。Peach 使用 XML 来定义数据结构,可以定义数据之间的依存关系如校验值等。
书中有个用 Peach 来 Fuzz PNG 格式文件的例子,可以参考。
010 脚本解析复杂文件
010 Editor 是一款非常强大的文本 / Hex 编辑器,包括文件解析、计算器、文件比较等功能。
010 Editor 真正强大之处在于文件解析功能,其官网提供了针对多种文件格式(avi bmp png exe 等)的解析脚本。脚本编写使用类似 C/C++ 的语法,灵活度很高。
书中有一个利用 010 Editor 触发 GdiPlus.dll 在处理 IHDR 时的整数溢出漏洞,造成拒绝服务攻击(CPU 100%)。(CVE-2006-7210?)
PPT 文件解析
Office 系列软件使用的文件格式可以分为两个系列:
* Office ~Office :使用基于二进制的文件格式,文件名后缀为doc、ppt、xls等
* Office2003及更高版本:使用基于XML的文件格式,文件名后缀为docx、pptx、xlsx等
这里主要讨论二进制 PPT 文件格式。
测试深度 |
解析逻辑 |
数据粒度 |
Fuzz 方法 |
Level1 |
OLE2 解析器 |
离散分布的 512 字节数据段 |
修改 OLE 文件头、FAT 区块、目录区块等位置的数据结构 |
Level2 |
PPT 记录解析器 |
流和信息库 |
修改流中的数据,破坏记录头和数据的关系 |
Level3 |
PPT 对象创建器 |
原子和容器 |
用负载替换原子数据 |
Level4 |
PPT 对象内部逻辑 |
原子记录内部的 integer、bool、string 等数据 |
用相关的负载集修改字节数据 |
PPT 的有效数据被组织在基于 OLE2 的二进制文件中。OLE2 文件把数据组织成流(Stream)进行存储。数据流在逻辑上连续存储,在硬盘上则离散存储。如果直接用十六进制编辑器打开一个 OLE2 文件,将会看到许多大小为 512 字节的离散的数据块,并且在文件的开头有一个存储了这些数据块索引的 FAT 表。OLE2 的 FAT 表跟 FAT32 文件系统的索引很相似。(书的附录有 OLE2 的 010 Editor 脚本)

PPT 的有效数据存储在 OLE2 的 stream 中,通常一个 PPT 文件包括以下几种 stream:
数据流 |
说明 |
Current User |
最近打开演示文档的用户信息 |
PowerPoint Document |
文档中的数据信息 |
Pictures(Optional) |
文档中的图像信息 |
Summary Information |
文档中的一些统计信息 |
Document Summary Information(Optional) |
文档中的一些统计信息 |
PowerPoint Document 数据流中包含了我们感兴趣的大部分信息,如 font、color、text、position 等数据结构。下面着重讨论 PowerPoint Document 数据流的解析。
PowerPoint Document 数据流中,数据以若干个"记录(Record)"的形式存储。每个记录都包含一个 8 字节的 header,根据 header 的不同,记录又可分为容器(Container)和原子(Atom)两种类型。其中,容器可以包含原子和其他容器,而原子则包含了 PowerPoint 对象的真正数据。
微软已经公布了 PPT 文件中所有记录(record)的格式说明,这就不难从 OLE2.bt 解析出的数据流中进一步解析出所有 PPT 的原子和容器结构。如果动手编程,不难发现这实际上是一个树的遍历问题。在随书资料中给出了一个简单的 010 解析脚本 ppt_parse.bt。执行ppt_parse.bt脚本,即可得到PPT的解析结果。
FTP Fuzzing
书中介绍了一款 infigo ftpstress fuzzer,配置选项很多,fuzz FTP 时可作首选。
SMTP、POP3、IMAP4、路径回溯、XSS
书中针对以上几个协议/主题都有 Fuzz 例子,总结经验如下:
* Python 测试确实方便,对于很多协议都有封闭包,非重点的地方直接使用包,需要自定义的地方(如匿名登录 POP3)稍修改即可
* 测试时要细致,不留死角。例如路径回溯,传入服务器等程序的参数中、客户端的内存中(直接调试修改)都可以作文章
OD: File Vulnerabilities & Protocols & Fuzz的更多相关文章
- OD: ActiveX Vulnerabilities
通过一个精心构造的页面 exploit 第三方软件中的 ActiveX 已经成为一种惯用攻击手段,众多知名软件公司都曾被发现其注册的 ActiveX 中存在严重的缓冲区溢出漏洞,一个被广泛使用的第三方 ...
- OD: Kernel Vulnerabilities Analyze
内核漏洞大多出没于 ring3 到 ring0 的交互中.从 ring3 进入 ring0 的通道,以及操作系统提供的 API 都有可能存在漏洞.例如:驱动程序中 IoControl 的处理函数,SS ...
- OD: Kernel Vulnerabilities
内核漏洞概述 内核漏洞的分类 运行在 Ring0 上的操作系统内核.设备驱动.第三方驱动能共享同一个虚拟地址空间,可以完全访问系统空间的所有内存,而不像用户态进程那样拥有独立私有的内存空间.由于内核程 ...
- Trivial File Transfer Protocol (TFTP)
Assignment 2The Trivial File Transfer Protocol (TFTP) is an Internet software utility fortransferrin ...
- od源代码
```/* od -- dump files in octal and other formats Copyright (C) 92, 1995-2002 Free Software Foundati ...
- PatentTips – EMC Virtual File System
BACKGROUND OF THE INVENTION 1. Field of the Invention The present invention generally relates to net ...
- Extension of write anywhere file system layout
A file system layout apportions an underlying physical volume into one or more virtual volumes (vvol ...
- 使用sublime编写c/c++ 总结
大块头IDE Visual studio太大了,记事本也能写代码但无疑是装逼过分了.写一些轻量级的c/c++代码使用sublime来写是个很好的选择. 三步走: 编译器(win下安装了vs就使用cl, ...
- minicom 使用教程
因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择.目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB#. minicom,tkterm都是linux下应用比 ...
随机推荐
- underscorejs-where学习
2.7 where 2.7.1 语法: _.where(list, predicate) 2.7.2 说明: 对list集合的每个对象依次与predicate对象进行匹配,返回一个数组(数组为匹配成功 ...
- Linux下Openfire相关安装和配置
记录下来,方便下次再用时从头查找资料 小京东ecshop中的通讯有用到openfire,Window下配置安装很简单,直接下载exe文件安装就行,而linux下要麻烦一点.安装后的配置下面会细说: 一 ...
- jQuery获取JSON格式数据方法
getJSON方法: jQuery.getJSON(url,data,success(data,status,xhr)) $("button").click(function(){ ...
- jquery easy ui 学习 (9)Pagination in TreeGrid 分页
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- codeforces 305E Playing with String
刚开始你只有一个字符串每次能选择一个有的字符串s,找到i,满足s[i - 1] = s[i + 1],将其分裂成3 个字符串s[1 ·· i - 1]; s[i]; s[i + 1 ·· |s|] ...
- Forms & HTML 组件 - laravelcollective/html
简书链接 :Forms & HTML 组件 - laravelcollective/html 安装 方法一: composer require laravelcollective/html 方 ...
- Skynet:特性收集
基于云风的 blog,收集 skynet 的特性以便将来在代码中一一验证. “ ... ” 部分节选自云风的 BLOG. 1. 基于 Erlang-Actor 模式的 C 实现 “把一个符合规范的 C ...
- java的占位符
java占位符的类型: 常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.fo ...
- 调用API函数,在窗口非客户区绘图(通过GetWindowDC获得整个窗口的DC,就可以随意作画了)
http://hi.baidu.com/3582077/item/77d3c1ff60f9fa5ec9f33754 调用API函数,在窗口非客户区绘图 GDI+的Graphics类里有个FromHdc ...
- VS2013下的Nmake编译链接成win XP的可执行程序
nmake下没有指定toolset=vc120_xp等类似物.但是,可以指定Link.exe的链接参数,指定子系统就可以了,/SUBSYSTEM:[WINDOWS | CONSOLE],5.01 5. ...