跳转到正文

TP-Link 路由器硬件渗透:利用未鉴权的 UART 调试串口

原文作者:Harsh Srivastava · 许可协议:CC BY 4.0 · 原文链接:https://www.harshsecurity.com/posts/tP-link-router-hardware-hacking-via-uart-console/

每台嵌入式设备的电路板上,几乎都藏着某个调试接口。厂商需要它来在产线上烧录固件、跑诊断——而你往往想不到,同样的接口会原封不动地带进你客厅里那台成品设备。

本文完整记录了我如何仅用万用表,在一台 TP-Link TL-WR845N 路由器上定位到一组未标注、未焊接的 UART 排针焊盘,再接到 USB-TTL 适配器,直接进入无需任何鉴权的 root shell——进而明文读出路由器当前的 Wi-Fi 密码。

没有利用代码,也没有固件漏洞。只要四个焊盘,再加一点耐心。

你需要准备什么

  • 目标设备,已拆开外壳,PCB 暴露在外
  • 数字万用表(导通档 + 直流电压档)
  • 3.3V USB-to-TTL / USB-to-Serial 适配器(不要用 5V)
  • 杜邦线 / 公对母跳线
  • 串口终端——我在 Kali Linux 上使用 picocom
  • 耐心、稳定的手,以及一台你本人拥有或已获授权测试的设备

第一步:锁定可疑排针焊盘

外壳打开后,首先要找的是主 SoC、Flash 芯片附近或板边那一排 3–5 个未焊接的通孔或焊盘——丝印上常见 J1、UART、TP1–TP4 之类标记,有时则完全没有标注。在 TL-WR845N 上,我正好找到了这样的东西:一组靠近主芯片组的 4 针排针焊盘,没有任何丝印标签。

主 SoC 旁边未标注的 4 针排针,几乎就是 VCC、GND、TX、RX 这一标准 UART 四件套的经典特征。剩下的问题只有一个:哪根是哪根——这时就轮到万用表上场了。

第二步:用万用表逐一识别引脚

多数教程会匆匆带过这一步,所以下面按引脚原样写出我当时的做法。

找 GND——导通档

路由器完全断电时,把万用表拨到导通档,一只表笔接到已知接地点,另一只依次点触四个引脚。只有一个引脚蜂鸣,确认与机壳地导通,那就是 GND。

找 VCC——直流电压档

给路由器上电,以 GND 为参考测量其余各脚。有一脚稳定读出 3.3V,且不随时间变化,这就是 VCC。除非明确需要用适配器供电,否则保持 VCC 悬空。

找 TX 与 RX

上电过程中观察剩余两脚:电压快速、不规则跳动的是 TX(主动发送启动日志);电压最平、最安静的就是 RX(排除法得出)。

引脚识别汇总

  • 引脚 1:TX(路由器 → 你)——启动时活跃
  • 引脚 2:RX(你 → 路由器)——空闲平直
  • 引脚 3:GND——与机壳地导通
  • 引脚 4:VCC(3.3V)——上电后稳定

第三步:把 USB-TTL 适配器接到路由器

这一步最容易让人踩坑:TX 接 RX,RX 接 TX,绝不要 TX 对 TX。你要交叉连线,和零调制解调器线一样。

  • 路由器 GND → 适配器 GND
  • 路由器 TX → 适配器 RXD
  • 路由器 RX → 适配器 TXD
  • 路由器 VCC → 保持不接

上电前确认适配器设为 3.3V 逻辑电平,而不是 5V。把 5V 灌进额定 3.3V 的 SoC 引脚可能永久损坏 UART。接线确认后,在 Kali 机器上确认设备已枚举:

CODE
ls /dev/ttyUSB*

打开串口会话

CODE
picocom -b 115200 /dev/ttyUSB0

115200 8N1(8 数据位、无校验、1 停止位)几乎是 MediaTek/Ralink 系 SoC 的通用默认值,一连就通。

我给路由器断电再上电的瞬间,完整启动日志就开始实时刷进终端——bootloader 信息、Flash 分区读取、文件系统挂载、服务启动——设备平时对自己“闭口不谈”的一切都暴露出来。我从未按任何键去打断 bootloader、闯入 U-Boot,或抢启动倒计时。

板子正常启动,Linux 用户空间起来后,就在串口线上把提示符递过来:

CODE
~ #

没有登录提示,没有用户名,没有密码,也没有任何形式的启动打断。只需给路由器上电等几秒,一个可交互的实时 root shell 就会由设备交到你手里。

第五步:确认 root 并取出 Wi-Fi 密码

简单列一下目录,就能确认这是路由器嵌入式 Linux 文件系统上的真正 root shell,而不是 bootloader 菜单:

确认文件系统

CODE
~ # ls web   usr   sbin   mnt   lib   dev   var   sys   proc   linuxrc   etc   bin

接下来,读取当前无线配置文件只需一条命令:

CODE
cat /var/Wireless/RT2860AP/RT2860AP.dat

返回的是路由器整份射频与安全配置——SSID、加密模式,以及当前预共享密钥——全部明文:

CODE
SSID1=TP-Link_Testing AuthMode=WPA2PSK;OPEN EncrypType=AES;NONE WPAPSK1=harshsecurity.com/password

正要紧的是 WPAPSK1:路由器主网络当前使用的 WPA2 预共享密钥。没有试过一个字典词,没有碰过 aircrack-ng,甚至完全没有与无线接口交互。物理 UART 访问让整套 WPA2 握手破解问题变得无关紧要。

为什么会这样

这不是固件漏洞——没有可打补丁的内存破坏或逻辑缺陷。这是一个从未做过的访问控制决策:

  • UART 控制台在零售固件里默认启用,且没有登录提示
  • 没有控制台锁定、超时或物理防拆检测
  • Wi-Fi PSK 及其他敏感配置以明文扁平文件存放,而非加密存储

一旦有了 root shell,设备整套安全模型——WPA2、管理后台鉴权,统统——都失去意义。你并没有在攻击这些机制;你只是在从磁盘上把答案读出来。

给厂商的建议

  • 对量产 UART 接口要求鉴权,或干脆禁用控制台
  • 若因 RMA/售后必须保留串口控制台,应加登录门槛并审计访问
  • 切勿把 PSK、管理员凭据或 API 密钥以明文存放在 Flash 上
  • 量产后不再需要控制台的零售板,可拆除调试排针或用环氧树脂覆盖

全部测试均在本人自有的实验室设备上完成。请勿对你不拥有、或未获明确授权测试的硬件尝试 UART/JTAG 访问。