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 固件模拟

  1. 配置虚拟桥接接口和本地br0网桥,桥接到ens32
  2. 使用QEMU进行用户级和系统级模拟
  3. 使用-strace参数启用系统调用跟踪

2.2 调试工具

  1. IDA Pro用于静态分析
  2. GDB用于动态调试
  3. 系统调用跟踪工具

3. 漏洞详细分析

3.1 CVE-2018-5767

漏洞位置

./bin/httpd程序中的R7WebsSecurityHandler函数

漏洞成因

  1. 使用sscanf函数从字符串v37中解析出=之后、;之前的内容,存储到变量v30
  2. v30是固定大小的局部变量(0x1C0字节)
  3. 没有对用户输入进行长度限制,导致栈溢出

利用条件

  1. 需要满足if条件:URL请求不在特定字符串内
  2. 使用/goform/bkbqwq作为URL路径可进入漏洞代码段

利用方法

  1. 构造栈布局:pop_r0给r0寄存器传参,pop_pc衔接到system函数调用
  2. 将system改为puts函数测试输出/bin/sh
  3. 实际利用时可能因/bin/sh不存在导致报错

调试技巧

  1. 通过报错信息is not defined定位到websFormHandler函数
  2. 含有goform的请求通过websFormHandler函数利用函数指针进行调用

3.2 CVE-2018-18727

漏洞位置

formSetMacFilterCfg函数调用的sub_C24C0函数

漏洞成因

  1. sub_C24C0函数中复制操作发生溢出
  2. 可覆盖sub_C17A0的返回地址
  3. 参数来源于HTTP请求中的deviceList字段

利用条件

  1. 请求路径为/goform/setMacFilterCfg
  2. 需要包含macFilterType字段,设置为"black"或"white"
  3. deviceList值不为空且包含\r字符

利用方法

  1. 构造176字节的payload
  2. 布局:POP{r3,PC};system_addr;mov r0,sp;blx r3;cmd
  3. 计算libc基地址:puts_addr - puts_offset

调试技巧

  1. 单步跟踪sub_C17A0sub_C24C0函数
  2. 检查payload中间不能被\x00截断

3.3 CVE-2018-18708

漏洞位置

fromAddressNat函数

漏洞成因

栈溢出漏洞,偏移为248字节

注意事项

  1. 检查CPSR寄存器的T位
  2. 栈上内容弹出到PC寄存器时,最低有效位(LSB)写入CPSR的T位
  3. 如果T位为1,需要在地址上加1

利用方法

  1. 复用之前的gadget和函数偏移
  2. 修改URL和请求数据

3.4 CVE-2018-18730

漏洞位置

formSetPptpServerCfg函数

漏洞成因

  1. startIp偏移为372字节
  2. endIp偏移为404字节
  3. 选择任意一个进行利用

利用条件

  1. 使用endIpstartIp值需为"xx.xx.xx.xx"格式
  2. sscanf不匹配4个条件时为真

利用方法

  1. 构造相应偏移的payload
  2. 可能需要等待一段时间才能执行成功

3.5 CVE-2018-18731

漏洞位置

addWifiMacFilter函数

漏洞成因

  1. deviceId偏移为793字节
  2. deviceMac偏移为796字节

利用条件

只需满足一个简单条件即可到达溢出点

利用方法

  1. 构造相应偏移的payload
  2. 直接覆盖返回地址

3.6 CVE-2018-18732

漏洞位置

fromSetSysTime函数

利用条件

  1. 添加timeType字段设置为"sync"
  2. CommitCfm函数一定会返回1
  3. SetValueGetValue函数需调用成功

绕过方法

  1. 可能因/var/cfm_socket连接失败导致利用失败
  2. 可尝试启动cfmcfmd服务
  3. 或直接修改条件判断

利用方法

  1. 溢出距离为572字节
  2. 构造相应payload

3.7 CVE-2018-18729

漏洞位置

GetParentControlInfo函数

漏洞类型

拒绝服务漏洞

利用方法

mac字段提供超长值导致程序崩溃

3.8 CVE-2018-18728

漏洞位置

formSetSambaConf函数

利用条件

添加action字段赋值为"del"

漏洞类型

命令注入漏洞

3.9 CVE-2024-3906

漏洞位置

formQuickIndex函数

利用条件

  1. mit_linktype字段赋值为"2"
  2. QEMU模拟时需要手动取否

利用方法

  1. 偏移为104字节
  2. 构造相应payload

3.10 CVE-2024-4171

漏洞位置

fromWizardHandle函数

漏洞成因

循环赋值时没有长度限制导致溢出

利用条件

  1. WANT字段赋值为"2"
  2. 需要修改LDRB指令为LDR以避免atoi报错

利用方法

  1. 偏移为320字节
  2. 构造payload格式:{"WANT":"2","PPW": payload}
  3. 也可使用{"WANT":"3","pppl2_pwd": payload}

4. 通用利用技巧

4.1 栈溢出利用

  1. 计算精确偏移
  2. 构造ROP链
  3. 处理CPSR寄存器的T位
  4. 避免payload中包含截断字符

4.2 命令注入

  1. 识别可注入点
  2. 绕过过滤条件
  3. 测试不同命令分隔符

4.3 调试技巧

  1. 使用-strace跟踪系统调用
  2. 通过报错信息定位关键函数
  3. 动态修改指令绕过保护

5. 防护建议

  1. 对所有输入进行严格长度检查
  2. 使用安全的字符串处理函数
  3. 启用栈保护机制(如Canary)
  4. 限制敏感功能的访问权限
  5. 及时更新固件版本

6. 总结

本文详细分析了Tenda AC15路由器中的多个漏洞,包括漏洞位置、成因、利用条件和具体利用方法。通过掌握这些技术细节,安全研究人员可以更好地理解嵌入式设备的安全风险,并采取相应的防护措施。

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 函数一定会返回1 SetValue 和 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路由器中的多个漏洞,包括漏洞位置、成因、利用条件和具体利用方法。通过掌握这些技术细节,安全研究人员可以更好地理解嵌入式设备的安全风险,并采取相应的防护措施。