Author:[email protected]深信服西部天威战队
1. 项目
github项目:https://github.com/rebeyond/Behinder/releases/
V2 源码:https://github.com/hktalent/afterLoader
2. 流量分析
执行流程图:
首次连接一句话服务端时,客户端首先向服务器端发起GET请求,只有一个参数,格式为?pass=123形式,服务器端随机产生一个128位的密钥,把密钥回显给客户端,同时把密钥写进服务器侧的Session中
客户端获取密钥后,后面的请求都为POST请求,对本地的二进制payload先进行AES加密然后base64编码,再通过POST请求发送至服务器端。正常的网站接口或者页面中,一般是响应的html代码或者json,冰蝎2响应的数据则为经过AES加密的二进制数据,所以Content-Type均为 : application/octet-stream
3. 特点:
- 服务器端动态解析二进制class文件
- 客户端已编译类的参数化:使用ASM框架来动态修改class文件中的属性值,动态生成经过参数化的payload class
4. 流量特征
- GET请求的 HTTP 响应包中Content-Length字段的值是固定的16,同时URI只有一个参数,key-value型参数
- 默认的 Accept 字段较为特殊 text/html, image/gif, image/jpeg, ; q=.2, /*; q=.2
- UserAgent字段内置了十余种比较老的User Agent,每次连接shell会随机选择一个进行使用
- JSP类型的webshell,POST请求体数据均为base64编码,Content-Type为application/octet-stream,响应体数据均为二进制文件
- 执行JSP webshell,一般较短的命令Content-Length都是9068
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. 特点
- 去除动态密钥协商机制
4. 流量特征
- 流量特征其实也V2版本类似,同样内置了十余种比较老的User Agent,POST请求体数据均为base64编码
- 存在GET请求,同时URI只有一个key-value类型参数
1. 项目
github项目:https://github.com/rebeyond/Behinder/releases/
V4 源码:https://github.com/MountCloud/BehinderClientSource
2. 流量分析
- 本地选择加密算法,生成服务端Webshell,加密算法对Payload进行加密,然后数据通过POST请求发送给远程服务端
- 服务端收到Payload密文后,利用解密算法进行解密
- 服务端执行解密后的Payload,并获取执行结果
- 服务端对Payload执行结果进行加密,然后返回给本地客户端
- 客户端收到响应密文后,利用解密算法解密,得到响应内容明文
3. 特点:
- 允许自定义加密解密协议
4. 流量特征
- 采用默认aes加密协议情况下流量特征与V2、V3类似
某盟UTS:
针对不同安全产商设备的检测原理,整理了以下几种魔改思路:
- 加密解密算法,除了默认的AES,可以使用DES、3DES、TDEA、Blowfish、Twofish、RC2、RC4、RC5、IDEA、SKIPJACK等对称加密算法
- 去除base64编码特征,请求体和响应体数据随机产生不定长度的额外字节数组
- 去除请求头User-Agent、Accept、Referer、Content-type等特征
- 请求包以json格式参数,响应体数据返回json格式或者html格式,数据可以拆散隐藏在html标签中
- 修改请求协议,使用HEAD协议,长度较小的paylaod放到header执行,Shell返回404,响应数据通过ceye类似接口进行中转/服务器可访问的目录图片中转
- 客户端不定时发送不定长度的垃圾数据
- 基于sessionID生成密钥、payload参数名、分隔符等
- 使用Java底层函数绕OpenRASP
- webshell免杀
https://xz.aliyun.com/t/2744#toc-5
https://mp.weixin.qq.com/s/EwY8if6ed_hZ3nQBiC3o7A