
GNU/Linux 上での USB イベントの履歴追跡
usbrip(「USB Ripper」に由来、USB R.I.P.ではありません)は、Linuxマシン上でUSBデバイスのアーティファクト(USBイベント履歴)を追跡できるシンプルなフォレンジックツールで、コマンドラインインターフェースを備えています。
目次:
usbrip は、Linuxのログデータ(journalctlの出力、または /var/log/syslog*(あるいは /var/log/messages*)ファイルの内容)を解析する小さなソフトウェアです。収集されたデータに基づいて、usbrip は以下の列を持つUSBイベント履歴テーブルを構築できます。
さらに、以下の機能もあります。
方法1. pipでインストール:
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
方法2. install.sh で最先端バージョンをインストール(推奨、追加機能あり):
~$ sudo apt install python3-venv p7zip-full -y
~$ git clone https://github.com/snovvcrash/usbrip && cd usbrip
~/usbrip$ sudo -H installers/install.sh
~/usbrip$ cd
~$ usbrip -h

Docker(*デモのみ!*)
~$ docker run --rm -it snovvcrash/usbrip
usbrip はシステムログファイル内で解析する2種類のタイムスタンプをサポートしています。
"%b %d %H:%M:%S"、例 "Jan 1 00:00:00")。このタイムスタンプは年情報を提供しません。"%Y-%m-%dT%H:%M:%S.%f%z"、例 "1970-01-01T00:00:00.000000-00:00")。journalctl がインストールされていれば、タイムスタンプを自動変換できるため心配はありません。それ以外の場合、望ましい syslog 構造は rsyslog 設定で RSYSLOG_FileFormat 形式を設定することで実現できます。
/etc/rsyslog.conf の次の行をコメントアウト:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf ファイルを追加:~$ echo '$ActionFileDefaultTemplate RSYSLOG_FileFormat' | sudo tee /etc/rsyslog.d/usbrip.conf
~$ sudo rm -f /var/log/syslog* /var/log/messages*
~$ sudo systemctl restart rsyslog
usbrip はまず、最も移植性の高いオプションとして journalctl を使用してシステムイベントをダンプできるかどうかを確認します。できない場合は、/var/log/syslog* または /var/log/messages* のシステムログファイルを検索して解析します。
storage モジュールで使用)簡単のため、~/usbrip$ プレフィックスが表示されるすべてのコマンドは、git clone の結果作成される ~/usbrip ディレクトリで実行されるものとします。
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shpip でインストールする以外にも、カスタム installers/install.sh スクリプトを使用して usbrip をインストールできます。
install.sh を使用すると、いくつかの追加機能が利用可能になります。
storage モジュールを使用できます。cron ジョブを設定してUSBイベントを定期的にバックアップできます(cron ジョブの例は usbrip/cron/usbrip.cron にあります)。⚠️ 警告: cron スケジューリングを使用する場合は、sudo crontab -e で crontab を設定して storage update サブモジュールを root として実行するようにしてください。ストレージのパスワードは /var/opt/usbrip/usbrip.ini に保存され、デフォルトでは root のみがアクセスできます。
install.sh で usbrip をインストールするには:
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l スイッチを有効にすると、Python 依存関係は PyPI ではなくローカルの .tar パッケージ(3rdPartyTools ディレクトリ)から解決されます。-s スイッチを有効にすると、usbrip プロジェクトのインストールに加えて、信頼できるUSBデバイスのリスト、履歴および違反ストレージが作成されます。インストール完了後、~/usbrip ディレクトリは削除しても問題ありません。
install.sh でインストールした場合、usbrip は以下のパスを使用します。
/opt/usbrip/ – プロジェクトのメインディレクトリ。/var/opt/usbrip/log/ – usbrip cron ログ。/var/opt/usbrip/storage/ – USBイベントストレージ(インストール中に作成される history.7z と violations.7z)。/var/opt/usbrip/trusted/ – 信頼できるUSBデバイスのリスト(インストール中に作成される auth.json)。/var/opt/usbrip/usbrip.ini – usbrip 設定ファイル(7-Zipストレージのパスワードを含む)。/usr/local/bin/usbrip – /opt/usbrip/venv/bin/usbrip スクリプトへのシンボリックリンク。cron ジョブは次のように設定できます。
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron
uninstall.shinstallers/uninstall.sh スクリプトは、システムから usbrip とすべてのインストールアーティファクトを削除します。
usbrip をアンインストールするには:
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a スイッチを有効にすると、usbrip プロジェクトディレクトリだけでなく、すべてのストレージと usbrip ログも削除されます。cron ジョブを設定していた場合は、忘れずに削除してください。
# ---------- バナー ----------
~$ usbrip banner
usbrip バナーを表示します。
# ---------- イベント ----------
~$ usbrip events history [-t | -l] [-e] [-n <イベント数>] [-d <日付> [<日付> ...]] [--host <ホスト> [<ホスト> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <製品名> [<製品名> ...]] [--manufact <製造元> [<製造元> ...]] [--serial <シリアル番号> [<シリアル番号> ...]] [--port <ポート> [<ポート> ...]] [-c <列名> [<列名> ...]] [-f <ファイル> [<ファイル> ...]] [-q] [--debug]
USBイベント履歴を取得します。
~$ usbrip events open <ダンプファイル.json> [-t | -l] [-e] [-n <イベント数>] [-d <日付> [<日付> ...]] [--host <ホスト> [<ホスト> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <製品名> [<製品名> ...]] [--manufact <製造元> [<製造元> ...]] [--serial <シリアル番号> [<シリアル番号> ...]] [--port <ポート> [<ポート> ...]] [-c <列名> [<列名> ...]] [-q] [--debug]
USBイベントダンプを開きます。
~$ sudo usbrip events genauth <出力auth.json> [-a <属性> [<属性> ...]] [-e] [-n <イベント数>] [-d <日付> [<日付> ...]] [--host <ホスト> [<ホスト> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <製品名> [<製品名> ...]] [--manufact <製造元> [<製造元> ...]] [--serial <シリアル番号> [<シリアル番号> ...]] [--port <ポート> [<ポート> ...]] [-f <ファイル> [<ファイル> ...]] [-q] [--debug]
信頼できる(承認済み)USBデバイスのリストを生成します。
~$ sudo usbrip events violations <入力auth.json> [-a <属性> [<属性> ...]] [-t | -l] [-e] [-n <イベント数>] [-d <日付> [<日付> ...]] [--host <ホスト> [<ホスト> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <製品名> [<製品名> ...]] [--manufact <製造元> [<製造元> ...]] [--serial <シリアル番号> [<シリアル番号> ...]] [--port <ポート> [<ポート> ...]] [-c <列名> [<列名> ...]] [-f <ファイル> [<ファイル> ...]] [-q] [--debug]
信頼できるデバイスのリストに基づいてUSB違反イベントを取得します。
# ---------- ストレージ ----------
~$ sudo usbrip storage list <ストレージタイプ> [-q] [--debug]
選択したストレージの内容を一覧表示します。ストレージタイプは "history" または "violations" です。
~$ sudo usbrip storage open <ストレージタイプ> [-t | -l] [-e] [-n <イベント数>] [-d <日付> [<日付> ...]] [--host <ホスト> [<ホスト> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <製品名> [<製品名> ...]] [--manufact <製造元> [<製造元> ...]] [--serial <シリアル番号> [<シリアル番号> ...]] [--port <ポート> [<ポート> ...]] [-c <列名> [<列名> ...]] [-q] [--debug]
選択したストレージを開きます。EVENTS OPEN サブモジュールと同様に動作します。
~$ sudo usbrip storage update <ストレージタイプ> [入力auth.json] [-a <属性> [<属性> ...]] [-e] [-n <イベント数>] [-d <日付> [<日付> ...]] [--host <ホスト> [<ホスト> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <製品名> [<製品名> ...]] [--manufact <製造元> [<製造元> ...]] [--serial <シリアル番号> [<シリアル番号> ...]] [--port <ポート> [<ポート> ...]] [--lvl <圧縮レベル>] [-q] [--debug]
ストレージを更新します — 既存のストレージにUSBイベントを追加します。圧縮レベルは [0..9] の数値です。
~$ sudo usbrip storage create <ストレージタイプ> [入力auth.json] [-a <属性> [<属性> ...]] [-e] [-n <イベント数>] [-d <日付> [<日付> ...]] [--host <ホスト> [<ホスト> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <製品名> [<製品名> ...]] [--manufact <製造元> [<製造元> ...]] [--serial <シリアル番号> [<シリアル番号> ...]] [--port <ポート> [<ポート> ...]] [--lvl <圧縮レベル>] [-q] [--debug]
ストレージを作成します — 7-Zipアーカイブを作成し、選択したオプションに従ってUSBイベントを追加します。
~$ sudo usbrip storage passwd <ストレージタイプ> [--lvl <圧縮レベル>] [-q] [--debug]
既存のストレージのパスワードを変更します。
# ---------- IDs ----------
~$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
USB IDデータベースから、<VID> や <PID> で特定のUSBデバイスの追加詳細を取得します。
~$ usbrip ids download [-q] [--debug]
USB IDデータベースを更新(ダウンロード)します。
モジュール名の一覧を表示するには:
~$ usbrip -h
特定のモジュールのサブモジュール名の一覧を表示するには:
~$ usbrip <モジュール> -h
特定のサブモジュールのすべてのスイッチの一覧を表示するには:
~$ usbrip <モジュール> <サブモジュール> -h
バナー出力、情報メッセージ、ユーザー操作を抑制し(-q, --quiet)、最新100件のエントリをリスト形式(-l, --list)で全USBデバイスのイベント履歴を表示:
~$ usbrip events history -ql -n 100
外部USBデバイス(-e, --external、実際に切断されたもの)のイベント履歴を、接続日時、VID、PID、切断日時、シリアル番号の列(-c conn vid pid disconn serial)を含むテーブル形式(-t, --table)で表示し、日付(-d '1995-09-15' '2018-07-01')とPID(--pid 1337)でフィルタリングし、ログは外部ファイル(-f /var/log/syslog.1 /var/log/syslog.2.gz)から取得:
~$ usbrip events history -et -c conn vid pid disconn serial -d '1995-09-15' '2018-07-01' --pid 1337 -f /var/log/syslog.1 /var/log/syslog.2.gz
👽 注: フィルタを扱う際には覚えておくべきことがあります。4種類のフィルタリングが利用可能です: 外部USBイベントのみ(簡単に抜き差しできるデバイス、-e)、日付(-d)、フィールド(--host, --vid, --pid, --product, --manufact, --serial, --port)、出力として取得するエントリ数(-n)。異なるフィルタを同時に適用した場合、次の動作になります: 最初に 外部 と 日付 のフィルタが適用され、次に usbrip はこれら2つのフィルタの共通部分から指定されたフィールド値を検索し、最後に -n オプションで定義した数に出力を切り詰めます。つまり、外部 と 日付 フィルタは共通部分、フィールド フィルタは和集合として考えてください。ご理解いただければ幸いです。
全USBデバイスのイベント履歴を構築し、出力をファイルにリダイレクトしてさらに分析。出力ストリームがターミナルstdoutでない場合(| や > など)、出力にANSIエスケープ文字(色)は含まれないので安心して使用できます。また、usbrip は一部のUNICODE記号を使用するため、結果のファイルをUTF-8エンコーディングに変換し(例: enconv)、さらに改行文字をWindows形式に変換して移植性を高める(例: awk)ことをお勧めします:
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 注: 出力をstdoutに既に取得している場合でも、自分でエスケープ文字を除去できます。そのためには出力データを usbrip.out にコピーし、さらに awk の命令を適用します:
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
信頼できるUSBデバイスのリストをJSONファイル(trusted/auth.json)として生成。VIDとPIDの属性を使用し、1984年11月30日に接続された最初の3デバイスを含める:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ 警告: 異なるUSBフラッシュドライブでもシリアル番号が同一になる場合があります。これは製造エラーや、ブラックハットがドライブのメモリチップを書き換えた結果など、様々な理由で発生する可能性があります。いずれにせよ、"安全なシステムはありません"。usbrip は現在、このようなケースをスマートに処理しません。つまり、シリアル番号が同一のデバイスのペアが存在する場合、それらは信頼できるデバイスリストと genauth モジュールに関しては同じデバイスとして扱われます。
外部USBデバイスのイベント履歴から、信頼できるUSBデバイスのリスト(trusted/auth.json)に基づいてPID属性で違反を検索。結果のイベントをホスト名 Bob-PC、製造元 EvilUSBManufacturer、シリアル番号 0123456789 に制限し、出力を接続日時、VID、PIDの列を含むテーブルとして表示:
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
VID(--vid VID)とPID(--pid PID)で特定のUSBデバイスの詳細を検索:
~$ usbrip ids search --vid 0781 --pid 5580
usb.ids データベースの最新バージョンをダウンロード:
~$ usbrip ids download