
针对 Linux 服务器的加密货币挖矿程序检测、清除与加固工具包。
基于真实事件响应构建——可检测使用 Rootkit 技术隐藏于
ps、top、htop和btop之外的挖矿程序。
git clone https://gitlab.com/abdom.seada/security-checks.git
cd security-checks
sudo bash setup.sh
🔀 分支:
master— 本工具包位于master分支。其他安全脚本未来可能添加在单独的分支上。
⚠️ 克隆后立即运行
setup.sh— 跳过此步骤是导致错误的第一大原因。
sudo bash setup.sh
setup.sh 会自动处理一切:
| 步骤 | 功能 |
|---|---|
| ✅ 权限 | 为 miner-hunter 和所有 lib/*.sh 脚本添加 chmod +x |
| ✅ 目录 | 创建 /var/log/miner_hunter/ 和 /var/lib/miner_hunter/(仅 root 可访问,权限 700) |
| ✅ 依赖项 | 检查 perf、mpstat、iptables、fail2ban、bc、strings — 自动安装缺失项 |
| ✅ 自检 | 运行 ./miner-hunter --version 确认一切配置正确 |
设置成功后的预期输出:
✅ 设置完成 — 所有检查均通过!
下一步:
sudo ./miner-hunter scan # 安全只读扫描
sudo ./miner-hunter full # 扫描 → 清除 → 加固
💡 为什么需要此步骤? Linux 不会执行没有
+x标记的文件。Git 和 SCP 传输会剥离此标记。setup.sh一次性修复所有文件——包括主脚本依赖的lib/模块。
sudo ./miner-hunter scan # ✅ 安全 — 只读,零更改
sudo ./miner-hunter full # ⚠️ 完整流程:扫描 → 清除 → 加固
sudo ./miner-hunter scan --dry-run # 👁️ 预览模式 — 显示将要执行的操作
| 命令 | 描述 | 是否更改系统? |
|---|---|---|
scan | 完整检测扫描 — 隐藏进程、CPU、网络、持久化 | ✅ 否 |
kill | 清除识别出的挖矿程序、封禁矿池 IP、移除残留 | ⚠️ 是 |
harden | 事件后续加固 — SSH、防火墙、监控、完整性基线 | ⚠️ 是 |
full | 运行 scan → kill → harden,每个阶段有确认提示 | ⚠️ 是 |
report | 显示最近的扫描报告 | ✅ 否 |
| 选项 | 描述 |
|---|---|
-d, --dry-run | 预览所有操作而不做任何更改 |
-e, --evidence DIR | 将证据保存到自定义目录,而非 /root/miner_evidence_* |
-h, --help | 显示帮助 |
-v, --version | 显示版本 |
实际场景以及每种情况下的具体操作。
top 什么也没显示"这是典型的 Rootkit 症状。挖矿程序对用户空间工具隐藏,但无法隐藏于硬件性能计数器。
# 步骤 1:先运行安全扫描 — 确认存在什么,再触碰任何东西
sudo ./miner-hunter scan
如果存在挖矿程序,你会看到:
🚨 [严重] CPU 异常:用户 CPU 占用 97% 但 top 显示每个进程最多 2%
🚨 [严重] perf 检测到 4 个隐藏线程,消耗约 94% 的总 CPU
🚨 [严重] 活动连接至 185.x.x.x:9200(已知挖矿端口)
🚨 [严重] 虚假内核线程 PID=3421 名称=[kworker/0:1] 执行文件=/tmp/.x/miner
# 步骤 2:清除挖矿程序并封禁其矿池
sudo ./miner-hunter kill
# 步骤 3:加固服务器,防止它卷土重来
sudo ./miner-hunter harden
你注意到一些可疑情况——异常出站流量、不是你创建的 cron 任务、名称奇怪的进程——但无法确定。
# 运行完整扫描 — 完全安全、只读、零更改
sudo ./miner-hunter scan
# 然后阅读结构化报告
sudo ./miner-hunter report
位于 /root/miner_evidence_*/report.txt 的报告按严重程度对每个发现进行分类:
[严重] 条目 → 立即执行 kill[警告] 条目 → 手动审查后再操作挖矿程序拥有持久化机制——cron 任务、systemd 服务、PM2 条目或 shell 配置文件后门,在你清除后重新生成它。
sudo ./miner-hunter scan
在输出中查找这些内容:
⚠️ [警告] 可疑 cron 条目:* * * * * /tmp/.x/update
🚨 [严重] 恶意 systemd 服务:/etc/systemd/system/update-check.service
🚨 [严重] PM2 进程 'app-worker' 已重启 8432 次 — 可能是挖矿程序重生循环
🚨 [严重] 在 /root/.bashrc 中检测到 Shell 配置文件后门
# kill 会移除所有持久化残留 — 不仅仅是正在运行的进程
sudo ./miner-hunter kill
# 然后运行 harden 安装监控,这样如果有任何东西重生,你都会收到警报
sudo ./miner-hunter harden
💡 执行
kill后,监控 cron 每 5 分钟运行一次并记录到/var/log/miner_hunter/watchdog_alerts.log— 如果有东西回来,你会立即知道。
主动加固,无需部署或清除挖矿程序,只是锁定系统。
# 单独运行 harden — 无需扫描或清除
sudo ./miner-hunter harden
这将:
sshd 监禁/usr/bin 完整性基线(MD5 校验和——以便以后检测被篡改的二进制文件)执行 kill 后,验证步骤报告挖矿程序可能仍在运行:
⚠️ 挖矿程序可能已重生
CPU:89% | 挖矿连接数:1
防火墙封锁已生效——挖矿程序无法连接矿池
建议重启或重装操作系统
# 1. 防火墙封锁已生效——挖矿程序无法连接其矿池
# 确认封锁是否激活:
iptables -L OUTPUT -n | grep DROP
# 2. 运行二次扫描,看看哪些残留了
sudo ./miner-hunter scan
# 3. 检查是否有内核模块 Rootkit 隐藏进程
lsmod | grep -iE 'diamorphine|reptile|kovid|rootkit'
# 4. 非零污染值 = 加载了外部内核模块(Rootkit 指示器)
cat /proc/sys/kernel/tainted
如果内核污染值非零或出现已知的 Rootkit 模块——挖矿程序已拥有内核级控制权。此时最安全的做法是从已知干净的快照完全重装操作系统。
执行 harden 后,监控 cron 已安装。以下是如何操作:
# 实时查看警报日志
tail -f /var/log/miner_hunter/watchdog_alerts.log
# 确认监控 cron 任务已注册
cat /etc/cron.d/miner-watchdog
# 检查从基线建立后 /usr/bin 二进制文件是否有变化
md5sum --check /var/lib/miner_hunter/usrbin_baseline.md5 --quiet
最后一个命令的任何输出意味着系统二进制文件在基线之后被修改——立即调查。
| 技术 | 捕捉的内容 |
|---|---|
/proc 与 ps 比较 | 对用户空间工具不可见的进程 |
| LD_PRELOAD 劫持 | 恶意共享库挂接 libc 以隐藏进程 |
| 内核模块 Rootkit | Diamorphine、Reptile、Kovid 及其他已知 Rootkit |
| 虚假内核线程 | 伪装为 [kworker]、[kthreadd]、[kswapd] 的挖矿程序 |
| 被篡改的系统二进制文件 | 被替换的 ps、top、ls、ss、netstat |
| 技术 | 捕捉的内容 |
|---|---|
perf 硬件 PMC 性能分析 | 隐藏的 CPU 消耗者——Rootkit 无法伪造硬件计数器 |
/proc 增量采样 | 每个 PID 的直接内核级 CPU 记账 |
| CPU 异常检测 | 高 %user CPU 且无可解释的可见进程 |
| 技术 | 捕捉的内容 |
|---|---|
直接读取 /proc/net/tcp | 活动连接——绕过被挂接的 ss/netstat |
| 挖矿端口检测 | 端口 3333、4444、5555、7777、9200、14433、14444、45560 |
| 挖矿域名解析 | 解析已知矿池域名并与活动连接交叉检查 |
| 套接字到 PID 映射 | 追溯每个挖矿连接属于哪个进程 |
| 位置 | 检查内容 |
|---|---|
| Cron | /etc/cron*、/var/spool/cron/、所有用户 crontab |
| Systemd | 所有单元文件和定时器中的可疑条目 |
| Udev 规则 | 设备事件触发的硬件级执行 |
| PM2 | Node.js 进程管理器条目中极端重启次数 |
| Shell 配置文件 | .bashrc、.bash_profile、/etc/profile、/etc/profile.d/* |
| SSH | 所有用户的 authorized_keys 文件 |
| WebShell | Node.js 项目目录中的 PHP 文件 |
| XMRig 配置 | 常见挖矿程序投放位置的 config.json |
当你运行 sudo ./miner-hunter kill 时,这是确切顺序:
DROP 规则,这样即使挖矿程序重生也无法重新连接SIGKILL 杀死 TGID(线程组组长 PID)perf 并检查 /proc/net/tcp 以确认 CPU 下降且连接已消失| 操作 | 详情 |
|---|---|
| 防火墙持久化 | Systemd 服务,在每次重启后恢复 iptables 挖矿封锁规则 |
| SSH 审计 | 检查 PermitRootLogin、PasswordAuthentication、MaxAuthTries — 打印推荐值 |
| Fail2ban 检查 | 验证 sshd 监禁是否激活,并报告当前被封禁的 IP |
| 挖矿监控 | 每 5 分钟的 cron 任务 — 检查 CPU 异常、LD_PRELOAD、挖矿端口、PHP WebShell |
/usr/bin 基线 | 对 /usr/bin 中所有二进制文件进行 MD5 校验和,用于未来的篡改检测 |
security-checks/ ← 仓库根目录(master 分支)
├── miner-hunter # 入口点 — 实际运行的文件
├── setup.sh # ⚙️ 首次设置 — 克隆后运行一次
├── lib/
│ ├── common.sh # 共享工具:日志、颜色、辅助函数
│ ├── detect_hidden.sh # 隐藏进程与 Rootkit 检测
│ ├── detect_cpu.sh # 通过 perf 和 /proc 进行 CPU 性能分析
│ ├── detect_network.sh # 矿池连接检测
│ ├── detect_persistence.sh # 持久化机制检测
│ ├── kill_miner.sh # 进程杀死与残留移除
│ └── harden.sh # 事后加固
├── README.md
└── LICENSE
| 要求 | 详情 |
|---|---|
| 操作系统 | Linux — 已在 Ubuntu 24.04 LTS、Debian 13 上测试 |
| 权限 | 必须以 root 身份运行(sudo) |
| 由 setup.sh 自动安装 | perf、mpstat(sysstat)、bc、strings(binutils) |
| 推荐安装 | fail2ban — 缺失时会标记,但不会自动安装 |
| 必需(不会自动安装) | iptables — 执行 kill/harden 阶段时必须存在 |
每次运行都会生成:
| 输出 | 位置 | 内容 |
|---|---|---|
| 证据目录 | /root/miner_evidence_YYYYMMDD_HHMMSS/ | 捕获的二进制文件、perf 报告、挖矿配置 |
| 日志文件 | /var/log/miner_hunter/run_YYYYMMDD_HHMMSS.log | 完整时间戳的运行日志 |
| 报告 | evidence_dir/report.txt | 结构化发现摘要,带有严重级别 |
| 监控警报 | /var/log/miner_hunter/watchdog_alerts.log | harden 后的持续警报 |
| 完整性基线 | /var/lib/miner_hunter/usrbin_baseline.md5 | harden 后的 /usr/bin 校验和 |
本工具是在应对一个加密货币挖矿程序的实际事件响应过程中构建的,该挖矿程序:
next 以混入 Node.js 服务器上的 Next.js 进程kthreadd 的线程组组长——这是一个实际的内核线程名称/proc/PID/exe → (已删除))ps、top、htop 和 btop 不可见perf 硬件 CPU 计数器性能分析被检测到MIT