一款多平台模糊测试工具,用于探测用户态二进制文件、客户端和服务器。
它已在高知名公司和开源项目的 50+ 应用和库 中发现漏洞。
简单设置即可在 Linux、Mac 和 Windows 上开始模糊测试。
Litefuzz 旨在服务于一个目的:在所有主流平台上进行模糊测试和分类,支持 CLI/GUI 应用、网络客户端和服务器,以发现安全相关的漏洞。
它简化了流程,使得在不同平台、多种目标中轻松发现安全漏洞,同时仅做出一些诚实的权衡。
它不是为速度、可扩展性或为了在学术界获奖而构建的。它通过从不同角度应用简单技术来产生结果。对于控制台文件模糊测试,你可能应该直接使用 AFL。它具有卓越的性能、检测能力(以及更快的非检测执行)、扩展性,并且可以从 无中生有 生成 JPEG 图片。对于网络模糊测试,如果你有 PCAP 文件需要重放,mutiny fuzzer 也表现良好,frizzer 看起来也很有前景。但如果你想尝试这个工具,它可以用单一工具跨平台模糊测试这些类型的目标。
./ 给你的目标来一次……轻量模糊测试。``` $ sudo apt install -y latex2rtf
$ ./litefuzz.py -l -c "latex2rtf FUZZ" -i input/tex -o crashes/latex2rtf -n 1000 -z --========================-- --======| litefuzz |======-- --========================--
[STATS] run id: 3516 cmdline: latex2rtf FUZZ crash dir: crashes/latex2rtf input dir: input/tex inputs: 1 iterations: 1000 mutator: random(mutators)
@ 1000/1000 (3 crashes, 127 duplicates, ~0:00:00 remaining)
[RESULTS]
completed (1000) iterations with (3) unique crashes and 127 dups
check crashes/latex2rtf for more details
这是一个简单的本地目标,AFL++ 完全有能力处理,这里仅作为示例快速给出。Litefuzz 的设计初衷更多是用于网络和 GUI 模糊测试,您深入了解后会看到这一点。
## 为什么
是的,又一款模糊测试器,而且它并不完全符合当前的趋势和惯例。为了满足某些需求,我们做出了一些权衡。这些需求包括:一款默认就能在多个平台上工作、既能模糊测试本地目标也能测试网络目标、并且非常易于使用的模糊测试器。并不是要说服任何人什么,但让我们提供一些背景信息。有些目标需要花费大量精力才能将 AFL 等模糊测试器集成到构建链中。这不是问题,因为本模糊测试器不需要插桩,牺牲了插桩带来的精确覆盖率,换取了易用性和可移植性。AFL 也不原生支持网络模糊测试,虽然有些基于它的项目支持,但它们使用起来远非直接简单,通常需要更多的代码修改和 harness 才能工作([Libfuzzer](https://llvm.org/docs/LibFuzzer.html) 的情况类似)。
它不支持并行模糊测试,也不支持像[持久模式](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)那样能带来惊人速度提升的功能,因此它的扩展能力远不及那些具备这些功能的模糊测试器。再次强调,这不是一款最先进的模糊测试器。但它不需要源代码、不需要正确配置构建系统,也不需要特定的操作系统特性。它甚至可以模糊测试某些网络客户端 GUI 和交互式应用程序。它在很大程度上“就地取材”,许多功能(如变异器和最小化)都是从零开始编写的。
它的设计理念是“拿来即用”,并且我们投入了精力来自动化设置和安装其所需的少数依赖项。这款模糊测试器的编写是为了服务于某个目的,即在许多不同的目标场景和环境中提供价值,而最重要的是,所有模糊测试器最终都应该根据这一点来评判:发现漏洞的能力。而且,它**确实发现了**[漏洞](https://github.com/sec-tools/beta/blob/main/README.md#trophies)。它不假设存在目标源代码,因此可以很好地覆盖闭源软件。它只需少量修改就可以作为自动化的一部分运行,但它的设计初衷是让漏洞研究人员觉得有趣易用。不过,将其视为一个研发项目而非一个完全成熟的产品会更有帮助。另外,它没有那种开箱即用就有点问题、或者需要在现代操作系统上花更多功夫才能运行的复杂设置。
它已在 Ubuntu Linux、Mac 和 Windows 上测试通过,并附带了功能齐全的脚本,这些脚本几乎可以为您完成所有设置,以便搭建一个随时可以进行模糊测试的环境。
**设置脚本完成后,只需几分钟即可开始模糊测试大量不同的目标。**
## 工作原理
**Litefuzz 支持三种模式:本地、客户端和服务器。**
本地模式针对本地二进制文件,在 Linux/Mac 上通过子进程启动,并分别在崩溃时自动使用 GDB 和 LLDB 进行分类,在 Windows 上则使用 [WinAppDbg](https://github.com/MarioVilas/winappdbg)。崩溃信息写入本地崩溃目录,并按故障类型(如读/写访问违规或 SIGABRT/SIGSEGV)以及文件哈希值进行排序。在模糊测试过程中,所有独特的崩溃都会被分类,这些数据以及目标输出(如果有)也会被捕获并作为工件放在同一目录中。也可以使用 `--replay` 并提供崩溃文件来重放崩溃。在 `local` 客户端模式下,输入目录应包含服务器问候语、响应或其他客户端在连接服务器时预期的数据。
目前,网络模糊测试只实现了一次“发送”,没有复杂的会话支持。客户端通过命令行启动,其调试方式与文件模糊测试相同。会设置一个监听器来支持这种场景,是的,这很慢,而且几乎算是手工劳动,但它确实有效。如果检测到崩溃,会在 gdb 中重放以获取分类详情。在 `remote` 客户端模式下,工作方式相同,只是没有本地调试/崩溃分类。在 *local* 服务器模式下,它类似于 local 客户端模式;对于 `remote` 服务器模式,它只需连接到指定目标,并发送用户指定的变异后的样本客户端数据作为输入,但只提供简单的“我们还能连接吗?如果不能,则说明上一次发送可能导致了崩溃”这样的分类。
有几个从零编写的变异函数,它们主要进行随机变异,并从 `-i` 标志指定的输入中随机选择。对于文件模糊测试,只需选择本地模式,并传入目标命令行,用 FUZZ 表示应用程序期望文件名解析的位置,例如 `tcpdump -r FUZZ`,同时提供一个包含要变异的“好文件”的输入目录。对于网络客户端模糊测试,与本地模糊测试类似,但还需要通过 `-a` 提供连接细节。如果您想模糊测试服务器,则使用服务器模式,并提供 `protocol://address:port`,就像客户端一样。
它的模糊测试速度取决于目标消费数据并退出的速度,例如大多数 CLI 应用程序的情况,或者取决于您确定的本地执行或网络连接超时所需的时间,这可能慢得多。这里没有花哨的 exec 或内核技巧。当然,如果您编写一个能快速解析输入并退出的 harness,覆盖目标的特定部分,那也会有帮助。但到了那个程度,如果您能如此接近目标,那么您可能更应该使用[持久模式](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)或其他模糊测试器提供的类似功能。
简而言之...
### 它能做什么
- 在 Linux、Windows 和 Mac 上运行,支持 py2/py3
- 模糊测试读取文件/stdin 的 CLI/GUI 二进制文件
- 模糊测试网络客户端和服务器,无论是开源还是专有,支持本地调试或远程调试
- 崩溃的差异分析、最小化、重放、排序和自动分类
- 其他功能,如 TLS 支持、Golang 二进制文件模糊测试以及一些 Mac 专属功能
- 使用多种内置变异器 + pyradamsa(Linux)对输入进行变异
### 它不能做什么
- 原生插桩
- 通过并发任务进行扩展
- 复杂会话模糊测试
- 远程客户端和服务器监控(仅支持基本检查,如能否连接)
## 支持
主要在 **Ubuntu Linux 20.04**(22.04 和 21.04 进行过少量测试)、**Windows 10** 和 **Mac OS 11**(12 进行过少量测试)上进行了测试。该模糊测试器和设置脚本也可能在这些操作系统的略微早期或更新版本上工作,但大部分研究、测试和开发都在这些环境中进行。支持 Python3,并且努力使代码兼容 Python2,因为通过 [WinAppDbg](https://github.com/MarioVilas/winappdbg) 在 Windows 上进行模糊测试需要 Python2。
平台测试主要在基于 Intel 的硬件上进行,但事情似乎在 Apple 的 M1 平台上也能基本工作(明显的例外是 Linux 上的 GDB exploitable 插件可能不受支持,Pyradamsa 也不支持)。setup/ 目录下也有设置脚本,可以自动化大部分或全部任务和依赖项安装。它通常可以在每个平台上模糊测试原生二进制文件,这些文件通常用 C/C++ 编译,但也可以捕获 Golang 二进制文件的崩溃(实验性功能)。
### Python 版本
Linux 和 Mac 支持 Python3,而 Windows 需要 Python2。
为什么 Linux 和 Mac 用 Python3?Pyautogui、Pyradamsa(仅 Linux)、Mac 上更好的 socket 支持。
为什么 Windows 用 Python2?Winappdbg 需要 Python2。
### Linux
使用 GDB 进行调试,使用 [exploitable](https://github.com/jfoote/exploitable) 进行崩溃分类。如果是开源软件,可以用[消毒剂](https://fuzzing-project.org/tutorial2.html)等构建和插桩目标,否则有一些[内存调试器](https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Heap_corruption)可以在运行时加载。
此安装以及 Python 依赖项和其他有用的东西已通过 [setup/linux.sh](https://github.com/sec-tools/litefuzz/blob/main/setup/linux.sh) 实现了自动化。推荐的操作系统是 Ubuntu 20.04,因为大部分测试都在该环境中进行。
### Mac
在 OS X 上,我们使用 lldb 而不是 gdb 进行调试,因为它包含在 XCode 命令行工具中。作为管理员或属于开发者组应该可以使用 lldb,但这个行为可能因环境和版本而异,如果其他方法都失败,您可能需要使用 sudo 权限运行它。
您需要手动做的一件事是关闭 SIP(在恢复模式下,通过 cmd+R 或使用 VMware fusion 技巧)。否则,在 Tim Apple 的操作系统上进行模糊测试时,自动分类会失败。
大部分设置已通过 [setup/mac.sh](https://github.com/sec-tools/litefuzz/blob/main/setup/mac.sh) 脚本自动化,因此您可以直接运行它以快速开始。
### Windows
[WinAppDbg](https://github.com/MarioVilas/winappdbg) 用于在 Windows 上进行调试,但有一点小瑕疵:不支持 stdin 模糊测试。
与其他操作系统的自动设置类似,chocolatey 有助于在 Windows 上自动化软件包安装。以管理员身份在 litefuzz 根目录下运行 [setup/windows.bat](https://github.com/sec-tools/litefuzz/blob/main/setup/windows.bat) 以自动化安装。它将安装调试工具和其他依赖项,使一切顺利运行。
### 目标
这是已经测试过并通常支持的目标类型列表。
* 解析文件格式或 stdin 的本地 CLI/GUI 应用程序
- 支持调试
* 解析服务器响应的本地 CLI/GUI 网络客户端
- 支持 CLI 的调试
- 对 GUI 的调试支持有限
* 解析客户端请求的本地 CLI 网络服务器
- 支持调试(注意:必须能够作为独立可执行文件运行,否则可视为 *remote*)
* 解析客户端请求的本地 GUI 网络服务器
- 理论上支持,未经测试
* 解析服务器响应的远程 CLI/GUI 网络客户端
- 不支持调试
* 解析客户端请求的远程 CLI/GUI 网络服务器
- 不支持调试
- 例外情况是使用 Mac 上的 `attach` 或 `reportcrash` 功能
再次说明,该模糊测试器可以在 Linux、Mac 和 Windows 上运行并支持本地应用程序、客户端和服务器,当然也可以独立于目标平台来模糊测试远程内容。
### 分类
* 解析文件格式或 stdin 的本地 CLI/GUI 应用程序
- 运行应用程序,捕获信号,通过使用触发崩溃的文件在调试器中再次运行来复现
* 解析服务器响应的本地 CLI/GUI 网络客户端
- 运行应用程序,捕获信号,通过使用触发崩溃的文件在调试器中再次运行来复现
* 解析客户端请求的本地 GUI/CLI 网络服务器
- 在调试器中运行应用程序,捕获信号,通过使用触发崩溃的文件在调试器中再次运行来复现