论坛首页 漏洞分析研究区 阅读主题

[原创]Tenda堆栈缓冲区溢出漏洞 (CVE-2024-2986)

203 浏览 3 回复
#1 楼主 2026-06-01 21:09:04
CNVD 最近公开了 CNVD-2025-31165 (CVE-2024-2986) 漏洞, 漏洞描述为:Tenda FH1202是腾达品牌推出的一款双频无线路由器,专为大户型家庭、小型办公室或商务休闲区域设计,旨在提供稳定的无线网络覆盖和高速传输。
Tenda FH1202存在堆栈缓冲区溢出漏洞,该漏洞源于/goform/SetSpeedWan文件的formSetSpeedWan方法的speed_dir参数未能正确验证输入数据的长度大小,攻击者可利用该漏洞在系统上执行任意代码或者导致拒绝服务。软件版本 : AC15_V15.03.05.19binwalk 分析 Squashfs 的系统文件执行 binwalk -e -1 解压根据 ./etc_ro/init.d/rcS 的脚本来创建环境目录 创建 br0 的虚拟网卡根据 libCfm.so 的 GetValue 函数创建 Unix Domain Socket , 发送信息的格式如下 :创建 Unix Domain Socket /var/cfm_socket 的 uds_server.py 脚本代码如下 :default.ini 是 /webroot/default.cfg 转换的, 唯一的问题是程序客户端代码使用的是长连接的方式, 断开后还需要重启 uds_server.py 程序此外, 还需要模拟 bcm_nvram_* 函数HOOK NVRAM 的代码 hook_nvram.c 如下 :/tmp/nvram_default.cfg 是 /webroot/nvram_default.cfg 复制过来的查看 httpd 的 GCC 版本,使用的是 Buildroot ,C 标准库是 uClibc根据 GITHUB 上的 buildroot 项目, 编译生成支持 ARMv7 + uClibc + soft-float 的 arm-linux-gcc编译命令如下 :生成的 hook_nvram.so ELF 信息文件如下 :主机运行 python ./uds_server.py 创建 ./var/cfm_socketsudo chroot . bin/sh 进入固件目录环境 ,再运行 LD_PRELOAD=/tmp/hook_nvram.so /bin/httpd 开启 HTTP 服务访问 d77K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5&6x3W2)9J5k6e0p5$3z5q4)9J5k6e0y4Q4x3X3f1K6i4K6u0r3L8r3!0Y4K9h3&6Q4x3X3g2Z5N6r3#2D9 页面如下首先查看 httpd 开启的防护如下使用调试模式启动 httpd , 然后在 0x0061998 BL sprintf 的溢出点下断点gdb.txt 的加载脚本如下python ./uds_server.py 重启uds , sudo chroot . qemu-arm-static -g 1234 -E LD_PRELOAD=/tmp/hook_nvram.so /bin/httpd 调试模式启动 , 然后 gdb-multiarch -x gdb.txt 程序就断在了 _start 开始处然后使用 cyclic 生成测试字符串 , 使用 PYTHON POC 脚本的 HTTP 协议进行发送程序正常断在 sprintf@plt 函数处查看目的地址 0x407ff9f8 正常情况下的栈数据sprintf 后的栈数据如下单步运行到函数的结束处可以看到最后是 r11 0x407ffa34 ◂— 0x61616a61 ('ajaa') 的数据被弹出到 PC 寄存器偏移地址为 35 处如果调用 system 函数, 需要首先设置 R0 的值指向需要执行的命令地址但是 system 的函数汇编代码如下system 运行结束后 ,弹出到 PC 寄存器的是 LR 的值 ,如果不控制 LR 的值程序就会崩溃,现在需要找一个 BL system 的指令来自动设置 LR 的值libcommon.so 中的 doSystemCmd 函数正好符合, 然后 flush_dns_cache 的调用 doSystemCmd 代码如下这段代码非常符合参数的设置,首先设置 R3 的地址指向需要执行的命令 telnetd -l /bin/sh让弹出到 PC 寄存器的地址指向 libc.so.0 的 _exit 函数使用 ROPgadget 查找设置 R3 值的指令选取 0x00015c20 作为设置 R3 值的指令结合 vmmap 和 info sharedlibrary 计算 libcommon.so 的基址为 0x40854000 , libc.so.0 的基址为 0x409EB000栈的数据结构如下开启 telnetd 服务还需要挂载 devpts , 不然程序会提示 telnetd: can't find free pty运行 POC 后查看运行的进程信息telnet 192.168.3.3 进行测试POC 代码如下int __fastcall formSetSpeedWan(_DWORD *a1)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289669.htm
#2 2026-06-01 21:09:04
看起来还是比较简单的漏洞,没想到现在还有这种
#3 2026-06-01 21:09:04
N1nE


看起来还是比较简单的漏洞,没想到现在还有这种

包有的,目前路由器的对抗并不是这一系列的环境搭建或者是固件检测,patch掉关键逻辑都可以跑起来,挖漏洞分析漏洞相对是比较简单的,难点在于固件加密,要么纯手撕算法,要么买一台设备芯片提取。这一款固件没有加密直接binwalk梭哈拿到文件系统
#4 2026-06-01 21:09:04
腾达还是算比较知名的,居然还出这种漏洞

请登录后参与讨论

立即登录 注册账号