Tenda AC15路由器漏洞分析
字数 2705 2025-08-29 22:41:32
Tenda AC15路由器漏洞分析与利用教学文档
1. 漏洞概述
本文档详细分析Tenda AC15路由器中发现的多个漏洞,包括栈溢出漏洞和命令注入漏洞,涵盖CVE-2018-5767、CVE-2018-18727、CVE-2018-18708、CVE-2018-18730、CVE-2018-18731、CVE-2018-18732、CVE-2018-18729、CVE-2018-18728、CVE-2024-3906和CVE-2024-4171等多个漏洞。
2. 环境准备
2.1 固件模拟
- 配置虚拟桥接接口和本地br0网桥,桥接到ens32
- 使用QEMU进行用户级和系统级模拟
- 使用
-strace参数启用系统调用跟踪
2.2 调试工具
- IDA Pro用于静态分析
- GDB用于动态调试
- 系统调用跟踪工具
3. 漏洞详细分析
3.1 CVE-2018-5767
漏洞位置
./bin/httpd程序中的R7WebsSecurityHandler函数
漏洞成因
- 使用
sscanf函数从字符串v37中解析出=之后、;之前的内容,存储到变量v30中 v30是固定大小的局部变量(0x1C0字节)- 没有对用户输入进行长度限制,导致栈溢出
利用条件
- 需要满足if条件:URL请求不在特定字符串内
- 使用
/goform/bkbqwq作为URL路径可进入漏洞代码段
利用方法
- 构造栈布局:
pop_r0给r0寄存器传参,pop_pc衔接到system函数调用 - 将system改为puts函数测试输出
/bin/sh - 实际利用时可能因
/bin/sh不存在导致报错
调试技巧
- 通过报错信息
is not defined定位到websFormHandler函数 - 含有
goform的请求通过websFormHandler函数利用函数指针进行调用
3.2 CVE-2018-18727
漏洞位置
formSetMacFilterCfg函数调用的sub_C24C0函数
漏洞成因
sub_C24C0函数中复制操作发生溢出- 可覆盖
sub_C17A0的返回地址 - 参数来源于HTTP请求中的
deviceList字段
利用条件
- 请求路径为
/goform/setMacFilterCfg - 需要包含
macFilterType字段,设置为"black"或"white" deviceList值不为空且包含\r字符
利用方法
- 构造176字节的payload
- 布局:
POP{r3,PC};system_addr;mov r0,sp;blx r3;cmd - 计算libc基地址:
puts_addr - puts_offset
调试技巧
- 单步跟踪
sub_C17A0和sub_C24C0函数 - 检查payload中间不能被
\x00截断
3.3 CVE-2018-18708
漏洞位置
fromAddressNat函数
漏洞成因
栈溢出漏洞,偏移为248字节
注意事项
- 检查CPSR寄存器的T位
- 栈上内容弹出到PC寄存器时,最低有效位(LSB)写入CPSR的T位
- 如果T位为1,需要在地址上加1
利用方法
- 复用之前的gadget和函数偏移
- 修改URL和请求数据
3.4 CVE-2018-18730
漏洞位置
formSetPptpServerCfg函数
漏洞成因
startIp偏移为372字节endIp偏移为404字节- 选择任意一个进行利用
利用条件
- 使用
endIp时startIp值需为"xx.xx.xx.xx"格式 sscanf不匹配4个条件时为真
利用方法
- 构造相应偏移的payload
- 可能需要等待一段时间才能执行成功
3.5 CVE-2018-18731
漏洞位置
addWifiMacFilter函数
漏洞成因
deviceId偏移为793字节deviceMac偏移为796字节
利用条件
只需满足一个简单条件即可到达溢出点
利用方法
- 构造相应偏移的payload
- 直接覆盖返回地址
3.6 CVE-2018-18732
漏洞位置
fromSetSysTime函数
利用条件
- 添加
timeType字段设置为"sync" CommitCfm函数一定会返回1SetValue和GetValue函数需调用成功
绕过方法
- 可能因
/var/cfm_socket连接失败导致利用失败 - 可尝试启动
cfm或cfmd服务 - 或直接修改条件判断
利用方法
- 溢出距离为572字节
- 构造相应payload
3.7 CVE-2018-18729
漏洞位置
GetParentControlInfo函数
漏洞类型
拒绝服务漏洞
利用方法
给mac字段提供超长值导致程序崩溃
3.8 CVE-2018-18728
漏洞位置
formSetSambaConf函数
利用条件
添加action字段赋值为"del"
漏洞类型
命令注入漏洞
3.9 CVE-2024-3906
漏洞位置
formQuickIndex函数
利用条件
mit_linktype字段赋值为"2"- QEMU模拟时需要手动取否
利用方法
- 偏移为104字节
- 构造相应payload
3.10 CVE-2024-4171
漏洞位置
fromWizardHandle函数
漏洞成因
循环赋值时没有长度限制导致溢出
利用条件
WANT字段赋值为"2"- 需要修改
LDRB指令为LDR以避免atoi报错
利用方法
- 偏移为320字节
- 构造payload格式:
{"WANT":"2","PPW": payload} - 也可使用
{"WANT":"3","pppl2_pwd": payload}
4. 通用利用技巧
4.1 栈溢出利用
- 计算精确偏移
- 构造ROP链
- 处理CPSR寄存器的T位
- 避免payload中包含截断字符
4.2 命令注入
- 识别可注入点
- 绕过过滤条件
- 测试不同命令分隔符
4.3 调试技巧
- 使用
-strace跟踪系统调用 - 通过报错信息定位关键函数
- 动态修改指令绕过保护
5. 防护建议
- 对所有输入进行严格长度检查
- 使用安全的字符串处理函数
- 启用栈保护机制(如Canary)
- 限制敏感功能的访问权限
- 及时更新固件版本
6. 总结
本文详细分析了Tenda AC15路由器中的多个漏洞,包括漏洞位置、成因、利用条件和具体利用方法。通过掌握这些技术细节,安全研究人员可以更好地理解嵌入式设备的安全风险,并采取相应的防护措施。