主机沦陷后,你需要在黄金时间内完成三件事:确认入侵面、阻断攻击链、提取 IOC。以下是一套可直接上手的标准化排查流程。
前言
应急响应的核心原则只有三条:
- 先收集,后分析,最后清除
- 每一步记录发现,形成时间线
- 排查优先级:账户 → 进程/网络 → 持久化 → 文件 → 日志
动手之前,先过决策树,确认操作范围、操作系统、当前权限,不要跳过这一步。
一、初始响应决策
主机疑似被入侵?
├─ 1. 确认事件范围
│ ├─ 单台主机 → 直接排查
│ └─ 多台/不明 → 先网络隔离,再逐台排查
├─ 2. 判断操作系统
│ ├─ Linux → Phase 2
│ ├─ macOS → Phase 3
│ └─ Windows → Phase 4
├─ 3. 确认当前权限
│ ├─ root/Administrator → 可完整排查
│ └─ 普通用户 → 先提权或协调管理员权限
└─ 4. 保全证据
├─ 内存快照(如有条件)
├─ 磁盘镜像(关键服务器)
└─ 记录当前时间戳,后续所有发现标注时间
二、Linux 排查
2.1 账户审计
# 发现特权用户(uid=0 应只有 root)
awk -F: '$3==0{print $1}' /etc/passwd
# 发现可远程登录账户
awk'/\$1|\$6/{print $1}' /etc/shadow
# 发现 sudo 权限异常
grep-v"^#\|^$" /etc/sudoers |grep"ALL=(ALL)"
cat /etc/sudoers.d/*
# 发现 SSH 公钥后门
find / -name"authorized_keys"-execls-la{}\;-execcat{}\;
# 查看最近登录记录
lastlog; last; lastb
高风险判定:
2.2 进程与网络
# 异常网络连接
netstat-antlp|grep-E"ESTABLISHED|LISTEN"
ss -antlp
# 根据 PID 定位进程
ls-la /proc/<PID>/exe
cat /proc/<PID>/cmdline
ls-la /proc/<PID>/fd
# 资源占用异常(挖矿检测)
ps aux --sort=-%cpu |head-20
ps aux --sort=-%mem |head-20
# 隐藏进程检测
ps-ef|grep-E"^\S+\s+\d+.*\[.*\]"|grep-v"\[kworker"
三个高度可疑信号:
- 外连非业务 IP 的 ESTABLISHED 连接 → C2 通信
- 进程可执行文件在
/tmp、/dev/shm、/var/tmp → 恶意程序 /proc/PID/exe -> (deleted)
2.3 启动项与计划任务
# 全用户 crontab 扫描
foruserin$(cut-f1 -d: /etc/passwd);do
crontab-l-u$user2>/dev/null &&echo"=== $user ==="
done
cat /etc/crontab
ls-la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.monthly/ /etc/cron.weekly/
# systemd 服务(关注近期修改)
systemctl list-unit-files --type=service |grep enabled
find /etc/systemd/system/ /usr/lib/systemd/system/ -name"*.service"-mtime-7
# bashrc/profile 植入检测
grep-r"curl\|wget\|python\|bash -i\|/dev/tcp" /etc/profile* /etc/bashrc /root/.bashrc /home/*/.bashrc 2>/dev/null
2.4 文件系统排查
# 近期修改文件
find / -mtime-3-type f -not-path"/proc/*"-not-path"/sys/*"|head-100
# SUID/SGID 提权后门
find / -perm-4000-type f 2>/dev/null
find / -perm-2000-type f 2>/dev/null
# 临时目录及隐藏文件
ls-la /tmp/ /var/tmp/ /dev/shm/
find / -name".. "-o-name"..."-o-name".hidden"2>/dev/null
# WebShell 检测
find /var/www/ -name"*.php"-mtime-7
grep-rl"eval\|system\|exec\|passthru\|shell_exec\|base64_decode" /var/www/ 2>/dev/null
# 时间戳篡改检测
stat<可疑文件># 对比 Modify 和 Change 时间
2.5 日志分析
| | |
|---|
/var/log/auth.log | | grep "Accepted|Failed" |
/var/log/wtmp | | last -f /var/log/wtmp |
/var/log/btmp | | lastb -f /var/log/btmp |
/var/log/messages | | grep -i "error|fail" |
# 暴力破解检测
grep"Failed password" /var/log/auth.log |awk'{print $(NF-3)}'|sort|uniq-c|sort-rn|head-20
# 成功登录排查(关注非常规 IP 和时段)
grep"Accepted" /var/log/auth.log |awk'{print $1,$2,$3,$9,$11}'
# 提权行为检测
grep"sudo:" /var/log/auth.log |grep-v"session opened\|session closed"
2.6 Rootkit 检测
# 工具检测
chkrootkit
rkhunter --check--sk
# 手动检测(工具被篡改时的兜底方案)
md5sum /usr/bin/ps /usr/bin/netstat /usr/bin/ls /usr/bin/find /usr/bin/top
echo$LD_PRELOAD
cat /etc/ld.so.preload
lsmod |grep-v"^Module"
三、macOS 排查
macOS 基于 XNU 内核,排查工具链与 Linux 差异显著:launchd 替代 systemd,统一日志替代 syslog,plist 文件定义持久化。
3.1 账户审计
# 当前登录会话
who; w; last
# 列出所有本地用户(UID >= 500 为普通用户)
dscl . list /Users |grep-v"^_"
dscl .read /Users/<username> UniqueID PrimaryGroupID NFSHomeDirectory UserShell
# 管理员组成员
dscl .read /Groups/admin GroupMembership
dscl .read /Groups/admin GroupMembers
# UID 0 的非 root 用户
dscl . list /Users UniqueID |awk'$2 == "0" {print $1}'
# 近期创建的用户
dscl . list /Users |whileread user;do
create_date=$(dscl .read /Users/$user accountPolicyData 2>/dev/null |grep-o'creationTime":[0-9]*'|cut -d: -f2)
[-n"$create_date"]&&echo"$user created: $(date-r$((create_date/1000)) '+%Y-%m-%d %H:%M:%S')"
done
# SSH 公钥后门
foruserin$(dscl . list /Users |grep-v"^_");do
home=$(dscl .read /Users/$user NFSHomeDirectory 2>/dev/null |awk'{print $2}')
[-f"$home/.ssh/authorized_keys"]&&echo"=== $user ==="&&cat"$home/.ssh/authorized_keys"
done
3.2 进程与网络
# 网络连接和监听端口
lsof-i-P-n|grep-E"ESTABLISHED|LISTEN"
sudolsof-iTCP-sTCP:LISTEN-P-n
# 资源占用排序
top-l1-n20-stats pid,cpu,mem,command -o cpu
top-l1-n20-stats pid,cpu,mem,command -o mem
# 非标准路径进程检测
forpidin$(ps-eo pid);do
exe=$(ps-ocommand=-p $pid 2>/dev/null |head-1)
echo"$pid: $exe"
done|grep-E"/tmp/|/var/tmp/|/dev/|/private/var/|/Users/.*/Downloads/"
# 进程可执行文件删除检测
forpidin$(ps-eo pid);do
exe=$(lsof-p $pid 2>/dev/null |grep txt |head-1|awk'{print $NF}')
[-f"$exe"]||echo"PID $pid: executable missing/deleted -> $exe"
done
# 代理配置检查(流量劫持检测)
networksetup -getwebproxy Wi-Fi
networksetup -getsecurewebproxy Wi-Fi
scutil --proxy
3.3 启动项与持久化
macOS 持久化核心:launchd。SIP 状态决定持久化点的可信度。
# LaunchDaemons(开机即启,root 权限)
ls-la /Library/LaunchDaemons/
find /Library/LaunchDaemons/ -name"*.plist"-mtime-7
# LaunchAgents(用户登录后启动)
ls-la /Library/LaunchAgents/
ls-la ~/Library/LaunchAgents/ # ← 不受 SIP 保护,最高风险
# 所有用户的 LaunchAgents
foruserin$(dscl . list /Users |grep-v"^_");do
home=$(dscl .read /Users/$user NFSHomeDirectory 2>/dev/null |awk'{print $2}')
[-d"$home/Library/LaunchAgents"]&&["$(ls-A"$home/Library/LaunchAgents")"]&&echo"=== $user ==="&&ls-la"$home/Library/LaunchAgents"
done
# 非 Apple launchd 服务
launchctl list |grep-v"com.apple"
# 登录项
sudo osascript -e'tell application "System Events" to get the name of every login item'
# 内核扩展
kextstat |grep-v com.apple
ls-la /Library/Extensions/
# 安全状态
csrutil status # SIP 关闭 → 系统可被修改
spctl --status# Gatekeeper 状态
3.4 日志分析
macOS 统一日志(Unified Logging)命令:
# 系统登录日志
log show --predicate'process == "sshd_keyagent" OR process == "authorizationhost"'--info--last 7d --style compact
# 登录/认证事件
log show --predicate'process == "opendirectoryd" AND eventMessage CONTAINS "auth"'--last 7d
# sudo 使用记录
log show --predicate'process == "sudo"'--last 7d
# 安全事件(XProtect、Gatekeeper 拦截)
log show --predicate'eventMessage CONTAINS "malware" OR eventMessage CONTAINS "blocked"'--last 7d
# 可疑进程执行
log show --predicate'eventMessage CONTAINS "Killed" OR eventMessage CONTAINS "crash"'--last 7d
KnowledgeC 数据库(行为取证):
sqlite3 ~/Library/Application\ Support/Knowledge/knowledgeC.db \
"SELECT datetime(ZOBJECT.ZSTARTDATE+978307200,'unixepoch'), ZOBJECT.ZVALUESTRING, ZOBJECT.ZSTREAMNAME FROM ZOBJECT WHERE ZSTREAMNAME LIKE '%app%' ORDER BY ZSTARTDATE DESC LIMIT 20;"2>/dev/null
关键日志源:
| | |
|---|
| log show --predicate | |
| /var/log/install.log | |
| /Library/Logs/DiagnosticReports/ | |
| ~/Library/Application Support/Knowledge/knowledgeC.db | |
3.5 Rootkit 检测
# 安全基线
csrutil status # 应为 "enabled"
system_profiler SPiBridgeDataType |grep"Secure Boot"
# 非 Apple 内核扩展
kextstat |grep-v com.apple
ls-la /Library/Extensions/
# DYLD 注入检测
grep-i"DYLD_INSERT_LIBRARIES\|LD_PRELOAD" ~/.zshrc ~/.bashrc 2>/dev/null
# 开源检测工具
# KnockKnock: https://github.com/synack/knockknock
# BlockBlock: https://github.com/objective-see/BlockBlock
四、Windows 排查
4.1 账户审计
:: 当前登录会话
query user
:: 用户和管理员组
net user
net localgroup administrators
:: 隐藏账户检测(末尾带 $ 或 SID 异常)
wmic useraccount list full
wmic useraccount get name,sid
:: 踢出可疑会话
logoff <SessionID>
辅助工具: D盾(检测隐藏账户和克隆账户)。
4.2 进程与网络
:: 网络连接
netstat -ano | findstr "ESTABLISHED LISTENING"
:: 根据 PID 查进程
tasklist /FI "PID eq <PID>" /V
wmic process where processid=<PID> get name,executablepath,commandline
:: 全进程列表
wmic process get name,processid,executablepath,commandline /format:list
:: 代理配置检查
REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
:: 路由表
route print
高风险信号:
- 可执行文件路径在
%TEMP%、%APPDATA%、Downloads 下 - 进程名模仿系统进程但路径不在
C:\Windows\System32
4.3 启动项与服务
:: 注册表启动项
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
REG QUERY "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"
:: 计划任务
schtasks /query /fo LIST /v
:: 启动文件夹
dir "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
dir "%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup"
:: 服务
wmic service get name,displayname,pathname,startmode | findstr /i "auto"
重点关注: Run/RunOnce 中指向临时目录的项、执行 PowerShell/cmd /c/mshta 的计划任务、Unquoted Service Path 漏洞。
4.4 文件系统排查
:: 最近访问文件
dir %USERPROFILE%\Recent /a /o:-d
:: 临时目录
dir %TEMP% /a /o:-d
dir %SYSTEMROOT%\Temp /a /o:-d
:: 浏览器下载目录
dir "%USERPROFILE%\Downloads" /a /o:-d
:: 回收站
dir C:\$Recycle.Bin /s /a
:: 备用数据流检测(ADS,可隐藏恶意代码)
dir /r <可疑目录>
:: 预取文件(可还原程序执行历史,即使文件已被删除)
dir C:\Windows\Prefetch\
4.5 日志分析
打开事件查看器:eventvwr.msc
关键 Event ID 速查表:
登录类型参考: 2 交互登录、3 网络登录(PsExec)、4 批处理、5 服务、7 解锁、10 RDP 远程桌面。
PowerShell 查询:
# 登录失败 IP 排行
Get-WinEvent-FilterHashtable @{LogName='Security';ID=4625}|
Select-Object TimeCreated,@{N='IP';E={$_.Properties[19].Value}}|
Group-Object IP |Sort-Object Count -Descending
# 新建用户事件
Get-WinEvent-FilterHashtable @{LogName='Security';ID=4720}|
Format-List TimeCreated,Message
五、溯源与加固
5.1 时间线重建
收集所有发现 → 按时间排序 → 构建攻击链:
1. 初始入侵时间点(最早的异常记录)
2. 攻击路径(如何从入口扩展)
3. 持久化手段(留了哪些后门)
4. 数据泄露(是否有大量数据外传)
5.2 IOC 提取
5.3 加固建议
立即措施:
- 清除攻击者植入的持久化机制(计划任务、服务、启动项、SSH 密钥)
长期加固:
- macOS 专有:确保 SIP 开启、Gatekeeper 启用、FileVault 加密,定期检查 LaunchAgents 和 LaunchDaemons
关键注意事项
- 排查过程中不要重启服务器/工作站
- macOS 统一日志在重启后仍可查询(
log show --last),但 log stream 实时流会中断 - 不要直接删除可疑文件
- 如果怀疑系统命令被替换(Rootkit),使用静态编译的 busybox 或从可信源拷贝工具
- macOS 上
/usr/bin/lsof 等系统工具也可能被篡改——优先使用 kextstat、launchctl 等底层工具 - 日志可能被攻击者清除或篡改——多源交叉验证(系统日志 + 网络设备日志 + 应用日志)
- KnowledgeC 数据库在 macOS 10.15+ 可能加密