冰蝎-特征检测及报文解密

admin 2021年9月10日14:14:07冰蝎-特征检测及报文解密已关闭评论159 views字数 2641阅读8分48秒阅读模式
冰蝎-特征检测及报文解密

重生信息安全
作者:小让

前言

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. 密钥协商
  2. 加密传输

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-2

3. 长连接

冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 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中。正则如下:

返回随机密钥如图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}”

三、冰蝎报文解密

(一) 解密思路

在服务器开启 PHP OpenSSL 扩展脚本的情况下,冰蝎密文采用对称加密算法AES加密,加密后还会进行 base64 编码。在客户端发起密钥协商后,会返回16位明文随机密钥。在安全监控设备采集流量较全的情况下,可截获密文流量和密钥,通过解密解码平台即可获取冰蝎密文详情。

(二) 准备工具

AES在线解码 (http://tools.bugscaner.com/cryptoaes/)BASE64在线解码(https://tool.oschina.net/encrypt?type=3

(三)实现方式

1. 获取密钥

从请求密钥的数据包中获取密钥:29ab481053a0ebeb

2. 获取请求密文、返回密文

3. 借助在线解密解码平台

(1)输入密钥和请求密文,解密后为 base64 编码;base64解码

whoami解密

whoami解码(2)输入密钥和返回密文,解密后为base64编码;base64解码

本文以 php 语言来研究,在服务器开启 PHP OpenSSL 扩展脚本的情况下,冰蝎密文采用对称加密算法AES加密,加密后还会进行base64编码。在客户端发起密钥协商后,会返回16位明文随机密钥。在安全监控设备采集流量较全的情况下,可截获密文流量和密钥,通过解密解码平台即可获取冰蝎密文详情。本文是个人网上查阅相关资料研究和搭环境抓包所写,如有问题还望指正

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月10日14:14:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   冰蝎-特征检测及报文解密https://cn-sec.com/archives/539746.html