本文中xray高级版shiro payload来源于雷石安全实验室公众号发布的shiroExploit.jar

感谢雷石安全实验室,雷石安全实验室牛逼

本文主要描述如何从shiro的payload中提取有效payload。该方法适合从各种java反序列化漏洞中提取payload

0x01 前言

某日小伙伴发来雷石安全实验室的shiro利用工具,据称payload提取自xray。利用如下

0x02 反编译雷石利用工具

首先拖入idea中反编译,查看如何利用payload。代码如下

t是遍历数组的下标变量

不得不说,当我看到这人写的代码时,心中一万个草泥马飘过。第一次看到这样遍历数组的方式!!!!再看一下变量命名,浓郁地乡村非主流风格。雷石安全实验室写的代码,自带混淆,牛皮。

payload呢,原来是xray已经生成并加密的,一共430个。所以我们的问题变为如何从这430个已加密的payload中提取未加密的内容

0x03 shiro payload解密

根据shiro漏洞的原理,shiro的cookie通过如下方式加密, key为kPH+bIxk5D2deZiIxcaaaA==解码后的内容

base64Encode(iv+aes(java serialize object))

而java反序列化后的数据,以aced开头。于是我们可以使用shiro默认密钥,批量解密上面的430个key。如果正常解密,且解密后的数据以正确的magic number开头。则保存文件。代码如下

    public static String bytesToHex(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if(hex.length() < 2){
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
} public static byte[] decrypt(byte[] cipherTextBytes, byte[] pwdBytes, byte[] iv) {
try {
// 1 获取解密密钥
SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM);
// 2 获取Cipher实例
Cipher cipher = Cipher.getInstance(CIPHER_MODE);
// 查看数据块位数 默认为16(byte) * 8 =128 bit
// System.out.println("数据块位数(byte):" + cipher.getBlockSize());
// 3 初始化Cipher实例。设置执行模式以及加密密钥
IvParameterSpec iv1 = new IvParameterSpec(iv);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv1);
// 4 执行
byte[] clearTextBytes = cipher.doFinal(cipherTextBytes);
// 5 返回明文字符集
return clearTextBytes;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
// 解密错误 返回null
return null;
} public static void main(String... args) throws IOException {
for(int i = 0; i< xray.cookie.length; i++){
String payload = xray.payloads(i);
System.out.println(payload);
byte[] rawpayloadBytes = Base64.decode(payload);
byte[] key = Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");
int ivSize = key.length;
byte[] iv = new byte[ivSize];
System.arraycopy(rawpayloadBytes, 0, iv, 0, ivSize);
byte[] payloadBytes = new byte[rawpayloadBytes.length - ivSize];
System.arraycopy(rawpayloadBytes, ivSize, payloadBytes, 0, payloadBytes.length);
byte[] result = EncryptUtil.decrypt(payloadBytes, key, iv);
if (result != null){
String hexResult = bytesToHex(result);
if (hexResult.startsWith("aced")) {
System.out.println(payload);
new FileOutputStream(new File("res.ser")).write(result);
}
}
}
}

结果通过010editor查看如下

0x04 查看java反序列化数据

通过SerializationDumper工具即可查看

shiro中通过反序列化漏洞回显,需要执行自定义的java代码。查看ysoserial代码,执行自定义代码,需要通过com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet的方式,编写一个继承自该类的class,读取字节码并设置_bytecodes,代码如下

所以我们的重点在于如何提取bytecode数组中的内容。而serializationDumper默认只打印数组中的值。

查看一下serializationDumper工具是如何读取array数组的,代码如下

首先读取array的size,然后调(byte)cd.getClassName().charAt(1)去读取array的类型,再调用readBytesField方法读取每一项具体的值,代码如下

	/*******************
* Read a byte field.
******************/
private void readByteField() {
byte b1 = this._data.pop();
if(((int)b1) >= 0x20 && ((int)b1) <= 0x7e) {
//Print with ASCII
this.print("(byte)" + b1 + " (ASCII: " + ((char)b1) + ") - 0x" + this.byteToHex(b1));
} else {
//Just print byte value
this.print("(byte)" + b1 + " - 0x" + this.byteToHex(b1));
}
}

所以只需要魔改一下读取数组的地方即可,并写入文件。

0x05 利用

已经集成到shiro综合利用工具中,可以选择gadget以及生成方式,不过目前只集成16个key。



参考

  1. https://mp.weixin.qq.com/s/fZhL-GjoXLPqAIKBKCC_fg

java反序列化提取payload之xray 高级版的shiro回显poc的提取过程的更多相关文章

  1. Xray高级版白嫖破解指南

    啊,阿Sir,免费的还想白嫖?? 好啦好啦不开玩笑 Xray是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动.被动多种扫描方式,自备盲打平台.可以灵活定义 POC,功能丰富,调用简单,支持 ...

  2. Java反序列化漏洞整理

    Fastjson 反序列化 CVE-- Fastjson 利用版本范围为 Fastjson 及之前的版本 Struts2 S2-, S2-, S2-, S2-, S2-, S2-, S2-, S2-, ...

  3. 通过WebGoat学习java反序列化漏洞

    首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...

  4. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  5. 对ysoserial工具及java反序列化的一个阶段性理解【未完成】

    经过一段时间的琢磨与反思,以及重读了大量之前看不懂的反序列化文章,目前为止算是对java反序列化这块有了一个阶段性的小理解. 目前为止,发送的所有java反序列化的漏洞中.主要需要两个触发条件: 1. ...

  6. Java反序列化漏洞从入门到深入(转载)

    前言 学习本系列文章需要的Java基础: 了解Java基础语法及结构(菜鸟教程) 了解Java面向对象编程思想(快速理解请上知乎读故事,深入钻研建议买本<疯狂Java讲义>另外有一个刘意老 ...

  7. java反序列化——apache-shiro复现分析

    本文首发于“合天智汇”公众号 作者:Fortheone 看了好久的文章才开始分析调试java的cc链,这个链算是java反序列化漏洞里的基础了.分析调试的shiro也是直接使用了cc链.首先先了解一些 ...

  8. Java反序列化漏洞执行命令回显实现及Exploit下载

    原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond 文中提及的部分技术.工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使 ...

  9. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

随机推荐

  1. Anchor Boxes示例实战

    Anchor Boxes示例实战 目标检测算法通常对输入图像中的大量区域进行采样,判断这些区域是否包含感兴趣的目标,并调整这些区域的边缘,以便更准确地预测目标的真实边界框.不同的模型可能使用不同的区域 ...

  2. Python_selenium页面元素整合设计经验

  3. JUC 并发编程--02,生产者和消费者 synchronized的写法 , juc的写法. Condition的用法

    synchronized的写法 class PCdemo{ public static void main(String[] args) { //多个线程操作同一资源 Data data = new ...

  4. Java基础知识之this关键字知识讲解

    this关键字这里对java中this关键字的基础知识进行讲解,希望对热爱java的小伙伴有帮助!! /* this关键字代表了所属函数的调用者对象. this关键字的作用: 1. 如果存在同名成员变 ...

  5. 【问题记录】—SignalR连接断线重连

    起因: ASP.NET Core SignalR是一个开源库,可简化向应用添加实时 SignalR Web 功能. 实时 Web 功能使服务器端代码能够立即将内容推送到客户端.(相信大家都用得比较多了 ...

  6. 【读书笔记】《C语言 从入门到精通》(第三版)笔记

    C语言,上学的时候都没学好,没想到现在却靠它吃饭.因为对C语言还是比较熟悉,所以买这本书是用来当"字典"用的.所以下面的笔记不会有很基础的内容. 1.书籍介绍 2.结构体 3.[C ...

  7. 十七、.net core(.NET 6)搭建基于Quartz组件的定时调度任务

     搭建基于Quartz组件的定时调度任务 先在package包项目下,添加Quartz定时器组件: 新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目.然后新建一个中间调度类,叫Qu ...

  8. Linux系统安装-C7

    1.安装部署操作系统 (1)创建虚拟机,加载系统镜像 (2)进入系统引导界面进行配置 补充:centos7系统网卡名称 默认系统的网卡名称为 eth0 eth1 –centos6 默认系统的网卡名称为 ...

  9. 02 jumpserver系统设置

    2.系统设置: (1)基本设置: (2)邮件设置: 1)163邮箱设置: 2)在jumpserver上填写邮箱信息: 3)邮件测试信息如下: (3)邮件内容设置: (4)终端设置: (5)安全设置:

  10. CRM系统对企业管理的作用有多大?

    随着市场经济的发展,对任何行业的企业来说,客户都是非常重要的一个部分.CRM系统帮助企业做到以客户为中心,它可以根据客户的具体要求进行跟进和反馈,在很大程度上提高公司的客户服务水平和客户满意度,进而提 ...