• 改造冰蝎对抗waf&OpenRASP计划-初探


    0x01 前言

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

    0x02 反编译冰蝎

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

    一、jd-gui

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

    相关介绍:

    1.png

    2.jpg

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

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

    二、luyten

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

    3.jpg

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

    三、jadx

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

    4.jpg

    下载地址: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

    5.png

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

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

    6.jpg

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

    五、最终效果

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

    7.jpg

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

    点击链接做实验,反编译工具的使用:

    8.jpg

    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参数

    9.jpg

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

    0.png

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

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

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

    11.jpg

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

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

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

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

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

    12.png

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

    13.jpg

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

    UserAgent也是可以自定义的

    14.jpg

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

    15.jpg

    强特征5:传递的密钥

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

    16.png
    17.png

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

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

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

    原请求顺序:

    18.png

    打乱请求顺序:

    19.jpg

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

    实验推荐:应用防火墙WAF

    http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2017041916505100001

    点击上方链接体验

    针对 OpenRASP

    原文章是这么说的:

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

    1. new U(this.getClass().getClassLoader()).g(c.doFinal(new
    2. sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newIns
    3. tance().equals(pageContext);
    4. 因为流量是AES双向加密的,对绕过WAFIDS会比较有效。但部署在应用内部的OpenRASP,还是能够看到后门操作(安装 999-event-logger 插件即可看到日志):
    5. [event-logger] Listing directory content:/
    6. [event-logger] Execute command: whoami
    7. java.lang.ProcessBuilder.start
    8. ...
    9. net.rebeyond.behinder.payload.java.Cmd.RunCMD
    10. net.rebeyond.behinder.payload.java.Cmd.equals

    合天网安实验室的《AES加密算法分析》,让你学习理解对称加密算法AES的原理,使用CrypTool对特定明文/密文使用AES进行加解密,体会AES算法的加解密过程。

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

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

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

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

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

    20.jpg

    21.jpg

    0x04 成果检验

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

    22.jpg

    打开webshell

    23.jpg

    对应的请求

    24.jpg

    命令执行

    25.png

    虚拟终端

    26.png

    文件管理

    27.jpg

    数据库管理

    28.jpg

    合天智汇:合天网络靶场、网安实战虚拟环境
  • 相关阅读:
    SQL学习
    设计模式学习之简单工厂
    c#读写操作3
    SQL存储过程学习
    c# xml的读写
    SQL存储过程实例
    存储过程分页
    搞双显示器
    转:用药的七种心理误区
    lp提了一个非常让偶非常郁闷的要求……
  • 原文地址:https://www.cnblogs.com/hetianlab/p/15251212.html
Copyright © 2020-2023  润新知