深色模式
应急响应预案:被入侵了怎么办
摘要:被入侵时最怕乱操作毁掉证据、也怕不敢操作让损失扩大。本文给出六阶段处置流程,含可复制的取证命令、隔离手法和"绝对不能做的事"。
适用环境
bash
cat /etc/os-release
command -v ss lsof ps netstat 2>/dev/null
command -v auditctl ausearch && auditctl -s | head -2
systemctl is-active rsyslog1
2
3
4
2
3
4
建议提前准备一个应急响应工具包(静态编译的 busybox、lsof、ss),因为系统命令可能已被替换。
操作步骤
阶段 0:准备(平时就要做)
- 值班表与升级路径(谁决策隔离、谁对外沟通)。
- 资产清单、网络拓扑、日志中心地址。
- 快照/备份可用性与恢复演练记录。
- 离线保存的 AIDE 基线与应急工具包。
阶段 1:识别 —— 确认是不是真出事了
常见信号:
bash
# 异常登录
last -n 20; lastb | head -10
grep -i "Accepted password\|Accepted publickey" /var/log/secure 2>/dev/null | tail -10
# 异常进程与连接
ps auxf | head -40
ss -lntup; ss -tnp | grep ESTAB | head -20
lsof -i -nP | head -20
# 异常计划任务与启动项
crontab -l -u root; ls -la /etc/cron.d/ /var/spool/cron/
systemctl list-unit-files --state=enabled | grep -v "@" | head -30
# 异常账号
awk -F: '$3==0 {print $1}' /etc/passwd
awk -F: '$2=="" {print $1}' /etc/shadow1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
CPU 异常(挖矿特征):
bash
top -bn1 | head -15
ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head -151
2
2
阶段 2:遏制 —— 先止血,但别毁证据
不要直接关机或重装系统
关机丢失内存中的进程与连接信息,重装销毁磁盘证据。除非业务必须立刻中断,否则先做隔离与取证。
隔离手段(按影响从轻到重):
bash
# 1) 网络层隔离:只保留取证通道
nft add rule inet filter input ip saddr <取证机IP> accept
nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }' 2>/dev/null
# 更稳妥:在交换机/云安全组上把该主机摘除
# 2) 阻断可疑外连
ss -tnp | grep ESTAB | grep -E ':(4444|6666|8080|9001)'
nft add rule inet filter output ip daddr <C2_IP> drop
# 3) 停止恶意进程(先记录再杀)
ps -eo pid,ppid,user,cmd | grep -i "xmrig\|minerd\|bash -i" | head
kill -STOP <pid> # 先 STOP 而不是 -9,保留内存可用于取证1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
修改口令与密钥要按正确顺序
先改密钥/口令再清理后门,否则攻击者可能重新进来。同时全量轮换:SSH key、数据库口令、应用 token。
阶段 3:取证 —— 记录,不要改写
bash
mkdir -p /tmp/ir-$(date +%F)
cd /tmp/ir-$(date +%F)
ps auxf > ps.txt
ss -lntup > netstat.txt
lsof -i -nP > lsof-net.txt
last -n 50 > last.txt
crontab -l -u root > crontab-root.txt 2>/dev/null
systemctl list-unit-files --state=enabled > units.txt
cp -a /var/log/secure /var/log/messages ./ 2>/dev/null
ausearch --start this-week > audit-week.txt 2>/dev/null1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
内存与磁盘镜像(条件允许时):
bash
# 进程内存转储(需安装对应工具)
gcore -o /tmp/ir/core <pid> 2>/dev/null
# 磁盘镜像建议整机快照,不要在运行的系统上 dd 单分区1
2
3
2
3
计算关键文件哈希,与离线基线比对:
bash
aide --check > aide-check.txt 2>/dev/null
rpm -Va 2>/dev/null | head -40 > rpm-verify.txt # Debian: dpkg -V1
2
2
阶段 4:根除 —— 清除入侵路径
- 删除后门账号、计划任务、启动项、恶意 systemd unit。
- 修复被利用的漏洞(打补丁、改配置、收权限)。
- 全量轮换凭据:SSH key、数据库口令、API token、证书私钥。
- 检查横向移动痕迹:该主机能连通的其他机器是否也有相同登录记录。
bash
grep -rIn "可疑关键字" /var/www /opt 2>/dev/null | head -20
find / -xdev -newermt "入侵时间起点" -type f 2>/dev/null | head -401
2
2
用文件时间线缩小范围:
bash
find /etc /usr/bin /opt -xdev -newer /etc/hostname -type f -ls 2>/dev/null | head -301
阶段 5:恢复 —— 优先重建而不是"清理"
更可靠的做法是从干净镜像重建主机,再从可信备份恢复数据:
bash
# 1) 确认备份时间点在入侵之前
restic -r /backup/restic-repo snapshots | tail -5
# 2) 恢复到隔离环境验证
restic -r /backup/restic-repo restore latest --target /tmp/restore-check
# 3) 重建主机 → 恢复数据 → 打齐补丁 → 重建基线
aide --init && mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz1
2
3
4
5
6
2
3
4
5
6
阶段 6:复盘 —— 写时间线,改流程
时间线模板字段:时间(精确到分钟)、事件、来源(哪条日志)、处置动作、负责人。
必须回答:
- 入口是什么(漏洞/弱口令/泄露凭据)?
- 检测延迟多久(入侵时间 → 发现时间)?为什么这么久?
- 处置延迟多久?卡在哪个环节?
- 哪些措施本可以阻止或提前发现?
验证
bash
# 处置后确认清单
awk -F: '$3==0 {print $1}' /etc/passwd # 仅 root
crontab -l -u root | wc -l
ss -tnp | grep ESTAB | wc -l # 无可疑外连
aide --check | grep -c "Changed\|Added" # 应趋近 0
journalctl -u sshd --since "1 day ago" | grep -c "Failed password"
# 重建基线
aide --update && mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
判定标准:时间线文档完整;入口已封堵;凭据已全部轮换;基线已重建;改进项有责任人与期限。
常见坑
第一时间关机或重装,证据全毁
无法复盘就无法改进。除非业务连续性要求,否则先隔离 + 取证。
只杀进程不找入口
后门还在、凭据未换,攻击者随时回来。必须找到并封堵入口。
用被感染主机上的命令做取证
ps/ls 可能被 rootkit 替换。使用静态编译的可信工具或从只读介质启动。
忘记检查横向移动
只修一台机器,其他机器已被渗透却不知道。要查该主机的出向连接与其他机器的登录记录。
复盘写成追责大会
复盘目的是改进流程与技术,追责氛围会让真实信息被隐瞒。