记一次welogic下shiro漏洞利用


本文首发于公众号:https://mp.weixin.qq.com/s/mQyTGJzdQ5U5Sev1qzYo8A

一、前言

在实战中碰到一个 shiro 有 key 无链的情况,原以为是工具带的链不够,又手动生成的许多 poc,没成功。在各种测试后,发现项目是部署在 weblogic 下的,后面搜到abc123师傅的文章《第 17 篇:Shiro 反序列化在 Weblogic 下无利用链的拿权限方法》发现确实会有区别。又搜到了Y4er师傅的文章《使用 WebLogic CVE-2020-2883 配合 Shiro rememberMe 反序列化一键注入蚁剑 shell》 ,在本地部署的环境没成功(后面想想应该是coherence.jar的版本问题),最后在参考feihong师傅的文章《使用 CVE-2020-2555 攻击 Shiro》,并对项目的代码加以改动才利用成功。站在巨人们的肩膀上,各位师傅写过的内容我就不写了一遍了。

1.1 前提条件

1.目标weblogic的版本,当然可以fuzz
2.存在Weblogic的Coherence组件反序列化漏洞:CVE-2020-2555、CVE_2020_2883、CVE-2020-14756、CVE-2021-2135等等

1.2 环境搭建

为了大家可以尝试,采用本地搭建环境来复现一遍。

1.2.1 环境启动

使用dokcer进行weblogic部署,这里使用vulhubweblogicCVE-2023-21839

cd vulhub/weblogic/CVE-2023-21839
docker-compose up -d

因为启动环境后的账号密码是随机的,进到docker容器把控制台密码解密后登录。

console账号密码获取参考:https://www.freebuf.com/articles/web/220147.html

1.2.2 环境部署

shiro 的 demo 地址。

https://github.com/backlion/demo/blob/master/samples-web-1.2.4.war

登录后部署项目。

上传 war 文件。

上传完成之后就一直下一步到底,点击完成。

需要在控制中修改启动的选项,为所有请求提供服务,再点击启动就可以访问了。

访问测试一下没问题。

二、项目用法

2.1 项目导入

这里对feihong师傅的项目进行浅析一下,这里建议大家先把项目代码过一遍,有自己的理解后再看后面的部分。

下载完项目后等pom.xml解析好依赖后(有报错的估计是网络问题),再将各个依赖手动导入一下(Add as Library),不然有些代码会报错。

2.2 替换 coherence.jar 版本

由于目标环境的weblogic版本是12.2.1.3,但是当前项目依赖中的coherence.jar的版本是12.1.3.0.0

java -jar coherence.jar -version

只需要将docker中的coherence.jar移植到此项目中即可。

三、改造

3.1 命令执行

3.1.1 适配 linux

这里写好的BasicCMDpayload类是根据CVE_2020_2555写的,并且执行语句是windows的,需要修改为linux执行命令语句,将cmd替换成/bin/bash

    // 修改前
ReflectionExtractor extractor3 = new ReflectionExtractor(
            "exec",
            new Object[]{new String[]{"cmd", "/c", cmd}}
    );
    // 修改后
ReflectionExtractor extractor3 = new ReflectionExtractor(
            "exec",
            new Object[]{new String[]{"/bin/bash", "-c", cmd}}
    );

3.1.2 支持 CVE_2020_2883

再将payload包中的BasicCMDpayload.java修改为支持CVE_2020_2883BasicCMDpayload_2883.java,根据观察对比testcase包中的TestScriptEngineWithCVE_2020_2555.javaTestScriptEnginelWithCVE_2020_2883.java,前半段没修改。

后半段代码都是各自的调用关系。

TestFileOutputStreamWithCVE_2020_2883.javaTestScriptEnginelWithCVE_2020_2883.java,不同功能代码也仅仅是调用类和变量不同。

那就根据这种规律直接将BasicCMDpayload.java中的内容 copy 到新建的BasicCMDpayload_2883.java中,然后一步步修改后半段的对应关系,将结尾修改为 return 语句。

// 修改前
//序列化
byte[] bytes = Util.serialize(queue);

//反序列化
Util.deserialize(bytes);
// 修改后
//序列化
return Util.serialize(queue);

JavaScript脚本解析引擎ScriptEngineManager修改为可以执行命令的Runtime

// 修改前
queueArray[0] = ScriptEngineManager.class;
// 修改后
queueArray[0] = Runtime.class;

在主函数那边添加一条 case 的代码,以便能调用成功,运行生成 cookie 的值。

发送数据包。

进入docker查看,命令执行成功。

3.2 延迟

当目标不出网可以通过延迟效果,判断是否存在漏洞,也可以检测是否存在对应的漏洞或者coherence.jar版本是否正确。

同理只是将ScriptEnginePayload.java按照CVE_2020_2883利用代码再修改成ScriptEnginePayload_2883.java类,这里只说关键的地方。根据ScriptEnginePayload.java中的代码逻辑。通过JavaScript脚本解析引擎实现了任意代码执行,那就将执行代码的地方替换成 sleep 语句。

// 修改前
ReflectionExtractor extractor4 = new ReflectionExtractor(
        "eval",
        new Object[]{code}
);
// 修改后
ReflectionExtractor extractor4 = new ReflectionExtractor(
        "eval",
        new Object[]{"java.lang.Thread.sleep(5000);"}
);

同理再写一条 case,生成 cookie 的值。

发送数据包,成功延迟了。

既然可以任意执行 java 代码,那就可以做更多的事情:命令执行、回显、内存马等等。

3.3 命令执行回显

本身已经修改好的ScriptEnginePayload_2883.java类,将原本的 sleep 语句注释还原即可。

				// 修改前
        ReflectionExtractor extractor4 = new ReflectionExtractor(
                "eval",
                new Object[]{"java.lang.Thread.sleep(5000);"}
//                new Object[]{code}
        );
        // 修改后
        ReflectionExtractor extractor4 = new ReflectionExtractor(
                "eval",
//                new Object[]{"java.lang.Thread.sleep(5000);"}
                new Object[]{code}
        );

运行生成 cookie。

成功回显。

3.4 内存马

3.4.1 cmd 小马

直接用项目中的内存马是可以成功的,由于打的内存马是两种:cmd 小马和冰蝎马(需要魔改),使用ScriptEnginePayload_2883去加载WeblogicMemshellLoader类。

target文件中找到编译后的WeblogicMemshellTemplate.class进行base64编码,放到请求包的body里。

进行 url 编码。

发现小马可以使用。

由于此项目默认打入的是魔改冰蝎的内存马,所以正常的冰蝎无法直接连接,但是可以修改代码打入其他可以连接的内存马。

3.4.2 获取注入 filter 的代码

这里使用jMG java 内存马生成工具,生成一个内存马。

SOAPUtils.class放入到idea中,获取base64加密后的数据。

根据代码里发现,这一串数据需要先base64解密,然后再 zip 解压缩。

进行base64解密。

解压后重命名。

就获得了内存马的代码。

一会需要使用woodmem.class进行base64编码后结果。

3.4.3 修改代码打入内存马

WeblogicMemshellTemplate.java复制成一份WeblogicMemshellTemplate2.java,修改三处地方。

内存马的类名(内存马生成器中可以看到)
woodmem.class进行base64编码后的结果

修改WeblogicMemshellLoader.java中的调用类为刚刚生成的WeblogicMemshellTemplate2.java的类名。

生成cookie值。

到编译好的target目录去把WeblogicMemshellTemplate2.class进行base64编码,后赋值给body中的code参数。

code的值url编码后发送。

成功连接冰蝎马。

本项目修改后代码放这里:https://github.com/xi3w3n/Attacking_Shiro_With_Weblogic

改进空间

项目只是简单的改进利用一下,但是还有很多地方可以继续进行改进完善的:

添加CVE-2020-14756、CVE-2021-2135利用代码
操作系统识别后命令执行
Coherence多版本兼容

参考链接

https://github.com/feihong-cs/Attacking_Shiro_with_CVE_2020_2555

https://mp.weixin.qq.com/s/GckEFXWYcIiZZ1-BKwB6yA

https://xz.aliyun.com/t/8202

https://xz.aliyun.com/t/9343


文章作者: xi3w3n
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xi3w3n !
评论
  目录