persisthunt.sh 通过收集与持久化相关的定向取证工件并高亮常见于 Linux 持久化技术的可疑模式,帮助加快调查速度。
该脚本协助检测持久化、威胁狩猎,并针对广为人知的 Linux 持久化机制收集工件。检测结果根据置信度和严重性分为三个级别 - 高、低 和 参考信息。示例包括引用 /tmp/、/home/、/dev/tcp、curl 的可疑自启动条目,或检测到活跃的绑定/反向 shell。
它被设计为一个灵活的基座,防御者可根据自身环境添加或删除检测逻辑和关键字来定制。输出可能很大,且可能需要结合具体环境进行分析,但也适合使用 LLM 或 AI 代理进行审查和总结。
以 root 用户运行并将输出重定向到文件
sudo persisthunt.sh > output.log
通过 SSH 在远程主机上运行
ssh [email protected] 'bash -s' < persisthunt.sh > output.log 2>&1
=== [HIGH] 活跃的反向 shell ===
bob 3889906 0.0 0.0 2800 1848 pts/2 S+ 06:38 0:00 sh -i
=== [HIGH] 活跃的绑定 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 程序(可能存在 BPFdoor 持久化) ===
PID: 3903559, Executable: bpfdoorpoc, Stack trace: /proc/3903559/stack:[<0>] packet_recvmsg+0x6e/0x5c0
=== [LOW] tmp/home/hidden 目录中的近期 ELF 二进制文件 ===
/var/tmp/.test
| 置信度 | 技术 | 描述 |
|---|
| 高 | AT 作业持久化 | 合法的 'at' 作业并不常见;/var/spool/at 中的意外条目高度可疑。 |
| 高 | 引用可疑关键字的 Cron 条目 | 引用 curl/wget/nc/ncat/socat 或 /tmp、/var/tmp、/dev/shm、/home 及隐藏文件等路径的 Cron 文件。 |
| 高 | 活跃的绑定 shell | 检测正在网络套接字上监听的解释器进程(bash/sh/zsh/dash/ksh/python*/perl/nc/ncat/socat)(绑定 shell)。 |
| 高 | 活跃的反向 shell | 检测标准输入和标准输出被重定向到套接字的进程,这表明存在反向 shell。 |
| 高 | 使用 eBPF 原始网络套接字进行持久化 | BPFdoor 等 Rootkit 使用带原始网络套接字的 eBPF 程序作为持久化后门。了解更多 |
| 高 | 引用可疑关键字的 systemd 服务/定时器 | 搜索 systemd 路径(包括 ~/.config/systemd/user/ 下的用户单元)中的 .service 和 .timer 文件,查找可疑关键字。 |
| 高 | 引用可疑关键字的 Init/rc.local/profile 脚本 | 引用可疑关键字或持久化路径中的网络/工具的 Init 脚本和 rc.local/profile 文件。 |
| 高 | 引用可疑关键字的 MOTD 脚本 | 引用可疑关键字或持久化工具的 MOTD 脚本。 |
| 高 | 引用可疑关键字的 Shell profile | 包含可疑命令或路径的 Shell profile(/etc/profile、/etc/profile.d、 |
| 高 | 引用可疑关键字的 D-BUS 服务文件 | 在路径 */dbus-1/* 下找到的引用可疑关键字的 D-BUS 服务文件 |
| 高 | 引用可疑关键字的 NetworkManager dispatcher 脚本 | 在路径 */NetworkManager/dispatcher.d/* 下找到的引用可疑关键字的 NetworkManager dispatcher 脚本 |
| 高 | tmp/home/hidden 目录中的隐藏 ELF 可执行文件 | /tmp、/var/tmp、/home、/dev/shm 中名称以点开头的隐藏点文件,且为 ELF 可执行文件。 |
| 高 | 正在运行的进程 | 引用可疑关键字的正在运行的进程 |
| 高 | SUID/SGID/全局可写的 ELF 二进制文件 | 设置了 SUID 或 SGID 位且为 ELF 二进制的全局可写文件(潜在的特权提升/后门)。 |
| 高 | 在 /proc 中检测到隐藏进程(可能的 rootkit) | 枚举 /proc 中的 PID 并与 ps 输出比较,以发现被 rootkit(例如 Diamorphine)隐藏的进程;包括攻击者如何通过后门化 ps 来隐藏 PID 的说明。 |
| 高 | 使用 bind mount 技巧隐藏进程 | 检测覆盖 /proc/ 的挂载(例如 mount -o bind mydir /proc/1234),这可能会向 ps 隐藏进程条目。 |
| 高 | 系统级配置 LD_PRELOAD | /etc/ld.so.preload 的存在或被修改,该文件可能被 rootkit 滥用以实现持久化。 |
| 低 | 具有 capabilities 的文件 | 系统上设置了 POSIX capabilities 的文件(来自 getcap)——置信度较低的指标,但值得检查。 |
| 低 | tmp/home/hidden 目录中的近期 ELF 二进制文件 | /tmp、/var/tmp、/dev/shm、/home 中最近修改或创建的可执行 ELF 二进制文件(7 天内)——置信度较低的指标。 |
| 低 | Git 配置或 hooks 文件 | 非示例的 git 配置或 hooks 文件(例如 .git/config 或 .git/hooks/*),这些文件可能被滥用进行持久化。 |
| 低 | APT Hooks | APT Hooks 可能被滥用进行持久化。 |
| 低 | Yum/DNF 插件 | 引用可疑关键字的 Yum/DNF 插件 |
| 低 | 内容可疑的 .pth 文件(Python 持久化) | 包含已执行的导入或调用(如 import、os.system、exec())的 .pth 文件,这些代码会在 Python 模块导入时运行。 |
| 低 | udev 规则 | 带有 RUN 键的 Udev 规则(可能的持久化) |
| 低 | PAM 模块 | 引用 pam_exec 的 PAM 模块,这可能被滥用进行持久化 |
| 低 | 劫持系统二进制文件 | /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin/ 中最近修改的二进制文件 |
| 参考信息 | 所有 cron 条目(人工审查) | 打印所有与 cron 相关的文件及其(非注释)内容以供人工审查。 |
| 参考信息 | 所有 shell profile(人工审查) | 打印所有系统级和用户级 shell profile 文件的内容以供人工检查。 |
| 参考信息 | 所有 init.d 和 rc.local 脚本(人工审查) | 打印 init.d 和 rc.local 脚本以供人工检查。 |
| 参考信息 | 所有 MOTD 文件(人工审查) | 打印 MOTD 和 update-motd.d 脚本/文件以供人工审查。 |
| 参考信息 | 近期(7 天)ELF 二进制文件(人工审查) | 列出近期(7 天内)可执行的 ELF 文件以供人工审查。 |
| 参考信息 | 列出主目录中的所有点文件(人工审查) | 枚举用户主目录中的点文件以供人工审查。 |
| 参考信息 | 主目录中的 SSH authorized keys(人工审查) | 打印 /root 和 /home 中非空的 authorized_keys 文件以供人工检查。 |
| 参考信息 | 本地用户和组(人工审查) | 通过 getent 列出本地用户和组以供人工审查。 |
| 参考信息 | 挂载信息(人工审查) | 打印当前挂载信息以供人工检查。 |
| 参考信息 | 活跃的网络连接(人工审查) | 显示活跃的网络连接(ss -tunap)以供人工审查。 |
| 参考信息 | systemd 服务(人工审查) | 列出正在运行的 systemd 服务(systemctl list-units --type=service --state=running)。 |
| 参考信息 | D-BUS 服务文件(人工审查) | 查找 dbus-1 目录下的 D-BUS 服务文件以供审查。 |
| 参考信息 | NetworkManager dispatcher 脚本 | NetworkManager-dispatcher 会在网络变化时运行脚本;检查 NetworkManager 下 dispatcher.d 中的可执行脚本,以发现潜在的持久化。 |
| 参考信息 | 容器镜像和正在运行的容器 | 使用 Docker、Podman 和 Containerd 列出所有容器镜像和正在运行的容器 |
| 参考信息 | 已安装的软件包 | 使用 dpkg/rpm/dnf 列出所有已安装的软件包 |
| 参考信息 | 已加载的内核模块 | 列出所有已加载的内核模块 |