01、冰蝎简介
最近攻防演练期间,Webshell工具界再次祭出大杀器“BehinderV4.0”。看来蓝队的头发又要“保不住”了;看不完的流量包,解不完的绕过编码。
本次冰蝎新增了5种加密方式xor、xor_base64、aes、json和image。本文通过对该工具的分析,来分享一下对于防护此类工具的思考。
02、通讯过程
先看下基本过程:
1. 客户端向服务端请求密钥;
2. 服务端记录下客户端相关信息,生成随机密钥,并将两份消息发送给客户端;
3. 客户端将收到的密钥通过AES对称加密算法,对payload攻击脚本进行加密。然后再进过base64编码对加密过后对二进制流进行编码。发送给服务端;
4. 服务端通过base64解码以后,再利用刚刚的密钥解密,获得payload并执行。将执行结果加密返回给客户端;
5. 客户端解密获得最终消息。
03、案例讲解
1. 客户端向服务端请求密钥
客户端在运行时,首先以GET请求携带密码字段向服务器发起握手请求,获取此次会话的加密密钥和Cookie值。加密密钥用来对后续发送的Payload进行AES加密;上文我们说到服务器端随机产生密钥之后会存到当前Session中,同时会以set-cookie的形式给客户端一个SessionID,客户端获取密钥的同时也要获取该Cookie值,以用来标识客户端身份,服务器端后续可以通过客户端传来的Cookie值中的SessionID来从Session中取出该客户端对应的密钥进行解密操作。
主要代码如下:
客户端每次都会通过服务器发来的随机密钥。对攻击payload进行加密。
2. 客户端对Payload进行加密
案例中给出的是一个执行打开当前文件的命令(open ./),下面给出Payload小样:
冰蝎的加密思路可以分为如下几个步骤:
读取二进制的payload,并将其使用AES加密(密钥为上一步向服务器请求到的密钥);
通过Base64进行编码:
其实到这一步就可以看出来冰蝎的一个思路流程图(左侧为客户端,右侧为服务器):
AES的密钥是随机生成的,下面的一段代码摘自冰蝎作者的密钥生成模块:
查看一下运行的随机结果,蓝队是不是压力突然就上来了?流量的特征完全随机。
前面对于客户端铺垫了这么多,那现在就看看服务端的执行结果:
小结:
到这里,基本上讲完了冰蝎4.0版本这个工具的牛X的地方啦!将Payload加密,但是本文并非是工具编写的教程,所以实现细节的话还是看大佬的原文吧!https://xz.aliyun.com/t/2744。
04、防护思路
因为密钥的变化,直接抓取Payload流量过程中的特征几乎是不太可能的。但是如果将可疑流量保存下来,获取密钥并进行解密,那也不是不可能的。
还有一种难度系数较小的方案是,即从文件上传的角度来防护。