当前位置:首页>Linux>入侵排查三板斧:Linux / macOS / Windows 三平台应急响应方法论

入侵排查三板斧:Linux / macOS / Windows 三平台应急响应方法论

  • 2026-09-10 21:53:58
入侵排查三板斧:Linux / macOS / Windows 三平台应急响应方法论
主机沦陷后,你需要在黄金时间内完成三件事:确认入侵面、阻断攻击链、提取 IOC。以下是一套可直接上手的标准化排查流程。

前言

应急响应的核心原则只有三条:

  1. 先收集,后分析,最后清除
    ——排查过程中不删除任何可疑文件
  2. 每一步记录发现,形成时间线
    ——事后溯源的全部依据
  3. 排查优先级:账户 → 进程/网络 → 持久化 → 文件 → 日志

动手之前,先过决策树,确认操作范围、操作系统、当前权限,不要跳过这一步。


一、初始响应决策

主机疑似被入侵?
├─ 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

高风险判定:

发现
风险等级
处置
uid=0 的非 root 用户
🔴 高
usermod -L <user>
 立即禁用
未知用户有 sudo ALL 权限
🔴 高
移除 sudoers 条目
未知 SSH 公钥
🔴 高
记录指纹后删除
异常时段登录
🟡 中
关联 IP 溯源

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
 或 secure
SSH/sudo 认证
grep "Accepted|Failed"
/var/log/wtmp
登录/注销
last -f /var/log/wtmp
/var/log/btmp
失败登录
lastb -f /var/log/btmp
/var/log/messages
 或 syslog
系统事件
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/
应用崩溃(可能由恶意行为触发)
KnowledgeC
~/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
  • 异常外连 IP 的 ESTABLISHED 连接

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 速查表:

Event ID
含义
排查价值
4624
登录成功
结合登录类型判断攻击方式
4625
登录失败
暴力破解痕迹
4634
注销
会话持续时间分析
4672
特权登录
管理员登录事件
4720
创建用户
后门账户检测
7045
服务安装
持久化/横向移动痕迹

登录类型参考: 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 提取

IOC 类型
来源
用途
恶意 IP/域名
网络连接、日志
封禁 + 情报查询
文件 Hash
可疑文件 MD5/SHA256
VirusTotal/微步查询
攻击者账户
新增/异常账户
内网横向排查
恶意文件路径
文件系统排查
全网扫描同类文件

5.3 加固建议

立即措施:

  • 修改所有受影响账户密码
  • 清除攻击者植入的持久化机制(计划任务、服务、启动项、SSH 密钥)
  • 封禁恶意 IP(防火墙/安全组)
  • 修补入侵利用的漏洞

长期加固:

  • 启用集中日志收集,防止本地日志被清除
  • 部署 HIDS/EDR 监控
  • 实施最小权限原则
  • 定期审计账户和服务
  • macOS 专有:确保 SIP 开启、Gatekeeper 启用、FileVault 加密,定期检查 LaunchAgents 和 LaunchDaemons

关键注意事项

  1. 排查过程中不要重启服务器/工作站
    ——内存中的恶意进程和网络连接信息会丢失
  2. macOS 统一日志在重启后仍可查询
    (log show --last),但 log stream 实时流会中断
  3. 不要直接删除可疑文件
    ——先备份取证再清除
  4. 如果怀疑系统命令被替换(Rootkit)
    ,使用静态编译的 busybox 或从可信源拷贝工具
  5. macOS 上 /usr/bin/lsof 等系统工具也可能被篡改
    ——优先使用 kextstat、launchctl 等底层工具
  6. 日志可能被攻击者清除或篡改
    ——多源交叉验证(系统日志 + 网络设备日志 + 应用日志)
  7. KnowledgeC 数据库在 macOS 10.15+ 可能加密
    ,sqlite3 读取失败时需配合解密工具
下载地址

最新文章

随机文章