Web渗透:Shiro550漏洞(CVE-2016-4437)

Apache Shiro 是一个强大且易于使用的Java安全框架,提供了身份验证(Authentication)、授权(Authorization)、会话管理(Session Management)和密码学支持等功能。Apache Shiro 550反序列化漏洞(CVE-2016-4437)是一个严重的Java反序列化漏洞,它允许攻击者通过特制的Java序列化对象在目标系统上执行任意代码。该漏洞影响了使用默认“rememberMe”功能的Apache Shiro。

shiro550(1.2.4版本)反序列化漏洞原理

Apache Shiro 提供了一种“rememberMe”功能,用于在用户关闭浏览器后仍然保持会话,当启用该功能时,Shiro 会将用户的会话信息序列化并存储在一个 cookie 中,以便在用户重新访问时反序列化并恢复会话;在这边攻击者可以通过修改“rememberMe” cookie,注入特制的恶意 Java 序列化对象;当 Shiro 反序列化这个恶意对象时,攻击者可以在目标系统上执行任意代码。

漏洞相关源代码片段

漏洞出现在 Shiro 的 RememberMeManager 组件中,特别是处理“rememberMe”cookie 的代码部分,以下是与漏洞相关的关键代码片段的简化示例,帮助我们理解漏洞的原理。

    public void onSuccessfulLogin(Subject subject, AuthenticationToken token, AuthenticationInfo info) {//清理旧的身份验证信息cforgetIdentity(subject);
​//生成新的身份验证信息if (isRememberMe(token)) {  //如果有勾选remember merememberIdentity(subject, token, info);//生成新的cookie中的RememberMe字段

在Shiro中,当用户成功登录时,可以通过onSuccessfulLogin方法来处理“记住我”功能的逻辑。这个方法会清理旧的身份验证信息,并根据需要生成新的身份验证信息。

forgetIdentity方法会删除存储在Cookie中的身份信息,以确保旧的身份信息不会被重新使用。isRememberMe(token):检查登录请求中是否包含“记住我”选项。如果用户在登录时选择了“记住我”,这个方法会返回truerememberIdentity(subject, token, info):如果用户选择了“记住我”,这个方法会生成并存储新的身份验证信息;接着我们再继续追踪rememberIdentity

   public void rememberIdentity(Subject subject, AuthenticationToken token, AuthenticationInfo authcInfo) {PrincipalCollection principals = getIdentityToRemember(subject, authcInfo);rememberIdentity(subject, principals);}

getIdentityToRemember(subject, authcInfo)方法用于从authcInfo(身份验证信息)中提取用户的身份信息。接着调用rememberIdentity(subject, principals)方法,使用提取到的身份信息来设置“记住我”功能,这边继续跟进rememberIdentity:

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

这个函数中使用了convertPrincipalsToBytes(accountPrincipals)方法用于将PrincipalCollection(包含用户身份信息的对象)转换为字节数组;此时我们进入convertPrincipalsToBytes函数查看具体针对信息数据的操作是什么样的:

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

可以看到再这个函数中首先使用了serialize(principals)方法将PrincipalCollection对象序列化为字节数组。接着进行一个获取密钥服务的操作,当CipherService不为空,则对序列化后的字节数组进行加密;接着我们进入encryp函数中查看具体的加密操作是如何进行的:

    protected byte[] encrypt(byte[] serialized) {byte[] value = serialized;CipherService cipherService = getCipherService();  if (cipherService != null) {    //如果cipherService不为空ByteSource byteSource = cipherService.encrypt(serialized, getEncryptionCipherKey());   value = byteSource.getBytes();}return value;}

这里调用了getCipherService()方法获取配置的加密服务,并赋值给变量cipherService;进入getCipherService()方法后可以发现此处的加密为AES加密(除了指定加密的方式之外还指定了其他的一些加密细节)

获取到加密的信息后就是对序列化的数据进行加密了,在加密时,程序中使用了getEncryptionCipherKey()方法进行密钥获取:

此时可以看到默认的加密密钥实际上在shiro中是一串固定的base64解码后的字符串;其base64编码的值是“kPH+bIxk5D2deZiIxcaaaA==”

2.rememberSerializedIdentity

在清楚如何针对信息数据转化为字节数组后,接着再看一下rememberSerializedIdentity方法中具体做了哪些操作:

   protected void rememberSerializedIdentity(Subject subject, byte[] serialized) {
​if (!WebUtils.isHttp(subject)) {if (log.isDebugEnabled()) {String msg = "Subject argument is not an HTTP-aware instance.  This is required to obtain a servlet " +"request and response in order to set the rememberMe cookie. Returning immediately and " +"ignoring rememberMe operation.";log.debug(msg);}return;}
​
​HttpServletRequest request = WebUtils.getHttpRequest(subject);HttpServletResponse response = WebUtils.getHttpResponse(subject);
​//base 64 encode it and store as a cookie:String base64 = Base64.encodeToString(serialized);  //进行base64编码
​Cookie template = getCookie(); //the class attribute is really a template for the outgoing cookiesCookie cookie = new SimpleCookie(template);cookie.setValue(base64);    //将base64编码的信息整合到cookie当中cookie.saveTo(request, response);}

在该方法中使用了Base64.encodeToString(serialized);对序列化数据进行Base64编码;并将Base64编码后的数据整合到Cookie中;至此我们就可以知道RememberMe的具体生成步骤:

用户信息-->序列化-->AES加密-->Base64编码-->Cookie信息

那么对应的解密过程就是:

Cookie信息-->Base64解码-->AES解密-->反序列化-->用户信息

漏洞利用

靶场则是使用vulhub进行搭建,进入对应的目录.../vulhub/shiro/CVE-2016-4437;使用docker命令进行启动

docker-compose up -d

查看具体的端口映射

docker ps -a

这个时候直接访问环境所在靶机IP地址的8080端口:

默认的账号密码为admin:vulhub;这个时候我们可以先输入任意Username和passwrod进行登录并抓包(Remember me选项必须勾选);抓到数据包后将数据包发送至BP的重放模块Repeater,进行发包,查看相应包内容:

发现相应包中包含有Set-Cookie: rememberMe=deleteMe字段就基本上可以断定这边使用了shiro框架;既然是shiro框架,我们就可以尝试进行安全测试:

安全工具(文章末尾附下载地址)

①Burpsuite ShiroPassiveScan插件扫描

这是一款基于BurpSuite的被动式shiro检测插件;该插件会对BurpSuite传进来的每个不同的域名+端口的流量进行一次shiro检测且key可在config.yml自定义,解决有些用户觉得key太少的问题。

安装方法:

添加进入插件即可;

这当我们正常去访问网站, 如果站点的某个请求出现了,那么该插件就会去尝试检测(需要挂BP);当检测到漏洞后则会在BP中进行显示:

这款插件也允许我们自行添加Key:打开./BurpShiroPassiveScan/resources/config.yml并找到application.shiroCipherKeyExtension.config.payloads,在后面添加新的Key即可。

②shiro_attack

使用此工具需要事先准备java环境,java10以上版本缺少javafx-sdk-18.0.2泛型,需要自己手动安装,最好使用jdk1.8版本(环境变量的设置这边就不说了),环境准备好后直接在工具目录打开cmd命令行,运行如下命令:

java -jar shiro_attack-4.7.0-SNAPSHOT-all.jar

能够爆破出Key则表示Shiro框架存在反序列化漏洞,在爆破出Key后可以直接选择检测当前利用链条,若利用链不能够利用则可以进行利用链爆破;

发现利用链可以使用后则尝试进行命令执行、内存马操作,成功GetShell。

【注意】若懒得去找jdk1.8以及这两个工具,关注风铃Sec回复[Shiro550]进行领取即可(文章底下有二维码)

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

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

相关文章

AI算法19-偏最小二乘法回归算法Partial Least Squares Regression | PLS

偏最小二乘法回归算法简介 算法概述 偏最小二乘法模型可分为偏最小二乘回归模型和偏最小二乘路径模型。其中偏最小二乘回归模型是一种新型的多元统计方法,它集中了主成分分析、典型相关分析和线性回归的特点,特别在解决回归中的共线性问题具有无可比拟…

内网安全:权限维持的各种姿势

1.Linux权限维持 2.Windows权限维持 目录: 一.Linux权限维持: 1.webshell: 2.定时任务: 3.SUID后门: 4.SSH Key免密登录后门: 5.添加用户后门: 二.Windows权限维持 1.计划任务后门&…

记录些Spring+题集(1)

接口防刷机制 接口被刷指的是同一接口被频繁调用,可能是由于以下原因导致: 恶意攻击:攻击者利用自动化脚本或工具对接口进行大量请求,以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误:某些情…

iOS ------ 消息传递和消息转发

一,消息传递 在OC中,传递消息就是在对象上调用方法。 相对于C语言的方法就“静态绑定”的函数,在编译器就决定了运行时所要调用的函数。在OC中,如果向某对象传递消息,就会使用动态绑定机制来决定需要调用那个方法。调…

【操作系统】定时器(Timer)的实现

这里写目录标题 定时器一、定时器是什么二、标准库中的定时器三、实现定时器 定时器 一、定时器是什么 定时器也是软件开发中的⼀个重要组件.类似于⼀个"闹钟".达到⼀个设定的时间之后,就执行某个指定 好的代码. 定时器是⼀种实际开发中⾮常常用的组件. ⽐如⽹络通…

浅谈C嘎嘎类与对象

本篇文章与大家浅谈一下C嘎嘎的类与对象知识点 类的定义 关键字:class 语法格式: class 类名 { };//这里的分号不能少 此外,class有三个属性分别是private、public、protected,这三个属性是干啥的,相…

FPGA CFGBVS 管脚接法

说明 新设计了1个KU040 FPGA板子,回来之后接上JTAG FPGA不识别。做如下检查: 1、电源测试点均正常; 2、查看贴片是否有漏焊,检查无异常,设计上NC的才NC; 3、反复检查JTAG接线是否异常,贴片是…

【BUG】已解决:ValueError: Expected 2D array, got 1D array instead

已解决:ValueError: Expected 2D array, got 1D array instead 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉…

本地多模态看图说话-llava

其中图片为bast64转码,方便json序列化。 其中模型llava为本地ollama运行的模型,如:ollama run llava 还有其它的模型如:llava-phi3,通过phi3微调过的版本。 实际测试下来,发现本地多模型的性能不佳&…

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式(又译作色度采样结构、像素格式): 在vlc中也可以获取到色彩格式(vlc底层也使用了FFmpeg进行解码): 这个色彩格式就是之前的文章《音视频入门基础…

【unity实战】使用unity制作一个红点系统

前言 注意,本文是本人的学习笔记记录,这里先记录基本的代码,后面用到了再回来进行实现和整理 素材 https://assetstore.unity.com/packages/2d/gui/icons/2d-simple-ui-pack-218050 框架: RedPointSystem.cs using System.…

入职前回顾一下git-01

git安装 Linux上安装git 在linux上建议用二进制的方式来安装git,可以使用发行版包含的基础软件包管理工具来安装。 红帽系 sudo yum install gitDebian系 sudo apt install gitWindows上安装git 去官网下载和操作系统位数相同的安装包.或者可以直接安装GitHub…

MAVSDK动态库与静态库及mavsdk_server程序macOS平台编译与安装

1.克隆mavsdk: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编译静态库 cmake -Bbuild/default -H. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF 生成makefile 生成成功,开始编译 cmake --build build/default -j8 成功生成libmavsdk.a 开…

谷歌邮箱被停用,开发者账号也要完犊子了?还能申诉回来?怎么申诉

当谷歌邮箱突然被停用,不少开发者可能会感到一阵心慌。大家最担心的是,这会不会影响到自己用这个邮箱注册的开发者账号?自己的APP还能不能顺利通过审核?毕竟,邮箱一旦“歇菜”,可能就意味着和它绑定的开发者…

VAE论文阅读

在网上看到的VAE解释,发现有两种版本: 按照原来论文中的公式纯数学推导,一般都是了解生成问题的人写的,对小白很不友好。按照实操版本的,非常简单易懂,比如苏神的。但是却忽略了论文中的公式推导&#xff…

几何相关计算

目录 一、判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、判断多边形顺时针还是逆时针 七、判断凹多边形 一、判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小,那矩形1和矩形2一定不相…

SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 - 第520篇

历史文章(文章累计520) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

鸿蒙模拟器(HarmonyOS Emulator)Beta申请审核流程

文 | Promise Sun 一.背景: 鸿蒙项目开发需要使用模拟器进行开发测试,但目前想在DevEco Studio开发工具中使用模拟器就必须到华为官网进行报名申请,参加“鸿蒙模拟器(HarmonyOS Emulator)Beta活动申请”。 申请审核通…

Hi3861 OpenHarmony嵌入式应用入门--华为 IoTDA 设备接入

华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,可以将自己的 IoT 设备 联接到华为云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云物联网平台的服 务实现设备与设备之间的控…

微信小程序---npm 支持

一、构建 npm 目前小程序已经支持使用 npm 安装第三方包,但是这些 npm 包在小程序中不能够直接使用,必须得使用小程序开发者工具进行构建后才可以使用。 为什么得使用小程序开发者工具需要构建呢❓ 因为 node_modules 目录下的包,不会参与…