第14天 — 我构建了 ProcWatch:Linux 进程安全扫描器,用于取证与事件响应
I’m happy to translate the article for you, but I don’t have the article’s text available. Could you please paste the content you’d like translated (excluding the source line you’ve already provided)? Once I have the text, I’ll translate it into Simplified Chinese while preserving all formatting, markdown, and code blocks.
当这个工具变得必要的那一刻
如果你曾经解过 Linux 取证 CTF,你一定熟悉以下仪式:
-
SSH 登录到机器。
-
一切看起来都很正常。
-
然后你注意到:
- CPU 使用率异常
- 有网络流量
- 日志对不上
于是你开始进行古老的仪式:
ps aux | grep -v grep
netstat -tulnp
ls -la /tmp
cat /proc/<pid>/cmdline
你滚动查看。你猜测。你重新运行命令。在那 200 多个进程中,总会有一个反向 shell、一个投放器,或是一个加密矿工……而你正手动玩 “寻找瓦尔多:事件响应版”。
在一次挑战中,我花了 40 分钟去寻找隐藏在 /dev/shm 中的 shell,随后我意识到:
我并不是在解决网络安全问题。
我在解决一个 可视性 问题。
于是我构建了一个工具。这个工具就是 ProcWatch。
ProcWatch 实际是什么
ProcWatch 是一个基于 Python 的 进程行为扫描器。
- 不是 杀毒软件。
- 不是 特征检测。
它提出了一个不同的问题:
系统上的任何进程是否表现得像攻击者一样?
它不检查文件,而是监视真实入侵中使用的 进程行为模式。
威胁模型
在编写检测规则之前,我先梳理了攻击者在获取 Linux 访问权限后通常的行为:
| 阶段 | 攻击者的行为 |
|---|---|
| 立足点 | 在 /tmp 或 /dev/shm 中投放二进制文件 |
| 控制 | 生成反向 shell |
| 提权 | 滥用 SUID 或 LD_PRELOAD |
| 持久化 | 通过解释器运行脚本 |
| 变现 | 安装加密货币挖矿程序 |
| 规避 | 执行后删除二进制文件 |
每个 ProcWatch 检测都直接对应上述某个阶段。
Detection 1 — Executing from Writable Directories (CRITICAL)
SUSPICIOUS_LOCATIONS = [
"/tmp",
"/dev/shm",
"/var/tmp",
"/run/user",
"/dev/mqueue",
]
恶意软件喜欢可写目录,因为:
- 无需额外权限
- 很少被监控
- 易于清理
/dev/shm 尤其值得关注。它是基于 RAM 的存储;重启机器后证据会消失。正规软件几乎从不在此目录运行。
如果你看到:
/dev/shm/hidden_binary
你并没有找到一个程序——你找到了攻击者。
Detection 2 — 可疑解释器使用
SUSPICIOUS_NAMES = ["bash", "sh", "nc", "python", "perl", "ruby", "socat"]
单独来看这没有任何意义,但若结合位置或网络活动就会变得强大。
python3进程是正常的。- 在
/tmp中的python3进程连接到 4444 端口则不正常。
这被称为 living‑off‑the‑land:攻击者使用合法工具,从而无需上传恶意软件。
Detection 3 — 权限提升指示器
if uids.real != uids.effective:
# SUID privilege escalation in action
Linux 进程有 real UID(真实用户 ID)和 effective UID(有效用户 ID)。如果它们不同,就捕获到了权限提升事件。
更可疑的是:
root process running from /home/user
Root 进程应位于 /usr/bin,而不是用户的 Downloads 文件夹。
检测 4 — 反向Shell 与 C2 检测
SUSPICIOUS_PORTS = [4444, 5555, 7777, 31337]
这些端口是反向 shell 和 C2 监听的经典端口。
ProcWatch 将情况区分为:
- LISTEN → 可疑
- ESTABLISHED outbound connection → 几乎可以确定已被妥协
一个进程向外连接到 4444 端口,基本上就是在举旗示意:“有人在控制我”。
检测 5 — 加密矿工检测
关键字检测
MINER_KEYWORDS = ["xmrig", "monero", "stratum", "pool"]
行为检测
if cpu_usage > 85: # percent
# possible miner
为什么这很重要:现代攻击者通常不会破坏系统;他们会将其变现。许多真实的泄露是因为服务器突然 24/7 运行在 100 % CPU 时被发现的。
检测 6 — 已删除可执行文件技巧
攻击者通常会:
- 运行恶意软件
- 删除文件
Linux 会在内存中保持进程存活,因此文件从磁盘上消失,但仍在执行。
内核提示:
/proc/<pid>/exe -> binary (deleted)
ProcWatch 正好可以检测到这一点。甚至可以恢复二进制文件:
cp /proc/<pid>/exe recovered_binary
这是真正的取证技术。
检测 7 — LD_PRELOAD 注入(高级)
LD_PRELOAD=/tmp/libevil.so
与其投放完整的二进制文件,攻击者会加载一个恶意库来拦截系统调用,以实现:
- 隐藏文件
- 窃取密码
- 伪造身份验证
这正是许多用户空间 rootkit 的工作方式。捕获此类行为几乎总是意味着已确认的妥协。
命令行界面
我把这个工具设计成类似 git 的使用方式:
procwatch scan # 一次性扫描
procwatch scan -v -j # 详细的 JSON 输出
procwatch watch # 实时监控
procwatch info # 查看进程详情
procwatch list # 列出所有已跟踪的进程
最有用的模式
procwatch watch
它仅在出现 新的可疑进程 时发出警报,为您提供攻击者活动的实时信息流。它的体验出奇地接近真实的 SOC 监控控制台。
这在CTF中的帮助
登录后立即:
procwatch scan -j
现在你拥有系统进程状态的带时间戳快照,能够在几秒钟内而不是几分钟内发现恶意进程。
调查 200 个进程?您只需查看 3
这可以把 45 分钟的挑战缩短到 5 分钟。
限制
- 该工具通过
/proc在用户空间运行,因此 无法检测内核根套件。如果内核本身在撒谎,ProcWatch 也会相信它。 - 某些解释器警报是误报。
- 容器通过命名空间隐藏进程。
我正在考虑的未来升级
- YARA 内存扫描
- eBPF 系统调用监控
- ptrace 检测
运行它
pip install psutil
sudo python3 procwatch.py scan -v
截图
(Root 提供对环境变量和连接的完整可视性。)
我学到的
- 攻击者不会隐藏文件。
- 他们将行为隐藏在普通进程中。
行为更难伪造。
ProcWatch 并不能取代调查——它只是把手电筒直接照向你应该开始寻找的地方。

