冰蝎动态二进制加密WebShell基于流量侧检测方案

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29

冰蝎是一款新型动态二进制加密网站工具。目前已经有6个版本。对于webshell的网络流量侧检测,主要有三个思路。一:webshell上传过程中文件还原进行样本分析,检测静态文件是否报毒。二:webshell上线或建立连接过程的数据通信流量。三:webshell已连接后执行远程控制命令过程的数据通信流量。本文通过分析多个历史冰蝎版本及五种脚本(asp|aspx|jsp|jspx|php),结合第二点检测冰蝎上线的静态特征,并总结部分snort规则。
冰蝎通讯原理
冰蝎采用AES加密,很多文章已有介绍,并有对应解密脚本,这里不再赘述。
冰蝎上线数据包
V1.0版本冰蝎连接
抓取到的通信流量如下:

Content-Type: application/octet-stream表示以二进制流传输数据。GET请求体返回16位大小写字母或数字。
V1.1版本冰蝎连接

冰蝎工具从V1.1开始(包含V1.1)新增随机UserAgent支持,每次会话会从17种常见UserAgent中随机选取。这个版本的pass 与其他版本不同,pass(密码) 后跟10位数字。
V2.0.1版本冰蝎连接
php shell上线数据包

asp shell 上线数据包

特殊的数据包
特殊包类型一
仅在php shell 上线时发现。测试版本 V2.0和V2.0.1
php shell上线时会产生两个POST请求和响应。第一个POST 响应无响应体,第二个POST响应有响应体。这里需要额外写snort判断。用flowbits 设置多包联合检测。
第一个POST响应

第二个POST响应

特殊包类型二
有两条很久以前抓的冰蝎包,写的snort一直匹配不上,忘了是哪个版本。仔细一看,居然没有Content-Length字段。php shell 上线,GET响应居然无强特征 ”Content-Length: 16,查资料说如果是 chunked 加密的,可能就不显示这个content-length字段了。这个特殊类型我选择性忽视。

下面也是php GET响应 无强特征 “Content-Length: 16″,看上去多了几个字符,是显示的问题,其实并没有多。

静态特征
弱特征1:密钥传递时URL参数
 

"/.(php|jsp|asp|jspx|aspx)/?/w{1,8}=/d{1,10}HTTP/1/.1" 
这里 /w{1,8} 表示密码的长度,可根据实际需求及探针性能调整。/d{1,10} 表示密码后面跟的数字长度,为了兼容V1.0和V1.1,用1-10。如果只检测V2.1版本,可以调整为 /d{2,3}。
弱特征2:加密时的URL参数
在加密通讯过程中,没有URL参数。是的,没有参数本身也是一种特征。
"/.(php|jsp|asp|jspx|aspx) HTTP/1.1"
本文暂未使用此特征。
强特征3:Accept字段(可绕过)
Accept是HTTP协议常用的字段,但冰蝎默认Accept字段的值却很特殊,这个特征存在于冰蝎的任何一个通讯阶段。
Accept: text/html,image/gif, image/jpeg, *; q=.2, */*;q=.2
冰蝎支持自定义HTTP Header,因此该特征可以被绕过。
可以针对此特征做专门的检测,因为大多数人都没有修改Accept 习惯。
本文暂未使用此特征。
强特征4:UserAgent字段(可绕过)
冰蝎工具从V1.1开始(包含V1.1)新增随机UserAgent支持,每次会话会从17种常见(较老)UserAgent中随机选取。
如果发现历史流量中同一个源IP访问某个URL时,命中了以下列表(下载地址)中多个UserAgent,那基本确认就是冰蝎了。
大多数人都没有修改Accept 习惯。但冰蝎支持自定义UA,该特征可以被绕过。
本文暂未使用此特征。
强特征5:传递的密钥
加密所用密钥是长度为16的随机字符串,大小写字母+数字组成。密钥传递阶段,密钥存在于get请求的响应体中。需要划重点的是,不管哪种冰蝎脚本的shell,上线过程客户端都是要与服务器商量2次密码的,也就是会发2个get请求,并返回2次 16位的key。

因此密钥特征如下:
"/r/n/r/n[A-Za-z0-9]{16}$"
还有一个特征,get请求响应体长度一定是16位的。
"Content-Length: 16"
弱特征6:加密数据上行
jsp|php|jspx 加密数据上行特征如下:

[1] [2] [3]  下一页