1. 论文参考(先敬大佬)
Chen D D, Woo M, Brumley D, et al. Towards automated dynamic analysis for linux-based embedded firmware[C]//NDSS. 2016, 1: 1.1-8.1.
2 Firmadyne——官方部署模式
2.1 源码
https://github.com/firmadyne/firmadyne#databasehttps://github.com/firmadyne/firmadyne" \l "database
2.2 环境
VM Ubuntu 18.04(16.04也可)
2.3 部署流程
2.3.1 拉取文件
git clone --recursive GitHub - firmadyne/firmadyne: Platform for emulation and dynamic analysis of Linux-based firmware |
(若导入超时失败,可以将https换成git;或是更改git源或是科学上网)
2.3.2 依赖导入
sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
2.3.3 Binwalk
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo ./deps.sh
sudo python3 ./setup.py install
第三步时可能需要更新python3的版本>=3.6
2.3.4 切换和配置python版本(python>3.5时不需要考虑)
一、python 3.6 的安装
安装 GCC toolchain
sudo apt install build-essential |
安装各种依赖关系
sudo apt install libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev libffi-dev |
下载python原代码并编译
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz tar xf Python-3.6.5.tar.xz cd Python-3.6.5 ./configure --enable-optimizations make -j 8 sudo make altinstall |
二、默认python版本选择
在安装完python3.6后,系统会存在着至少3个版本。可以通过update-alternatives 进行版本管理。
更新update-alternatives中python列表
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2 sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.6 3 |
最后数字为对应python版本优先级,数值越大,优先级越高。(可搜索update-alternatives 命令解释)
设置完成后默认python版本为3.6
选择适当版本
切换至其他版本python
sudo update-alternatives --config python
然后根据提示输入相应版本对应数字即可。
还需要删除python3.5
sudo apt-get remove python3.5 rm -rf /usr/lib/python3.5/ rm -rf ~/.local/python3.5 |
2.3.5 设置pg数据库
sudo apt-get install postgresql
sudo -u postgres createuser -P firmadyne
接着输入密码firmadyne
sudo -u postgres createdb -O firmadyne firmware
sudo -u postgres psql -d firmware < ./firmadyne/database/schema
2.3.6 二进制文件下载
cd ./firmadyne; ./download.sh |
2.3.7 QEMU安装
sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils |
2.4 Firmadyne使用
2.4.1 路径配置更改
修改所有的路径变量地址
vi ./firmadyne/firmadyne.config |
2.4.2 下载固件(Netgear路由器)
wget http://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip
2.4.3 提取文件系统
使用extractor提取filesystem
python3 ./sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk "WNAP320 Firmware Version 2.0.3.zip" images |
-nk:no kernel,不提取内核;
-np:no parallel operation,没有并行操作;
-sql:将镜像信息表存储到数据库127.0.0.1 ;
-b:with the Netgear brand ();
Images:存储压缩文件在images.
2.4.4 识别架构并存储
./scripts/getArch.sh ./images/1.tar.gz |
2.4.5 装载路由器文件系统内容存储对象到imagetables
./scripts/tar2db.py -i 1 -f./images/1.tar.gz |
2.4.6 创建路由器的qemu磁盘镜像
./scripts/makeImage.sh 1 |
2.4.7 指定网络配置并将信息记录到log
./scripts/inferNetwork.sh 1 |
2.4.8 模拟运行防火墙
使用指定的网络配置模拟运行防火墙,这将通过产生TAP设备增加route修改主机系统配置
./scratch/1/run.sh |
账号为admin,密码为password
第二次直接运行run.sh即可
2.5 攻击演示
2.5.1 Msf演示——查看日志基本不通过
chmod +x analyses/*.py mkdir exploits python3 ./analyses/runExploits.py-t 192.168.0.100 -o exploits/exploit -e x |
2.5.2 snmp扫描
./analyses/snmpwalk.sh 192.168.0.100 |
2.5.3 WEB服务测试
./analyses/webAccess.py 1 192.168.0.100 log.txt |
大致原理是对内部的常见web地址进行访问(并对重定向进行处理)
2.5.4 MACAddress-RCE
反弹了shell到终端
原理:/boardDataWW.php没有进行对mac地址进行上传验证,存在命令注入漏洞(也可以利用bp重定向)
3 局限性_
3.1 网络地址无法从内核中准确读取
通过实验发现无法准确的获取内核中关于接口配置
例如:DIR882A1_FW110B02.bin 固件文件的仿真中,由于无法获取地址,即在使用./scripts/inferNetwork.sh 1获取时,地址列表时空的(信息主要是通过硬件知识库获取,然后匹配固件架构后,自动分配)
3.2 内核结构作者使用通用结构目标,需要自定义更改
默认的执行路径如下,但实际的路径与默认有差异,需要更改
实际路径如下
最后好像有大佬解决了网络信息推测异常问题,成功仿真原作者无法实现的思科设备Cisco RV100W的设备固件。贴上大佬的链接: