[原创]使用FirmAE 对zyxel路由器固件仿真实践
2023-3-31 16:45:38 Author: bbs.pediy.com(查看原文) 阅读量:19 收藏

[原创]使用FirmAE 对zyxel路由器固件仿真实践

6小时前 274

[原创]使用FirmAE 对zyxel路由器固件仿真实践

0x01.FirmAE简介

FirmAE 是一个执行仿真和漏洞分析的全自动框架。FirmAE 使用五种仲裁技术显著提高仿真成功率(从Firmadyne的 16.28% 提高到 79.36%)。

image-20230322100641414

FirmAE的整体架构为如上图所示。与Firmadyne类似,FirmAE在预先构建的自定义Linux内核和库上模拟固件镜像。它还模拟目标镜像两次,以收集各种系统日志,并利用这些信息进行进一步的仿真,前一个仿真步骤称为预仿真,后一个称为最终仿真。为了进行大规模分析,FirmAE致力于完全自动化。实际上Firmadyne的许多步骤已经自动化了,但是仍然需要一些用户交互。例如,用户必须首先使用特定选项提取目标固件的文件系统。然后,他们评估是否成功提取文件系统并检索架构信息。随后,他们为QEMU制作固件镜像并在预仿真中收集信息。最后,他们运行最终仿真的脚本并执行动态分析。FirmAE自动化了所有这些交互,并添加了一个用于网络可达性和Web服务可用性的自动评估过程。FirmAE还使用Docker 将仿真并行化,以有效评估大量固件镜像。每个固件镜像在每个容器中独立仿真,该容器配备所有所需的软件包和依赖项。这使得能够快速可靠地仿真目标镜像。更多详细细节可参考FirmAE论文

0x02. FirmAE安装

Ubuntu 18.04

Clone FirmAE

1

$ git clone --recursive https://github.com/pr0v3rbs/FirmAE

运行download.sh

运行 install.sh

0x03. FirmAE使用

执行init.sh脚本。

检查仿真

1

$ sudo ./run.sh -c <brand> <firmware>

分析目标固件

  • 分析模式,使用FirmAE分析器

1

$ sudo ./run.sh -a <brand> <firmware>

  • 运行模式,有助于测试网络服务或执行自定义分析器

1

$ sudo ./run.sh -r <brand> <firmware>

完成run.sh -c后,可debug固件。

用户级基本调试实用程序

1

$ sudo ./run.sh -d <brand> <firmware>

内核级引导调试

1

$ sudo ./run.sh -b <brand> <firmware>

0x04. 使用FirmAE仿真zyxel路由器固件

一般情况下,按照上述方法使用FirmAE可自动化仿真固件,但也有一些固件自动化仿真的效果并不是很好,这时就需要做一些逆向分析,通过适当的调整来完成仿真。比如zyxel NWA1100-NH_2.12固件,下面在使用FirmAE仿真该固件过程中,日志显示整个流程没有出错,顺利完成仿真,但实际上该路由器固件的web服务并没有被成功启动。

image-20230113105816827

这里用调试模式模拟运行后选择2可以连接进入shell

但是发现无法正常访问http服务,通过分析发现,该固件文件系统中由两个http服务程序,FirmAE启动了httpd,实际上这个固件用的是mini_httpd。

image-20230113105232533

接下来尝试手动启动mini_httpd,首先要清楚启动mini_httpd需要哪些启动参数,通过查看/etc/default/mini_httpd.conf,可以看到mini_httpd默认启动参数

image-20230113105406483

在/etc下可以看到有一个mini_httpd.conf指向/tmp/mini_httpd.conf,但实际上/tmp下并不存在这个文件

image-20230113105705227

另外还有一个mini_httpd.cnf文件,这里面有一下默认的内容,像是支持ssl的一些配置

image-20230113110147794

直接尝试用这个配置文件启动是失败的,

image-20230113110335185

在IDA里 打开mini_httpd,搜索报错信息"unknown config option"

image-20230113111307685

image-20230113111433565

最终定位到解析配置文件的代码逻辑,这里可以看到在解析配置文件的一些字段,至于哪些是必要字段哪些是非必要字段,可以尝试构造文件,测试运行。

经过逆向分析和测试,最终我这里的配置文件内容构造如下

1

2

3

4

dir=/usr/www

cgipat=cgi-bin/*

user=root

port=8081

构造好配置文件就可以正常启动mini_httpd了

image-20230113111904423

此时发现可以成功访问http服务了

image-20230113112019183

这里尝试用 admin admin登录,又发现了一个报错log_maintain: not found

image-20230113113456540

在mini_httpd里面找到了调用log_maintain的地方,找不到这个程序,说明这个程序所在路径不再环境变量,搜索到log_maintain在

/etc/script/ 目录下,将该路径添加到环境变量

1

export PATH=/etc/scripts/:$PATH

image-20230113113633618

继续分析登录逻辑,这里用户名密码会交给chkpwd程序验证

image-20230113181131102

image-20230113181452541

这里感觉用的是系统用户名密码,但是修改了系统用户名密码后没有成功登录,这里直接patch固件登录逻辑来绕过,可以看出如果用户名密码正确,v45会被写入字符串"Access granted",后面以这个字符串为标志来判断是否成功登录,这里就直接将

!srncmp(v84, "Access granted", 14)改成strncmp(v84, "Access granted", 14) 即将bnez改成beqz

image-20230113181731933

image-20230113182443195

patch后成功登如路由器

image-20230113182555575

登录后抓取到一个设置ip的请求包,下面定位处理http请求的代码,首先考虑字符串定位,但是在mini_httpd程序中并未搜索到/cgi-bin/ip字符串。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

POST /cgi-bin/ip HTTP/1.1

Host: 192.168.0.1:8081

User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:108.0) Gecko/20100101 Firefox/108.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Content-Type: application/x-www-form-urlencoded

Content-Length: 192

Origin: http://192.168.0.1:8081

Connection: close

Referer: http://192.168.0.1:8081/cgi-bin/ip

Cookie: AUTH=; csd=3; cod=1

Upgrade-Insecure-Requests: 1

AP_IPADDR=1.1.1.1&AP_NETMASK=255.255.255.255&IPGW=192.168.0.2&IPV6_AUTO=none&IPV6_ADDR=&PRIDNS=8.8.8.8&SECDNS=1.1.1.1&DOT1Q_VLAN=&MGMT_VLAN_ID=22&MGMT_VLAN=&EEE_Status=&COMMIT=Apply&EXECUTE=ip

image-20230118114819188

接着在固件文件夹下搜索/cgi-bin/ip字符串,发现了/usr/www/cgi-bin/ip这个目录,但实际在固件中没有找到ip这个程序,说明这个程序可能是固件运行起来后动态生成的。

最终在模拟运行的系统中发现了ip这个文件,ip链接到了/sbin/cgiMain,说明请求实际上是由cgiMain来处理。接下来就可以逆向cgiMain程序对http请求处理来进一步挖洞了,另外还可以在调试模式中使用gdb动态调试cgiMain。

image-20230118115330135

0x05. 总结

通过FirmAE可以对一些IoT固件自动化仿真,同时也便于逆向和动态调试,大大方便了安全研究。但对一些无法完全自动仿真的固件,就需要安全研究员手动分析可能的原因, 本文分享了一个没有自动仿真成功的固件案例,以及解决问题的思路。另外对FirmAE的实现及FirmAE其他功能感兴趣的,可以阅读项目源码及论文。

0x06.参考链接:

  1. https://github.com/pr0v3rbs/FirmAE
  2. https://syssec.kaist.ac.kr/pub/2020/kim_acsac2020.pdf
  3. https://github.com/firmadyne/firmadyne

实战CVE漏洞分析与防范(第1季)


文章来源: https://bbs.pediy.com/thread-276699.htm
如有侵权请联系:admin#unsafe.sh