what the fuzz一个分布式的、代码覆盖率引导的、跨平台的基于快照的模糊测试器,专为攻击运行在Microsoft Windows和Linux用户模式(实验性!)上的用户模式或内核模式目标而设计。
what the fuzz(简称 wtf)是一个分布式的、代码覆盖率引导的、可定制的、跨平台的基于快照的模糊测试器,专为攻击运行在Microsoft Windows或Linux(实验性,参见 linux_mode)上的用户模式或内核模式目标而设计。目标的执行可以在带有 bochscpu 的模拟器内进行(最慢,最精确),在使用 Windows Hypervisor Platform APIs 的 Windows VM 内,或在使用 KVM APIs 的 Linux VM 内(最快)。
它在广泛的软件中发现了内存损坏漏洞:IDA Pro,一款流行的 AAA游戏,Windows内核,Microsoft RDP客户端,NVIDIA GPU显示驱动程序 等。
编译后的二进制文件可以从 CI artifacts 或 Releases 部分获取,适用于Windows和Linux。
如果你想了解更多关于它的历史或如何在真实目标上使用它,建议阅读以下文章以入门 🔥
尝试这些功能的最佳方式是使用 fuzzer_hevd / fuzzer_tlv_server 模块。你可以下载 target-hevd.7z / target-tlv_server.7z 存档并将其解压到 targets/ 目录中。这些存档包含每个目标预期的目录树:
inputs 是存放输入测试用例的文件夹,outputs 是存放当前最小集文件的文件夹,coverage 是存放 .cov 文件的文件夹,crashes 是存放崩溃文件的文件夹,state 是存放内存转储(mem.dmp)、CPU状态(regs.json)以及符号存储(symbol-store.json)的文件夹。符号存储是一个简单的JSON文件,在Linux系统上用于指定断点位置,因为这些平台不支持符号/dbgeng。wtf 在每次在Windows上运行目标时会在运行时生成此文件。以下假设你已经下载了最新版本附带的 target-hevd.7z 文件,并将其解压到你的 wtf 克隆的 targets 目录中。你应该有 wtf/targets/hevd,其中包含 inputs / outputs 等目录。
服务器本质上是大脑,负责跟踪所有状态:聚合的代码覆盖率、语料库,它生成测试用例并将其分发给客户端。
以下是启动本地服务器节点的方法:```text wtf.exe master --name hevd --max_len=1028 --runs=10000000
`max_len` 选项用于限制生成的测试用例的大小,`runs` 指定生成的测试用例数量,`address` 定义 **wtf** 需要监听的地址,`target` 是包含我们上述目录树结构的目录(用户也可以选择使用 `--input` / `--output` / `--crashes` 覆盖这些目录),`name` 指定你的模糊测试模块名称,以便主控节点在你定义了生成器函数时调用它。
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/4a03fc75eed3ed5a92f7f10def697dbf220ae36b0701f05b37759eb432fc0fd9.webp">
</p>
### 模糊测试节点
客户端节点运行由服务器生成并分发的测试用例,并将结果(代码覆盖率、结果等)反馈给服务器。
以下是启动一个使用 *bochscpu* 后端的客户端节点的方法:```text
wtf.exe fuzz --name hevd --limit 10000000
fuzz子命令需要与name选项一起使用,以指定要使用的fuzzer模块,backend用于指定执行后端,limit用于指定每个测试用例最多执行的指令数(根据后端的不同,该选项的含义有所不同)。
如果您想要运行一个测试用例(或包含多个测试用例的文件夹),可以使用run子命令。
以下是运行crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0测试用例的方法:```
wtf.exe run --name hevd --limit 10000000 --input crashes\crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/49b3ca8582d6314724e5615c687472499d5f8f41d04c9543c0a6a070c51f56f8.webp">
</p>
### 精简语料库
要精简语料库,你需要使用一个服务器节点和尽可能多的客户端节点,就像进行模糊测试任务一样。只需将 `runs` 选项设置为 0 即可。
以下是将 `outputs` 中的语料库精简到 `minset` 目录的方法(同时展示了如何覆盖 `inputs` 和 `outputs` 目录):```
wtf.exe master --name hevd --max_len=1028 --runs=0 --inputs=outputs --outputs=minset
在执行后端中进行内省的主要机制是生成执行跟踪。bochscpu 是执行此操作最快的后端,因为在其他后端退出VMX模式的代价非常高。
以下是针对测试用例 crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0 生成执行跟踪的方法:```
wtf.exe run --name hevd --limit 10000000 --input crashes\crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0 --trace-type=rip
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/340b4b251e378eaf21c6f5ffdd4f013bd2cef89f23a604cffd0ebf897d27c71f.webp">
</p>
要符号化执行轨迹,应使用 [symbolizer-rs](https://github.com/0vercl0k/symbolizer-rs)。以下是如何符号化上述生成的 `crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0.trace` 执行轨迹:```
symbolizer-rs.exe --trace crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0.rip.trace
如果你发现自己需要更多的上下文感知能力,bochscpu 后端允许你生成可加载到 Tenet 追踪探索器中的执行追踪。下文中,我从 memmove 中的一个崩溃开始,回溯以找出源指针的来源(用户模式!):```
wtf.exe run --name hevd --limit 10000000 --input crashes\crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0 --trace-type=tenet
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/34df2f5ca8f378db664d3f01bcbefdd43409e300d256d50e3f4f630eb06cc7be.webp">
</p>
### 生成代码覆盖率追踪
要生成代码覆盖率追踪,您只需使用 `run` 子命令并带上 `--trace-type=cov` 选项。
以下是您如何为 `minset` 文件夹内的所有文件生成代码覆盖率追踪,并将它们存储在 `coverage-traces` 文件夹中的方法:```
wtf.exe run --name hevd --input minset --trace-path=coverage-traces --trace-type=cov
这些追踪结果无法直接加载到 lighthouse 中,因为它们尚未被符号化。
以下是你如何对 coverage-traces 文件夹内的所有文件进行符号化,并将结果写入 coverage-traces-symbolized:```
symbolizer-rs.exe --trace coverage-traces -o coverage-traces-symbolized --style modoff
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/8a3c3ca18571abef16a9f87f736fe4d52ac102f41095eab4db32533cb5b198b4.webp">
</p>
最后,你可以在 [lighthouse](https://github.com/gaasedelen/lighthouse) 中加载这些文件:
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/35d9c25c3d26abf5761fec9e7848ba09d090c7aab32322a740732d82e85964e8.webp">
</p>
此外,如果你不关心单独的代码覆盖率,master 分支维护了一个 `coverage.cov` 文件,其中包含了已被执行的唯一聚合代码覆盖率。这使得在模糊测试期间快速检查全局代码覆盖率变得非常容易。
## 它是如何工作的?
**wtf** 通过 *执行后端* 运行用户态和内核态,并依赖用户在目标中插入测试用例。与其他传统的模糊测试工具不同,**wtf** 并不承担大部分繁重的工作;用户需要自己完成。用户需要非常了解被测试目标,并且接入一个新目标是一个需要时间的迭代过程。不过,如果你准备好进行黑客操作,它提供了很大的灵活性 :)
接入目标的通常工作流程如下: