【Shiro反序列化漏洞】shiro550流程分析

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

目录

0x1 前言

0x2 漏洞原理

0x3 漏洞分析

加密过程

解密过程

0x4 总结


0x1 前言

Shiro-550反序列化漏洞大约在2016年就被披露了,但感觉直到近一两年,在各种攻防演练中这个漏洞才真正走进了大家的视野,Shiro-550反序列化应该可以算是这一两年最好用的RCE漏洞之一,原因有很多:Shiro框架使用广泛,漏洞影响范围广;攻击payload经过AES加密,很多安全防护设备无法识别/拦截攻击……

shiro550基础环境的搭建,我是参照别的博客,这里给师傅们推荐下:

shiro-550 IDEA环境配置-CSDN博客

总结要下载的环境配置:
jdk1.8:https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.htmltomcat8.5.99:https://tomcat.apache.org/download-80.cgishiro漏洞源码:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4

这里给师傅们提示下,如果师傅们用的是开源版的idea,那么这里后面利用idea配置tomcat的时候,就会出问题,因为开源版的idea没有web功能,所以建议师傅们使用付给版的idea(因为我就是这莫过来的,很头大!!!)

这里给师傅们推荐下破解idea的文章:

Docs

环境搭建成功了之后,运行tomcat,浏览器就会自动弹出这个页面:

0x2 漏洞原理

根据漏洞描述,Shiro≤1.2.4版本默认使用CookieRememberMeManager,其处理cookie的流程是:

先获取cookie中的remberMe值 --> 对其base64解码 --> AES解码 --> 对解密的值反序列化

然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞

payload 构造的顺序则就是相对的反着来:

构造恶意命令 --> 序列化 --> AES加密 --> base64编码 --> 发送cookie值

在整个漏洞利用过程中,比较重要的是AES加密的密钥,该秘钥默认是默认硬编码的,所以如果没有修改默认的密钥,就自己可以生成恶意构造的cookie了。

0x3 漏洞分析

加密过程

我们先进入登录界面,然后登录root用户,记得这里要勾选Remember Me 选项,然后利用burp抓包,需要注意的是,抓这个页面的POST包,因为还有一个GET包,但是这个GET包没有rememberMe 加密的字段。

注意看划重点的这几个地方,特别是rememberMe里面的加密内容

我们先打开idea,然后双击shift快捷键进行检索Cookie,然后找到跟CookieRememberMeManager有关的代码文件进行分析。

而我们看看这边CookieRememberMeManager类继承了AbstractRememberMeManager,我们在ctrl + B AbstractRememberMeManager

我们可以看到这边这个类里面有硬编码。

然后它又继承了RememberMeManager接口,我们继续进去看看是怎么回事

点击分别查看这几个函数,知道这些是登陆成功,登陆失败,退出的一些service

我们再重新分析下代码文件:

在org/apache/shiro/mgt/DefaultSecurityManager.java代码的rememberMeSuccessfulLogin方法下断点

跟进onSuccessfulLogin方法,具体实现代码在AbstractRememberMeManager.java。

public void onSuccessfulLogin(Subject subject, AuthenticationToken token, AuthenticationInfo info) {//always clear any previous identity:forgetIdentity(subject);//now save the new identity:if (isRememberMe(token)) {rememberIdentity(subject, token, info);} else {if (log.isDebugEnabled()) {log.debug("AuthenticationToken did not indicate RememberMe is requested.  " +"RememberMe functionality will not be executed for corresponding account.");}}}

调用forgetIdentity方法对subject进行处理,subject对象表示单个用户的状态和安全操作,包含认证、授权等。

继续跟进forgetIdentity方法,getCookie方法获取请求的cookie,接着会进入到removeFrom方法。

removeForm主要在response头部添加Set-Cookie: rememberMe=deleteMe

然后再回到onSuccessfulLogin方法中,如果设置rememberMe则进入rememberIdentity。

rememberIdentity方法代码中,调用convertPrincipalsToBytes对用户名进行处理。

protected void rememberIdentity(Subject subject, PrincipalCollection accountPrincipals) {byte[] bytes = convertPrincipalsToBytes(accountPrincipals);rememberSerializedIdentity(subject, bytes);}

进入convertPrincipalsToBytes,调用serialize对用户名进行处理。

protected byte[] convertPrincipalsToBytes(PrincipalCollection principals) {byte[] bytes = serialize(principals);if (getCipherService() != null) {bytes = encrypt(bytes);}return bytes;}

跟进serialize方法来到org/apache/shiro/io/DefaultSerializer.java,很明显这里对用户名进行了序列化。

再回到convertPrincipalsToBytes,接着对序列化的数据进行加密,跟进encrypt方法。加密算法为AES,模式为CBC,填充算法为PKCS5Padding。

getEncryptionCipherKey获取加密的密钥,在AbstractRememberMeManager.java定义了默认的加密密钥为kPH+bIxk5D2deZiIxcaaaA==。

加密完成后,继续回到rememberIdentity,跟进rememberSerializedIdentity方法。

对加密的bytes进行base64编码,保存在cookie中。至此,加密的流程基本就分析完了。

解密过程

给大家参考下这位大佬的博客:

https://changxia3.com/2020/09/03/Shiro反序列化漏洞笔记一(原理篇)/

 

0x4 总结

从上面的分析可以知道,大体的漏洞触发流程为:

先获取cookie中的remberMe值 --> 对其base64解码 --> AES解码 --> 对解密的值反序列化

所以Shiro反序列化漏洞一个很关键的点就在于AES解密的密钥,攻击者需要知道密钥才能构造恶意的序列化数据。在Shiro≤1.2.4中默认密钥为kPH+bIxk5D2deZiIxcaaaA==。官方针对这个漏洞的修复方式是去掉了默认的Key,生成随机的Key。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535563.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity中PICO中手柄按键返回值

文章目录 前言一、我们看一下每个按键返回值获取按键返回值的方法 二、我们实现一个左摇杆控制平滑移动的功能1、创建一个左摇杆控制移动的脚本2、传入XR Origin对象,并且定义一个公开变量控制移动速度3、获取到摇杆是否移动,以及移动的偏移量4、如果摇杆…

「建议收藏」常用adb操作命令详解

1、查看当前运行的所有设备 adb devices 返回当前设备列表 这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 2、安装软件 adb install 验证是否成功。需要到设备的 data/app路径下查看是否有该包名 这个命令将指定的apk文件安装到设备上 …

Android Studio入门级教程(详细)【小白必看】[通俗易懂]

Android Studio如何使用 本文主要讲解一下Android Studio使用方法 步骤: 1.建立项目 首先点击new——new project新建项目 选择想要创建的Android 的模板,建议选择empty activity(空模板),然后next Name&#xff1…

TCP:三次握手四次挥手及相关问题:

连接—三次握手: 流程图: 过程详解: 客户端(connect)连接服务器(listen) Client将标志位SYN置为1,随机产生一个值seqx, 并将该数据包发送给Server, Client进入SYN_ SENT状态,等待Server确认。Server收到数据包后由标…

程序员来看,你选哪一门编程语言提升自己?

通过多个调查表的分析,发现大家对于GO语言的兴趣和需求非常高。GO语言是一种由Google开发的静态类型、编译型语言,最初于2007年问世。这门语言的设计者是Robert Griesemer、Rob Pike和Ken Thompson,他们的初衷是为了弥补C和Java在大规模软件工…

武汉儿童医院变电所电力运维平台系统的设计及应用

彭姝麟 Acrelpsl 1 引言 2015年国务院发布《中共中央、国务院关于进一步深化电力体制改革的若干意见》(中发[2015]9号),简称“电改9号文”。而本次新电改的重点是“三放开一独立三强化”:输配以外的经营性电价放开、售电业务放开…

勾八头歌之数据科学导论—数据预处理

第1关:引言-根深之树不怯风折,泉深之水不会涸竭 第2关:数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as pltdef student():# Load the CSV file and replace #NAME? with NaNtrain pd.read_csv(Tas…

Ribbon简单使用

Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后…

唤醒世界童心的中国玩具,如何在产业转型中乘风破浪?

作为“世界玩具工厂”,中国拥有多个成熟的玩具产业带,包括:占全国玩具产量25%的澄海积木玩具产业带;产销量占全国80%的雄安新区毛绒玩具产业带;占全国教玩具市场份额63%、国际教玩具市场份额30%的温州永嘉桥下镇教玩具…

H5自适应程序员个人主页源码

H5自适应程序员个人主页源码 源码名称:自适应程序员个人主页源码 源码介绍:一款自适应程序员个人主页源码,带有4个页面,分别对应首页、个人技能页、我的朋友页【也可改为的我站点】、联系我页面。 需求环境:H5 下载地址&#x…

(C语言)strlen函数模拟实现(三种方法)

目录 1. strlrn函数 2. 注意事项&#xff1a; 3. 计数器法 4. 指针减指针方法&#xff1a; 5. 递归方法&#xff1a; 1. strlrn函数 头文件<string.h> 实现函数模拟须知&#xff1a; • 字符串以 \0 作为结束标志 &#xff0c;strlen函数返回的是在字符串中 \0 …

每日一题 第一期 洛谷 铺地毯

[NOIP2011 提高组] 铺地毯 https://www.luogu.com.cn/problem/P1003 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 …