1. 项目概述:当服务器不再“干净”
干运维或者安全的朋友,估计都经历过这种心跳漏一拍的瞬间:登录一台服务器,
top
命令一看,CPU莫名飙高;
netstat
一查,多出来几个陌生的外联IP;或者更直接的,业务方反馈网站被挂马了。这时候,脑子里第一个念头就是:“被搞了”。接下来怎么办?是手忙脚乱地重启服务,还是直接重装系统一了百了?对于很多刚接触线上应急的同学来说,面对一台可能已经失陷的Linux服务器,往往有种无从下手的茫然感。
“Linux应急响应实战”要解决的,就是这种茫然。它不是一个高深的理论体系,而是一套基于实战、可立即上手操作的“体检”流程。核心目标很明确:
快速定位入侵迹象,评估影响范围,并尽可能清晰地还原攻击者的入侵路径和行为轨迹
。很多人觉得应急响应是安全专家的专属领域,需要各种昂贵的商业工具支持。其实不然,Linux系统自身就提供了大量强大的内置工具和日志记录,足以支撑一次深入的排查。从最基础的命令历史
history
,到系统各个角落的日志文件,再到容易被忽视的开机自启项,攻击者留下的“脚印”远比我们想象的多,关键在于我们是否知道去哪里找,以及如何解读这些信息。
这篇文章,我将以一个从业者的视角,带你走一遍完整的应急响应流程。我们不谈空泛的理论,只聚焦于在真实入侵事件发生后,你应该立即敲入哪些命令,查看哪些文件,以及如何将这些零散的信息点串联成完整的攻击故事链。无论你是运维工程师、开发人员还是对安全感兴趣的爱好者,掌握这套方法,都能让你在关键时刻保持冷静,做到心中有数,手中有术。
2. 应急响应核心思路与流程设计
应急响应切忌无头苍蝇似的乱撞。在动手之前,建立一个清晰、有序的排查思路,能极大提升效率,避免遗漏关键证据,甚至因误操作破坏现场。我个人的经验是,遵循一个“由外到内,由显到隐”的排查漏斗模型。
2.1 排查流程的“漏斗模型”
这个模型的核心是分层递进,逐步缩小排查范围:
- 第一层:快速感知与影响评估 。首先确认异常现象(如CPU高、网络连接异常),并立即评估业务影响。这一步的目标是决定后续动作的优先级:是优先恢复业务,还是优先保护现场深入分析。
-
第二层:系统资源与网络行为分析
。使用
top,iftop,netstat等命令,快速查看当前系统的进程、网络连接等实时状态,寻找明显的恶意进程或异常外联。 -
第三层:攻击痕迹深度挖掘
。这是核心阶段,围绕用户行为(
history、登录日志)、文件系统(异常文件、隐藏文件)、持久化机制(开机自启、定时任务)、日志审计进行深度检查。 - 第四层:时间线梳理与入侵还原 。将前面发现的碎片化证据(文件创建时间、命令执行时间、日志记录时间)按时间顺序排列,尝试还原攻击者的入侵步骤和意图。
在整个过程中,有一个
黄金原则:尽可能只做“读”操作,避免“写”操作
。不要轻易删除文件、杀死进程(除非它对业务造成立即伤害),因为这些都是证据。优先考虑对可疑文件进行备份(如用
tar
打包后下载到本地分析),对内存进行转储(如果条件允许)。
2.2 工具选型:内置命令优先,外部工具辅助
很多安全工具(如
chkrootkit
,
rkhunter
)功能强大,但在应急初期,我强烈建议
优先使用系统内置命令
。原因有三:第一,可信。你无法确定入侵者是否替换了系统外的工具。第二,普遍。任何Linux发行版都有,无需额外安装。第三,快速。命令简单直接,出结果快。
-
基础检查三件套
:
ps,netstat(或ss),lsof。它们是查看进程、网络和文件打开情况的瑞士军刀。 -
文件查找利器
:
find。通过时间、权限、大小、名称等属性查找可疑文件,无可替代。 -
文本处理专家
:
grep,awk,sed。用于快速过滤和分析海量日志。 -
完整性校验
:
rpm -Va(RHEL/CentOS) 或debsums(Debian/Ubuntu)。用于校验系统文件是否被篡改,但这通常是在有干净系统对比的情况下更有效。
在完成初步内置命令排查后,可以考虑使用一些静态的、可从可信源获取的外部工具进行深度扫描,但这属于后续加固的范畴,不在首次应急的必做清单里。
3. 核心排查点详解与实操命令
现在,我们进入实战环节。假设我们通过监控发现一台服务器的CPU持续异常,怀疑被入侵,下面就是一步步的排查操作。请记住,以下所有命令,建议在操作前先通过
script
命令记录整个排查会话,以备后续复盘。
3.1 起点:命令历史(history)的深度挖掘
很多攻击者在获取shell后,会执行一系列命令来提权、下载木马、清理痕迹。
history
命令是回顾这些操作的第一个窗口,但高手也会清理它。
基础查看与关键信息提取:
# 查看当前用户的历史命令
history
# 查看所有用户的历史命令(需要root权限)
for user in $(ls /home); do echo "=== History for $user ==="; sudo -u $user -i -- sh -c 'history'; done 2>/dev/null
但
history
默认只记录终端中执行的命令,且存储在内存中,退出时才写入文件(
~/.bash_history
)。攻击者可能直接清空该文件,或者设置
HISTCONTROL=ignorespace
并在命令前加空格来避免记录。
进阶技巧:
-
检查历史记录文件属性
:
ls -la ~/.bash_history,查看文件大小、修改时间。一个突然变得很小或修改时间很新的.bash_history文件可能被清空过。 -
检索敏感命令
:即使用户清空了历史,也可能有残留。直接
grep历史文件寻找可疑模式。grep -E "(wget|curl|chmod 777|ssh-keygen|passwd|useradd|visudo|nohup|\./)" ~/.bash_history grep -E "(^sudo|^su |^ssh )" ~/.bash_history | head -20 # 查看权限变更或远程登录尝试 -
查看其他shell的历史
:如果用户使用了
zsh,历史文件在~/.zsh_history;fish则在~/.local/share/fish/fish_history。
注意 :依赖
history是远远不够的,因为它太容易被篡改和规避。它只是一个线索来源,不能作为唯一证据。
3.2 系统实时状态与网络分析
这是发现正在进行的恶意活动的关键。
进程排查:
# 1. 查看进程树,识别异常父进程(如由web服务进程fork出的奇怪子进程)
ps auxf
# 或使用更直观的pstree
pstree -p -a -u -h
# 2. 重点查看CPU/内存占用高的进程
top -c -o %CPU
top -c -o %MEM
# 3. 查找隐藏进程(进程名被篡改或含有不可见字符)
ps aux | grep -v "\["
# 通常内核线程会显示在[]中,过滤掉它们后,观察剩余进程
网络连接排查:
# 1. 查看所有网络连接,显示进程名
netstat -antp
# 更现代的工具是ss,速度更快
ss -antp
# 2. 重点查看ESTABLISHED状态的连接,特别是外联
netstat -antp | grep ESTABLISHED
# 查看监听在非标准端口的进程
netstat -tulnp | grep -vE “:(22|80|443|3306)\s”
# 3. 使用lsof查看特定进程打开的网络端口和文件
lsof -i -P -n # 查看所有网络连接
lsof -p <PID> # 查看指定进程打开的所有资源
实操心得
:遇到可疑的外联IP(尤其是来自不常见国家或已知恶意IP段的),可以立即通过
whois
或在线威胁情报平台(如微步、VirusTotal)进行快速查询。同时,注意查看那些连接到外部IP的
/dev/tcp
或
/dev/udp
的连接,这可能是反弹shell的特征。
3.3 文件系统与隐藏痕迹排查
攻击者通常会上传或创建恶意文件。
基于时间的查找 (这是最有效的查找方式之一):
# 查找最近24小时内被修改的文件
find / -type f -mtime -1 2>/dev/null | head -50
# 查找最近1小时内被访问的文件
find / -type f -atime -1/24 2>/dev/null | grep -v "/proc\|/sys"
# 查找特定目录下(如web根目录、tmp目录)最近创建的文件
find /var/www/html /tmp /dev/shm -type f -ctime -1 2>/dev/null
基于权限和所有者的查找 :
# 查找系统中所有SUID/SGID文件(提权常用)
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null
# 查找任何人可写的敏感目录或文件
find / -type f -perm -o=w -exec ls -la {} \; 2>/dev/null | grep -vE "/proc|/sys"
find / -type d -perm -o=w -exec ls -la {} \; 2>/dev/null | grep -vE "/proc|/sys"
查找隐藏文件和非常规文件名 :
# 查找以点开头的隐藏文件(非用户家目录下的需要警惕)
find / -name “.*” -type f 2>/dev/null | grep -vE “/home|/root”
# 查找文件名中包含空格、非常规字符的文件
find / -type f -name “* *” -o -name “*$*” -o -name “*|*” 2>/dev/null
检查关键系统文件是否被篡改 :
# 检查/etc/passwd和/etc/shadow的完整性
ls -l /etc/passwd /etc/shadow
# 查看是否有新增的uid为0(root)的用户
awk -F: ‘$3==0 {print $1}’ /etc/passwd
# 检查是否有空密码用户
awk -F: ‘length($2)==0 {print $1}’ /etc/shadow
3.4 持久化机制:开机自启与定时任务
攻击者为了维持访问,一定会设置持久化。这是应急响应的重中之重,也是最容易被遗忘的角落。
系统服务(Systemd)排查 :
# 1. 查看所有已启动的服务
systemctl list-units --type=service --state=running
# 2. 查看所有用户定义的服务单元文件(重点排查)
systemctl list-unit-files --type=service | grep enabled
find /etc/systemd/system /usr/lib/systemd/system -name “*.service” -type f -exec ls -la {} \;
# 3. 仔细检查每个可疑服务的配置文件,特别是ExecStart指向的二进制文件路径
systemctl cat suspicious-service-name.service
传统init脚本(SysVinit)排查 :
# 查看所有运行级别的启动项
chkconfig --list
ls -la /etc/rc.d/rc[0-6].d/ | grep -E “S[0-9]+”
定时任务(Cron)排查 :
# 1. 查看系统级定时任务
ls -la /etc/cron* /etc/anacrontab
cat /etc/crontab
# 2. 查看所有用户的crontab(这是重灾区)
for user in $(cut -f1 -d: /etc/passwd); do echo “=== Crontab for $user ===”; crontab -l -u $user 2>/dev/null; done
# 3. 检查cron的日志,看是否有异常任务执行记录(日志位置通常在/var/log/cron)
tail -f /var/log/cron
其他持久化位置 :
-
Profile文件
:
/etc/profile,/etc/profile.d/,~/.bashrc,~/.bash_profile。攻击者可能在其中添加恶意命令,在用户登录时执行。grep -r “\.sh\|\.\/\|wget\|curl” /etc/profile.d/ ~/.bashrc ~/.bash_profile 2>/dev/null -
SSH后门
:检查
~/.ssh/authorized_keys文件,看是否有未授权的公钥;检查/etc/ssh/sshd_config是否被修改,例如允许空密码登录。 -
动态链接库劫持
:检查
/etc/ld.so.preload文件,如果存在且内容可疑,它会预加载恶意so库。cat /etc/ld.so.preload 2>/dev/null
4. 日志审计:还原攻击时间线
系统日志是还原攻击过程的“黑匣子”。但攻击者也会删除日志,所以需要多源印证。
核心日志文件定位 :
-
认证日志
:
/var/log/secure(RHEL/CentOS),/var/log/auth.log(Debian/Ubuntu)。记录所有登录、sudo提权、认证失败信息。# 查看失败的登录尝试(爆破攻击) grep “Failed password” /var/log/secure # 查看成功的登录记录 grep “Accepted password\|Accepted publickey” /var/log/secure # 查看sudo命令执行记录 grep sudo /var/log/secure -
系统日志
:
/var/log/messages或/var/log/syslog。记录内核和系统服务的通用信息。 -
Web服务器日志
:
/var/log/nginx/access.log,/var/log/apache2/access.log。用于分析Web攻击入口,如SQL注入、文件上传漏洞利用请求。# 查找包含“union select”、“eval(”、“base64_decode”等特征的请求 grep -i -E “union.*select|eval\(|base64_decode|\.\./” /var/log/nginx/access.log | head -50 -
命令历史审计
:如果系统配置了
auditd(审计守护进程),可以获取更可靠的命令执行记录。# 搜索文件修改事件 ausearch -f /etc/passwd # 搜索特定用户执行的所有命令(如果配置了规则) ausearch -ua root -i
日志分析技巧 :
-
时间戳排序
:将不同来源的日志(如
secure中的登录记录、history中的命令时间、find找到的文件修改时间)按时间排序,可以清晰地看到攻击链。 - 关注“空隙” :如果日志文件中出现大段时间的空白,或者日志文件被截断(文件大小突然变小),这本身可能就是攻击者清理日志的证据。
- 关联分析 :将可疑IP从网络连接中提取出来,去认证日志里搜索该IP的登录尝试,再去Web日志里搜索该IP的访问记录。
5. 常见入侵场景与排查案例实录
理论说再多,不如看几个实战中常见的“病例”。
5.1 案例一:Webshell与持久化后门
现象 :网站被挂马,首页被篡改。 排查思路 :
-
定位恶意文件
:根据Web访问日志,找到被访问的异常PHP/JSP文件路径。使用
find在Web根目录下查找最近修改的、包含eval、assert、system等危险函数的文件。find /var/www/html -name “*.php” -type f -exec grep -l “eval(” {} \; -
检查进程和网络
:
ps aux查看是否有php、java进程异常运行并连接外部IP。netstat查看是否有可疑外联。 -
排查持久化
:这是关键。攻击者上传Webshell后,往往会用它来下载更隐蔽的后门,并设置持久化。
-
检查
crontab:crontab -l -u www-data(如果Web服务以www-data运行)。 -
检查
/tmp、/dev/shm目录下是否有可执行文件,并被cron调用。 - 检查系统服务中是否有新增的、指向奇怪路径的服务。
-
检查
-
结果
:可能发现一个隐藏在
/var/www/html/images/目录下的.config.php文件(Webshell),同时crontab里有一条任务,每分钟从远程服务器下载一个脚本到/dev/shm/.cache并执行。
5.2 案例二:SSH暴力破解与公钥植入
现象
:服务器CPU和内存使用正常,但
/var/log/secure
日志暴增,且发现有陌生IP成功登录。
排查思路
:
-
分析认证日志
:
# 统计失败次数最多的IP grep “Failed password” /var/log/secure | awk ‘{print $11}’ | sort | uniq -c | sort -rn # 查看所有成功登录的记录 grep “Accepted” /var/log/secure -
检查SSH相关文件
:
-
立即检查
~/.ssh/authorized_keys(特别是root用户),查看是否有未授权的公钥。 -
检查
/etc/ssh/sshd_config,确认PermitRootLogin、PasswordAuthentication等配置未被修改为不安全的值。
-
立即检查
-
排查入侵后行为
:如果攻击者已成功登录,立刻检查该用户(尤其是root)的
history,以及系统关键位置(如/root、/usr/bin)是否有新增文件。 -
结果
:发现某个IP在短时间内有数万次失败登录尝试,最终成功破解了一个弱密码用户。并在该用户的
.ssh/authorized_keys中植入了攻击者的公钥,实现了免密登录。
5.3 案例三:挖矿木马(资源消耗型)
现象 :服务器CPU或GPU占用率长期100%,风扇狂转。 排查思路 :
-
定位高占用进程
:
top或htop一眼就能看到异常进程。但挖矿进程常会伪装成系统进程名(如kthreadd、ksoftirqd)或频繁改名。 -
检查进程血缘
:使用
pstree查看高CPU进程的父进程。挖矿进程常由某个守护进程(可能来自cron或systemd服务)拉起,即使被杀死也会复活。 -
网络连接
:
netstat或ss查看该进程是否连接到一个矿池地址(通常端口为3333、5555、7777等)。 -
查找关联文件
:使用
lsof -p <PID>查看进程打开了哪些文件,通常能在/tmp、/var/tmp或用户家目录下找到挖矿程序本体和配置文件。 - 清除持久化 :按照前面所述,彻底检查cron、systemd服务、启动脚本等,找到并删除守护进程的配置。
-
结果
:发现一个名为
kinsing的进程占满CPU,其父进程是一个/etc/systemd/system/myservice.service定义的服务,该服务执行了/tmp/.kinsing/kinsing二进制文件。同时,cron中还有一个任务用于更新这个挖矿程序。
6. 应急响应后的善后与加固建议
找到并清除入侵痕迹后,工作只完成了一半。如果不进行加固,很快会再次被攻陷。
-
立即措施 :
- 隔离 :如果可能,将受影响服务器从网络中断开,或通过防火墙限制其访问。
- 改密 :立即更改所有用户(尤其是root和特权用户)的密码。
- 撤钥 :删除所有未授权的SSH公钥。
- 更新与打补丁 :更新操作系统和所有应用软件到最新版本,修补已知漏洞。
-
中期加固 :
- 配置安全策略 :强化SSH配置(禁用root登录、使用密钥登录、修改默认端口)、配置防火墙(如iptables/firewalld,只开放必要端口)。
-
安装入侵检测系统
:部署像
fail2ban这样的工具来自动封禁暴力破解的IP。 -
启用审计
:配置并启用
auditd,对关键文件和命令执行进行审计。 - 最小权限原则 :为服务和应用程序创建专用低权限用户运行。
-
长期监控 :
- 建立基线 :记录正常状态下系统的进程、端口、服务列表,便于未来对比。
- 部署集中日志 :将关键日志实时发送到远程的日志服务器(如ELK Stack),避免攻击者删除本地日志。
-
定期安全扫描
:使用
lynis、ClamAV等工具进行定期安全检查和病毒扫描。
应急响应是一项对抗性的技术活,攻击者的手法在持续演变。今天分享的这套从
history
到开机自启的排查流程,是一个经过实践检验的、系统化的基础框架。它能帮你解决90%的常见入侵事件排查。但真正的安全,永远在于预防和持续监控。养成定期检查系统、及时更新补丁、遵循最小权限原则的习惯,比任何应急响应都更重要。最后,保持警惕,但不必恐慌。每一次安全事件,都是提升你系统防御能力和技术洞察力的宝贵机会。



1209

被折叠的 条评论
为什么被折叠?



