raj3shp/persisthunt

GitHub: raj3shp/persisthunt

一个用于Linux系统持久化检测、狩猎和取证收集的Bash脚本工具。

Stars: 24 | Forks: 1

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