1. 项目概述:当Linux服务器被“敲门”之后
干运维或者安全这行的,最怕半夜手机响。不是系统挂了,就是服务器被黑了。前者还好说,重启大法、回滚备份总有个盼头;后者,尤其是Linux服务器被入侵,那感觉就像家里进了贼,你不仅得把他揪出来,还得搞清楚他偷了什么、破坏了什么、有没有留后门,最后还得把门锁修好。这个过程,就是我们常说的“应急响应”。今天要聊的,就是针对Linux系统入侵排查的一份实战工作记录,也就是圈内人常说的“WP”。
这份WP不是纸上谈兵的理论,而是基于真实或高度仿真的应急响应场景,一步步记录从接到告警到完成初步处置的全过程。它的核心价值在于提供一套可复现、可操作的排查思路和命令集,相当于一份“现场勘查指南”。无论你是初入行的安全工程师,还是需要兼顾安全的运维人员,手头有这样一份详实的WP,在真正面对安全事件时,心里能稳得多。它帮你理清头绪,告诉你先看哪里、用什么命令、怎么分析结果,避免在紧急情况下像无头苍蝇一样乱撞。
接下来,我会结合常见的入侵场景,拆解这份Linux入侵排查WP的完整逻辑和实操细节。我们会从最紧急的“止损”动作开始,深入到进程、网络、文件、日志等各个维度的蛛丝马迹中,最后还会分享一些加固建议和我在实战中踩过的坑。目标很简单:让你看完之后,能独立完成一次基础的Linux入侵应急响应。
2. 应急响应核心流程与首要动作
接到服务器可能被入侵的告警后,切忌慌张,更不要第一时间登录上去就乱删文件或重启系统。鲁莽的操作会破坏现场证据,让后续的溯源和分析变得极其困难。一个专业的应急响应,必须遵循有序的流程。
2.1 应急响应生命周期模型
一个完整的应急响应通常包含几个阶段:准备、检测、遏制、根除、恢复、总结。我们当前聚焦的“入侵排查”,主要覆盖的是“检测”和初步的“遏制”阶段。在开始任何技术操作前,必须完成以下管理动作:
- 信息收集与确认:第一时间联系报告人,确认告警来源(是IDS/IPS报警、异常流量监控,还是业务异常反馈?)、时间点、受影响的主机IP或域名。尽可能获取更多上下文信息。
- 授权与合规:确保你的操作拥有合法授权。如果是客户服务器,需获得客户书面或邮件授权;如果是公司内部资产,需遵循内部安全事件响应流程。
- 组建响应小组:如果事件影响重大,应立即召集安全、运维、业务负责人成立临时响应小组,明确沟通渠道和决策链。
完成上述步骤后,我们才进入技术排查环节。而技术排查的第一步,永远是:保护现场,收集易失性数据。
2.2 现场保护与易失性数据收集
系统内存、当前网络连接、进程列表等信息在断电或重启后会丢失,这些就是“易失性数据”,是入侵者活动最直接的证据。因此,登录可疑服务器的第一要务不是杀毒,而是取证。
登录注意事项:
- 避免使用可疑服务器上的已知用户:入侵者可能已经替换了
ssh、bash等二进制文件,或添加了键盘记录器。如果条件允许,最好通过带外管理(如IPMI、ILO)或从已知干净的跳板机,使用一次性密钥或临时密码登录。 - 创建隔离的调查环境:登录后,立即将当前Shell的输入输出记录到文件,同时复制一份可信的命令行工具到临时目录备用。
# 记录所有后续操作,用于审计和复盘 script -a -q /tmp/forensic_log.$(date +%Y%m%d%H%M%S).txt # 将/bin下的核心工具拷贝到临时目录,防止使用被篡改的命令 mkdir -p /tmp/trusted_bin cp /bin/ps /bin/netstat /bin/lsof /bin/ss /tmp/trusted_bin/ export PATH=/tmp/trusted_bin:$PATH
关键易失性数据收集命令: 以下命令的输出应尽快重定向到文件中,并传输到安全的分析平台。
系统概况与运行时间:
uptime who -a lastuptime看负载和运行时间,突然的高负载可能意味着加密挖矿。who和last查看当前和近期的登录记录,寻找异常IP或用户名。网络连接与监听端口:
# 优先使用ss,它比netstat更高效,且不易被木马替换 ss -tulnp # 查看所有TCP/UDP连接 netstat -antup # 查看路由表 route -n # 查看ARP缓存 arp -a重点查看
LISTEN状态的端口,是否有不熟悉的端口开放(如6666,4444,31337等常见后门端口)。查看ESTABLISHED连接,寻找与可疑IP的通信。进程信息:
ps auxf # 或更详细的格式 ps -eo pid,ppid,user,ni,pri,pcpu,pmem,vsz,rss,tty,stat,start,time,cmd --forest查看进程树(
--forest),入侵者进程往往会被隐藏或伪装。注意:无终端控制的进程(?)、高CPU/内存占用进程、奇怪进程名(如随机字符串、与系统进程名相似但字母被替换)。系统内存信息:
free -h cat /proc/meminfo如果物理内存几乎用尽,但Swap使用率不高,可能是遇到了消耗内存的恶意软件或攻击。
注意:在极端情况下,高级攻击者会部署“内核级rootkit”,能够隐藏进程、网络连接和文件。此时,上述命令的输出可能被篡改。需要结合其他手段,如使用静态编译的、来自可信介质的取证工具(如
busybox静态版)进行检查,或者直接进行内存取证分析。
3. 入侵痕迹深度排查:四个核心维度
收集完易失性数据后,我们需要对系统进行更深入的静态分析,寻找入侵者留下的持久化痕迹、被篡改的文件以及攻击活动的日志证据。主要从四个维度展开:进程与自启动、文件系统、网络与用户、系统日志。
3.1 进程与系统自启动项排查
入侵者为了保持访问权限,一定会设法让自己的恶意进程在系统重启后能自动运行。
3.1.1 检查系统服务
# Systemd 系统 systemctl list-unit-files --type=service --state=enabled systemctl list-units --type=service --state=running # 重点关注状态为 enabled 和 running 的服务 # 查看某个可疑服务的详细信息 systemctl status suspicious_service_name # 查看服务文件内容 cat /usr/lib/systemd/system/suspicious_service_name.service # 或 cat /etc/systemd/system/suspicious_service_name.service3.1.2 检查经典自启动位置
# 检查用户级自启动 (注意替换username) ls -la /home/username/.config/autostart/ ls -la ~/.config/autostart/ # 检查系统级自启动脚本 ls -la /etc/init.d/ ls -la /etc/rc.d/rc[0-6].d/ # 检查 rc.local (虽然很多新系统已不推荐) cat /etc/rc.local # 检查 cron 任务 (重点!) crontab -l # 当前用户 crontab -u username -l # 指定用户 ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.monthly/ /etc/cron.weekly/ cat /etc/crontabCron是攻击者最常用的持久化手段之一,他们会添加一个每分钟或每几分钟执行的任务,用于下载并执行恶意脚本、维持反向Shell等。
3.1.3 检查动态链接库劫持检查/etc/ld.so.preload文件,如果此文件存在且非空,它会在程序启动时优先加载其中指定的库,常被用于注入恶意代码。
cat /etc/ld.so.preload3.2 文件系统异常排查
入侵者会上传工具、篡改系统文件、创建隐藏后门。文件系统排查是体力活,也是技术活。
3.2.1 查找近期被修改的文件
# 查找过去24小时内被修改的文件,从根目录开始(可能需要sudo) find / -type f -mtime -1 2>/dev/null | head -50 # 查找过去2小时内被修改的文件 find / -type f -mmin -120 2>/dev/null # 更精确地,结合时间点。如果知道大概入侵时间,比如3天前下午2点 find / -type f -newermt '2023-10-24 14:00' ! -newermt '2023-10-24 15:00' 2>/dev/null3.2.2 查找可疑文件
- SUID/SGID文件:具有SetUID或SetGID权限的文件,运行时可以临时获得文件所有者或组的权限。攻击者可能利用此权限提升为root。
检查结果,排除已知的合法文件(如find / -type f -perm /6000 2>/dev/null/bin/passwd,/bin/su)。 - 隐藏文件与目录:以点开头的文件/目录,以及名称异常的文件。
find / -name ".*" -type f 2>/dev/null | grep -v "/proc\|/sys" find / -name "*.php" -o -name "*.jsp" -o -name "*.war" -o -name "*.py" 2>/dev/null | grep -v "/usr\|/var/www" # 在web目录外寻找web shell - 查找大文件:攻击者可能上传了打包的日志、工具集或挖矿程序。
find / -type f -size +50M 2>/dev/null | xargs ls -lh
3.2.3 检查系统关键文件完整性
- 对比重要二进制文件:使用
rpm、dpkg等包管理器验证,或与干净系统对比哈希值。
重点关注# CentOS/RHEL rpm -Va | grep '^..5' # Debian/Ubuntu debsums -c/bin,/sbin,/usr/bin,/usr/sbin下的ls,ps,netstat,ss,find,top等命令是否被替换。 - 检查
/etc/passwd和/etc/shadow:查看是否有异常用户、UID为0的用户(除root外)。awk -F: '$3==0 {print $1}' /etc/passwd grep -E ":/bin/bash|:/bin/sh" /etc/passwd
3.3 网络与用户活动排查
3.3.1 深入分析网络连接使用lsof命令可以查看进程打开的文件和网络连接,功能强大。
# 查看所有网络连接 lsof -i # 查看某个端口被谁占用 lsof -i:8080 # 查看某个进程的所有网络活动 lsof -p <PID>3.3.2 检查用户历史与登录
# 查看所有用户最近登录情况 lastlog # 查看当前登录用户 w # 查看所有用户的命令历史(需root) for user in $(ls /home); do echo "=== History for $user ==="; sudo -u $user tail -n 50 ~/.bash_history 2>/dev/null; done # 注意:高手会清空.bash_history,或设置HISTSIZE=0。3.4 系统日志分析:寻找攻击者的足迹
日志是还原攻击时间线的最重要依据。关键日志文件包括:
/var/log/auth.log或/var/log/secure:认证相关日志,记录SSH登录成功/失败、sudo使用等。/var/log/syslog或/var/log/messages:系统通用日志。/var/log/audit/audit.log:如果开启了auditd审计服务,这里有更详细的系统调用记录。/var/log/nginx/access.log或/var/log/apache2/access.log:Web访问日志。/var/log/cron:Cron任务执行日志。
日志分析常用命令:
# 1. 聚焦SSH暴力破解 grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | head -20 # 查看成功登录的IP grep "Accepted password" /var/log/secure | awk '{print $11}' | sort | uniq -c # 2. 查看某个时间段的日志(假设入侵发生在10月25日10点左右) sed -n '/Oct 25 09:50:00/,/Oct 25 10:10:00/p' /var/log/secure # 3. 使用journalctl (Systemd系统) journalctl --since "2023-10-25 09:00:00" --until "2023-10-25 11:00:00" -u ssh journalctl -k | grep -i "error\|warning" # 查看内核日志 # 4. 如果日志量巨大,可以使用工具如 `lnav` 或 `goaccess` (针对web日志)进行交互式分析。4. 典型入侵场景的排查实战
理论说再多,不如看实战。下面我们模拟两个最常见的入侵场景,串联使用上述命令进行排查。
4.1 场景一:服务器疑似被植入挖矿木马
症状:CPU使用率长期100%,风扇狂转,top命令发现一个名为kinsing或kdevtmpfsi的陌生进程占用大量CPU。
排查步骤:
定位进程:
ps aux | grep -E 'kinsing|kdevtmpfsi'记下PID。
查看进程详细信息:
ls -la /proc/<PID>/exe # 查看进程的可执行文件路径 cat /proc/<PID>/cmdline # 查看进程的完整启动命令 ls -la /proc/<PID>/cwd # 查看进程的工作目录结束进程并删除文件:
kill -9 <PID> # 找到文件路径后,彻底删除 rm -f /tmp/kinsing /var/tmp/kdevtmpfsi # 挖矿木马通常有守护进程和多个相关文件,需仔细查找 find / -name "*kinsing*" -o -name "*kdevtmpfsi*" 2>/dev/null检查持久化:
# 检查cron crontab -l cat /etc/crontab ls /etc/cron.d/ # 检查systemd服务 systemctl list-unit-files | grep -i miner # 检查特定用户的定时任务 ls /var/spool/cron/crontabs/挖矿木马几乎一定会通过cron或systemd实现持久化。
清理持久化项:
# 删除cron任务 crontab -r # 删除当前用户的cron(谨慎!确认是恶意任务) # 或编辑crontab文件删除对应行 # 删除systemd服务文件并重载 systemctl stop malicious_service systemctl disable malicious_service rm /etc/systemd/system/malicious_service.service systemctl daemon-reload
4.2 场景二:网站被上传WebShell
症状:网站出现异常内容,流量异常,服务器上发现陌生.php或.jsp文件。
排查步骤:
定位Web目录:确定网站根目录(如
/var/www/html,/usr/share/nginx/html)。查找可疑Web文件:
# 查找最近修改的php文件 find /var/www/html -name "*.php" -mtime -1 # 查找包含特定危险函数的文件(如eval, system, shell_exec) grep -r "eval\|system\|shell_exec\|passthru\|pcntl_exec" /var/www/html --include="*.php" # 查找文件大小异常的小文件(WebShell通常不大) find /var/www/html -type f -size -10k -name "*.php" | xargs ls -lh分析Web访问日志:
# 在nginx/apache日志中寻找上传行为 grep "POST.*upload\|POST.*\.php" /var/log/nginx/access.log | tail -50 # 寻找访问可疑文件的记录 grep "shell\.php\|cmd\.php\|wso\.php" /var/log/nginx/access.log # 寻找攻击者IP grep "shell.php" /var/log/nginx/access.log | awk '{print $1}' | sort -u检查文件权限:
# Web目录不应有777权限 find /var/www/html -type d -perm 777 find /var/www/html -type f -perm 666Web目录和文件权限过松是导致被上传WebShell的常见原因。
处置:删除WebShell文件,修补导致上传的漏洞(如文件上传功能未校验、CMS漏洞),重置相关数据库密码,并清理可能被篡改的网页文件。
5. 排查后的加固与反思
完成入侵排查和初步清理后,工作只完成了一半。必须进行系统加固,防止再次被同一方式入侵,并总结事件。
5.1 立即加固措施
更新与升级:立即更新所有软件包,尤其是已知存在漏洞的组件。
# CentOS/RHEL yum update -y # Debian/Ubuntu apt update && apt upgrade -y修改密码:更改所有用户密码,特别是root和具有sudo权限的用户。检查
/etc/passwd和/etc/shadow,删除无用账户。加固SSH:
- 禁用root直接登录:
PermitRootLogin no - 禁用密码认证,改用密钥对:
PasswordAuthentication no - 修改默认端口:
Port 2222 - 使用
AllowUsers限制可登录用户。 - 重启ssh服务:
systemctl restart sshd
- 禁用root直接登录:
配置防火墙:使用
firewalld或iptables,只开放必要的端口。# firewalld 示例 firewall-cmd --permanent --remove-service=ssh # 移除默认ssh服务(对应22端口) firewall-cmd --permanent --add-port=2222/tcp # 添加新端口 firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload安装并配置入侵检测系统:如
fail2ban(防暴力破解)、rkhunter/chkrootkit(Rootkit检测)、lynis(安全审计扫描)。
5.2 建立持续监控与响应机制
- 集中化日志:使用
rsyslog或syslog-ng将重要日志发送到独立的日志服务器,避免攻击者擦除本地日志。 - 部署HIDS:考虑部署基于主机的入侵检测系统(如OSSEC、Wazuh),能够监控文件完整性、异常登录、可疑进程等。
- 定期安全扫描:使用
Nessus,OpenVAS等工具定期进行漏洞扫描。 - 制定并演练应急预案:让团队熟悉响应流程,定期进行红蓝对抗演练。
5.3 个人实操心得与避坑指南
- 保持冷静,先取证后处置:这是铁律。慌乱中重启服务器,内存证据就全没了。任何删除、停止操作前,先保存好证据(命令输出、文件副本、内存镜像)。
- 不要完全信任受害系统:攻击者可能替换了
ps、netstat、ls等命令。使用事先准备好的静态编译工具或从光盘等只读介质启动进行排查,是最可靠的方式。 - 时间线是关键:将收集到的各种日志(系统日志、Web日志、命令历史)按时间排序,能清晰还原攻击路径。
auditd审计日志在这方面价值巨大,建议在重要服务器上启用。 - 假设失陷范围更大:不要以为只找到一处后门就万事大吉。攻击者常采用“打点-横向移动”的策略。检查同一网段的其他机器,检查数据库、缓存等关联服务。
- 善用自动化脚本,但不依赖:网上有很多应急响应检查脚本(如
linux-check.sh),可以快速给出检查结果。但它们只是辅助工具,不能替代人工分析。脚本可能过时,也可能被rootkit绕过。理解每条命令背后的原理更重要。 - 沟通与记录:整个响应过程,所有操作、发现、决策,都要详细记录。这既是事后写报告的需要,也是团队协作和知识沉淀的关键。
入侵排查就像侦探破案,需要耐心、细心和系统的思维。每一次应急响应,都是对系统安全状况的一次深度体检,也是提升个人技术能力的绝佳机会。把这份WP的思路和命令变成你的肌肉记忆,当下一次警报响起时,你就能从容应对。