漏洞挖掘技术简介
漏洞挖掘技术概述
Fuzz测试是一种特殊的黑盒测试。可以把fuzz测试理解为一种能自动进行“rough attack”尝试的工具。Fuzz测试往往能触发一个缓冲区溢出漏洞,但是不能实现有效的exp。
动态测试技术
SPIKE简介
SPIKE是一款非常著名的ProtocokFuzz(针对网络协议的模糊测试工具)
它引入了基于数据块的Fuzz理论。
struct spike *our_spike;
our_spike = new_spike();
setspike(our_spike);//设置本上下文环境spike为our_spike
s_init_fuzzing();//初始化fuzzing字符串
s_resetfuzzvariable();//重置fuzzing变量
while(!s_didlastvariable()) {//循环直到最后一个fuzzing变量
s_resetfuzzstring();//重置fuzzing字符串
while(!s_didlastfuzzstring()){//循环直到最后一个fuzzing字符串
spike_clear();
s_setfirstvariable();//从第一个变量开始
/*构造Fuzzing数据*/
s_string_variables('&',"/uid=bob&passwd=bob");//以&字符为分割符,将两处的bob设置为fuzzing变量
//或用以下方式实现同样效果
s_string("/uid=");
s_string_variable("bob");
s_string("&passwd=");
s_string_variable("bob");
/*获取Fuzzing数据*/
s_get_databuf();
/*利用Fuzzing数据进行测试
*do_something();
*/
s_incrementfuzzstring();//fuzzing字符串+1
}
s_incrementfuzzvariable();//fuzzing变量+1
}
spike_free(our_spike);
new_spike()函数生成SPIKE结构体并进行一个简单的初始化
setspike(our_spike)指明当前使用哪个结构体
s_string()函数用于以字符串形式向SPIKE结构体的缓冲区添加数据。
s_print_buffer()函数用于以16进制形式输出当前缓冲区的数据。
在SPIKE中定义block,使用s_block_start()和s_block_end()两个函数来定义一个数据块。
s_block_start("main_block");
s_string("cmd_main");
s_binary_block_size_intel_word(“main_block”);
s_block_start("sub_block1");
s_string("cmd_sub1");
s_binary_block_size_intel_word(“sub_block1”);
s_binary("9090909090909090");
s_block_end("sub_block1");
s_block_start("sub_block2");
s_string("cmd_sub2");
s_binary_block_size_intel_word(“sub_block2”);
s_binary("44444444");
s_block_end("sub_block2");
s_block_end("main_block");
结果:
Datasize=48
Start buffer:
63 6d 64 5f 6d 61 69 6e
30 00 00 00 63 6d 64 5f
73 75 62 31 14 00 00 00
90 90 90 90 90 90 90 90
63 6d 64 5f 73 75 62 32
10 00 00 00 44 44 44 44
End buffer:
s_binary_block_size_intel_word(blockname)会自动计算block的size。按照大端方式存储(书上说是大端,也就是高字节在低地址 0x1234在内存中是1234和我们正常读的顺序差不多,但是intel应该是小端存储 这里我没做实验不太了解)
SPIKE实验
实验步骤
1.编写spk脚本
使用命令generic_send_tcp 10.1.1.101 9999 trun.spk 0 0
参数用法
前面的是从第几个var开始也就是s_string_variables占的地方,后面是迭代的开始STR,这个应该是内置有迭代的内容,0为你自己设定的初始值。
文件类型漏洞挖掘 Smart Fuzz
Smart Fuzz概述
文件格式Fuzz的基本办法
不管 IE 还是 Office,都有一个共同点,就是用文件作为程序的主要输入。从本质上讲,这些软件都是按照事先约定好的数据结构对文件中不同的数据域进行解析,以决定用什么颜色、在什么位置显示这些数据。
文件格式 Fuzz(File Fuzz)就是利用 “畸形文件” 测试软件鲁棒性的方法。
File Fuzz 工具的工作流程大体如下:
- 以正常的文件模板为基础,按照一定规则生成一批畸形文件
- 将畸形文件逐一送入软件进行解析,并监视软件是否会抛出异常
- 记录软件产生的错误星系,如寄存器状态、栈状态等
- 用日志或其他 UI 形式向测试人员展示异常信息,以进一步鉴定这些错误是否能被利用
Blind Fuzz 就是 “盲测”,也即在随机位置插入随机的数据以生成畸形文件。现代软件往往使用非常复杂的数据结构,而数据结构越复杂,解析逻辑越复杂,就越容易出现漏洞。复杂的数据结构有以下特征:
- 拥有一批预定义的静态数据,如 magic、cmd id 等
- 数据结构的内容是可以动态改变的
- 数据结构之间是嵌套的
- 数据中存在多种数据关系(size of, point to, reference of, CRC)
- 有意义的数据被编码或压缩,甚至用另一种文件形式来存储。
对于复杂数据结构的复杂文件进行漏洞挖掘,若用 Blind Fuzz,则产生测试用例的策略缺少针对性,生成大量无效测试用例,难以发现复杂解析器深层逻辑的漏洞等。
Smart Fuzz 的特征:
- 面向逻辑(Logic Oriented Fuzzing):目标是解析文件的程序逻辑。即明确测试 “深度” 以及畸形数据的测试 “粒度”。
- 面向数据类型测试(Data Type Oriented Fuzzing)
- 算术型,以 HEX、ASCII、Unicode、Raw 格式存在的各种数值
- 指针型,Null 指针、合法/非法的内存指针等
- 字符串型,超长字符串、缺少终止符 (0x00) 的字符串等
- 特殊字符,#,@,*,<,>,/,,../等
- 基于样本(Sample Based Fuzzing):首先构造合法的样本文件(模板文件),然后以这个文件为模板,每次只改动小部分数据和逻辑来生成畸形文件,这也叫做变异(Mutation)
用Peach挖掘文件漏洞
这里的实验书上的样例有些过时,并且环境要求苛刻所以我并没有照书上进行完整的实验。
peach下载最后更新时间2020年。
<?xml version="1.0" encoding="utf-8"?>
<Peach >
<Include ns="default" src="file:defaults.xml" />
<DataModel name="HelloWorldTemplate">
<String value="Hello Wrold!" />
</DataModel>
<StateModel name="State" initialState="State1">
<State name="State1">
<Action type="output">
<DataModel ref="HelloWorldTemplate"/>
</Action>
</State>
</StateModel>
<Test name="HelloWorldTest">
<StateModel ref="State"/>
<Publisher class="stdout.stdput"/>
</Test>
<Run name="DefaultRun">
<Test ref="HelloWorldTest" />
</Run>
</Peach>
错误代码如上。
可见run标签已经不再使用了。
所以要完整的学习Peach使用请找官方文档。
FTP的漏洞挖掘
FTP协议简介
FTP服务全称为文件传输协议(File Transfer Protocol。其工作模式为C/S模式。FTP协议默认情况下工作在21号端口。
具体过程如下:
- 建立TCP链接
- 客户端向FTP服务端发送USER命令标识身份。服务器要求客户端输入密码
- 客户端发送PASS命令,同时发送密码
- 服务端通过验证
- 客户端开始利用其它FTP协议命令进行文件擦走
- 结束此次链接,使用QUIT命令退出
漏洞挖掘手记1:DOS
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
客户端操作系统 | Windows xp | |
服务器端操作系统 | Windows xp | |
软件使用 | FTPStress Fuzzer 1.0 Quick Easy FTP Server 3.1 |
实验过程
如上设置好FTPFuzz,随后开启Quick FTP Server。
用OD attachFTPServer,随后开启FTPFuzz。
结果如上EAX被.?..覆盖出现了读内存错误。
漏洞为Quick FTP Server3.1的拒绝服务漏洞,LIST命令后的用户数据如果长度超过232同时字符以?结尾程序就会崩溃。
漏洞挖掘手记2:访问权限
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
客户端操作系统 | Windows xp | |
服务器端操作系统 | Windows xp | |
软件使用 | CompleteFTP Server 3.3.0 |
实验过程
存在路径回溯漏洞
EMail的漏洞挖掘
挖掘SMTP漏洞
SMPT协议简介
SMTP的全称为简单邮件传输协议。使用25端口与邮件服务器进行通信。
具体过程如下:
- 建立TCP链接
- 客户端向服务器发送HELO命令标识邮件用户自己的身份,然后客户端发送MAIL命令。
- 服务端以OK作为相应,表示准备接受。
- 客户端发送RCPT命令
- 服务器表示是否愿意为收件人接收邮件。
- 协商结束,发送邮件,用命令DATA发送输入内容
- 结束此次发送,QUIT命令退出
文章评论