適用范圍
適用于 Linux 3.10+ 生產環境,發現 load 高但用戶態 CPU 接近 0 % 的場景。
1. 現場凍結
目標:在 rootkit 干預前保存易失數據。
#!/bin/bash
# freeze.sh
TS=$(date +%s)
mkdir -p /srv/ir/${TS}
cd /srv/ir/${TS}# 1.1 進程樹(busybox 靜態單文件,繞過 LD_PRELOAD)
curl -sLo bb https://busybox.net/downloads/binaries/1.36.1-x86_64-linux-musl/busybox
chmod +x bb
./bb ps -eo pid,ppid,cmd,pcpu,stat --sort=-pcpu > ps.txt# 1.2 內核調度器原始視圖
cat /proc/sched_debug > sched.txt# 1.3 打開文件表(含 deleted)
lsof +L1 > lsof_deleted.txt
運行:
sudo bash freeze.sh
輸出目錄 /srv/ir/<timestamp>/
打包后拉走離線分析。
2. 隱形進程定位
2.1 比對法
#!/usr/bin/env python3
# hidden_pid.py
import os, re, globproc_pids = {int(p) for p in glob.glob('/proc/[0-9]*')}
sched_pids = set()
with open('/proc/sched_debug') as f:sched_pids = {int(m.group(1)) for m in re.finditer(r'pid\s+:\s+(\d+)', f.read())}hidden = sched_pids - proc_pids
print("Hidden PIDs:", hidden)
執行:
python3 hidden_pid.py
若有輸出,則繼續 2.2。
2.2 提取樣本
PID=<hidden_pid>
cp /proc/$PID/exe /srv/ir/${TS}/pid_${PID}.elf
strings /srv/ir/${TS}/pid_${PID}.elf | grep -i 'stratum\|xmrig'
若命中關鍵字,可定性為挖礦木馬。
3. 網絡側交叉驗證
使用 eBPF 無需抓完整 PCAP,僅統計外聯端口與字節數。
// conn_count.c (clang + libbpf)
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>struct {__uint(type, BPF_MAP_TYPE_HASH);__type(key, __u32); // daddr__type(value, __u64); // bytes__uint(max_entries, 1024);
} ipv4_tx SEC(".maps");SEC("tracepoint/syscalls/sys_enter_write")
int trace_write(struct trace_event_raw_sys_enter *ctx) {__u32 fd = ctx->args[0];struct sock *sk = ...; // 省略 sk 獲取邏輯if (!sk || sk->__sk_common.skc_family != AF_INET) return 0;__u32 daddr = sk->__sk_common.skc_daddr;__u64 *bytes = bpf_map_lookup_elem(&ipv4_tx, &daddr);__u64 len = ctx->args[2];if (bytes) *bytes += len;else bpf_map_update_elem(&ipv4_tx, &daddr, &len, BPF_ANY);return 0;
}
char LICENSE[] SEC("license") = "GPL";
編譯 & 運行:
clang -O2 -target bpf -c conn_count.c -o conn_count.o
sudo bpftool prog load conn_count.o /sys/fs/bpf/conn_count
sudo bpftool prog attach tracepoint /sys/kernel/debug/tracing/events/syscalls/sys_enter_write conn_count
sleep 30
sudo bpftool map dump name ipv4_tx
若出現大量流量涌向已知礦池網段,證據鏈完整。
4. 止血與恢復
步驟 | 動作 | 備注 |
---|---|---|
4.1 | 從旁路接入清洗中心 | 將 0.0.0.0/0 → TCP/443 流量牽引至第三方高防 Anycast 清洗;源站僅接受清洗中心回源網段 |
4.2 | 本地進程 kill | kill -9 <hidden_pid> 后立即 echo f > /proc/sysrq-trigger 強制釋放已刪除文件句柄 |
4.3 | 內核完整性校驗 | apt install debsums && debsums -cs 失敗包重新安裝 |
4.4 | 重啟 | 確認 /var/log/syslog 無 ima: error 后單用戶模式重啟 |
5. 參考架構
- 邊緣接入層:Anycast + 七層 WAF + Bot 管理
- 源站側:僅開放 22/443 回源白名單,SSH 端口改為 922 并通過隧道訪問
- 日志:清洗中心提供 JSON 格式原始日志,直接對接 SIEM,減少自建 ELK 節點數量