漏洞挖掘方法
1. 概述
1.1. 图灵机停机问题
程序存在不可计算性,因此理论上无法彻底消灭软件中存在的缺陷(Bug和漏洞)。
1.2. 白盒测试:源代码审计
可利用以下工具进行源代码审计:
- Fortify:在编译阶段扫描若干种安全风险
- Rough Auditing Tool for Security:用于分析C/C++语言的语法树,寻找存在潜在安全问题的函数调用
- Bugs Errors And Mistakes:由IBM研究院研发,使用数据流分析的方法分析源代码的所有可执行路径,以检测代码中潜在的bug
- SLAM:检测驱动中的bug
- Flaw Finder:用Python语言开发的代码分析工具
- Prexis:可以审计多种语言的源代码,审计的漏洞类型超过30种
- Coverity:提高软件质量的源代码静态分析工具
1.3. 黑盒测试:Fuzz
Fuzz使用带有攻击性的畸形数据来触发各种类型的漏洞(不能exploit),可使用以下工具:
- SPIKE:针对网络协议的模糊测试工具,使用了基于数据块的Fuzz理论
- beSTORM:利用了模糊测试技术来实现针对网络协议的安全测试
2. 文件类型漏洞挖掘
File Fuzz会构造畸形文件来对Office等以文件作为主要输入的软件(按照事先约定好的数据结构对文件中不同的数据域进行解析)进行测试。其大概流程如下:
- 以一个正常的文件模板为基础,按照一定规则产生一批畸形文件
- 将畸形文件送入软件进行解析,并监视软件是否会抛出异常
- 记录软件产生的错误信息,如寄存器状态、栈状态等,并进一步鉴定这些错误是否能被利用
2.1. Blind Fuzz与Smart Fuzz
Blind Fuzz(盲测)是在随机位置插入随机的数据以生成畸形文件,其效率较为低下。相比较之下Smart Fuzz效率较高,其包含三种工作模式(三种工作模式可以共存):面向逻辑、面向数据类型和基于样本:
- 面向逻辑:复杂文件格式往往要经过多层解析。对测试目标层针对性地生成畸形数据,不破坏其他数据依赖关系,使得畸形数据能够完整地传递到目标层,不会在上层解析中被破坏
- 面向数据类型:针对不同的目标,生成不同数据类型的数据进行测试。通常包括以下几种类型:
- 算术型:HEX、ASCII、Unicode、Raw
- 指针型:Null 指针、合法/非法的内存指针
- 字符串型:超长字符串、缺少终止符(0x00)的字符串等
- 特殊字符:#, @, ‘, <, >, /, , ../ 等
- 基于样本:在合法的模板文件(为了提高测试质量,包含的数据结构应该尽量齐全)的基础上,改动小部分数据和逻辑来生成畸形文件
2.2. 工具
- Peach:支持基于生长(随机或启发性数据填充模型)和基于变异(基于给定正常样本修改)的文件Fuzz,该工具使用XML语言来定义数据结构
- 010 Editor:文本/十六进制编辑器,可以进行文件解析、计算器、文件比较,可以自己编写文件解析插件脚本
3. 其它类型漏洞发掘
- FTP Fuzz
- Email Fuzz
- 溢出漏洞
- URL中的路径回溯(类似于任意文件读取)
- 内存中的路径回溯
- XSS
- ActiveX控件(ActiveX控件用于丰富html的功能)Fuzz
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 凌虚的博客!