Author:KimJun@深信服西部天威战队

0x00 V2版本

1. 项目

github项目:https://github.com/rebeyond/Behinder/releases/
V2 源码:https://github.com/hktalent/afterLoader

2. 流量分析

执行流程图:

  1. 首次连接一句话服务端时,客户端首先向服务器端发起GET请求,只有一个参数,格式为?pass=123形式,服务器端随机产生一个128位的密钥,把密钥回显给客户端,同时把密钥写进服务器侧的Session中

  2. 客户端获取密钥后,后面的请求都为POST请求,对本地的二进制payload先进行AES加密然后base64编码,再通过POST请求发送至服务器端。正常的网站接口或者页面中,一般是响应的html代码或者json,冰蝎2响应的数据则为经过AES加密的二进制数据,所以Content-Type均为 : application/octet-stream

3. 特点

  1. 服务器端动态解析二进制class文件
  2. 客户端已编译类的参数化:使用ASM框架来动态修改class文件中的属性值,动态生成经过参数化的payload class

4. 流量特征

  1. GET请求的 HTTP 响应包中Content-Length字段的值是固定的16,同时URI只有一个参数,key-value型参数
  2. 默认的 Accept 字段较为特殊 text/html, image/gif, image/jpeg, ; q=.2, /*; q=.2
  3. UserAgent字段内置了十余种比较老的User Agent,每次连接shell会随机选择一个进行使用
  4. JSP类型的webshell,POST请求体数据均为base64编码,Content-Type为application/octet-stream,响应体数据均为二进制文件
  5. 执行JSP webshell,一般较短的命令Content-Length都是9068

0x01 V3版本

1. 项目

github项目:https://github.com/rebeyond/Behinder/releases/
V3 源码:https://github.com/MountCloud/BehinderClientSource

2. 流量分析

冰蝎3和2相比,最重要的变化就是去除动态密钥协商机制,采用预共享密钥,全程无明文交互,密钥格式为md5("admin")[0:16],其余的都差不多
这里还要提到一点,当客户端第一次调用ShellService�#doConnect�方法连接webshell失败,会调用Utils#getKeyAndCookie�方法发送Get请求连接协商秘钥,猜测作者可能是为了兼容2版本的webshell,也算是一个特征点

3. 特点

  1. 去除动态密钥协商机制

4. 流量特征

  1. 流量特征其实也V2版本类似,同样内置了十余种比较老的User Agent,POST请求体数据均为base64编码
  2. 存在GET请求,同时URI只有一个key-value类型参数

0x02 V4版本

1. 项目

github项目:https://github.com/rebeyond/Behinder/releases/
V4 源码:https://github.com/MountCloud/BehinderClientSource

2. 流量分析

  1. 本地选择加密算法,生成服务端Webshell,加密算法对Payload进行加密,然后数据通过POST请求发送给远程服务端

  2. 服务端收到Payload密文后,利用解密算法进行解密
  3. 服务端执行解密后的Payload,并获取执行结果
  4. 服务端对Payload执行结果进行加密,然后返回给本地客户端
  5. 客户端收到响应密文后,利用解密算法解密,得到响应内容明文

3. 特点

  1. 允许自定义加密解密协议

4. 流量特征

  1. 采用默认aes加密协议情况下流量特征与V2、V3类似

0x03 安全设备检测原理图

某盟UTS:

0x04 魔改思路

针对不同安全产商设备的检测原理,整理了以下几种魔改思路:

  1. 加密解密算法,除了默认的AES,可以使用DES、3DES、TDEA、Blowfish、Twofish、RC2、RC4、RC5、IDEA、SKIPJACK等对称加密算法
  2. 去除base64编码特征,请求体和响应体数据随机产生不定长度的额外字节数组
  3. 去除请求头User-Agent、Accept、Referer、Content-type等特征
  4. 请求包以json格式参数,响应体数据返回json格式或者html格式,数据可以拆散隐藏在html标签中
  5. 修改请求协议,使用HEAD协议,长度较小的paylaod放到header执行,Shell返回404,响应数据通过ceye类似接口进行中转/服务器可访问的目录图片中转
  6. 客户端不定时发送不定长度的垃圾数据
  7. 基于sessionID生成密钥、payload参数名、分隔符等
  8. 使用Java底层函数绕OpenRASP
  9. webshell免杀

参考

https://xz.aliyun.com/t/2744#toc-5
https://mp.weixin.qq.com/s/EwY8if6ed_hZ3nQBiC3o7A

点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖