路由器固件逆向&&AFL 入门

0x01 提权固件内容

binwalk

binwalk -e xxxx

提权文件系统

ubireader_extract_files xxx 

会生成一个名叫 ubifs-root 的文件夹里面还存放这一个文件,这个文件就是ubi镜像的最终文件系统。

firmware-mod-kit 安装

sudo yum install git build-essential zlib1g-dev liblzma-dev python-magic
这里我只装了liblzma-dev 因为后面配置的时候报了这个错
用的命令是
sudo apt-get install liblzma-dev

git clone https://github/mirror/firmware-mod-kit.git
cd firmware-mod-kit/src
./configure
make

说明

extract-firmware.sh 解包固件
build-firmware.sh 重新封包
check_for_upgrade.sh 检查更新
unsquashfs_all.sh 解包提取出来的squashfs文件

将用binwalk解压出来的文件夹中的120200.squashfs文件,转存到firmware-mod-kit文件夹,然后执行

./unsquashfs_all.sh 192728.squashfs 

就可以得到文件系统

以 DVRF 中的第一个漏洞程序 stack_bof_01 为例,在实战 MIPS 架构中栈溢出的简单利用。

0x02 Openwrt介绍

百度一下:OpenWrt 可以被描述为一个嵌入式的 Linux 发行版,(主流路由器固件有 dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的、静态的系统。OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。对于开发人员,OpenWrt 是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。

openwrt在开发的时候 基本上是MVC模式,既 Model,View,Controller
Controller目录中存放的就是所有走web访问的入口文件
Model中放的就是一些所需要的模块
View就是html模板。

0x03 寻找漏洞

使用 AFL 进行模糊测试

0x01 AFL 安装与使用

tar -xvf  压缩文件 -C  /指定目录
make 
make install
./afl-fuzz -i testcase_dir -o findings_dir -- \
     /path/to/tested/program [...program's cmdline...]

若程序从文件中获取输入,则在命令行部分输入 “@@” 字符作为占位符,afl-fuzz 会自动用输入文件名将其替换。

AFL的基本原理和工作流程;
如何选择Fuzzing的⽬标?
如何获得初始语料库?
如何使用AFL构建程序?
AFL的各种执行方式;
AFL状态窗口中各部分代表了什么意义?

afl 安装文件作用:

• afl-gcc 和afl-g++ 分别对应的是gcc 和g++ 的封装
• afl-clang 和afl-clang++ 分别对应clang 的c 和c++ 编译器封装À。
• afl-fuzz 是AFL 的主体,用于对目标程序进行fuzz。
• afl-analyze 可以对用例进行分析,通过分析给定的用例,看能否发现用例中有意义的字段。
• afl-qemu-trace 用于qemu-mode,默认不安装,需要手工执行qemu-mode 的编译脚本进行编译,后面会介绍。
• afl-plot 生成测试任务的状态图
• afl-tmin 和afl-cmin 对用例进行简化
• afl-whatsup 用于查看fuzz 任务的状态
• afl-gotcpu 用于查看当前CPU 状态
• afl-showmap 用于对单个用例进行执行路径跟踪
布局从左到右,从上到下,依次是:
① Process timing:Fuzzer运行时长、以及距离最近发现的路径、崩溃和挂起经过了多长时间。
② Overall results:Fuzzer当前状态的概述。
③ Cycle progress:我们输入队列的距离。
④ Map coverage:目标二进制文件中的插桩代码所观察到覆盖范围的细节。
⑤ Stage progress:Fuzzer现在正在执行的文件变异策略、执行次数和执行速度。
⑥ Findings in depth:有关我们找到的执行路径,异常和挂起数量的信息。
⑦ Fuzzing strategy yields:关于突变策略产生的最新行为和结果的详细信息。
⑧ Path geometry:有关Fuzzer找到的执行路径的信息。
⑨ CPU load:CPU利用率
putput:
queue文件夹包含每个独特执行路径的测试用例,以及用户给出的所有起始文件。
hang文件夹包含导致测试程序超时的测试用例
crash文件夹包含导致测试程序接收致命信号的测试用例

一些参考资料:
台湾国立交通大学的一个大佬写的入门教程http://spencerwuwu-blog.logdown/posts/1366733-a-simple-guide-of-afl-fuzzer
看雪一篇结合gdb分析crash的关于afl的教程https://bbs.pediy/thread-249179.htm
多种afl工具使用及多种情况下afl处理的文章https://0x00sec/t/fuzzing-projects-with-american-fuzzy-lop-afl/6498
使用afl来fuzz binutils的例子 https://www.evilsocket/2015/04/30/fuzzing-with-afl-fuzz-a-practical-example-afl-vs-binutils/
使用afl挖imagemagick的cve的文章https://github/lcatro/Fuzzing-ImageMagick/blob/master/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Fuzzing%E6%8C%96%E6%8E%98ImageMagick%E7%9A%84%E6%BC%8F%E6%B4%9E.md
天融信阿尔法实验介绍afl的文章https://www.freebuf/articles/system/191536.html

0x02 模糊测试

有源码

tips:

尽量使测试用例足够小
确保测试对象足够简单
只给需要测的库进行打桩因为AFL
并行

test.c

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <signal.h> 

int vuln(char *str)
{
   
   
    int len = strlen(str);
    if(str[0]