Linux应急响应实战:从Webshell排查到系统加固的完整指南

发布时间:2026/6/29 22:27:49
Linux应急响应实战:从Webshell排查到系统加固的完整指南 1. 项目概述从“靶机”到“战场”的实战演练最近在安全圈里一个叫“知攻善防实验室”的应急响应靶机训练项目特别是它的Web3版本讨论热度挺高。很多刚入行的安全工程师或者想转行做应急响应的朋友一听到“应急响应”四个字就有点发怵觉得这活儿压力大、要求高既要懂攻击又要懂防御还得在高压下快速决策。而这个靶机训练恰恰就是为解决这个痛点而生的。它不是让你去CTF赛场上解题而是模拟一个真实的企业服务器被入侵后的现场你需要扮演安全工程师的角色从接到告警那一刻起完成整个应急响应的闭环。简单说它就是一个高度仿真的“数字犯罪现场”而你的任务就是那个“数字侦探”找出入侵者是谁、怎么进来的、干了什么、留下了什么最后把“现场”清理干净并加固防线。这个Web3靶机从名字就能看出它聚焦的是Web应用层相关的安全事件。在真实的攻防对抗中Web漏洞比如SQL注入、文件上传、命令执行、反序列化是攻击者最常用的突破口也是应急响应中最常遇到的场景。靶机环境通常基于Linux系统比如CentOS里面预置了被攻击过的痕迹比如异常的进程、被篡改的文件、隐藏的后门、可疑的网络连接和日志记录。你的核心工作流程就是遵循标准的应急响应流程准备 - 检测与分析 - 遏制、根除与恢复 - 事后总结与加固。这个过程光看理论是没用的必须亲手去摸、去查、去分析才能形成肌肉记忆。这也是为什么这类实战靶场越来越受青睐的原因——它提供了零风险的“练功房”。接下来我会结合常见的实战经验和这个靶机可能涉及的场景为你拆解一次完整的应急响应实操。我会假设我们面对的就是一台被入侵的CentOS服务器上面运行着Web服务比如Apache/Nginx PHP我们将一步步抽丝剥茧。你会发现所谓的“应急响应脚本”其实是一系列命令和思考逻辑的组合而核心在于你的分析思路和对系统、网络的熟悉程度。2. 应急响应核心流程与实战思路拆解应急响应不是一堆命令的堆砌而是一个有章法的调查过程。在真正登录服务器之前你的头脑里就应该有一个清晰的调查框架。这个框架决定了你的效率避免你在海量的系统信息中迷失方向。2.1 标准流程六阶段模型业内通常将应急响应分为六个阶段这是一个非常实用的指导框架准备阶段这是平时就要做的工作。包括制定应急预案、准备工具包调查工具、分析软件、建立沟通机制、进行人员培训。对于个人练习而言你的“准备”就是准备好一个干净的虚拟机环境安装好常用的调查工具我们后面会列出来并熟悉它们的基本用法。检测与确认阶段收到告警如主机异常、流量异常、Webshell报警后第一时间确认事件是否真实发生初步判断事件类型和影响范围。在靶场中这个阶段通常从你发现某个异常现象开始比如网站首页被篡改或者监控到服务器有异常外连。遏制阶段在确认事件后立即采取短期措施防止损害扩大。例如隔离受感染主机断网、暂停受影响的服务、修改密码、封禁恶意IP等。注意在取证调查完成前尽量避免直接删除恶意文件或重启系统以免破坏证据。根除阶段找到安全事件的根源并彻底清除。包括清除恶意文件、后门、异常账户、计划任务等并修补被利用的漏洞。恢复阶段在确认根除后将系统或服务恢复到正常状态。恢复业务运行并持续监控一段时间以确保威胁没有复发。总结与改进阶段整理整个事件的时间线、攻击路径、技术细节形成报告。并基于此改进安全策略、加固系统、更新应急预案。在靶机训练中我们主要聚焦在2、3、4阶段即检测、分析和根除。下面我们就以一个典型的“Web服务器被上传Webshell并执行了命令”为场景深入每个环节的实操细节。2.2 调查思路由表及里由果溯因面对一台疑似被入侵的服务器新手容易上来就乱翻日志老手则会遵循一个高效的调查路径。我个人的习惯是“先宏观后微观先易失后持久”宏观状态快照首先用几条命令快速了解系统的整体状态。谁在登录有哪些网络连接哪些进程消耗资源异常这能帮你快速定位可疑点。追踪攻击入口Web攻击入口点大概率在Web应用。检查Web目录下的可疑文件、最近被修改的文件分析Web访问日志这是溯源的关键。深挖持久化痕迹攻击者为了维持访问一定会做持久化。检查计划任务、系统服务、启动项、SSH授权密钥、动态链接库劫持等位置。关联分析与时间线将不同地方发现的线索文件创建时间、进程启动时间、日志记录时间串联起来还原攻击者的行动路径。这个思路就像是破案先看案发现场概貌宏观状态寻找凶器Webshell再查凶手是怎么进来的日志最后看他有没有在房子里藏备用钥匙持久化后门。3. 实战工具箱命令与脚本详解工欲善其事必先利其器。下面这些命令和工具是Linux应急响应的“瑞士军刀”。我建议你可以在自己的测试机上先熟练它们。所谓的“CentOS应急响应脚本”其实就是把这些命令按逻辑组合成一个Shell脚本实现一键化信息收集。3.1 系统状态快速排查命令登录服务器后不要急着动任何东西先以只读的方式收集信息。1. 系统信息与用户排查# 查看当前登录用户和历史登录 who -a last -aiwx # 查看所有用户特别是UID为0的root用户和最近创建的用户 cat /etc/passwd | grep -E “(0:x|/bin/bash)” awk -F: ‘$30{print $1}’ /etc/passwd # 查看特权用户sudoers cat /etc/sudoers | grep -v “^#” | grep -v “^$” # 查看空口令用户 awk -F: ‘length($2)0 {print $1}’ /etc/shadow2. 进程与网络排查# 查看所有进程关注异常路径、高CPU/内存占用、奇怪父进程的进程 ps aux --sort-%cpu | head -20 ps aux --sort-%mem | head -20 # 查看网络连接ESTABLISHED状态的连接尤其要注意外连IP和端口 netstat -antp | grep ESTABLISHED # 或者用更现代的ss命令 ss -antp # 检查监听端口看是否有不熟悉的端口开放 netstat -tulnp # 检查进程打开的文件如果某个进程打开了Web目录下的可疑文件就是重大嫌疑 lsof -p 可疑PID3. 自启动项与服务排查# 检查系统服务 systemctl list-unit-files --typeservice | grep enabled # 检查开机启动项 ls -lah /etc/rc.d/rc.local /etc/rc.local 2/dev/null # 检查用户级定时任务crontab crontab -l # 查看当前用户的 cat /etc/crontab # 查看系统级的 ls -la /etc/cron.* # 查看cron目录下的所有任务注意攻击者经常将后门伪装成系统服务或藏在/etc/rc.local、/etc/init.d/等位置实现开机自启。查看服务时要特别注意那些路径奇怪、描述不清的服务。3.2 Web入侵专项排查命令这是本次靶机训练的重点因为事件是“Web3”。1. Web目录文件排查# 假设Web根目录是 /var/www/html 查找最近24小时内被修改的文件 find /var/www/html -type f -mtime -1 -ls # 查找权限异常的文件如777权限 find /var/www/html -type f -perm 777 -ls # 查找包含可疑关键词的文件如eval, base64_decode, system, shell_exec等 grep -r -l “eval(.*$_POST\|base64_decode\|system\|shell_exec\|passthru” /var/www/html --include“*.php” # 查找隐藏文件以点开头的文件 find /var/www/html -name “.*” -type f # 查找大小异常的小文件可能是Webshell find /var/www/html -type f -size -10k -ls | head -302. Web日志分析Web访问日志如Apache的access_log Nginx的access.log是还原攻击链的宝藏。# 查看日志最后1000行快速浏览 tail -1000 /var/log/httpd/access_log # 查找访问量最大的IP可能是扫描器或攻击源 awk ‘{print $1}’ /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -20 # 查找访问了可疑路径的请求如上传、管理后台、包含漏洞参数 grep -E “(upload|admin|\.php\?|\.php\|cmd|exec)” /var/log/httpd/access_log # 查找返回状态码异常的请求如大量的404扫描或成功的200但访问了异常文件 awk ‘$9404 {print $7}’ /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -20 awk ‘$9200 {print $7}’ /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -303. 后门与漏洞扫描可以使用一些工具辅助但不要完全依赖。# 使用clamav进行病毒扫描需安装 clamscan -r /var/www/html # 使用find命令结合webshell特征库需自己维护一个关键词文件 # find /var/www/html -type f -name “*.php” -exec grep -l -f webshell_keywords.txt {} \;3.3 构建一键信息收集脚本将上述命令有机组合可以形成一个基础的应急响应信息收集脚本。下面是一个简化示例保存为ir_collect.sh并赋予执行权限。#!/bin/bash # 应急响应基础信息收集脚本 # 作者你的名字 # 描述收集系统状态、用户、进程、网络、自启动、Web相关证据 OUTPUT_DIR“/tmp/ir_$(date %Y%m%d_%H%M%S)” mkdir -p $OUTPUT_DIR echo “[*] 开始应急响应信息收集输出目录$OUTPUT_DIR” # 1. 系统与用户信息 echo “[*] 收集系统与用户信息…” who -a $OUTPUT_DIR/who.txt 21 last -aiwx $OUTPUT_DIR/last.txt 21 cat /etc/passwd $OUTPUT_DIR/passwd.txt 21 cat /etc/shadow $OUTPUT_DIR/shadow.txt 21 2/dev/null || echo “无法读取shadow文件” $OUTPUT_DIR/shadow.txt awk -F: ‘$30{print $1}’ /etc/passwd $OUTPUT_DIR/uid0_users.txt # 2. 进程信息 echo “[*] 收集进程信息…” ps aux --sort-%cpu $OUTPUT_DIR/ps_aux_cpu.txt 21 ps aux --sort-%mem $OUTPUT_DIR/ps_aux_mem.txt 21 ps auxf $OUTPUT_DIR/ps_auxf_tree.txt 21 # 3. 网络信息 echo “[*] 收集网络信息…” netstat -tulnp $OUTPUT_DIR/netstat_listen.txt 21 netstat -antp $OUTPUT_DIR/netstat_all.txt 21 ss -antp $OUTPUT_DIR/ss_all.txt 21 # 4. 自启动项 echo “[*] 收集自启动项…” systemctl list-unit-files --typeservice | grep enabled $OUTPUT_DIR/enabled_services.txt 21 crontab -l $OUTPUT_DIR/crontab_user.txt 21 cat /etc/crontab $OUTPUT_DIR/crontab_system.txt 21 ls -la /etc/cron.* $OUTPUT_DIR/cron_dirs.txt 21 # 5. Web目录检查 (根据实际情况修改WEB_ROOT) WEB_ROOT“/var/www/html” if [ -d “$WEB_ROOT” ]; then echo “[*] 收集Web目录信息…” find $WEB_ROOT -type f -mtime -7 -ls $OUTPUT_DIR/web_recent_files.txt 21 find $WEB_ROOT -type f -perm 777 -ls $OUTPUT_DIR/web_777_files.txt 21 # 简单的Webshell关键词查找 grep -r -l “eval\|assert\|system\|shell_exec\|passthru\|base64_decode” $WEB_ROOT --include“*.php” 2/dev/null $OUTPUT_DIR/webshell_suspects.txt || echo “未找到疑似文件” $OUTPUT_DIR/webshell_suspects.txt else echo “[!] Web根目录 $WEB_ROOT 不存在跳过Web检查。” $OUTPUT_DIR/web_check.txt fi # 6. 历史命令检查攻击者可能执行的操作 echo “[*] 收集历史命令…” history $OUTPUT_DIR/history.txt 21 echo “[] 信息收集完成所有文件已保存至$OUTPUT_DIR” echo “[] 请仔细分析以上文件并结合日志进行深度调查。”实操心得这个脚本只是一个起点。在真实环境中你需要根据实际情况调整WEB_ROOT路径并可能增加对特定日志文件如/var/log/secure,/var/log/messages的收集。运行脚本后不要在原环境直接分析最好将$OUTPUT_DIR目录打包下载到本地分析机器上避免在受污染环境操作带来风险。4. 案例实战模拟“知攻善防-Web3”靶机入侵分析现在让我们代入一个具体的模拟场景。假设你接到通知服务器192.168.1.100上的网站首页被篡改显示了一段挑衅文字。4.1 初步排查与遏制远程登录使用SSH密钥或密码登录服务器。如果怀疑SSH已不安全应通过带外管理方式如控制台快速状态检查# 查看当前登录用户除了自己还有没有其他人 who # 查看异常进程和网络连接 top -c netstat -antp | grep -v “127.0.0.1” | grep ESTABLISHED假设发现一个可疑的/tmp/.x进程正在连接一个外部IP的6667端口常见IRC后门端口。立即遏制网络隔离如果条件允许在防火墙或交换机层面封锁该服务器对外的异常连接如那个外部IP或者直接断网。进程终止记录下可疑进程的PID然后终止它。kill -9 PID。注意这只是临时措施后门很可能重启。备份现场在采取任何破坏性操作如删除文件前先对关键证据进行备份。例如将可疑进程对应的可执行文件复制出来cp /proc/PID/exe /tmp/backup_malware。4.2 深度检测与根除定位Webshell# 检查Web根目录最近修改的文件 find /var/www/html -type f -name “*.php” -mtime -1 | xargs ls -la假设发现一个可疑文件/var/www/html/images/logo.php修改时间就在不久前且内容包含eval($_POST[‘cmd’]);。这就是一个典型的“一句话木马”Webshell。分析攻击入口# 分析Apache访问日志查找访问logo.php的请求 grep “logo.php” /var/log/httpd/access_log # 更关键的是查找在logo.php被创建之前有哪些可疑的请求比如上传、包含漏洞利用 # 假设logo.php是在今天10:30创建的 # 查看10:00-10:30之间的日志寻找POST请求或带有明显攻击参数的请求 sed -n ‘/10:00/,/10:30/p’ /var/log/httpd/access_log | grep -E “(POST|upload|\.php\?)”通过分析你可能发现攻击者先利用了一个文件上传漏洞请求/upload.php上传了Webshell然后通过访问logo.php并传递POST参数执行了系统命令。清除Webshell与修复漏洞备份恶意文件副本供后续分析后删除Webshellrm -f /var/www/html/images/logo.php。找到存在漏洞的上传功能代码upload.php修复其文件类型校验、目录路径等安全缺陷。排查持久化后门 Webshell找到了但攻击者可能还留了其他后门。# 检查计划任务 crontab -l -u root cat /etc/crontab ls -la /var/spool/cron/ # 检查系统服务 systemctl list-unit-files --typeservice | grep -E “(enabled|disabled)” # 检查SSH授权密钥 cat ~/.ssh/authorized_keys cat /root/.ssh/authorized_keys # 检查动态链接库劫持 cat /etc/ld.so.preload 2/dev/null # 检查/etc/rc.local cat /etc/rc.local假设在/etc/cron.hourly/目录下发现一个可疑的脚本cleanup.sh其内容会从远程服务器下载并执行恶意程序。这就是攻击者设置的持久化后门。清除持久化后门删除恶意计划任务脚本rm -f /etc/cron.hourly/cleanup.sh。检查并清理/tmp/、/dev/shm/等临时目录下的可疑文件。使用chkrootkit、rkhunter等工具进行全系统扫描排查Rootkit。4.3 恢复与加固恢复业务修复漏洞后重启Web服务验证网站功能是否正常。修改密码更改服务器root用户密码以及所有数据库、应用账户的密码。系统加固更新系统yum update -y。最小化服务关闭不必要的服务。配置防火墙只开放必要的端口如80, 443, 22。加强SSH禁止root直接登录使用密钥认证修改SSH端口。文件监控部署文件完整性监控如AIDE对关键目录/bin,/sbin,/usr/bin,/var/www建立基线一旦文件被修改就能告警。日志集中将系统日志、Web日志发送到独立的日志服务器避免攻击者擦除日志。5. 常见问题排查与高阶技巧实录在实际应急响应和靶机练习中你会遇到各种“坑”。下面记录了一些典型问题和我的处理思路。5.1 问题排查速查表问题现象可能原因排查命令/思路CPU或内存占用异常高1. 挖矿木马2. Webshell正在执行高强度操作3. 正常业务高峰top -c查看进程ps aux --sort-%cpu检查进程路径和命令行参数是否可疑。服务器对外发起大量连接1. 被当作DDoS肉鸡2. 后门在进行C2通信或数据外传3. 正常业务如爬虫、API调用netstat -antp | grep ESTABLISHEDss -antp关注连接到的陌生IP和端口特别是高频短连接。Web日志中出现大量扫描请求1. 攻击者正在信息收集或漏洞扫描2. 搜索引擎爬虫通常User-Agent可识别awk ‘{print $1}’ access_log | sort | uniq -c | sort -nr分析扫描路径特征可临时封禁恶意IP。发现可疑文件但无法删除1. 文件被设置为不可修改immutable属性2. 文件正在被进程占用lsattr filename查看属性用chattr -i filename解除锁定lsof | grep filename查看占用进程并先结束进程。命令历史history被清空攻击者为了隐藏痕迹执行了history -c检查~/.bash_history文件是否被清空或篡改。可以尝试从系统日志如/var/log/secure中记录的SSH命令间接还原部分操作。系统命令被替换如ls, ps中了Rootkit系统二进制文件被篡改使用which ls和rpm -Vf /bin/ls对于RPM系统校验命令完整性。使用静态编译的干净工具包如busybox进行检查。5.2 高阶技巧与心得时间线分析是王道将文件修改时间stat filename、进程启动时间、日志记录时间放在一个时间轴上能清晰看出攻击步骤。使用find配合-newerXY参数可以基于时间戳查找文件。不要相信系统自带的命令在高度怀疑系统被Rootkit感染时ps,netstat,ls等命令的输出可能被篡改。此时应该从干净的救援盘启动或者使用静态编译的、放在只读介质上的安全工具集如chkrootkit自带的工具或自己准备的busybox进行检查。关注隐藏和伪装攻击者喜欢用“.”开头的隐藏文件、将文件放在/tmp、/dev/shm、/var/tmp等临时目录或者将后门命名为类似系统文件的名字如/usr/bin/sshdvs/usr/bin/sshd2。使用ls -la和find时务必仔细。Webshell的变种现在的Webshell越来越隐蔽可能采用编码、加密、图片马、隐藏在正常文件尾部等方式。静态特征匹配可能失效需要结合动态行为分析如监控Web目录下文件的执行行为、网络连接。善用日志除了Web日志系统认证日志/var/log/secure记录SSH登录、系统日志/var/log/messages记录很多系统事件都包含关键信息。比如在secure日志里可以看到失败的SSH爆破尝试和成功的登录记录。靶机练习的进阶在完成基础的“找Webshell、清后门”之后可以尝试更复杂的场景比如攻击者通过多个漏洞组合渗透如SQL注入到Getshell、内网横向移动在靶场环境中部署多台机器、日志被部分清除、使用内存马无文件攻击等。这些在“知攻善防”这类高质量的靶场中应该都有所涉及。应急响应是一项综合能力需要你对操作系统、网络、Web应用、安全工具都有了解。靶机训练就像消防演习练得越多真遇到火灾时就越镇定。每一次调查都是一次对知识体系的巩固和扩展。最后记住一个原则在确认完全清楚影响并做好备份之前谨慎执行删除、重启等不可逆操作。宁可多花时间分析也不要盲目行动破坏了唯一的数据源。