前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >冰蝎-特征检测及报文解密

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

作者头像
重生信息安全
发布2020-04-26 13:28:45
4.7K0
发布2020-04-26 13:28:45
举报
文章被收录于专栏:重生信息安全重生信息安全

前言

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 字段的值却很特殊,这个特征存在于冰蝎的任何一个通讯阶段。如下:

代码语言:javascript
复制
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的扩展名一般为可执行脚本,如下:

代码语言:javascript
复制
\.(php|jsp|asp|aspx)\?(\w){1,10}=\d{2,3}  HTTP/1.1

请求密钥URL图2-4:

2. 加密时的URL参数

在加密通讯过程中,无URL参数。如下:

代码语言:javascript
复制
\.(php|jsp|asp|jspx|asa)    HTTP/1.1
3. 传递的密钥

加密所用密钥是长度为16的随机字符串,小写字母+数字组成。密钥传递阶段,密钥存在于Response Body中。正则如下:

代码语言:javascript
复制
^[a-fA-F0-9]{16}$

返回随机密钥如图2-5:

4.加密数据上行

在加密通讯时,php/jsp shell 会提交base64编码后的请求数据。用如下正则便可以很好的匹配。数字20是指定的字符出现至少20个才会匹配。正则如下:

代码语言:javascript
复制
\r\n\r\n[a-zA-Z\d\+\/]{20,}
5. 密数据下行

该特征同样存在于加密通讯时,在返回包中的数据是加密后的二进制数据。这里使用正则的“非”匹配二进制非常见字符。正则如下:

代码语言:javascript
复制
” [^\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位明文随机密钥。在安全监控设备采集流量较全的情况下,可截获密文流量和密钥,通过解密解码平台即可获取冰蝎密文详情。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 重生信息安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、冰蝎-动态加密算法
    • (一) 冰蝎简介
      • (二) 冰蝎工具通信原理
        • 1. 第一阶段-密钥协商
        • 2. 第二阶段-加密传输
    • 二、冰蝎特征检测
      • (一) 可绕过特征
        • 1. Accept字段
        • 2. UserAgent字段
        • 3. 长连接
      • (二) 非可绕过特征
        • 1. 密钥传递时URL参数
        • 2. 加密时的URL参数
        • 3. 传递的密钥
        • 4.加密数据上行
        • 5. 密数据下行
    • 三、冰蝎报文解密
      • (一) 解密思路
        • (二) 准备工具
          • (三)实现方式
            • 1. 获取密钥
            • 2. 获取请求密文、返回密文
            • 3. 借助在线解密解码平台
        相关产品与服务
        数据库智能管家 DBbrain
        数据库智能管家(TencentDB for DBbrain,DBbrain)是腾讯云推出的一款为用户提供数据库性能、安全、管理等功能的数据库自治云服务。DBbrain 利用机器学习、大数据手段、专家经验引擎快速复制资深数据库管理员的成熟经验,将大量传统人工的数据库运维工作智能化,服务于云上和云下企业,有效保障数据库服务的安全、稳定及高效运行。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档