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仿真准备

  1. qemu-arm-static复制到squashfs-root目录
  2. 运行测试:
chroot . ./qemu-arm-static ./bin/httpd

2.4 环境修复

  1. 网络检查函数patch:

    • 修改相关函数为mov r3,#1绕过网络检查
    • 替换httpd并修改权限
  2. 页面显示问题:

    • webroot_ro重命名为webroot解决页面无法显示问题

3. 漏洞分析

3.1 函数调用流程

sub_2E420(main) -> sub_2E9EC() -> sub_42378() -> formSetMacFilterCfg -> sub_C14DC -> sub_C17A0 -> sub_C24C0

3.2 关键漏洞点

  1. formSetMacFilterCfg函数中存在漏洞
  2. 触发点在sub_C24C0中的strcpy操作

3.3 参数传递

  • s2_1s2通过sub_2BA8C(实际为websGetVar())获取
    • s2_1: macFilterType参数
    • s2: deviceList参数

3.4 漏洞触发条件

  1. sub_C10D0(s2_1)检查macFilterType参数:

    • 必须为"black"或"white"
    • 返回0才会进入后续流程
  2. v19 = sub_C14DC(v18, v17):

    • v18: macFilterType(固定值)
    • v17: deviceList(可控输入)
  3. strcpys复制到src+32处:

    • 无长度限制导致缓冲区溢出
    • 可覆盖返回地址

4. 漏洞利用

4.1 测试偏移量

  1. 使用cyclic模式测试
  2. 可能需要多次发送(Tenda设备的常见问题)
  3. 确定偏移量为176字节

4.2 计算libc基址

  1. puts函数下断点获取其地址
  2. 计算:
    libc_base = puts_address - 0x35CD4
    

4.3 ARM架构关键知识

  1. 寄存器用途:

    • r0: 传递函数第一个参数
    • r3: 通用寄存器
    • pc: 程序计数器
  2. CPSR的T位:

    • 决定CPU执行模式
    • T=0: ARM指令(4字节对齐)
    • T=1: Thumb指令(2字节对齐)
    • 跳转到Thumb指令时地址需为奇数(如0xdeadbeef | 1)

4.4 ROP链构造

  1. gadget1:

    • r3传入system
    • pc传入gadget2
  2. gadget2:

    • ROP链最后添加/bin/sh字符串
    • sp指向/bin/sh字符串
    • sp赋给r0(第一个参数)
    • r3system地址
    • 最终执行system("/bin/sh")

5. POC构造

(具体POC代码略,参考原文中的成功利用示例)

6. 总结

  1. Tenda系列产品的栈溢出漏洞具有通用性
  2. 关键点在于:
    • 环境搭建与修复
    • 函数调用流程分析
    • 可控输入点定位
    • ARM架构下的ROP构造技巧
  3. 类似漏洞可参考Tenda AC9(CVE-2018-18708)的分析

7. 扩展学习

  1. 其他Tenda设备漏洞复现
  2. ARM架构下的漏洞利用技术
  3. 嵌入式设备固件分析方法
  4. QEMU仿真与调试技巧
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分离固件: 2.3 QEMU仿真准备 将 qemu-arm-static 复制到 squashfs-root 目录 运行测试: 2.4 环境修复 网络检查函数patch : 修改相关函数为 mov r3,#1 绕过网络检查 替换httpd并修改权限 页面显示问题 : 将 webroot_ro 重命名为 webroot 解决页面无法显示问题 3. 漏洞分析 3.1 函数调用流程 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 函数下断点获取其地址 计算: 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") 5. POC构造 (具体POC代码略,参考原文中的成功利用示例) 6. 总结 Tenda系列产品的栈溢出漏洞具有通用性 关键点在于: 环境搭建与修复 函数调用流程分析 可控输入点定位 ARM架构下的ROP构造技巧 类似漏洞可参考Tenda AC9(CVE-2018-18708)的分析 7. 扩展学习 其他Tenda设备漏洞复现 ARM架构下的漏洞利用技术 嵌入式设备固件分析方法 QEMU仿真与调试技巧