适用场景:CTF 比赛(长城杯/铁三/玄机/知攻善防等)应急响应赛题、企业真实入侵排查。
应急响应(Incident Response):当服务器已经被入侵(被挖矿、被植入 webshell、被爆破、被挂马……)之后,安全人员要做的几件事:
比赛里通常给你一台被打穿的服务器(Linux 或 Windows 的虚拟机镜像 / 远程 SSH 桌面),让你回答类似问题:
| 常见题目问法 | 答案藏在哪 |
|---|---|
| 攻击者的 IP 是什么? | web 日志、secure/auth 日志、last、爆破记录 |
| 攻击者登录的账号/密码? | 攻击者创建的后门账号、日志里的成功登录 |
| 攻击的时间? | 日志时间戳、文件创建/修改时间 |
| webshell 文件路径 / 内容 / MD5? | web 目录 find、D 盾/河马扫描结果 |
| 挖矿程序的路径 / 矿池地址? | 高 CPU 进程、计划任务、其配置文件 |
| 后门账号的名字? | /etc/passwd、net user、隐藏账号 |
| 篡改的网页在哪里? | web 目录 mtime、index 文件 |
先取证,后清除。 进程、网络连接、内存这些"易失性数据"关机就没了,一定要先记录、保存证据,再删除。考试里要先找到答案(截屏/记下来),再去杀进程删文件。
这是最经典的排查框架(源自 Bypass007《应急响应实战笔记》),Linux 和 Windows 都通用:
① 检查系统账号安全 —— 有没有陌生账号、后门账号、隐藏账号 ② 检查异常端口、进程 —— 有没有奇怪的网络连接、高 CPU 进程 ③ 检查启动项/计划任务/服务 —— 持久化(开机自启)藏在哪里 ④ 检查文件 —— webshell、可疑二进制、临时目录 ⑤ 检查日志 —— 还原攻击时间线(谁、何时、从哪、干了啥) ⑥ 清除加固 —— 杀进程、删文件、修漏洞、改密码
小白记忆法:账号 → 进程端口 → 自启 → 文件 → 日志 → 清除。 攻击者进来后一定会:留账号或留公钥、跑进程连外网、设置开机自启、留文件。四个方向挨个查就不会漏。
bashuname -a # 系统版本、内核版本(老内核可能有提权漏洞)
cat /etc/os-release # 发行版
hostname # 主机名
date # 当前时间(对日志时间线很重要,注意时区)
who / whoami # 当前登录的用户
history # 当前用户的历史命令(重点!)
bashcat /etc/passwd # 看所有用户,重点看 uid=0 的非 root 账号
awk -F: '$3==0{print $1}' /etc/passwd # 找出所有 uid=0 的账号(正常只有 root)
awk -F: '$7=="/bin/bash" || $7=="/bin/sh"' /etc/passwd # 能登录 shell 的账号
cat /etc/shadow # 密码哈希,看哪些账号有密码、哪些被加了密码
last # 登录成功记录(来自 /var/log/wtmp)
lastb # 登录失败/爆破记录(来自 /var/log/btmp),文件可能巨大
lastlog # 每个用户最后一次登录时间
who # 当前在线用户
重点排查项:
hacker、mysql2、带 $ 的隐藏账号);last 里有没有陌生 IP 在凌晨/异常时间登录成功;~/.ssh/authorized_keys 都要看:bashcat /root/.ssh/authorized_keys
ls -la /home/*/.ssh/
for f in $(ls /home); do echo "== $f =="; cat /home/$f/.ssh/authorized_keys 2>/dev/null; done
bashgrep "Accepted" /var/log/secure # CentOS/RHEL:成功登录(IP、端口、时间)
grep "Failed password" /var/log/secure # 爆破失败记录
grep "Accepted" /var/log/auth.log # Ubuntu/Debian 对应路径
# 统计爆破源 IP TOP 10
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head
bashhistory # 当前用户
cat /root/.bash_history # root 的历史命令
cat /home/*/.bash_history # 其他用户的历史命令
历史命令是"还原攻击者行为"的金矿:能看到他下载了什么(wget/curl)、编译了什么(gcc)、加了什么账号(useradd)、写了什么文件(echo > /...)。注意攻击者可能 history -c 清空,此时去对比文件修改时间和其他日志。
bashnetstat -antlp # 所有 TCP 连接 + 监听端口 + 对应进程(-p 要 root)
netstat -anulp # UDP
ss -antlp # 更快的替代命令(新系统 netstat 可能没装)
lsof -i :8888 # 看某个端口被谁占用
lsof -p <PID> # 某进程打开了哪些文件/端口
怎么判断"异常"连接:
ESTABLISHED 状态但进程名很怪。确认可疑进程后:
bashps -ef | grep <PID> # 看进程完整命令行
ps aux --sort=-%cpu | head # CPU 占用 TOP(挖矿必查!)
top # 动态看,按 1 看每个核
ls -l /proc/<PID>/exe # 进程对应的可执行文件真实路径(进程删了文件也指向它)
ls -l /proc/<PID>/cwd # 进程的工作目录
cat /proc/<PID>/cmdline # 启动命令
strings /proc/<PID>/exe | grep -i pool # 在二进制里找矿池地址(stratum+tcp://)
kill -9 <PID> # 确认后再杀(先取证!)
定时任务(挖矿病毒最爱):
bashcrontab -l # 当前用户定时任务
crontab -l -u root # root 的
ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.weekly/
cat /etc/crontab
cat /var/spool/cron/* # 所有用户的 crontab 文件实体(RHEL 系)
cat /var/spool/cron/crontabs/* # Debian 系
grep -r "curl\|wget\|http" /etc/cron* /var/spool/cron/ # 找下载型任务
经典手法:攻击者用定时任务"守护"挖矿进程——你 kill 了进程,定时任务过几分钟又把它拉起来。所以先删定时任务,再杀进程。
开机自启:
bashsystemctl list-unit-files --state=enabled # 已启用的服务
systemctl list-timers # 定时器(新一代"计划任务")
cat /etc/rc.local /etc/rc.d/rc.local # 开机脚本
ls /etc/init.d/ # 传统 init 服务
cat /etc/systemd/system/*.service # 自定义服务文件,看 ExecStart 指向哪
ls -la /etc/profile.d/ # 登录时加载的脚本
其他常见持久化点(逐个检查):
bash# SSH 软链接后门 / 恶意配置
cat /etc/ssh/sshd_config | grep -i authorized
# 环境变量后门
cat /etc/profile /etc/bashrc /root/.bashrc /root/.bash_profile
# SUID 提权后门
find / -perm -4000 -type f 2>/dev/null
# 动态库劫持后门(preload 一个 so,很多挖矿用它隐藏进程)
cat /etc/ld.so.preload 2>/dev/null
# 内核模块 rootkit
lsmod
bash# 按时间找(结合日志里攻击者活动的时间段)
find / -mtime 0 -type f 2>/dev/null # 24小时内改动的文件
find / -ctime -1 -type f -name "*.sh" 2>/dev/null
find /tmp /var/tmp /dev/shm -type f 2>/dev/null # 临时目录(恶意文件最爱待的地方)
find / -size +100M -type f 2>/dev/null # 大文件
find / -name "*.sh" -newer /etc/passwd 2>/dev/null # 比 passwd 新建的 sh
# 找 webshell(第 5 章有详细版)
find /var/www -name "*.php" -mtime -7 2>/dev/null
# 文件取证
stat <文件> # 创建/修改/访问时间
file <文件> # 文件类型
md5sum <文件> # 求 MD5(比赛常要提交)
strings <文件> | grep -i "http\|pool\|passwd" # 抽取可读字符串找 C2/矿池
/proc/<PID>/exe的妙用:恶意进程运行时删除了自己的文件,ls -l /proc/PID/exe仍指向那个文件(带(deleted)),可以cat或复制出来分析。
bash# rkhunter:rootkit 检测(安全客推荐)
rkhunter --check
# chkrootkit
chkrootkit
# 检查系统命令是否被替换(对比包管理器)
rpm -Va # RHEL/CentOS:校验所有 rpm 包文件
dpkg -V # Debian/Ubuntu
如果 ps、ls、netstat 等命令本身被替换(看命令输出正常但实际藏着恶意进程),说明中了用户态 rootkit——可以用 busybox 的静态命令交叉验证,或直接上 LD_PRELOAD 检查(见 3.4)。
| 日志 | 路径 | 内容 |
|---|---|---|
| 登录成功/失败 | /var/log/secure(RHEL)/ /var/log/auth.log(Debian) | SSH 登录、sudo、su |
| 登录成功记录 | /var/log/wtmp | 用 last 读(二进制) |
| 爆破记录 | /var/log/btmp | 用 lastb 读 |
| 最后登录 | /var/log/lastlog | 用 lastlog 读 |
| 系统消息 | /var/log/messages / journalctl | 服务启停、内核 |
| 定时任务日志 | /var/log/cron | crontab 执行记录 |
| Web 日志 | /var/log/nginx/、/var/log/httpd/、/var/log/apache2/ | 见第 5 章 |
| MySQL 日志 | /var/log/mysqld.log、/var/log/mysql/ | 见第 6 章 |
| 邮件日志 | /var/log/maillog | |
| 历史命令 | ~/.bash_history |
常用日志分析命令:
bashtail -100 /var/log/secure # 看最后 100 行
grep "sshd" /var/log/secure # 过滤 SSH 相关
grep -v "Failed" /var/log/secure # 反向过滤
awk '{print $1}' file | sort | uniq -c | sort -rn | head # 万能统计:某列 TOP10
journalctl --since "2026-09-01" --until "2026-09-13" # 按时间过滤系统日志
cmdsysteminfo # 系统版本、补丁(KB 编号)、启动时间 net user # 列出所有用户 net user Administrator # 看某用户详情(最后登录时间、组) net localgroup administrators # 管理员组里有哪些人(重点!) lusrmgr.msc # 图形界面管理本地用户和组 query user / qwinsta # 当前登录会话(RDP 在线用户)
隐藏账号排查(结尾带 $ 的账号 net user 看不到):
lusrmgr.msc 图形界面对比;regedit → HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
(SAM 默认不可见,需要用 D 盾/psexec -s -i regedit 提权查看);cmdnetstat -ano # 所有连接 + PID(-n 数字显示 -o 显示 PID) netstat -ano | findstr "ESTABLISHED" # 只看已建立的连接 netstat -ano | findstr "4444" # 查反弹 shell 常见端口 tasklist # 进程列表 tasklist | findstr "1234" # 用 netstat 查到的 PID 定位进程名 tasklist /svc # 进程与服务对应关系 wmic process get name,processid,commandline # 进程完整命令行(很重要!) tasklist /m # 进程加载的 DLL
判断可疑进程的要点:
C:\Windows\System32,如果 svchost.exe 跑在 C:\Users\xxx\ 下必有问题;svch0st.exe、expl0rer.exe);cmdtaskkill /PID 1234 /F # 强杀进程(先取证再杀!) wmic process where processid=1234 delete schtasks /query /v # 计划任务(下一节)
cmd:: 启动项 msconfig # 图形界面 shell:startup # 运行框输入,直接打开"启动"文件夹 shell:common startup # 所有用户的启动文件夹 reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run reg query HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run :: 计划任务 taskschd.msc # 图形界面 schtasks /query /fo LIST /v # 命令行列出所有计划任务详情 :: 服务 services.msc # 图形界面 net start # 正在运行的服务 sc query # 同上 wmic service get name,pathname,startmode # 服务的可执行路径(找路径异常的)
工具推荐:Autoruns(Sysinternals)——一键列出所有自启动位置,比手工查全得多。
重点目录:
C:\Users\<用户>\AppData\Roaming\ C:\Users\<用户>\AppData\Local\Temp\ (临时目录,恶意文件常驻) C:\ProgramData\ C:\Windows\Temp\ C:\Users\Public\ 回收站
常用命令:
cmddir /s /a /q C:\Users\*\AppData\Local\Temp\* # 含隐藏文件 forfiles /m *.exe /d 2026/9/1 /s /p C:\ /c "cmd /c echo @path @fdate @ftime" # 按日期找 exe
按时间段找攻击者放的马:右键文件→属性看"创建时间/修改时间",或用 Everything 按日期过滤。拿到可疑文件后算 MD5:certutil -hashfile 文件名 MD5。
打开方式:Win+R → eventvwr.msc,重点看 Windows 日志 → 安全/系统。
必背事件 ID:
| ID | 含义 | 应急意义 |
|---|---|---|
| 4624 | 登录成功 | 看登录 IP、账号、类型 |
| 4625 | 登录失败 | 爆破分析:同一 IP 大量 4625 = 被爆破 |
| 4720 | 创建用户账号 | 攻击者留后门账号 |
| 4722/4724/4726 | 启用/重置/删除账号 | |
| 4732/4728 | 成员被加入本地组/全局组 | 提权行为 |
| 7045 | 安装了新服务 | 恶意服务后门 |
| 1102 | 清理审计日志 | 攻击者删日志 |
| 4698/4699 | 计划任务创建/删除 | |
| 6005/6006 | 开机/关机 | 时间线参考 |
登录类型(4624 事件里的 Logon Type):
| 类型 | 含义 |
|---|---|
| 2 | 本机交互登录 |
| 3 | 网络登录(SMB 共享等) |
| 10 | RDP 远程桌面登录(RDP 爆破成功就看这个) |
| 5 | 服务登录 |
用 PowerShell 快速统计爆破:
powershellGet-WinEvent -FilterHashtable @{LogName='Security';Id=4625} -MaxEvents 1000 | ForEach-Object { $_.Properties[19].Value } | Group-Object | Sort-Object Count -Descending | Select -First 10
Log Parser 分析日志(经典工具,SQL 语法查事件日志):
cmdLogParser.exe -i:EVT "SELECT TimeGenerated,EXTRACT_PREFIX(TokenAndPriviliges,',',0) AS User,EXTRACT_PREFIX(Message,1,'源网络地址') AS IP FROM Security.evtx WHERE EventID=4624" -o:CSV
也可把 evtx 日志拷出来用 360 星图、Event Log Explorer 等工具离线分析。
| 工具 | 用途 |
|---|---|
| D 盾 | webshell 查杀 + 隐藏账号检测(国产行政常用) |
| 河马(HiSQL/Hema)webshell 查杀 | webshell 扫描 |
| 火绒 / 火绒剑 | 病毒查杀 + 行为分析 |
| Process Explorer / Process Monitor | 进程分析 / 文件注册表行为监控 |
| Autoruns | 全量自启动项 |
| Log Parser | 事件日志 SQL 查询 |
| PCHunter / System Informer | 类似 procexp 的手工查杀利器 |
| 卡巴斯基绿色版(KVRT) | 应急杀毒 |
| 服务 | 默认日志位置 |
|---|---|
| Nginx | /var/log/nginx/access.log、error.log(配置在 nginx.conf 的 log_format / access_log) |
| Apache (RHEL) | /var/log/httpd/access_log、error_log |
| Apache (Debian) | /var/log/apache2/access.log、error.log |
| Tomcat | $CATALINA_HOME/logs/localhost_access_log.*.txt、catalina.out |
| IIS | C:\inetpub\logs\LogFiles\W3SVC1\(或 %SystemDrive%\inetpub\logs) |
| 宝塔面板 | /www/wwwlogs/ |
第一步永远是确认真实日志路径:看配置文件 grep -r "access_log" /etc/nginx/。
192.168.1.100 - - [13/Sep/2026:10:23:45 +0800] "GET /login.php?user=admin HTTP/1.1" 200 1234 "http://refer" "Mozilla/5.0..." └─ $remote_addr └─ 时间 └─ $request(方法+URL) └─ $status └─ $body_bytes_sent └─ $http_user_agent
bash# ★ 访问量 TOP10 的 IP(判断爆破/扫描/CC)
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# ★ 看某个 IP 到底干了什么(有可疑 IP 后必做)
grep "1.2.3.4" access.log | less
# ★ 该 IP 访问过的 URL 去重
grep "1.2.3.4" access.log | awk '{print $7}' | sort | uniq -c | sort -rn
# ★ 状态码统计(大量 404 = 扫描;大量 500 = 打到了漏洞)
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# ★ 只看成功登录(找爆破成功的那一条)
grep "1.2.3.4" access.log | awk '$9==200'
# 统计访问最多的 URL
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20
# 统计某个时间段(结合攻击时间)
grep "13/Sep/2026:10:" access.log
# 查看 UA(sqlmap 等工具 UA 很明显)
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head
bash# SQL 注入特征
grep -E "union|select|and 1=1|or 1=1|'--|information_schema|sleep\(|benchmark\(" access.log
# XSS 特征
grep -E "<script|onerror|onload|javascript:|alert\(" access.log
# 命令执行 / 文件包含
grep -E "exec|system|passthru|phpinfo|proc\.open|cat%20/etc/passwd|\.\/\.\.\/" access.log
# 常见扫描器 User-Agent(必查!扫描器 IP 往往就是攻击者 IP)
grep -iE "sqlmap|nikto|nessus|nmap|awvs|acunetix|dirsearch|gobuster|fuzz" access.log
# webshell 访问特征(连上后门文件的 POST 请求)
grep -E "\.php\?cmd=|eval|assert|base64_decode|gzinflate" access.log
# 反序列化 / 常见漏洞 payload
grep -E "rmi://|ldap://|jndi|Runtime|OGNL" access.log
标准溯源思路:
grep 该 IP 看它完整请求序列(从扫描→打漏洞→getshell→连 webshell);/uploads/shell.php)→ 对应 web 目录找到 webshell 文件;bash# GoAccess:实时可视化日志分析(推荐)
goaccess -f /var/log/nginx/access.log --log-format=COMBINED
goaccess -f access.log --log-format=COMBINED -o report.html # 输出 HTML 报表
其他:360 星图、ELK、nginxpulse。
bash# 找最近 N 天新建/修改的脚本文件(知道攻击时间时最有用)
find /var/www -name "*.php" -mtime -7 2>/dev/null
find /var/www -name "*.jsp" -o -name "*.jspx" -mtime -7 2>/dev/null
# 按特征搜代码
grep -rn --include="*.php" -E "eval\(|assert\(|system\(|exec\(|shell_exec|passthru|base64_decode\(" /var/www/
grep -rn --include="*.jsp" -E "Runtime.getRuntime|ProcessBuilder|request.getParameter" /var/www/
grep -rn --include="*.aspx" -E "Process.Start|eval" /var/www/
# 找隐藏/奇怪命名的文件
find /var/www -name ".*" -type f
find /var/www -size 0 -o -name "*1*.php" -name "*x*.php"
webshell 一句话木马常见形态:
php<?php @eval($_POST['cmd']); ?> # 经典一句话
<?php assert($_REQUEST['a']); ?> # assert 变形
<?php $a=str_replace(...); eval($a); ?> # 变形/加密马(用 D 盾/河马扫)
排查要点:正常网站文件不会出现 eval($_POST);同时看文件修改时间是否与日志中的攻击时间吻合。
查看日志配置:
sqlshow variables like '%log%'; -- 所有日志相关变量
show variables like 'general_log%'; -- 查询日志开关和路径
show variables like 'slow_query%'; -- 慢查询日志
show variables like 'log_error%'; -- 错误日志
show variables like 'datadir%'; -- 数据目录
常见日志文件位置(Linux):
| 日志 | 说明 | 位置 |
|---|---|---|
| 错误日志 | 启动/运行错误 | /var/log/mysqld.log(RHEL)/ /var/log/mysql/error.log(Debian) |
| general_log | 记录每一条 SQL 与连接(应急取证神器,默认关闭) | 由 general_log_file 决定 |
| 慢查询日志 | 超 long_query_time 的 SQL | slow_query_log_file |
| binlog | 数据变更记录 | log_bin 决定 |
应急时开启 general_log 取证(实时记录攻击者的 SQL):
sqlSET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/tmp/mysql_general.log';
-- 让攻击者复现一遍攻击,然后 cat /tmp/mysql_general.log 逐条看
SET GLOBAL general_log = 'OFF'; -- 取证完记得关
MySQL 常见被入侵的方式与排查:
secure_file_priv 未限制时,攻击者可
SELECT '<?php @eval($_POST[1]);?>' INTO OUTFILE '/var/www/html/shell.php';
→ 去 show variables like 'secure_file_priv'; 看配置,去对应目录找新增 php 文件;udf.so 后 CREATE FUNCTION sys_exec ... 执行系统命令
→ 排查:SELECT * FROM mysql.func;、在插件目录(plugin_dir)找可疑 .so/.dll;排查完加固:改强密码、限制远程 root、bind-address 内网、secure_file_priv=NULL、删可疑 func。
Redis 若无密码且绑定了 0.0.0.0,攻击者可以直接远程操作,最经典的三种利用:
~/.ssh/authorized_keys 后门):
CONFIG SET dir /root/.ssh/ CONFIG SET dbfilename authorized_keys SET x "\n\nssh-rsa AAAA...公钥...\n\n" SAVE
CONFIG SET dir /var/spool/cron/、dbfilename root;CONFIG SET dir /var/www/html/、dbfilename shell.php。应急排查命令:
bashredis-cli
> INFO clients # 当前连接的客户端
> CLIENT LIST # ★ 每个客户端的来源 IP(找攻击者 IP)
> CONFIG GET dir # 当前持久化目录(被改过就是证据)
> CONFIG GET dbfilename # 持久化文件名
> MONITOR # 实时查看所有命令(抓现行)
> SLOWLOG GET # 慢查询日志,也能看到历史命令痕迹
> CONFIG GET requirepass # 有没有密码
对应系统侧排查:
bashcat /root/.ssh/authorized_keys # 有没有陌生公钥
ls -la /var/spool/cron/ && cat /var/spool/cron/root # 有没有写进计划任务
find / -name "authorized_keys" -newer /etc/passwd
crontab -l
加固:requirepass 强密码、bind 127.0.0.1、改默认端口、禁止 CONFIG SET(rename-command)、低权限用户运行。
比赛里数据库题经常和 web 日志联动:web 日志看到攻击者 IP → 数据库日志里同一时间出现他的连接 → 他执行了写文件的 SQL → web 目录出现 shell。把三边的时间线对齐,就是完整攻击链,也是答题的关键。
① top / ps aux --sort=-%cpu → 找出吃 CPU 的进程(常见名:kdevtmpfsi、kinsing、xmrig、minerd、systemd 等伪装名) ② ls -l /proc/<PID>/exe → 定位恶意文件真实路径(可能 (deleted)) ③ lsof -p <PID> / netstat -antlp → 找矿池连接(外连 IP,stratum+tcp 协议) ④ crontab -l / /etc/cron* / systemctl list-timers → 找守护下载的定时任务(先删!) ⑤ ls /etc/ld.so.preload;cat 它 → 找隐藏进程用的 so(很多挖矿带这个) ⑥ 查下载源:/var/log/* 、history、web 日志里找 wget/curl 的 URL → 定位入侵入口(常是 Redis 未授权/web 漏洞/RDP 爆破) ⑦ 清除:删定时任务 → 杀进程 → 删文件 → 清公钥 → 修入口漏洞 ⑧ 求证 MD5:md5sum 恶意文件(答题常要)
lastb 统计爆破 IP;grep "Accepted" /var/log/secure 找成功那条 = 攻击者 IP + 时间 + 账号;见第 5.6 节。核心是日志时间 + 文件时间 + 扫描工具三线合一。
1. 先跑基础命令收集信息(系统、账号、last、netstat、top)——这些几乎必出答案 2. 看题目问什么,缺什么证据去对应章节找 3. 所有答案记录时间线:攻击者 IP → 入口 → 动作 → 落地文件 → 持久化 → 外联 4. 全部找齐后再清除(删马、杀进程、删账号),最后交卷
bash# ===== Linux =====
uname -a; date
cat /etc/passwd; awk -F: '$3==0{print $1}' /etc/passwd
last; lastb; history
netstat -antlp; ps aux --sort=-%cpu | head
crontab -l; ls /etc/cron*; cat /etc/ld.so.preload
find /tmp /var/tmp /dev/shm -type f
find /var/www -name "*.php" -mtime -7
grep -iE "sqlmap|eval|union" /var/log/nginx/access.log
grep "Accepted" /var/log/secure
md5sum <恶意文件>
cmd:: ===== Windows ===== systeminfo & net user & net localgroup administrators netstat -ano & tasklist /svc wmic process get name,processid,commandline schtasks /query /v & reg query HKLM\...\CurrentVersion\Run eventvwr.msc (4624 / 4625 / 4720 / 7045) certutil -hashfile 文件 MD5
| 平台 | 工具 | 用途 |
|---|---|---|
| Linux | rkhunter / chkrootkit | rootkit 检测 |
| Linux | GoAccess | web 日志可视化 |
| Linux | Linuxgun / AutoIR_Remote | 一键应急排查脚本(GitHub 开源) |
| Linux | D 盾(可跑在 wine) / 河马 | webshell 查杀 |
| Linux | busybox | 命令被替换时交叉验证 |
| Windows | D 盾 | webshell + 隐藏账号 |
| Windows | 河马 webshell 查杀 | webshell |
| Windows | 火绒 / 火绒剑 | 杀毒 + 行为分析 |
| Windows | Process Explorer / Monitor | 进程与行为 |
| Windows | Autoruns | 自启动项全查 |
| Windows | PCHunter / System Informer | 手工查杀 |
| Windows | Log Parser 2.2 | 事件日志 SQL 分析 |
| Windows | KVRT(卡巴绿色版) | 应急杀毒 |
| 通用 | Everything(Win) | 按时间快速定位文件 |
| 通用 | Wireshark | 抓流量分析 |
以下是本文整理时参考的优质文章,建议按需精读:
Windows 方向
Linux 方向
Web / 数据库日志
靶机实战
心法:应急响应本质是"找不同"——拿着一份正常的系统该有的样子(账号列表、自启项、进程、计划任务),和现在的样子对比,多出来的、改过的、跑在外网的,都是线索。命令记不住没关系,记住六步流程和"账号/进程/自启/文件/日志"五个方向,到哪台机器都能开始排查。