最近工作需要,学习了一下webshell加密通信的方法,本文记录下修改蚁剑编码以进行流量伪装的实验过程。本人网络安全小白,不足还请指出,多谢。
中国蚁剑是一款开源的跨平台网站管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。\(^引\)
但同时也会用作webshell,被一些攻击者所利用。
比如,如果网站上存在一句话木马,<?php eval($_POST[test]);?>
,则可使用蚁剑进行连接控制。
将一句话中间的post参数test作为密码,便可以进行蚁剑的连接。
如果采用默认的编码器和最基础的配置,点击测试连接,可以捕捉到相关post流量。
可以看到post请求正文部分,有一个key-value pair,key正是test,一句话找到这个key并通过eval执行对应的value,从而远程执行代码进行控制。
上面是默认的编码器,这时,如果选择base64编码
则请求部分的流量为
URL解码后得到
当执行test的时候,会找到正文中nd326ad188f2ca对应的value并进行base64_decode,之后eval执行。
可以看到,当采用base64编码配置的时候,首先会将原始命令进行base64编码,采用随机变量作为key进行存储传输,后再提供一个具体的执行方式。
查看蚁剑关于base64编码配置的源码
可以看到,同上面分析一致,对原始数据data['_']进行base64编码,分配randomID,同时提供了一个执行方式data[pwd]。
这个方法中,webshell控制时需要同时将执行方式一起进行传输,每次都需要提供给一句话木马。
此外,根据上面流量信息,编码部分往往只编码了控制代码,执行方式并没有进行编码。将执行方式进行明文传输,存在较为明显的检测特征,常规检测引擎可以通过这部分特征进行拦截。
为绕过拦截,攻击者会针对这部分进行优化:直接将执行方式放嵌入到木马里。这样流量中只有加密过的数据。
抛砖引玉,这里设计一个绕过方式。
根据base64原理,base64编码后的数据只会包含大小写字母、数字、+、/。
base64将3个字节的数据分为4组进行编码,所以长度为4的倍数,长度不满4的倍数的话在末尾用等号(=)填充。
通常检测引擎为防逃逸会有对base64数据进行解码的功能,但多数只会对符合base64格式的数据进行解码尝试。所以可以简简单单在数据前面插入几个字符,使其长度不满足4的倍数或者包含其他字符,以此尝试绕过检测。
实际执行时,将前面插入的字符再删除掉即可。
这里,对上文的一句话木马进行修改
<?php eval(base64_decode(substr($_POST[test], 9)));?>
包含两个功能,一个是采用了substr函数对传输过来的数据进行替换,保留真正的base64攻击载荷;另一个是加入了base64_decode函数,直接将解码方式写入到一句话中,避免流量传输解码方式。
为适配这个一句话,稍稍对蚁剑的base64编码器进行了修改
删除了randomID,直接写死test。在value中,除了默认的对命令进行base64编码以外,在前面加入了"hello?hhh"9个字符用作混淆。
此外也删除了pwd这个解码方法。
测试连接,成功,得到请求流量为
仅包含一个键值对,通常,随机插入的这9个混淆字符已经足以让部分检测引擎无法解码。
至此,在进行远程控制时,每次执行命令的post报文中已经没有明显的攻击特征,这达到伪装成正常业务的目的。
综上所述,如果精心构造修改蚁剑,并将秘钥/解码方法嵌入到木马中,则对通信流量有一定伪装,可绕过检测。
实际中,包其他握手等部分流量同样也缺乏强有力的检测特征。
对于这种webshell的检测,我认为在webshell上传过程中对文件进行检测是目前比较合适的方法(假如文件有混淆又是个难题)。
参考
标签:编码,检测,解码,base64,流量,伪装,编码方式,进行 From: https://www.cnblogs.com/antelx/p/16734854.html