
Linux向け永続化検出・ハンティング・アーティファクト収集スクリプト
persisthunt.sh は、標的を絞った永続化関連アーティファクトを収集し、Linux の永続化テクニックに一般的に関連する疑わしいパターンを強調表示することで、調査を迅速化します。
このスクリプトは、よく知られた Linux の永続化メカニズム全体にわたって、永続化の検出、脅威ハンティング、アーティファクト収集を支援します。結果は、信頼度と重大度に基づいて High、Low、Informational の3つのレベルに分類されます。例としては、/tmp/、/home/、/dev/tcp、curl を参照する疑わしい自動実行エントリ、またはアクティブな bind/reverse shell の検出が含まれます。
これは、検出ロジックやキーワードを追加・削除することで、防御担当者が各自の環境に合わせてカスタマイズできる柔軟な基盤として設計されています。出力は大きくなる可能性があり、環境固有の分析が必要になる場合がありますが、LLM や AI エージェントを使用したレビューや要約にも適しています。
root ユーザーとして実行し、出力をファイルにリダイレクトします
sudo persisthunt.sh > output.log
SSH 経由でリモートホスト上で実行します
ssh [email protected] 'bash -s' < persisthunt.sh > output.log 2>&1
=== [HIGH] Active reverse shell ===
bob 3889906 0.0 0.0 2800 1848 pts/2 S+ 06:38 0:00 sh -i
=== [HIGH] Active bind shell ===
LISTEN 0 1 0.0.0.0:4444 0.0.0.0:* users:(("python3",pid=3891687,fd=3))
bob 3891687 0.7 0.3 19540 12320 pts/3 S+ 06:41 0:00 python3 -c exec("""import socket as s,subprocess as sp;s1=s.socket(s.AF_INET,s.SOCK_STREAM);s1.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR, 1);s1.bind(("0.0.0.0",4444));s1.listen(1);c,a=s1.accept(); while True: d=c.recv(1024).decode();p=sp.Popen(d,shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE);c.sendall(p.stdout.read()+p.stderr.read())""")
=== [HIGH] eBPF programs with raw network sockets (possible BPFdoor persistence) ===
PID: 3903559, Executable: bpfdoorpoc, Stack trace: /proc/3903559/stack:[<0>] packet_recvmsg+0x6e/0x5c0
=== [LOW] Recent ELF binary in tmp/home/hidden dirs ===
/var/tmp/.test
| Confidence | Technique | Description |
|---|
| High | AT ジョブの永続化 | 正当な 'at' ジョブはまれです。 /var/spool/at 内の予期しないエントリは非常に疑わしいです。 |
| High | 不審なキーワードを参照する Cron エントリ | curl/wget/nc/ncat/socat や /tmp, /var/tmp, /dev/shm, /home, または隠しファイルなどのパスを参照する Cron ファイル。 |
| High | アクティブな bind shell | ネットワークソケットで待ち受けている (bind shell) インタープリタプロセス (bash/sh/zsh/dash/ksh/python*/perl/nc/ncat/socat) を検出します。 |
| High | アクティブな reverse shell | 標準入力と標準出力がソケットにリダイレクトされているプロセスを検出し、reverse shell を示します。 |
| High | eBPF 生ネットワークソケットを使用した永続化 | BPFdoor などのルートキットは、永続的なバックドアのために生ネットワークソケットを持つ eBPF プログラムを使用します。 続きを読む |
| High | 不審なキーワードを参照する Systemd サービス/タイマー | systemd パス配下の .service および .timer ファイル (~/.config/systemd/user/ 配下のユーザーユニットを含む) を不審なキーワードについて検索します。 |
| High | 不審なキーワードを参照する Init/rc.local/profile スクリプト | 永続化パス内で不審なキーワードやネットワーク/ツールを参照する Init スクリプトおよび rc.local/profile ファイル。 |
| High | 不審なキーワードを参照する MOTD スクリプト | 不審なキーワードまたは永続化ツールを参照する MOTD スクリプト。 |
| High | 不審なキーワードを参照するシェルプロファイル | 不審なコマンドやパスを含むシェルプロファイル (/etc/profile, /etc/profile.d, ~/.bashrc, ~/.profile, など)。 |
| High | 不審なキーワードを参照する D-BUS サービスファイル | 不審なキーワードを参照するパス */dbus-1/* 内の D-BUS サービスファイル |
| High | 不審なキーワードを参照する NetworkManager ディスパッチャスクリプト | 不審なキーワードを参照するパス */NetworkManager/dispatcher.d/* 内の NetworkManager ディスパッチャスクリプト |
| High | tmp/home/隠しディレクトリ内の隠し ELF 実行ファイル | /tmp, /var/tmp, /home, /dev/shm 内の隠しドットファイル (ドットで始まる名前) で ELF 実行ファイルであるもの。 |
| High | 実行中のプロセス | 不審なキーワードを参照する実行中のプロセス |
| High | SUID/SGID/ワールドライタブル ELF バイナリ | SUID または SGID ビットが設定されたワールドライタブルなファイルで、ELF バイナリであるもの (特権昇格/バックドアの可能性)。 |
| High | /proc で検出された隠しプロセス (rootkit の可能性) | /proc の PID を列挙し、ps の出力と比較して、rootkit (例: Diamorphine) によって隠されたプロセスを特定します。攻撃者が PID を隠すために ps をバックドアする方法に関するメモも含まれます。 |
| High | bind マウントトリックによる隠しプロセス | /proc/ の上にバインドするマウント (例: mount -o bind mydir /proc/1234) を検出します。これにより ps からプロセスエントリを隠すことができます。 |
| High | システム全体に構成された LD_PRELOAD | rootkit が永続化のために悪用する可能性がある /etc/ld.so.preload の存在または変更。 |
| Low | ケイパビリティを持つファイル | getcap から POSIX ケイパビリティが設定されたシステム上のファイル — 信頼度は低いですが、確認する価値があります。 |
| Low | tmp/home/隠しディレクトリ内の最近の ELF バイナリ | /tmp, /var/tmp, /dev/shm, /home 内で最近 (7 日以内) に変更または作成された実行可能な ELF バイナリ — 信頼度の低い指標。 |
| Low | Git 設定またはフックファイル | サンプル以外の git 設定またはフックファイル (例: .git/config または .git/hooks/*) で、永続化に悪用される可能性があるもの。 |
| Low | APT フック | APT フックは永続化のために悪用される可能性があります。 |
| Low | Yum/DNF プラグイン | 不審なキーワードを参照する Yum/DNF プラグイン |
| Low | 不審な内容を含む .pth ファイル (Python の永続化) | import, os.system, exec() などの実行されるインポートや呼び出しを含む .pth ファイル。これらは Python モジュールのインポート時に実行されます。 |
| Low | udev ルール | RUN キーを持つ udev ルール (永続化の可能性) |
| Low | PAM モジュール | pam_exec を参照する PAM モジュール。永続化に悪用される可能性があります。 |
| Low | システムバイナリのハイジャック | /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin/ 内の最近変更されたバイナリファイル |
| Informational | すべての cron エントリ (手動レビュー) | すべての cron 関連ファイルとその (コメント以外の) 内容を出力し、手動でレビューします。 |
| Informational | すべてのシェルプロファイル (手動レビュー) | すべてのシステムおよびユーザーのシェルプロファイルファイルの内容を出力し、手動で検査します。 |
| Informational | すべての init.d および rc.local スクリプト (手動レビュー) | init.d および rc.local スクリプトを出力し、手動で検査します。 |
| Informational | すべての MOTD ファイル (手動レビュー) | MOTD および update-motd.d のスクリプト/ファイルを出力し、手動でレビューします。 |
| Informational | 最近 (7 日間) の ELF バイナリ (手動レビュー) | 最近の実行可能な ELF ファイル (7 日間) を一覧表示し、手動でレビューします。 |
| Informational | ホームディレクトリ内のすべてのドットファイルを一覧表示 (手動レビュー) | ユーザーのホームディレクトリ内のドットファイルを列挙し、手動でレビューします。 |
| Informational | ホームディレクトリ内の SSH 認証鍵 (手動レビュー) | /root および /home 内の空でない authorized_keys ファイルを出力し、手動で検査します。 |
| Informational | ローカルユーザーとグループ (手動レビュー) | getent を使用してローカルユーザーとグループを一覧表示し、手動でレビューします。 |
| Informational | マウント (手動レビュー) | 現在のマウントを出力し、手動で検査します。 |
| Informational | アクティブなネットワーク接続 (手動レビュー) | アクティブなネットワーク接続 (ss -tunap) を表示し、手動でレビューします。 |
| Informational | Systemd サービス (手動レビュー) | 実行中の systemd サービスを一覧表示します (systemctl list-units --type=service --state=running)。 |
| Informational | D-BUS サービスファイル (手動レビュー) | dbus-1 ディレクトリ配下の D-BUS サービスファイルを検索してレビューします。 |
| Informational | NetworkManager ディスパッチャスクリプト | NetworkManager-dispatcher はネットワーク変更時にスクリプトを実行します。NetworkManager 配下の dispatcher.d 実行可能スクリプトを確認して、永続化の可能性を調べます。 |
| Informational | コンテナイメージと実行中のコンテナ | Docker、Podman、Containerd を使用してすべてのコンテナイメージと実行中のコンテナを一覧表示します。 |
| Informational | インストール済みパッケージ | dpkg/rpm/dnf を使用してすべてのインストール済みパッケージを一覧表示します。 |
| Informational | ロードされたカーネルモジュール | ロードされたすべてのカーネルモジュールを一覧表示します。 |