冰蝎动态二进制加密WebShell特征分析
概述
冰蝎一款新型加密网站管理客户端,在实际的渗透测试过程中有非常不错的效果,能绕过目前市场上的大部分WAF、探针设备。本文将通过在虚拟环境中使用冰蝎,通过wireshark抓取冰蝎通信流量,结合平时在授权渗透中使用冰蝎马经验分析并总结特征。
版本介绍
目前冰蝎已经迭代6个版本下载地址,从最初的v1.0版本到目前最新的版本v2.0.1,其中v1.0版本可以从此处下载到。
冰蝎最初的版本对于环境的要求较为苛刻,仅支持部分环境,绝大部分环境中都无法连接成功,目前最新版本可使用范围有了较大的提升,PHP 5-PHP 7全版本支持,Java最低支持至1.6,.NET最低支持至2.0。
冰蝎最初版本User-Agent头为客户端JDK版本,v1.1开始新增随机UserAgent支持,每次会话会从17种常见UserAgent中随机选取。
由于冰蝎在通信过程中使用AES加密,Java和.Net默认支持AES加密,php环境中需要开启openssl扩展,v2.0更新以后,PHP环境加密方式根据服务器端支持情况动态选择,不再依赖openssl,使得冰蝎有了更大的发挥空间。
JSP冰蝎马,此处不作冰蝎马分析。
PHP冰蝎马
通信流量分析
在本地搭建环境抓取冰蝎流量来进行简单的特征分析,主要测试冰蝎最初版本和最新版本,v1.0和v2.0.1,提取通信关键特征。
服务端虚拟机win7、客户端本地主机win10、Tomcat8,客户端服务端Java环境均为1.8。
V1.0版本冰蝎连接
抓取到的通信流量如下:
从Wireshark中抓到的数据包中可以看出,冰蝎与传统的管理工具一样,操作请求均为POST。从流量包中可以清楚看到请求头中携带的User-Agent: Java/1.8.0_181为客户端Java环境的版本且会随着客户端的Java环境而变化,Content-Type: application/octet-stream表示以二进制流传输数据,响应体的数据被加密,无法看出响应的内容是什么,Content-Type: application/octet-stream代表二进制流也不能作为判定的依据,暂时无法提取的有效的特征,但是注意到冰蝎在建立之前会有一个GET请求,咱们在最新版本中看一下会不会有这个GET请求。
V2.0.1版本冰蝎连接
冰蝎v2.0.1连接成功,抓取到流量包如下:
我们通过查看POST数据包发现除上述提到冰蝎增加了随机的User-Agent和v1.0并无其它本质上的区别。
但是我们注意到依然会有GET请求,冰蝎检测的难点在于在通信过程中数据通过加密传输,难以提取特征,下面我们比较一下两个版本之间在连接过程中发起的GET请求。
V1.0请求包详情如下:
V2.0.1请求包详情如下:
通过比较发现,冰蝎在连接之前会发送一个GET请求,服务端如果正常会响应一个16位的字符串。其实冰蝎每一次连接请求都会向服务端发送一次GET请求获取16位的密钥,这16位的字符串就是密钥,在客户端和服务端的通信过程中使用密钥进行加密以达到免杀的目的,因此只要我们能在流量中发现这样特征的流量,便可以发现隐藏在流量中的冰蝎webshell。
冰蝎特征总结
检测请求方式:Request.method= GET
检测请求资源:Request.url= /[\w.]*\.[a-zA-Z]{3,4}\?\w{0,20}=\d{0,10}
检测服务端响应(仅16位密钥):Response.body.startwith =\w{16}
上述正则仅供参考,实际过程中需要防止规则被绕过,例如:shell的名字、后缀(可能利用解析漏洞等)、密码的长度等等。本次仅从v1.0和v2.0.1中去分析,实际在目前的版本中都存在获取密钥这个请求,由于篇幅有限,只举例说明了这个两个版本。
文末总结
与检测传统的网站管理工具不同的,中国菜刀、中国蚁剑、c刀等都从POST请求中去提取特征,而冰蝎在通信过程中使用加密传输无法获取明文,因此,利用冰蝎在和服务端通信过程中会获取密钥的特性去检测也许会是一种可行的方法。