改造冰蝎对抗waf&OpenRASP计划-初探
2020-02-19 19:07:48 Author: forum.90sec.com(查看原文) 阅读量:274 收藏

0x01 前言

​ 在参考了各家waf对于多种姿势检测“冰蝎”的文章之后,产生了改造冰蝎的想法,目前主要的检测手段为针对冰蝎的流量特征进行匹配,所以我们的反侦探手段为改变冰蝎的流量特征以达到绕过的目的,由于@rebeyond大佬没有开源冰蝎代码,所以得反编译。那么思路来了,第一:反编译冰蝎,得到大概源代码。第二:重新构建项目,让我们反编译后得到的代码跑起来。第三:针对检测规则进行绕过。

0x02 反编译冰蝎

​ 目前反编译java应用的相关工具主要有三种 JD-GUI、luyten、jadx。

一、jd-gui

JD-GUI是一个独立的图形实用程序,用于显示“ .class”文件的Java源代码。您可以使用JD-GUI浏览重建的源代码,以立即访问方法和字段。

​ 相关介绍:

JD-GUI-1

JD-GUI-2

​ 下载地址:http://java-decompiler.github.io/

​ 目前最新的版本为:jd-gui-1.6.6.jar

二、luyten

​ 相关介绍:Luyten是一款很强大的反编译工具包,是一款github的开源工具,软件功能非常强大,界面简洁明晰、操作方便快捷,设计得很人性化。且能够反编译有些jd-gui无法反编译的文件。

luyten

下载地址:https://github.com/deathmarine/Luyten/releases

三、jadx

​ 相关介绍:jadx是一款深受Android开发人员喜爱的反编译利器,同时支持命令行和图形界面,能以最简便的方式完成apk的反编译操作。工具支持apk、dex、jar、aar等格式的文件,可以通过File - Open file选择文件或者直接将文件拖进窗口中,可以算得上一键反编译了,非常简单易用。

jadx

下载地址:https://github.com/skylot/jadx/releases

四、Import Jar As Project

​ Import Jar As Project 是一款eclipse插件,用于将.jar或.war作为项目导入到Eclipse IDE中,即使您没有通过反编译jar来获取源代码。

​ 官网地址:https://github.com/helospark/import-jar-as-project

import-jar-as-project

​ 对于具体如何反编译Behinder.jar到在eclipse中运行起来Behinder的详细过程本文不累述,因为这是耗时的体力活,我们要解决很多问题,很多没有java基础的童鞋也看不懂。这里只讲大概思路,首先我们可以通过Import Jar As Project插件将Behinder.jar导入eclipse,这样在ecplise中就创建了一个存在一堆报错的Behinder项目,然后再利用上文提到的三款反编译软件对Behinder.jar进行反编译,将每个文件以及每个java类中的方法进行对比,修改eclipse项目中的对应代码,在运用eclipse的相关报错信息进行有关反编译代码的排错,修改。这里解释一下为什么要用三款反编译软件,因为各自的优缺点不一样,反编译出来的代码也是不一样的,所以得综合尝试。

​ 在没有进行任何修改的情况下导入eclipse后的情况如图所示:

导入

可以看到,基本每个java文件都存在错误。

五、最终效果

​ 在长达两个工作日的不断排错后,终于成功的跑起来了我们反编译后的代码

反编译

出于对原作者的尊重,这里不放出项目文件

0x03 对抗分析

​ 网上对冰蝎流量检测的文章主要是以下三篇:

第一:“基于流量侧检测冰蝎webshell交互通讯”

链接:https://blog.csdn.net/qq_36334464/article/details/99978193

第二:“流量加密又怎样? 多种姿势检测“冰蝎””

链接:https://www.freebuf.com/articles/web/216133.html

第三:“那些年我们堵住的洞 – OpenRASP纪实”

链接:https://anquan.baidu.com/article/855

​ 检测手段:按照“静态特征”编写两类规则:1.密钥传递规则。2.加密通讯规则。

如果同一个url或者源IP在数秒内内同时命中了这两种规则,那么可以非常肯定的确认是冰蝎了。注意,此处是同一个URL或者源IP,而不是同一个TCP会话,密钥传递和加密通讯未必是同一个TCP会话(源端口会变化)。

​ 对抗思路:既然是同时命中两种规则,是 ”与" 的关系,那么我们只需要让第一个条件 “密钥传递规则” 不被waf匹配到就行了。

​ 密钥传递规则主要包括如下几个方面:

弱特征1:密钥传递时URL参数

弱特征1:密钥传递时URL参数

对抗思路:增加随机数量的随机参数和随机值,修改冰蝎的随机数规则

对抗一

弱特征2:加密时的URL参数

​ 在加密通讯过程中,没有URL参数。是的,没有参数本身也是一种特征。

​ 对抗思路:在加密通讯的请求上增加 随机数量的随机参数和随机值 的URL参数

对抗二

强特征3:Accept字段(可绕过)

​ Accept是HTTP协议常用的字段,但冰蝎默认Accept字段的值却很特殊,我也没有想明白为什么要设置这么一个奇怪的值。这个特征存在于冰蝎的任何一个通讯阶段。

Accept: text/html,image/gif, image/jpeg, *; q=.2, */*; q=.2

​ 这里对于原作者的(没有想明白),我给出一下解释,冰蝎可以自定义请求头,如果在没有自定义请求头的情况下,Accept的值是使用java代码发送请求时没有设置Accept时自带的。

setRequestProperty("Accept", "*/*");

自定义请求头

对抗思路:虽然这个强特征用户是可以通过自定义绕过的,我还是在代码里面改了

Accept

强特征4:UserAgent字段(可绕过)

​ UserAgent也是可以自定义的

UserAgent

对抗思路:虽然可以自定义,我还是修改了自带的,因为我平时自己使用的时候也没有填写的习惯......

对抗三

强特征5:传递的密钥

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

秘钥传递
秘钥传递二

​ 对抗思路:其实最稳妥的方式就是 删减传递秘钥 的过程,将秘钥硬编码在客户端和服务器端,具体的做法有,一、每次打开冰蝎的时候生成一个秘钥,然后生成带密钥硬编码的服务器端(jsp、asp、php...)。二、将秘钥存放在某个文件中如(key.ini)由用户自定义,Behinder.jar去读取key,服务器端中的秘钥让用户手动修改。

但是,我不喜欢这种模式,或者说我懒,因为这样的话,需要修改的代码就太多了,包括java代码,jsp,jspx,php,aspx,asp脚本文件。不仅耗时而且对冰蝎的侵入式修改较大。

转变思路,我们可以看到冰蝎原来的请求顺序是一:客户端请求秘钥,服务器端返回秘钥,第二,客户端拿到秘钥然后发送POST请求。waf也是针对这个顺序进行匹配的。所以我们只需要打乱这个顺序让waf无法匹配到这个规律从而不会去进行下一步的探测就行了。基于这个想法我加入了在每次客户端get请求秘钥的中间插入 随机数量的get 请求http://xxx.xxx.xxx/。当然请求的当然是当前域名或者ip
原请求顺序:

原请求顺序

打乱请求顺序:

打乱请求顺序

到这里,基本上waf也认识不了啥了,更别说后续的会去拿到密钥去动态分析。

针对 OpenRASP

​ 原文章是这么说的:

​ 演练期间见到最多的就是冰蝎动态后门了,其中JSP版本通过自定义ClassLoader + defineClass方法来实现eval特性。

new U(this.getClass().getClassLoader()).g(c.doFinal(new 
sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newIns
tance().equals(pageContext);

​ 因为流量是AES双向加密的,对绕过WAF和IDS会比较有效。但部署在应用内部的OpenRASP,还是能够看到后门操作(安装 999-event-logger 插件即可看到日志):

[event-logger] Listing directory content:/
[event-logger] Execute command: whoami
java.lang.ProcessBuilder.start
...
net.rebeyond.behinder.payload.java.Cmd.RunCMD
net.rebeyond.behinder.payload.java.Cmd.equals

​ 同样,我们依然可以通过命令执行的堆栈识别冰蝎:

java.lang.ProcessBuilder.start
...net.rebeyond.behinder.payload.java.Cmd.RunCMD
net.rebeyond.behinder.payload.java.Cmd.equals

​ 因此,无论服务端的JSP如何变形,只要客户端代码不变,我们通过校验堆栈就可以检测冰蝎动态后门。目前最新版的JS插件 2019-0703-1600 已经支持防护。

​ 对抗思路:OpenRASP 已经说得很明白了,也很务实,很欣赏这种务实的态度,不然安全行业怎么发展呢,不像某些waf收费贵的一X,流批吹的凶,结果 唠跨松。跑题了。。。

​ 我们也不需要做大改,只需要改变冰蝎的包结构就行了,我就直接去掉了net.rebeyond.behinder这三层包。

原包结构

后包结构

0x04 成果检验

环境:apache-tomcat-7.0.96 + rasp-2019-12-17

环境

打开webshell

测试一

对应的请求

测试一请求

命令执行

命令执行

虚拟终端

虚拟终端

文件管理

文件管理

数据库管理

数据库管理

下载地址

链接:https://pan.baidu.com/s/1wd8AreiyudZUHNgFbS2b2A
提取码:a9ef

仅供参考学习,切勿用作非法用途。

0x05 总结

​ 由于是反编译出来的代码,有许多bug,例如此版本不支持tomcat6 asp aspx,反弹shell功能无法成功。

期间也得到了@rebeyond大佬的指点,非常感谢。原作者也说了年后会再次更新,敬请期待。

Author:AgeloVito


文章来源: https://forum.90sec.com/t/topic/796/1
如有侵权请联系:admin#unsafe.sh