一、介绍
FirmAE目标是创造一个可以供用户动态调试分析的环境,而不是复现和硬件一模一样的环境,,其卖点是大规模(Large-Scale)。
论文开头就直指“友商”Firmadyne,提出其模拟成功率低等问题,
其将原本Firmadyne的成功率16.28%提高到79.36%,其底层还是使用了QEMU。FirmAE
从固件的启动、网络、NVRAM、内核和其它五个方面
,总结了导致固件仿真失败的原因及通用解决方法。
FirmAE中主要集成了四种模式,
check模式、run模式、analyze 模式、debug 模式。在固件仿真当中我们通常利用的是前两种模式check模式和run模式。check 模式会对固件进行
仲裁仿真(
arbitrated emulation
)的各项操作,将设备运行后,检查网络连通性和服务可用性,最后仿真退出,保存相关的日志信息记录在缓存文件中。run模式是根据 check模式构建的各种处理信息,进行仿真,在仿真程序时不会退出。
在漏洞检测方面,FirmAE根据固件的文件系统和内核日志来推断Web服务状态,其发现了23个设备的12个0DAY。
基于Firmadyne实现了原型系统FirmAE。其总框架如下图:
FirmAE的整体架构为如上图所示。
FirmAE用和Firmadyne相似的方法(使用预构建的自定义Linux内核和库)来仿真固件映像。
它依然需要模拟目标镜像两次,以收集各种系统日志,并利用这些信息进行进一步的仿真,前一个仿真步骤称为
预仿真
,后一个称为
最终仿真
。
Automation:
为了进行大规模分析,FirmAE致力于完全自动化。实际上Firmadyne的许多步骤已经自动化了,但是仍然需要一些用户交互。例如,用户必须首先使用特定选项提取目标固件的文件系统。然后,他们评估是否成功提取文件系统并检索架构信息。随后,他们为QEMU制作固件镜像并在预仿真中收集信息。最后,他们运行最终仿真的脚本并执行动态分析。FirmAE自动化了所有这些交互,并
添加了一个用于网络可达性和Web服务可用性的自动评估过程
(
为此,我们在FirmAE中构建了一个模块,定期运行ping和curl命令
)
。
Parallelizaton:
FirmAE还
使用Docker 将仿真
并行化
,以有效评估大量固件镜像
。每个固件镜像在每个容器中独立仿真,该容器配备所有所需的软件包和依赖项。这使得能够快速可靠地仿真目标镜像。FirmAE通过运行多个容器实例来并行仿真固件。
更多详细细节可参考
FirmAE论文
。
二、安装
1、克隆FirmAE
$ git clone --recursive
https://github.com/pr0v3rbs/FirmAE
2、运行脚本
download.sh
$ ./download.sh
# 需要外网
3、运行脚本
install.sh
$ ./install.sh
三、用法
1、运行脚本
init.sh
$ ./init.sh
2、准备固件
$ wget
https://github.com/pr0v3rbs/FirmAE/releases/download/v1.0/DIR-868L_fw_revB_2-05b02_eu_multi_20161117.zip
3、检测仿真
# 检查固件是否可以仿真,会给出仿真成功后可以访问web页面的ip,或是仿真失败给出仿真失败的原因比如固件提取失败、网络构建失败、服务启动失败等
$
sudo
./
run
.
sh
-
c
<
brand
>
<
firmware
>
相关的日志在FirmAE/scratch/3/目录下,其中3是IID的值。
4、分析目标固件
-
分析模式,使用FirmAE分析器
$
sudo
./
run
.
sh
-
a
<
brand
>
<
firmware
>
-
运行模式,有助于测试网络服务或执行自定义分析器( 在已经执行过check模式下再进行仿真时,仿真的速度会变得很快 )
$
sudo
./
run
.
sh
-
r
<
brand
>
<
firmware
>
出现俩个“true”表明已成功模拟固件
在node1这台机器上用浏览器打开192.168.0.1,如下:无需输入密码即可进入
四、Debug
完成run.sh -c后,可debug固件:
1. 用户级基本调试实用程序。(当模拟固件可通过网络访问时很有用)
$
sudo
./
run
.
sh
-
d
<
brand
>
<
firmware
>
2. 内核级引导调试。
$
sudo
./
run
.
sh
-
b
<
brand
>
<
firmware
>
五、Turn on/off arbitration
检查firmae.config:
六、Docker
首先,准备一个docker镜像:
$ .
/docker
-init
.sh
注:为了更快更顺畅的下载包与github项目,修改FirmAE/core/Dockerfile:
并行模式
然后,运行以下命令之一
-ec只检查仿真,
-ea检查仿真并分析漏洞。
$
.
/
docker
-
helper
.
py
-
ec
<
brand
><
firmware or
firmware_path
>
# 默认等待时间2400s
日志:FirmAE/scratch/DIR-868L_fw_revB_2-05b02_eu_multi_20161117.zip.log
$
.
/
docker
-
helper
.
py
-
ea
<
brand
><
firmware
or
firmware_path
>
# 默认等待时间3600s
日志:FirmAE/scratch/DIR-868L_fw_revB_2-05b02_eu_multi_20161117.zip.log,
卡死在:
调试模式
在成功模拟固件映像之后:
$
.
/
docker
-
helper
.
py
-
ed
<
firmware
>
Emulation result
Google spreadsheet -
view
Dataset
Google drive -
download
七、参考
IoT固件Rehosting综述 - 在线工具-wetools.com微工具
FirmAE: Towards Large-Scale Emulation of IoT Firmware for Dynamic Analysis阅读笔记 - 知乎 (zhihu.com)
https://github.com/pr0v3rbs/FirmAE
How to use the fuzzer in FirmAE? · Issue #10 · pr0v3rbs/FirmAE · GitHub
使用FirmAE 对zyxel路由器固件仿真实践_黑客技术 (hackdig.com)
FirmAE及DlinkDIR320、600、645漏洞复现 - 『软件调试区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn