0 参考论文(先敬大佬)
题目:Towards Automated Dynamic Analysis for Linux-based Embedded Firmware
作者:Daming D. Chen∗, Manuel Egele†, Maverick Woo∗, and David Brumley∗
机构:卡内基梅隆大学
期刊:NDSS 2016
1 Firmadyne——官方部署模式
1.1 源码
https://github.com/firmadyne/firmadyne#database
1.2 环境
VMware Station
VM Ubuntu 16.04
1.3 部署流程
1.3.1 拉取文件
git clone --recursive GitHub - firmadyne/firmadyne: Platform for emulation and dynamic analysis of Linux-based firmware |
(若导入超时失败,可以将https换成git;或是更改git源或是本机和虚拟机都挂梯子)
1.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
1.3.3 Binwalk
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo ./deps.sh
sudo python3 ./setup.py install
第三步时可能需要更新python3的版本>=3.6
1.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 命令解释)
sudo update-alternatives --config python
然后根据提示输入相应版本对应数字,然后回车即可。
1.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
1.3.6 二进制文件下载
cd ./firmadyne; ./download.sh
1.3.7 QEMU安装
sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
1.4 Firmadyne使用
1.4.1 路径配置更改
修改所有的路径变量地址
vi ./firmadyne/firmadyne.config
1.4.2 下载固件(Netgear路由器)
wget http://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip
1.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.
1.4.4 识别架构并存储
./scripts/getArch.sh ./images/1.tar.gz |
1.4.5 装载路由器文件系统内容存储对象到imagetables
./scripts/tar2db.py -i 1 -f./images/1.tar.gz
1.4.6 创建路由器的qemu磁盘镜像
./scripts/makeImage.sh 1
1.4.7 指定网络配置并将信息记录到log
./scripts/inferNetwork.sh 1
1.4.8 模拟运行防火墙
使用指定的网络配置模拟运行防火墙,这将通过产生TAP设备增加route修改主机系统配置
./scratch/1/run.sh
账号为admin,密码为password
第二次直接运行run.sh即可
1.5 攻击演示
1.5.1 Msf演示——查看日志基本不通过
chmod +x analyses/*.py
mkdir exploits
python3 ./analyses/runExploits.py-t 192.168.0.100 -o exploits/exploit -e x
1.5.2 snmp扫描
./analyses/snmpwalk.sh 192.168.0.100
1.5.3 WEB服务测试
./analyses/webAccess.py 1 192.168.0.100 log.txt
对内部的常见web地址进行访问(并对重定向进行处理)
1.5.4 MACAddress-RCE
反弹了shell到终端
原理:/boardDataWW.php没有进行对mac地址进行上传验证,存在命令注入漏洞(也可以利用bp重定向)
2 局限性
2.1 网络地址无法从内核中准确读取
通过实验发现无法准确的获取内核中关于接口配置
例如:DIR882A1_FW110B02.bin 固件文件的仿真中,由于无法获取地址,即在使用./scripts/inferNetwork.sh 1获取时,地址列表时空的(信息主要是通过硬件知识库获取,然后匹配固件架构后,自动分配)
2.2 内核结构作者使用通用结构目标,需要自定义更改
默认的执行路径如下,但实际的路径与默认有差异,需要更改
实际路径如下