第14天 — 我构建了 ProcWatch:Linux 进程安全扫描器,用于取证与事件响应

发布: (2026年3月1日 GMT+8 14:17)
8 分钟阅读
原文: Dev.to

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,你一定熟悉以下仪式:

  1. SSH 登录到机器。

  2. 一切看起来都很正常。

  3. 然后你注意到:

    • 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 — 已删除可执行文件技巧

攻击者通常会:

  1. 运行恶意软件
  2. 删除文件

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

截图

ProcWatch screenshot 1

ProcWatch screenshot 2

(Root 提供对环境变量和连接的完整可视性。)

我学到的

  • 攻击者不会隐藏文件。
  • 他们将行为隐藏在普通进程中。

行为更难伪造。

ProcWatch 并不能取代调查——它只是把手电筒直接照向你应该开始寻找的地方。

0 浏览
Back to Blog

相关文章

阅读更多 »