我和我的 KPI 拼了!
介绍
冰蝎是一款基于Java开发的动态加密通信流量的 Webshell 客户端。老牌 Webshell 管理神器——中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场景中越来越少使用,加密 Webshell 正变得日趋流行。
由于通信流量被加密,传统的 WAF、IDS 设备难以检测,给威胁狩猎带来较大挑战。冰蝎其最大特点就是对交互流量进行对称加密,且加密密钥是由随机数函数动态生成,因此该客户端的流量几乎无法检测。
工具通信原理
冰蝎的通信过程可以分为两个阶段:密钥协商和加密传输。经过探究,下面是冰蝎 2.0 的通讯过程,冰蝎 3.0 之后的版本都是直接将 AES 密钥写入文件中,然后直接进行加密交互。
第一阶段-密钥协商
1、攻击者通过 GET 或者 POST 方法,形如 http://127.0.0.1/shell.aspx?pass=645的请求服务器密钥;
2、服务器使用随机数 MD5 的高16位作为密钥,存储到会话的 $_SESSION 变量中,并返回密钥给攻击者。
第二阶段-加密传输
1、客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;
2、服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;
3、执行结果通过AES加密后返回给攻击者。

密钥协商(图片来自参考链接 [1])
特征
默认流量特征
Accept 字段
Accept: application/json, text/javascript, /; q=0.01
检测思路:
浏览器可接受任何文件,但最倾向 application/json 和 text/javascript
冰蝎 3.0 中,如果请求没有设置 accept,Cache-Control,Pragma,User-Agent。则会设置默认为:(在冰蝎 3.0 中,默认只会设置 ua 请求头,而其他三种一般不会设置。)
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Cache-Control: no-cache
Pragma: no-cache
User-Agent: java/1.8
Content-Type
Content-type: Application/x-www-form-urlencoded
检测思路:
弱特征,辅助其他特征来检测
在冰蝎 3.0 的服务端,是通过如下代码读取 post 请求
在冰蝎3.0 的服务端,是通过如下代码读取post请求
代码的意思是,直接读取 post 请求中 body 的内容。所以请求的 http 中,content-type 一定为 application/octet-stream
。否则就会出现非预期 http 编码的情况。
User-agent 字段
冰蝎 4.0 设置了 10 种 User-Agent,每次连接 shell 时会随机选择一个进行使用。
Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) Gecko/20100101 Firefox/87.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko/20100101 Firefox/79.0
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

UA 路径
端口
冰蝎与 webshell 建立连接的同时,javaw 也与目的主机建立 tcp 连接,每次连接使用本地端口在 49700 左右,每连接一次,每建立一次新的连接,端口就依次增加。
检测思路:
对符合范围的端口进行检测,作为弱特征。
PHP webshell 中存在固定代码
webshell特征
$post=Decrypt(file_get_contents("php://input"));
eval($post);
检测思路:
对 eval( 进行检测,这是个弱特征,很容易被绕过。
JSP webshell 特征
默认自带的 JSP webshell 全部带有 java.util.Base64 。正常业务也有,作为弱特征使用。
自带的 23 个 JSP webshell payload 中,只有两个不包含 SecretKeySpec(raw, "AES")
net.rebeyond.behinder.payload.java.NewScan 和 net.rebeyond.behinder.payload.java.PortMapOld 不包含。
自带的 JSP webshell 有大量相似部分,识别比较容易,可以作为强特征。
长连接
冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection。
Connection: Keep-Alive
检测思路
辅助其它检测思路
固定的请求头和响应头
Cookie 中存在特征
JSESSIONID|PHPSESSID|ASPSESSIONID
默认连接密码
默认时,所有冰蝎 4.0 webshell 都有 “e45e329feb5d925b” 一串密钥。该密钥为连接密码 32 位 md5 值的前 16 位,默认连接密码 rebeyond

默认连接密码
冰蝎 2.0
通信过程
密钥传递时 URL 参数
密钥传递时,URI 只有一个参数,key-value 型参数,只有一个参数。Key 是黑客给 shell 设置的密码,一般为 10 位以下字母和数字,很少有人设置特殊字符做一句话密码的(少数情况我们不考虑)。而 Value 一般是 2 至 3 位随机纯数字。另外 webshell 的扩展名一般为可执行脚本,正则如下:
\.(php|jsp|asp|aspx)\?(\w){1,10}=\d{2,3} HTTP/1.1

密钥传递(图片来自参考链接 [2])
加密时的 URL 参数
在加密通讯过程中,无 URL 参数。正则如下:
\.(php|jsp|asp|jspx|asa) HTTP/1.1
传递密钥过程
加密所用密钥是长度为 16
的随机字符串,小写字母 + 数字组成。密钥传递阶段,密钥存在于Response Body中。正则如下:
^[a-fA-F0-9]{16}$

传递密钥过程
加密数据上行
在加密通讯时,php/jsp shell 会提交 base64 编码后的请求数据。用如下正则便可以很好的匹配。数字 20 是指定的字符出现至少 20 个才会匹配。正则如下:
\r\n\r\n[a-zA-Z\d\+\/]{20,}
加密数据下行
该特征同样存在于加密通讯时,在返回包中的数据是加密后的二进制数据。这里使用正则的“非”匹配二进制非常见字符。正则如下:
” [^\w\s><=\-‘”\:\;\,\!\(\)\{\}][\w]{2}[^\w\s><=\-‘”\.\:\;\,\!\(\)\{\}][a-zA-Z\d]{2}”
冰蝎 3.0 之后的版本和v2.1相比,最重要的变化就是“去除动态密钥协商机制,采用预共享密钥,全程无明文交互,密钥格式为md5("admin")[0:16];
”。
好了,后面再结合一些常规检测方案搓模型吧
参考链接
[1] 冰蝎4.0特征分析及流量检测思路
[2] 冰蝎-特征检测及报文解密
[3] 冰蝎3.0简要分析
[4] 冰蝎3.0流量特征分析(附特征)