1. 从一台“变慢”的服务器说起Linux入侵排查到底在查什么凌晨两点被电话叫醒运维群里说生产环境的一台Linux服务器CPU跑满、SSH登录卡顿、业务响应超时。你登上机器top一看一个陌生进程占了90%以上的CPU名字还伪装成kworker或者[kthreadd]之类的内核线程样式。这时候你面对的就是一个典型的Linux入侵排查场景——它不是简单的“杀个进程重启了事”而是要回答三个核心问题谁进来了、怎么进来的、留下了什么。这篇内容围绕“应急响应”这个主线把Linux入侵排查的完整思路拆开讲。适合谁看一是刚接触应急响应、拿到一台疑似被入侵的机器不知道从哪下手的运维和安服新人二是做过一些排查但总是漏掉关键痕迹、事后复盘发现“当时怎么没看到”的从业者。我会把排查顺序、每个命令背后的意图、以及那些文档里不会写的坑尽量讲透。先说一个反直觉的结论入侵排查最忌讳一上来就kill -9。很多人看到可疑进程第一反应是杀掉结果进程一死它对应的可执行文件、网络连接、父进程关系、内存中的配置全部消失你后面想追溯入口就难了。正确的做法是先“固定现场”把易失性数据进程、网络连接、登录会话、内存抓下来再动手清理。这个顺序错了后面全是盲人摸象。Linux入侵排查的本质是在一台“已经被污染”的系统里从海量正常痕迹中筛出异常痕迹。难点在于攻击者会清理日志、伪装进程名、用rootkit隐藏文件而系统本身还在正常跑业务你不能随便重启。所以排查靠的不是某一个“神器”而是一套由外到内、由易失到持久的检查链路加上对Linux系统行为的熟悉程度。2. 排查前的现场固定哪些数据一重启就没了2.1 为什么先抓易失性数据Linux系统里数据分两类一类写在磁盘上文件、日志、配置重启还在一类只存在于内存和内核状态里进程、网络连接、登录会话、路由、ARP一重启就没了。入侵排查的第一原则是先抓易失性数据因为攻击者最可能通过重启或杀进程来销毁这些证据。我习惯在登机器后的前五分钟做这几件事按顺序来记录当前时间date后面所有时间线分析都要对齐这个基准。抓进程快照ps auxww和ps -ef各存一份注意ww是为了不截断命令行参数。抓网络连接netstat -antp或ss -antp把ESTABLISHED和LISTEN都存下来。抓登录会话w、who、last -a、lastb。抓内存中的进程可执行文件对可疑PIDls -l /proc/PID/exe和cat /proc/PID/cmdline。这些命令的输出建议重定向到文件比如ps auxww /tmp/ps_snapshot.txt但注意——别存到被入侵机器上就完事要尽快传到你的分析机。因为攻击者如果有后手可能连你存的证据一起删。2.2 一个容易被忽略的细节时间基准很多排查最后卡在“时间线对不上”。服务器时区可能是UTC你本地是CST日志里时间戳又是另一种格式。我踩过的坑是last显示的时间是本地时区而/var/log/secure里可能是UTC差了8小时导致我把一次正常登录误判成攻击时间。所以第一步一定要确认date、timedatectl、cat /etc/timezone把时区记下来。后面看任何日志先换算成统一时区再比对。这个细节看起来小但在应急响应里时间线错位会让你整个溯源方向跑偏。2.3 现场固定的操作清单数据类型命令存放建议进程列表ps auxww、ps -ef传分析机网络连接ss -antp、netstat -antp传分析机登录会话w、who、last -a传分析机进程可执行文件ls -l /proc/*/exe记录路径内存映射cat /proc/PID/maps传分析机定时任务crontab -l、ls /etc/cron*传分析机提示如果机器上已经有busybox或lsof优先用它们因为被入侵系统上的ps、netstat可能已经被替换成“过滤版”会隐藏攻击者的进程和连接。这是Linux入侵排查里非常经典的一个坑。3. 进程与网络揪出伪装的“不死马”和异常连接3.1 从CPU和内存异常切入攻击者留下的木马尤其是挖矿类和不死马最直接的表现就是资源占用异常。top按CPU排序top -o %MEM按内存排序先看有没有明显异常的进程。但要注意高级一点的木马会主动限制自己的CPU占用或者用nice调低优先级让你不容易发现。我一般会交叉比对几个维度ps aux --sort-%cpu | head -20ps aux --sort-%mem | head -20cat /proc/loadavg看整体负载如果发现某个进程CPU不高但持续存在、名字又很像系统进程就要重点看它的可执行文件路径。正常系统进程的/proc/PID/exe指向/usr/sbin/或/usr/lib/下的文件如果指向/tmp/、/dev/shm/、/var/tmp/基本可以判定有问题。3.2 识别进程伪装的手法攻击者常用的伪装手段有这么几类我在实战里都遇到过改名伪装把木马命名为[kworker/0:1]、[migration/0]这种带方括号的内核线程样式。真正的内核线程在ps里显示为[xxx]且/proc/PID/exe是空的因为内核线程没有用户态可执行文件。如果你看到一个带方括号的进程ls -l /proc/PID/exe却有指向那它一定是伪装的。路径伪装把木马放在/usr/bin/下起个像dbus-daemon、systemd-helper的名字。这时候要看文件的时间戳ls -l --time-stylefull-iso如果创建时间和其他系统文件差很多就是可疑的。父子关系伪装正常守护进程的父进程是systemdPID 1或init。如果某个“系统进程”的父进程是一个已经消失的PID显示为1但实际不是systemd或者父进程本身也可疑就要顺着pstree -p往上查。3.3 网络连接里的蛛丝马迹ss -antp看连接重点看两类LISTEN和ESTABLISHED。LISTEN里如果有一个监听在高端口比如/tmp/.X11-unix之外的随机端口的进程路径又可疑那很可能是后门。ESTABLISHED里如果有一个进程持续连接一个陌生外网IP尤其是非标准端口如4444、5555、6666这类基本就是C2回连。这里有个技巧ss -antp的输出里进程名可能被伪装但pid是真实的。拿到pid后ls -l /proc/PID/exe和cat /proc/PID/cmdline用tr \0 处理能还原真实身份。另外lsof -i -P -n也能交叉验证如果ss和lsof结果不一致说明有一个被替换了。3.4 “不死马”的排查要点不死马也叫内存马或守护马的特点是你杀了它它会被另一个进程重新拉起或者通过定时任务、inotify监控自我复活。排查思路是找到可疑进程后先别杀看它的父进程是谁cat /proc/PID/status | grep PPid。看它有没有打开的文件和网络lsof -p PID。看它有没有注册inotify监控ls -l /proc/PID/fd | grep inotify。检查定时任务crontab -l、cat /etc/crontab、ls -la /etc/cron.*/、cat /var/spool/cron/*。检查systemd服务systemctl list-units --typeservice看有没有陌生服务。只有把这些“复活机制”全部切断才能真正清掉不死马。否则你杀了主进程它三秒后又起来了。4. 持久化痕迹定时任务、启动项与账号后门4.1 定时任务是重灾区Linux下的持久化攻击者最爱用的就是定时任务因为简单、稳定、权限够。排查要覆盖这几个位置用户级crontab -l当前用户、cat /var/spool/cron/crontabs/*所有用户系统级cat /etc/crontab、ls -la /etc/cron.d/、/etc/cron.hourly/、/etc/cron.daily/systemd定时器systemctl list-timers --all我遇到过一个案例攻击者在/etc/cron.d/下放了一个名字叫0hourly的文件内容伪装成系统更新实际是每隔一段时间从远程拉取脚本执行。这种文件如果只看名字很容易漏掉必须逐个打开看内容。4.2 启动项和服务除了定时任务还有这些持久化位置/etc/rc.local很多老系统还在用攻击者会往里加一行启动命令。/etc/init.d/传统SysV服务脚本。~/.bashrc、~/.bash_profile、/etc/profile登录时执行攻击者会加反弹shell或下载命令。systemd服务/etc/systemd/system/、/lib/systemd/system/看有没有陌生.service文件。LD_PRELOAD劫持cat /etc/ld.so.preload如果这个文件存在且指向一个陌生.so那就是rootkit在劫持系统调用。4.3 账号后门排查账号后门是最直接的入口排查要点cat /etc/passwd看有没有UID为0的非root账号或者名字很像系统账号但实际是后门的如admin、test、support。cat /etc/shadow看有没有空密码账号或者最近被修改过密码的账号。awk -F: $30{print $1} /etc/passwd直接筛出所有UID为0的账号。cat /etc/sudoers和ls /etc/sudoers.d/看有没有被添加的提权配置。lastlog、last看最近登录的账号和时间。注意有些后门账号会被加在/etc/passwd末尾或者用useradd创建后立刻改UID为0。排查时不要只看前几行要完整过一遍。4.4 SSH后门SSH是Linux服务器最常见的入口后门手法也多~/.ssh/authorized_keys看有没有陌生的公钥尤其是带command前缀的那是强制命令后门。/etc/ssh/sshd_config看PermitRootLogin、Port、AuthorizedKeysFile有没有被改。sshd二进制是否被替换rpm -V openssh-server或dpkg -V openssh-server校验。~/.ssh/rc这个文件在SSH登录时执行容易被忽略。5. 日志与文件从海量痕迹里筛出那一条5.1 日志排查的正确姿势Linux日志主要在/var/log/下重点看这几个/var/log/secureRHEL系或/var/log/auth.logDebian系认证日志看爆破、登录成功、sudo使用。/var/log/messages或/var/log/syslog系统日志看服务启动、内核消息。/var/log/cron定时任务执行记录。/var/log/btmp失败登录记录lastb读的就是它。/var/log/wtmp成功登录记录last读的就是它。排查时先按时间范围过滤比如grep May 20 /var/log/secure再看有没有异常IP的登录成功记录。爆破的特征是短时间内大量Failed password然后突然一条Accepted password——那条就是攻破的时间点。5.2 日志被清理了怎么办高级攻击者会清理日志常见手法是echo /var/log/secure或者sed -i删掉特定行。这时候你要看日志文件大小是否异常小或者时间戳是否断层。ls -la /var/log/看有没有.1、.gz的轮转日志攻击者往往只删当前文件忘了轮转文件。journalctl如果系统用systemd-journald日志可能还在journal里journalctl --since 2024-05-20 --until 2024-05-21。命令历史cat ~/.bash_history攻击者可能忘了清或者清了但history还在内存里。5.3 文件层面的排查文件排查重点看时间和权限按修改时间找最近被改的文件find / -mtime -1 -type f 2/dev/null。找SUID文件find / -perm -4000 -type f 2/dev/null看有没有异常的。找隐藏文件find / -name .* -type f 2/dev/null尤其是/tmp、/dev/shm下的。找大文件find / -size 100M -type f 2/dev/null挖矿木马和日志堆积都可能。校验关键二进制rpm -Va或dpkg -V看有没有被替换的系统命令。我踩过的一个坑是只看了/tmp忘了/dev/shm。/dev/shm是内存文件系统重启就没了攻击者特别喜欢把木马放这里因为不占磁盘、不好查、重启后自动消失但如果有持久化机制会重新释放。所以排查时一定要ls -la /dev/shm/。6. 清理与加固别让同一台机器被进第二次6.1 清理的顺序确认所有恶意文件和持久化点后清理要按这个顺序先切断复活机制删定时任务、停恶意服务、清rc.local、清ld.so.preload。再杀进程kill -9可疑PID然后确认没有自动重启。再删文件删木马、后门、恶意脚本。再清账号删后门账号、清authorized_keys里的陌生公钥。最后改密码所有系统账号密码全部重置尤其是root和运维账号。顺序反了会怎样你先杀进程复活机制立刻把它拉起来你先删文件进程还在内存里跑文件句柄没释放删了也白删。所以一定是先断复活、再杀进程、再删文件。6.2 加固要点清理完不是结束要防止二次入侵改SSH端口、禁用root直接登录、改用密钥认证。装fail2ban或类似工具防爆破。定期更新系统补丁尤其是openssh、sudo、kernel。最小权限原则业务不用root跑运维账号按需授权。部署文件完整性监控如aide或tripwire关键文件被改能告警。日志集中收集别只存本地被入侵后本地日志不可信。6.3 一个真实的排查复盘我处理过一个案例服务器CPU跑满top看到一个叫[kworker/0:2]的进程占90%CPU。ls -l /proc/PID/exe指向/tmp/.kworkercat /proc/PID/cmdline显示是/tmp/.kworker -c /tmp/.config。顺着/tmp/.config找到C2地址再查crontab -l发现一条*/5 * * * * /tmp/.kworker。清理时先删cron再杀进程再删文件最后改密码、封IP。整个过程从登机器到清理完大概40分钟。这个案例里如果我一上来就kill -9cron会在5分钟内重新拉起它我就会以为“杀不掉”然后陷入反复杀的循环。所以先断复活机制这个顺序是实战里用血换来的经验。7. 排查工具与命令速查把常用操作固化下来7.1 必备命令清单用途命令进程快照ps auxww、ps -ef网络连接ss -antp、netstat -antp、lsof -i -P -n登录记录w、who、last -a、lastb定时任务crontab -l、cat /etc/crontab、ls -la /etc/cron.*/启动项cat /etc/rc.local、systemctl list-units --typeservice账号cat /etc/passwd、awk -F: $30 /etc/passwd、cat /etc/sudoers文件排查find / -mtime -1 -type f、find / -perm -4000 -type f日志grep Failed password /var/log/secure、journalctl二进制校验rpm -Va、dpkg -V7.2 工具选型建议busybox静态编译被入侵系统上自带命令不可信时用busybox的ps、netstat、ls交叉验证。chkrootkit / rkhunterrootkit检测但别全信误报率高只作参考。ClamAV病毒扫描对已知木马有效对新型和内存马效果有限。Volatility内存取证如果抓了内存镜像可以用它分析隐藏进程。Sysinternals for Linux微软出的procmon、sysmonLinux版行为监控。工具是辅助核心还是对Linux系统行为的理解。你越熟悉正常系统长什么样越容易发现异常。7.3 排查心态与经验最后说几点心态上的东西。应急响应最怕的是“慌”一慌就乱杀乱删把证据毁了。我的习惯是先记录再分析最后动手。每一步操作前问自己这个操作会不会破坏证据会不会触发攻击者的反制另外排查不是一个人的事。遇到复杂案例及时同步给团队多人交叉验证能减少误判。还有排查完一定要写复盘报告把时间线、入口、手法、清理过程记下来下次遇到类似情况能直接复用。Linux入侵排查这门手艺靠的是“见过足够多的正常才能一眼看出异常”。多练、多复盘、多总结慢慢就有手感了。
