Tenda AC15栈溢出漏洞复习(CVE-2018-18708)
字数 1522 2025-09-01 11:26:11
Tenda AC15栈溢出漏洞(CVE-2018-18708)分析与利用
1. 漏洞概述
CVE-2018-18708是影响多款Tenda产品的HTTP服务(httpd)中的缓冲区溢出漏洞。攻击者可以利用该漏洞造成拒绝服务或通过覆盖函数返回地址实现代码执行。
受影响产品及版本:
- Tenda AC7 V15.03.06.44_CN
- AC9 V15.03.05.19(6318) CN
- AC10 V15.03.06.23_CN
- AC15 V15.03.05.19_CN
- AC18 V15.03.05.19(6318) CN
2. 环境搭建
2.1 固件获取
从Tenda官网下载固件: https://www.tenda.com.cn/material
2.2 固件解包
使用binwalk分离固件:
binwalk -Me firmware.bin
2.3 QEMU仿真准备
- 将
qemu-arm-static复制到squashfs-root目录 - 运行测试:
chroot . ./qemu-arm-static ./bin/httpd
2.4 环境修复
-
网络检查函数patch:
- 修改相关函数为
mov r3,#1绕过网络检查 - 替换httpd并修改权限
- 修改相关函数为
-
页面显示问题:
- 将
webroot_ro重命名为webroot解决页面无法显示问题
- 将
3. 漏洞分析
3.1 函数调用流程
sub_2E420(main) -> sub_2E9EC() -> sub_42378() -> formSetMacFilterCfg -> sub_C14DC -> sub_C17A0 -> sub_C24C0
3.2 关键漏洞点
formSetMacFilterCfg函数中存在漏洞- 触发点在
sub_C24C0中的strcpy操作
3.3 参数传递
s2_1和s2通过sub_2BA8C(实际为websGetVar())获取s2_1:macFilterType参数s2:deviceList参数
3.4 漏洞触发条件
-
sub_C10D0(s2_1)检查macFilterType参数:- 必须为"black"或"white"
- 返回0才会进入后续流程
-
v19 = sub_C14DC(v18, v17):v18:macFilterType(固定值)v17:deviceList(可控输入)
-
strcpy将s复制到src+32处:- 无长度限制导致缓冲区溢出
- 可覆盖返回地址
4. 漏洞利用
4.1 测试偏移量
- 使用
cyclic模式测试 - 可能需要多次发送(Tenda设备的常见问题)
- 确定偏移量为176字节
4.2 计算libc基址
- 在
puts函数下断点获取其地址 - 计算:
libc_base = puts_address - 0x35CD4
4.3 ARM架构关键知识
-
寄存器用途:
r0: 传递函数第一个参数r3: 通用寄存器pc: 程序计数器
-
CPSR的T位:
- 决定CPU执行模式
- T=0: ARM指令(4字节对齐)
- T=1: Thumb指令(2字节对齐)
- 跳转到Thumb指令时地址需为奇数(如0xdeadbeef | 1)
4.4 ROP链构造
-
gadget1:
- 将
r3传入system - 将
pc传入gadget2
- 将
-
gadget2:
- ROP链最后添加
/bin/sh字符串 sp指向/bin/sh字符串sp赋给r0(第一个参数)r3为system地址- 最终执行
system("/bin/sh")
- ROP链最后添加
5. POC构造
(具体POC代码略,参考原文中的成功利用示例)
6. 总结
- Tenda系列产品的栈溢出漏洞具有通用性
- 关键点在于:
- 环境搭建与修复
- 函数调用流程分析
- 可控输入点定位
- ARM架构下的ROP构造技巧
- 类似漏洞可参考Tenda AC9(CVE-2018-18708)的分析
7. 扩展学习
- 其他Tenda设备漏洞复现
- ARM架构下的漏洞利用技术
- 嵌入式设备固件分析方法
- QEMU仿真与调试技巧