点击“蓝字”关注我们,不迷路~前言
19年驻场于某金融单位。参加19年9月、11月两次攻防演练,负责攻防演练组织、技术支持和复盘。期间,多个攻击队伍使用冰蝎 webshell ,防守方监测时确实各 IDS 确实报出 webshell 连接,但无法看到请求和返回详情。现市场已存在可解密冰蝎密文的IDS,由于我所在部门,三家厂商的安全设备均不可判断为冰蝎 webshell 和解密冰蝎,于是客户要求想办法做密文解密。下载pcap包截图如下:
注:本文以冰蝎v2.0.1版本PHP语言为阐述。一、冰蝎-动态加密算法
(一) 冰蝎简介
冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端。老牌 Webshell 管理神器——中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场景中越来越少使用,加密 Webshell 正变得日趋流行。由于通信流量被加密,传统的 WAF、IDS 设备难以检测,给威胁狩猎带来较大挑战。冰蝎其最大特点就是对交互流量进行对称加密,且加密秘钥是由随机数函数动态生成,因此该客户端的流量几乎无法检测。冰蝎目前最新版本为v2.0.1,兼容性已经日益完善,包括虚拟终端、Socks代理、文件管理、反弹shell、数据库管理等强大的功能,方便部署使用。图1-1 冰蝎webshell(二) 冰蝎工具通信原理
冰蝎的通信过程可以分为两个阶段:- 密钥协商
- 加密传输
1. 第一阶段-密钥协商
1)攻击者通过 GET 或者 POST 方法,形如 http://127.0.0.1/shell.aspx?pass=645 的请求服务器密钥;2)服务器使用随机数 MD5 的高16位作为密钥,存储到会话的 $_SESSION 变量中,并返回密钥给攻击者。2. 第二阶段-加密传输
1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;3)执行结果通过AES加密后返回给攻击者。图 1‑2 冰蝎执行流程图Wireshark下抓取冰蝎(v2.0.1)数据包详情如下图1-3、1-4:二、冰蝎特征检测
总结冰蝎在流量交互中的特征,这些特征可分为两类。一类是可绕过特征,这类特征攻击者可通过构造报文进行绕过,致使设备检测不到冰蝎 webshell 特征。另一类是非可绕过特征,攻击者在某些情景无法更改 HTTP 某些字段,致使有固定报文字段可供设备检测。使用单个特征误报较高,但多个特征配合使用可降低误报,推荐多个特征搭配使用,进一步提升特征检测的准确性。(一) 可绕过特征
1. Accept字段
Accept是HTTP协议常用的字段,但冰蝎默认 Accept 字段的值却很特殊,这个特征存在于冰蝎的任何一个通讯阶段。如下:Accept: text/html,image/gif, image/jpeg, *; q=.2, */*; q=.2
图2-1 请求体Accept字段2. UserAgent字段
冰蝎内置了十余种 UserAgent ,每次连接 shell 会随机选择一个进行使用。如果发现历史流量中同一个源IP访问某个URL时,命中了以下列表中多个 UserAgent ,可基本确认为冰蝎特征。以下 UserAgent 列表是从冰蝎的jar包中提取。请求体UserAgent如图2-23. 长连接
冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection。Connection: Keep-Alive请求体Connection如图2-3(二) 非可绕过特征
1. 密钥传递时URL参数
密钥传递时,URI只有一个参数,key-value型参数,只有一个参数。Key是黑客给shell设置的密码,一般为10位以下字母和数字,很少有人设置特殊字符做一句话密码的(少数情况我们不考虑)。而Value一般是2至3位随机纯数字。另外webshell的扩展名一般为可执行脚本,如下:\.(php|jsp|asp|aspx)\?(\w){1,10}=\d{2,3} HTTP/1.1
请求密钥URL图2-4:2. 加密时的URL参数
在加密通讯过程中,无URL参数。如下:\.(php|jsp|asp|jspx|asa) HTTP/1.1
3. 传递的密钥
加密所用密钥是长度为16的随机字符串,小写字母+数字组成。密钥传递阶段,密钥存在于Response Body中。正则如下:^[a-fA-F0-9]{16}$
返回随机密钥如图2-5:4.加密数据上行
在加密通讯时,php/jsp shell 会提交base64编码后的请求数据。用如下正则便可以很好的匹配。数字20是指定的字符出现至少20个才会匹配。正则如下:\r\n\r\n[a-zA-Z\d\+\/]{20,}
5. 密数据下行
该特征同样存在于加密通讯时,在返回包中的数据是加密后的二进制数据。这里使用正则的“非”匹配二进制非常见字符。正则如下:” [^\w\s><=\-‘”\:\;\,\!\(\)\{\}][\w]{2}[^\w\s><=\-‘”\.\:\;\,\!\(\)\{\}][a-zA-Z\d]{2}”