目前正在完全重写此工具。重点将是交互式Linux应用程序,这些程序最初仅从stdin读取输入。尝试使用Shellphish的Driller和Fuzzer功能。
autoPwn当前状态可以有限地执行此操作。只需运行autoPwn ./binary,然后选择“开始”选项。
考虑到这里所有的依赖问题,让autoPwn运行起来最简单的方法是使用Docker构建。注意,你可以移除--security-opt和--cap-add语句,但某些模糊测试功能可能无法正常工作。
$ sudo docker pull bannsec/autoPwn
$ sudo docker run -it -v $PWD:/mount --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ bannsec/autopwn
在Docker构建中,一切应该准备就绪。你可以直接用以下命令启动工具:
$ autoPwn ./file
autoPwn试图简化对项目进行模糊测试的源码编译过程。为此,创建了autoPwnCompile工具。只需将其指向你的源代码,并提供选项,它将输出一个准备好进行模糊测试的可执行文件。
usage: autoPwnCompile [-h] [--file FILE] [--ASAN | --MSAN] [--UBSAN]
[--fuzzer FUZZER]
Compile source to binaries for use in autoPwn.
optional arguments:
-h, --help show this help message and exit
--file FILE Single file to compile.
--ASAN Enable ASAN (default off)
--MSAN Enable MSAN (default off)
--UBSAN Enable UBSAN (default off)
--fuzzer FUZZER (optional) What fuzzer to compile for. Options are:
['AFL']. Default is AFL.
以下内容来自autoPwn的旧版本。
autoPwn这个名称对于一个简单脚本来说有点夸张。在使用模糊测试和afl-fuzz时,我注意到自己会反复执行相同的任务。出于这个考虑,我想创建一个能够完成以下任务的脚本:
到目前为止,该脚本能够完成前5项。第6项还在推测性开发中。它将利用angr符号执行引擎来创建可能的初始路径。届时,该脚本理论上可以完全自动化简单的模糊测试任务。
让我们看一个最近的TUCTF挑战,名为“WoO2”。虽然它不一定能发现所需的漏洞,但它展示了如何使用autoPwn简化路径发现。
以下是对程序的基本遍历:
$ ./e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Welcome! I don't think we're in Kansas anymore.
We're about to head off on an adventure!
Select some animals you want to bring along.
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
1
Choose the type of lion you want:
1: Congo Lion
2: Barbary Lion
1
Enter name of lion:
Test
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
5
让我们创建一个简单的输入测试用例:
$ cat in/1
1
1
Test
5
现在我们可以轻松启动模糊测试:
$ autoPwn
Setting up fuzz configuration
Target Binary (full or relative path): e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Command line args:
Number of cores (default: 8):
Test Case Dir (default: 'in/'):
Test Case Dir (default: 'out/'):
Max memory (default: 200): 4096
Starting fuzz
autoPwn> s
status check tool for afl-fuzz by <[email protected]>
Individual fuzzers
==================
>>> SESSION007 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION000 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION002 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION006 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION004 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION001 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION005 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION003 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
Summary stats
=============
Fuzzers alive : 8
Total run time : 0 days, 0 hours
Total execs : 0 million
Cumulative speed : 8 execs/sec
Pending paths : 8 faves, 8 total
Pending per fuzzer : 1 faves, 1 total (on average)
Crashes found : 0 locally unique
autoPwn> h
autoPwn
s == fuzzer (s)tatus
e == collect (e)xploits
a == collect (a)ll paths
m == (m)inimize corpus
q == (q)uit
这里发生的是,脚本创建了一些默认值(包括确定可用核心数)。我们更改了一个默认值,因为需要在QEMU中运行此程序需要额外的内存。autoPwn创建了一个配置文件,然后将其传递给afl-utils(https://github.com/rc0r/afl-utils)。在配置文件中,它还设置了CPU亲和性,因此模糊测试默认情况下会是优化的。
此时,你的计算机正在忙于进行模糊测试。然而,模糊测试的一个关键方面是语料库最小化。出于这个考虑,autoPwn正在监视afl-fuzz实例,以监控一组变异何时完成。当发生这种情况时,它会停止模糊测试(目前并非最优,但暂时可以接受),最小化语料库,然后重新启动模糊测试。它无需任何人工干预即可完成此操作,因此你可以启动后无需再管。
在某一个时刻,你可能想要查看afl发现了哪些路径。通过执行“a”命令,autoPwn将复制所有已知路径,最小化语料库,然后最小化各个测试用例,并将它们提供在一个输出目录中。