曝ZBTLink路由器出厂设置藏双后门,无需密码直接获取Root权限
原创
suntiger
suntiger
二进制空间安全
2026年8月31日 17:05
北京
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
将二进制空间安全设为\"星标⭐️\"
第一时间收到文章更新
技术背景
2026年8月27日,漏洞情报机构VulnCheck公开了深圳智博通电子(ZBT)多款路由器固件中的两套出厂后门,分别命名为SPEAKINGSTONE与DARKLANTERN,均可在无身份验证的情况下让远程攻击者以Root权限执行命令。
VulnCheck在2026年8月18日至21日对公网扫描,发现203台设备上的DARKLANTERN后门直接暴露在UDP 9992端口,分布22个国家,涉及16种自报型号。与此同时,研究人员注册了SPEAKINGSTONE备用域名www.findmyipaddr.com并搭建蜜罐服务器,截至8月21日收到392台设备的定期上报,其中390台位于中国,304个WiFi名称以CMCC开头,363台为同一型号L3\_V2\_8、固件3.0.0.4.528,最长一台已连续上报近两年。
漏洞原理
两套后门由同一个名为inetdetect的网络连通性看门狗进程拉起,均用Nim语言编写,使用UDP协议,但工作方式相反。SPEAKINGSTONE以系统服务yunmgrd运行,主动向外联UDP 10000端口发送设备指纹,包括型号、固件版本、MAC地址、WiFi名称、局域网IP、运行时长,部分型号还带GPS坐标。默认指挥服务器域名ac-link.com,解析到阿里云深圳节点47.107.224.89,与ENDLESSDOORS使用的地址相同。SPEAKINGSTONE还支持8类远程指令:执行任意命令、读取PPPoE宽带账号密码、写入DNS劫持列表、开关反向SSH隧道、更换备用C2地址等。
DARKLANTERN以infosrvd服务运行,在WAN侧监听UDP 9992,出厂防火墙规则显式允许来自互联网的入站访问。协议内部称revProto,分信息探测包和命令包两类。探测包固定19字节,设备收到后向来源的UDP 8897端口返回明文设备信息。命令包携带Shell字符串,经system(\"/etc/exec/cmd \" + payload)直接执行;校验令牌为md5(\"mqonu.com\" + payload)末4字节的十六进制,密钥写死在固件里;MAC地址校验看似严格,但全零MAC会被当作合法而放行。
攻击细节
DARKLANTERN的攻击链短而粗暴,适合在互联网上批量扫描。攻击者向目标UDP 9992发送19字节探测包,无需握手即可收到型号、MAC、SSID、公网IP。构造命令包时,用硬编码盐值mqonu.com计算MD5校验,MAC字段填六个零字节绕过过滤,Payload里用分号截断固定前缀即可注入任意Shell。VulnCheck扫描仪在4天内确认203个公网实例,型号从WE826-T2到WG3526等16种,说明这不是单一批次的失误,而是跨产品线固件级植入。
SPEAKINGSTONE的攻击面更偏向长期潜伏与数据收集。设备每间隔一段时间向C2发送注册信标(msgType 0x1001),攻击者若处于网络路径上(同一运营商、被劫持的DNS、伪造的C2),即可下发0x2507命令执行Shell、0x2502读取宽带凭证、0x230b写入DNS劫持。出站信标仅做单字节XOR混淆,入站命令完全明文,设备无法确认服务器真伪。备用域名findmyipaddr.com在固件里被拆成字符串片段隐藏,域名过期未续费时,任何注册者都能接管大量未配置主C2的设备,VulnCheck实测392台上报即证明这一点。
修复方案
先看机身或管理界面里的MAC地址是否以78:A3:51开头。再查品牌是否命中WiFlyer、Zbtlink、Deep Orange、KuWFi、Cioswi、CroSkylink等已知贴牌。有公网IP的设备,可在隔离环境用VulnCheck公开的Python脚本对UDP 9992发探测包,有符合格式的回应则高度可疑。企业网络侧可监控出站UDP 10000和DNS查询ac-link.com、findmyipaddr.com。
以下代码来自VulnCheck博客,可在已隔离的测试机上对单个IP做无害探测,仅发送信息查询包,不发送命令包:
#!/usr/bin/env python3\"\"\"Minimal DARKLANTERN scanner — VulnCheck PoC\"\"\"
import socketimport sys
# info probe: type 0x16, wildcard Allmac (all zeros), 1-byte dummy payload \"x\"PROBE = bytes.fromhex(\"0c161f00000000000000000000000000010078\")
def scan(host, port=9992, timeout=6): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(timeout) # infosrvd replies to :8897, not our source port — bind explicitly sock.bind((\"\", 8897)) try: sock.sendto(PROBE, (host, port)) data, _ = sock.recvfrom(1024) except socket.timeout: return None finally: sock.close()
if len(data) < 4 or data[:3] != b\"\\x0c\\x16\\x1f\": return None
fields = data[3:].decode(\"ascii\", errors=\"replace\").split(\";\") if len(fields) < 3: return None
return {\"model\": fields[0], \"firmware\": fields[1], \"mac\": fields[2]}
if __name__ == \"__main__\": if len(sys.argv) != 2: print(f\"usage: {sys.argv[0]} <host>\", file=sys.stderr) sys.exit(1)
result = scan(sys.argv[1]) if result: print(f\"[VULN] {sys.argv[1]} — model={result['model']} fw={result['firmware']} mac={result['mac']}\") else: print(f\"[SAFE] {sys.argv[1]} — no infosrvd response\")
运行环境:Python 3.6及以上,无需额外依赖。用法示例:python3 darklantern_scan.py 203.0.113.10。仅在获得授权的目标上使用;探测包本身不执行命令,但确认响应意味着目标存在未授权远程管理接口,应视为已失陷边缘设备处理。
企业采购场景应把硬件来源写入验收清单,要求供应商提供固件SBOM或至少制造商与编译版本,对边缘4G/LTE设备做入网前UDP端口扫描与MAC前缀比对。家庭用户若无法确认来源,最省心的做法是直接换主流品牌消费级路由,避免把来源不明的白盒设备放在财务、监控、NAS同一局域网。
(全文完)
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论