路由器漏洞挖掘工具总结
路由器漏洞挖掘工具总结
固件的解包与封装
firmware-mod-kit
基于binwalk的解打包⼯具
安装⽅法:
⾸先安装依赖
1 | sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic |
安装工具
1 | git clone https: / github.com/mirror/firmware-mod-kit.git |
解包固件
将固件 firmware.bin 解包到 working_directory/ 下
1 | ./extract_firmware.sh firmware.bin working_directory/ |
重新打包固件
将新⽣成的固件放到 output_directory 下
1 | ./build_firmware.sh output_directory/ working_directory/ |
基于文件系统的信息收集
trommel
trommel是一款使用python语言编写的开源工具,用于对固件的文件系统进行分析,筛选嵌入式设备文件,以识别潜在的脆弱指标。该工具不需要安装
使用方式
1 | python3 trommel.py -p 文件系统 -o 提取结果文件前缀 -d 提取结果存放目录 |
例如对DIR822路由器进行分析
1 | iot@research:~/tools/trommel$ python3 trommel.py -p ~/Desktop/fmk/rootfs/ -o DIR -d ~/Desktop/ |
分析结果会在我们给定的文件夹下面,一些文件的hash值
1 | __ __| _ \ _ \ \ | \ | ____| | |
含有某些关键字的文件
1 | __ __| _ \ _ \ \ | \ | ____| | |
Firmwalker
Firmwalker 是⼀个⽤于扫描固件⽂件系统的简单脚本。它搜索敏感信息,如硬编码的密
码、私钥、证书等,并检查潜在的安全问题。它将在提取或安装的固件⽂件系统中搜索感兴
趣的内容,例如:
etc/shadow 和 etc/passwd
列出 etc/ssl ⽬录
搜索 SSL 相关⽂件,例如 .pem、.crt 等。
搜索配置⽂件
寻找脚本⽂件
搜索其他 .bin ⽂件
查找关键字,例如管理员、密码、远程等。
搜索 IoT 设备上使⽤的常⻅ Web 服务器
搜索常⻅的⼆进制⽂件,例如 ssh、tftp、dropbear 等。
搜索 URL、电⼦邮件地址和 IP 地址
使⽤ Shodan CLI 调⽤ Shodan API 的实验性⽀持
使⽤⽅法如下,最后会⾃动⽣成⼀个 firmwalker.txt
1 | ./firmwalker.sh 固件路径 |
分析DIR822的结果
1 | iot@research:~/tools/firmwalker$ ./firmwalker.sh ~/Desktop/fmk/rootfs/ ./ruset.txt |
动态分析固件
FirmAE
Clone FirmAE
1 | git clone --recursive https://github.com/pr0v3rbs/FirmAE |
运行download.sh
1 | ./download.sh |
运行 install.sh
1 | ./install.sh |
firmae 的使用 首先执行初始化脚本
1 | ./init.sh |
检查仿真条件 -c 参数
1 | sudo ./run.sh -c <brand> <firmware> |
firmware 填写固件名称 brand 是开发板名称,可以随便填,不影响正常使用
完成run.sh -c
后,可debug固件,这样后面进行 debug 时,等待的时间会大大减少
-a 使用分析模式
1 | sudo ./run.sh -a <brand> <firmware> |
运行模式,有利于进行网络测试
1 | sudo ./run.sh -r <brand> <firmware> |
user-mode 调试固件
1 | sudo ./run.sh -d <brand> <firmware> |
system-mode 调试固件
1 | sudo ./run.sh -b <brand> <firmware> |
使用 FirmAE 对D-Link路由器设备漏洞进行仿真
第一步,首先检查仿真条件 使用 -c 参数
1 | iot@research:~/tools/FirmAE$ sudo ./run.sh -c DIR822 ~/Desktop/DIR822A1_FW103WWb03.bin |
第二步用运行模式启动 使用-r 参数
1 | iot@research:~/tools/FirmAE$ sudo ./run.sh -r DIR822 ~/Desktop/DIR822A1_FW103WWb03.bin |
firmware-analysis-toolkit
Firmware Analysis Toolkit(简称FAT)是一种用于分析嵌入式设备固件的开源工具套件。它旨在帮助安全研究人员和逆向工程师分析和理解嵌入式设备的固件,以发现漏洞、安全问题和潜在的攻击面。以下是Firmware Analysis Toolkit(FAT)的一些主要特点和功能:
- 固件提取:FAT允许您从嵌入式设备中提取固件,无论它们是存储在闪存芯片、固态硬盘还是其他媒体上。这是进行后续分析的第一步。
- 固件分析:FAT提供了各种分析工具,以帮助您深入研究固件的内部结构和组件。这包括文件系统解析、二进制文件分析、文件提取等。
- 字符串提取:该工具还能够从固件中提取字符串,以帮助您识别固件中可能包含的敏感信息或有用的配置参数。
- 固件比较:FAT允许您比较不同版本的固件,以查找更改和差异。这对于检测漏洞修复或新功能添加等方面很有用。
- 漏洞分析:FAT包括一些用于静态和动态漏洞分析的工具,以帮助您发现潜在的安全问题。
- 攻击面评估:该工具套件还提供了一些功能,用于评估嵌入式设备的潜在攻击面,帮助您识别可能的攻击矢量。
- 插件系统:FAT支持插件系统,这意味着您可以编写自定义插件来扩展工具的功能,以满足特定的需求。
首先需要安装 firmware-analysis-toolkit,安装完后目录结构如下
qemu
QEMU(Quick Emulator)是一款开源的虚拟化工具和模拟器,用于在不同架构和操作系统之间进行硬件级别的虚拟化和模拟。它具有多种用途,包括虚拟机管理、嵌入式系统开发、操作系统开发和测试等
他支持多平台支持、硬件级模拟、嵌入式开发、虚拟机管理、快照和还原、高度可定制、性能优化
QEMU在虚拟化和模拟领域非常有用,它是一个强大的工具,可用于多种开发、测试和虚拟化场景。它还是一个开源项目,因此可以根据需要进行自定义和扩展
qemu-user
QEMU-User(简称QEMU-U)是QEMU项目的一部分,它提供了一种用户态的CPU模拟,允许在一个架构上运行的二进制程序在不同架构的系统上执行。具体来说,QEMU-User允许将一个CPU架构的二进制程序在另一个CPU架构的系统上运行,而不需要完全模拟整个虚拟机。
如果仅仅只有单个 elf 静态链接文件,那么可以采用局部仿真的方法进行启动 例如 arm 架构的可以直接使用如下命令,然后监听 1234 端口,等待 gdb连接
1 | qemu-arm -g 12345 ./elf_fie |
这样就可以开启一个 12345 端口的 server,然后可以在另一个终端中使用 gdb 的 target remote
命令进行连接,然后调试
如果是动态链接的二进制文件,可以指定共享库的位置,可以使用qemu-user的-L
选项指定当前目录,然后将动态库存放于当目录的 lib 子目录中
1 | qemu-arm -L ./ -g 12345 ./elf_fie |
ARM 32位:
1 | qemu-arm -L /path/to/lib -g 12345 /path/to/your/arm_binary |
ARM 64位 (AArch64):
1 | qemu-aarch64 -L /path/to/lib -g 12345 /path/to/your/aarch64_binary |
MIPS 32位:
1 | qemu-mips -L /path/to/lib -g 12345 /path/to/your/mips_binary |
MIPS 64位:
1 | qemu-mips64 -L /path/to/lib -g 12345 /path/to/your/mips64_binary |
在这个命令中:
qemu-arm
是用于启动QEMU ARM用户模式的命令。-L /path/to/lib
指定根文件系统的路径,这是需要的,因为用户模式QEMU通常需要一些系统库和资源。-g 12345
指定用于调试的端口号,你可以将这个端口连接到调试器。/path/to/your/arm_binary
是要执行的ARM架构的二进制文件的路径。
请将 /path/to/rootfs
和 /path/to/your/arm_binary
替换为实际的路径和文件名。
qemu-system
QEMU-System是QEMU项目的一部分,它提供了完整的虚拟化和仿真环境,允许用户模拟整个计算机系统,包括CPU、内存、外部设备等。QEMU-System是一种强大的工具,可用于多种用途,包括虚拟化、操作系统开发、嵌入式系统测试和仿真等。
QEMU-System是一个非常强大和灵活的工具,广泛用于虚拟化、操作系统开发、嵌入式系统测试和仿真等领域。它是一个开源项目,因此用户可以根据需要进行自定义和扩展。
如果有文件系统,就可以使用 qemu-system 来进行系统仿真 举个例子来说明各个参数
1 | qemu-system-arm \ |
-kernel 指定内核镜像文件 bzImage 路径 -initrd 设置内核启动的内存文件系统 bzImage: 压缩的linux内核 vmlinux: 未压缩的ELF格式的linux内核,可以使用extract-vmlinux解压bzImage得到 rootfs.img: 根目录的文件系统 dev_helper.ko: 编译好的驱动模块,也是要分析的目标 start.sh: qemu的启动脚本
如果使用 qemu-system 进行调试,就得需要根据架构下载三个文件,比如目标系统是 arm 的 32位 小端序 就需要去如下网站下载以下文件: https://people.debian.org/~aurel32/qemu/
- vmlinuz-3.2.0-4-vexpress:zImage 格式压缩的 linux kernel
- initrd.img-3.2.0-4-vexpress:ramdisk 镜像
- debian_wheezy_armhf_standard.qcow2:文件系统镜像
然后进行网络配置 方便虚拟机和 qemu 进行通信
虚拟机里:
1 | sudo tunctl -t tap0 -u `whoami` # 为了与 QEMU 虚拟机通信,添加一个虚拟网卡 |
qemu里:
1 | ifconfig eth0 10.10.10.2/24 |
然后 qemu 启动命令
1 | sudo qemu-system-arm \ |
以下是各种架构的调试命令: aarch64:
1 | sudo qemu-system-aarch64 \ |
armhf:
1 | sudo qemu-system-arm \ |
armel:
1 | sudo qemu-system-arm \ |
mip_32:
1 | sudo qemu-system-mips \ |
mipsel_32:
1 | sudo qemu-system-mipsel \ |
mipsel_64:
1 | sudo qemu-system-mips64el \ |
例子: 以思科的路由器为例
固件下载 https://software.cisco.com/download/home/283879340/type/282487380/release/1.2.0.9 https://software.cisco.com/download/home/285026142/type/282465789/release/1.0.3.44
使用 binwalk 进行提取
1 | binwalk -Me RV130X_FW_1.0.3.44.bin |
得到如下文件系统 [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/qemu_systemmode7.png)
对漏洞程序 httpd 进行查看 可以发现是 arm 的小端序
1 | file httpd |
qemu 启动命令
1 | sudo qemu-system-arm \ |
目录结构如下 [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/qemu_systemmode1.png)
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/qemu_systemmode2.png)
然后会有个报错
1 | qemu-system-arm: Invalid SD card size: 25 GiB |
应该是镜像大小不是 2的n 次方
我们可以手动调整大小
1 | qemu-img resize debian_wheezy_armhf_standard.qcow2 32G |
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/qemu_systemmode3.png)
之后就可以正常运行 qemu [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/qemu_systemmode4.png)
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/qemu_systemmode5.png)
然后这时,为了能让虚拟机和 qemu 通信,我们需要配置一下网络 虚拟机里:
1 | sudo tunctl -t tap0 -u `whoami` # 为了与 QEMU 虚拟机通信,添加一个虚拟网卡 |
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/qemu_systemmode6.png)
qemu里:
1 | ifconfig eth0 10.10.10.2/24 |
传入文件系统
1 | sudo scp -r ./squashfs-root root@10.10.10.2:/root/ |
这里有个坑,如果直接传入 squashfs-root,var 下的软链接会出问题,导致后面 nginx 服务无法正常启动
然后将 squashfs-root 的压缩包传入 qemu 中然后解压
1 | tar zcvf 1.tar squashfs-root |
解压然后挂载文件系统
1 | #解压 |
之后就可以正常调试了
firmadyne
FIRMADYNE 是一个自动化且可扩展的系统,用于对基于 Linux 的嵌入式固件进行仿真和动态分析。旨在帮助安全研究人员和逆向工程师研究、测试和分析固件,以识别其中可能存在的漏洞、安全问题和潜在的攻击面。它包括以下组件:
- 用于检测固件执行的修改内核(MIPS:v2.6、ARM:v4.1、 v3.10 );
- 用于模拟硬件 NVRAM 外设的用户空间NVRAM 库;
- 一个提取器,用于从下载的固件中提取文件系统和内核;
- 一个小型控制台应用程序,用于生成用于调试的附加 shell;
- 以及一个用于从 42 多个不同供应商下载固件的爬虫。
如何安装 firmadyne? 首先需要按照依赖项
1 | sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan |
递归克隆
1 | git clone --recursive https://github.com/firmadyne/firmadyne.git |
还需要安装 binwalk 及其依赖项:
1 | git clone https://github.com/ReFirmLabs/binwalk.git |
然后就是数据库的安装和配置
1 | sudo apt-get install postgresql |
记得设置密码为 firmadyne [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne1.png)
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne2.png)
然后就是二进制组件的安装
1 | cd ./firmadyne; ./download.sh |
最后就是 qemu
1 | sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils |
如何使用呢? 首选我们需要启动数据库
1 | service postgresql startbash |
可以随便找个固件进行测试 这里使用 netgear 的固件
1 | wget -N --continue \ |
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne3.png)
然后使用之前安装的工具进行解压
1 | python3 ./sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk "firmware.bin" images |
- 解析固件
firmware.bin
创建项目 - 解压后目录
./../images/
下会多出一个tar.gz
文件,文件名就是这个固件的id -b Netgear
指定固件类型为Netgear
,可以随便写一个-sql
指定数据库位置-np
禁止多线程解压-nk
不处理内核
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne4.png) 可以看到解压成功 [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne5.png)
images 下多出的 targz [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne6.png)
然后进行自动化分析固件架构
1 | ./scripts/getArch.sh ./../images/1.tar.gz |
可以看到是 mipseb 的架构 说白了就是对 busybox 进行架构检测
同时也会将结果保存到数据库,方便后面自动分析
然后对固件信息进行收集
1 | ./scripts/tar2db.py -i 1 -f ./../images/1.tar.gz |
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne7.png)
同样的,同时也会将结果保存到数据库,方便后面自动分析
然后这时我们需要对固件创建 img
1 | ./scripts/makeImage.sh 1 [arch] |
[arch]
是可选参数,用于覆盖数据库中的arch
记录
然而实际上不指定就会报错 [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne8.png)
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne9.png) [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne10.png)
最后对固件的网络接口情况进行分析
1 | ./scripts/inferNetwork.sh 1 mipseb |
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne11.png) [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne12.png)
最后进行固件模拟
1 | ./scratch/1/run.sh |
[](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne13.png) [](https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide/blob/main/images/firmadyne14.png)
可以看到调试成功