一个自动检测 AFL crashes 输出的脚本,可自动启动afl-fuzz,可以添加定时任务执行,自动检测 crashes 文件夹中是否有新的崩溃产生并发送通知。如果已经安装 afl-utils,可自动调用 afl-collect 以进一步处理crashes。
sudo apt update && sudo apt install tmux python3 python3-pip -y
pip3 install -r requirements.txt
测试服务器系统版本:Ubuntu 20.04 已安装 AFL++
✗ python3 lazycrasher.py --help
usage: lazycrasher.py [-h] [-a ADD_TASK] [-r RUN] [-t TIME] [-s SOFTWARE] [-l LOG_LEVEL] [-v]
Lazycrasher opts
optional arguments:
-h, --help show this help message and exit
-a ADD_TASK, --add-task ADD_TASK
Add a new fuzz project task
-r RUN, --run RUN Run a fuzz project task
-t TIME, --time TIME Set the time from the current time when the search crash occurs
-s SOFTWARE, --software SOFTWARE
Software to search for fuzz projects, Default: None (Search All fuzz projects)
-l LOG_LEVEL, --log-level LOG_LEVEL
Level of Sending message: [0] Send message when find new crashes(not collect) [Default] | [1] Send message when find useful crashes (after collect)
-v, --verbose Show all debug messages
export CFLAGS="-fsanitize=address"
export CXXFLAGS="-fsanitize=address"
export CC=afl-clang-fast
export CXX=afl-clang-fast++
export AFL_USE_ASAN=1
- 这里要输入的绝对路径加参数信息就是 afl-fuzz 命令 -- 后面的那一部分
$ python3 lazycrasher.py -a gpac
[+] Please input the fuzz target program absolute path with args:
/home/fuzz/FuzzProjects/202307/gpac/bin/gcc/MP4Box -info @@
[+] Add task gpac successfully! Please add the fuzz input to /home/fuzz/slackOFFuzz/tasks/gpac/input
mv poc /home/fuzz/slackOFFuzz/tasks/gpac/input
$ python3 lazycrasher.py -r gpac
[+] Start fuzzing..., Please use `tmux a -t fuzz_gpac` to attach the tmux session.
tmux a -t fuzz_gpac
如果没有问题,那么可以 Ctrl+b d 退出 tmux 会话,开启 crontab 计划任务进行监听,当发现有新的 crash 出现时发送通知
$ crontab -e
# 7-22点之间每隔两个小时执行一次脚本
0 7-22/2 * * * /home/fuzz/slackOFFuzz/start.sh 120
说明一下: 定时任务在添加后不会立即执行, 而是根据配置的时间去间隔执行, 所以检测crashes也不是实时的
AFL input & output 文件夹结构:
AFL_Fuzz_Datas(tasks)
├── vim
│ ├── input
│ ├── output
│ ├── fuzzer01
│ ├── crashes
│ ├── fuzzer02
│ ├── collections
│ ├── README.txt (copy from fuzzer*/crashes/README.txt)
├── gpac
│ ├── input
│ ├── output
会在指定的 FuzzProjectDataPath 目录下创建任务文件夹,当用户将种子传入指定的input文件夹后,脚本可通过在 tmux 中创建 afl 任务启动 fuzz (采用并行模式, 创建三个afl-fuzz进程)
crashes 路径: <AFL_Fuzz_Datas>/<Project_name>/output/<fuzzer01>/crashes/
脚本执行后,它将会扫描 crashes 目录,当检测到有新的 crash 产生时进行下一步操作
如果 afl-collect
可用 (已安装 afl-utils ), 那么执行 afl-collect
用于收集和处理crashes
将会执行以下命令:
$ afl-collect -j 8 -e gdb_script -r -rr <AFL_Fuzz_Datas>/<Project_name>/output <AFL_Fuzz_Datas>/<Project_name>/collections -- <target> --target-opts
注意: 这里是写死了用 8 个核心去跑的
使用 collect 后的 crashes 运行程序,获取 ASAN 的 SUMMARY 输出信息,根据行号信息剔除重复项(保留无法获取 ASAN Summary的crashes), 并进行重命名便于人工进行下一步分析 (poc1/poc2/...)
使用 Bark 、钉钉机器人、邮箱 发送通知
Service:
消息推送相关配置修改:
- 编辑 message.py 文件,自行添加 token 等信息
- 编辑 lazycrasher.py 文件,自行选择启用 Bark/钉钉机器人/Email
## lazycrasher.py:13
# Message Send Service
Bark_msg_enabled = True
Ding_msg_enabled = False
Email_msg_enabled = False
- 改用 logging 打印日志
- 推送消息添加ASAN输出内容详情
- 调用GDB对其他crashes进行分析
- 使用
afl-tmin
最小化 crash - 自动生成 Issue 的提交信息
- 自动识别漏洞类型(CWE)
- 2023-07-27: 调用tmux执行afl-fuzz时如果报错直接打印出报错信息,然后销毁tmux会话
- 2023-07-25: 能够继续执行停止的fuzz任务
- 2023-07-19: 修复先前collect的poc会被删掉的bug
- 2023-07-15: 改为自动调用afl-fuzz,且保存到tmux会话
- 2022-11-02: 添加对collections内的crashes去重操作, 修复一些小bug