安全矩阵

 找回密码
 立即注册
搜索
查看: 434|回复: 0

Weblogic安全漫谈(四)

[复制链接]

215

主题

215

帖子

701

积分

高级会员

Rank: 4

积分
701
发表于 2023-4-8 09:22:24 | 显示全部楼层 |阅读模式
转载于:Zhuri 默安逐日实验室

黑名单机制必然会推动两种研究方向的发展:一是挖掘不在黑名单的新组件,是为绕过规则;二是发掘检查的盲区,是为绕过逻辑。


CVE-2020-14756
二次反序列化具有对抗检查逻辑的天生丽质,在CVE-2018-2893中就有利用字节数组和反射重建类两种方式。找找还有没有readObject到Class.forName的路子:


readUnsignedByte读到的nType为9或10时会进入readXmlSerializable或readExternalizableLite分支。

上述两个方法均通过自身loadClass方法加载类,最终由Class.forName获取类并返回。



    • readXmlSerializable方法获取类后继续进行XML解析,是另一个XXE漏洞。

readExternalizableLite方法获取类后继续调用readExternal反序列化,不受黑名单限制,进而引出两个问题:

    1. ExternalizableHelper自身没有实现Serializable接口,一定有什么地方调用它的readObject
    2. loadClass加载后强转为了ExternalizableLite类型,它哪些满足readExternal参数要求的子类可以被用作sink


找到PermissionInfo#readExternal会调用ExternalizableHelper#readCollection进而调用readObject作为链首。

继续找到TopNAggregator$PartialResult及其父类SortedBag:

readExternal方法会调用父类的instantiateInternalMap方法将comparator封装进TreeMap,随后在add方法中调用map.put时就会触发compare,进而连上以前的链尾。与PriorityQueue的作用相同,只是绕这么一圈过掉了黑名单。

重写PermissionInfo#writeExternal按照以前的套路一步步构造payload打出去就行。


  1. extract:95, MvelExtractor (com.tangosol.coherence.rest.util.extractor)

  2. extract:112, ReflectionExtractor (com.tangosol.util.extractor)
  3. extract:105, ChainedExtractor (com.tangosol.util.extractor)

  4. // extract:96, MultiExtractor (com.tangosol.util.extractor)

  5. compare:143, AbstractExtractor (com.tangosol.util.extractor)
  6. compare:416, SortedBag$WrapperComparator (com.tangosol.util)
  7. compare:1295, TreeMap (java.util)
  8. put:538, TreeMap (java.util)
  9. add:152, SortedBag (com.tangosol.util)
  10. add:270, TopNAggregator$PartialResult (com.tangosol.util.aggregator)
  11. readExternal:299, TopNAggregator$PartialResult (com.tangosol.util.aggregator)
  12. readExternalizableLite:2345, ExternalizableHelper (com.tangosol.util)
  13. readObjectInternal:2661, ExternalizableHelper (com.tangosol.util)
  14. readObject:2606, ExternalizableHelper (com.tangosol.util)
  15. readCollection:2131, ExternalizableHelper (com.tangosol.util)
  16. readExternal:190, PermissionInfo (com.tangosol.net.security)
  17. readExternalData:2118, ObjectInputStream (java.io)
  18. readOrdinaryObject:2067, ObjectInputStream (java.io)
  19. readObject0:1573, ObjectInputStream (java.io)
复制代码
漏洞作者用了AttributeHolder作为链首,主要是writeExternal的逻辑友好,不用重写构造起来更加方便。


CVE-2020-14644
按照同样的思路找ClassLoader.defineClass的路子:


com.tangosol.internal.util.invoke.RemoteConstructor#readResolve会触发newInstance并调用com.tangosol.internal.util.invoke.RemotableSupport#realize。

随后会经过多个方法处理后最终进入ClassLoader.defineClass,可以看到关键是最开始传入RemoteConstructor构造方法的ClassDefinition对象。

对于字节码相关的处理函数就是获取构造方法,之后会被用于创建实例化对象,真正的关键变为了ClassDefinition构造方法的ClassIdentity对象。





看到ClassIdentity构造函数会将包名、类名、以及md5哈希分别存入三个属性,上文中RemotableSupport加载字节码时,会以这个getName方法获取到的类名为准。

  1. defineClass:181, RemotableSupport (com.tangosol.internal.util.invoke)
  2. realize:137, RemotableSupport (com.tangosol.internal.util.invoke)
  3. newInstance:120, RemoteConstructor (com.tangosol.internal.util.invoke)
  4. readResolve:231, RemoteConstructor (com.tangosol.internal.util.invoke)
  5. invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
  6. invoke:62, NativeMethodAccessorImpl (sun.reflect)
  7. invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
  8. invoke:498, Method (java.lang.reflect)
  9. invokeReadResolve:1260, ObjectStreamClass (java.io)
  10. readOrdinaryObject:2078, ObjectInputStream (java.io)
  11. readObject0:1573, ObjectInputStream (java.io)
复制代码

梳理一下整体逻辑:

    1. 将要加载的类喂给ClassIdentity构造函数
    2. ClassDefinition构造函数接收第一步创建的ClassIdentity对象、以及要加载的类字节码
    3. RemoteConstructor构造函数接收第二步创建的ClassDefinition对象、以及要加载的类构造函数的参数类型数组

反序列化时就会触发类加载,要解决的核心问题是ClassIdentity构造函数把传给ClassLoader.defineClass的类名作了变化,我们也要对字节码中的类名作相应的格式变化,用asm或者javassist或者手动创建类对象都行。



CVE-2021-2135
早期对于14756的修复方法之一就是在ExternalizableHelper#readExternalizableLite中loadClass后,判断输入流属于ObjectInputStream就进入检查流程。这就是把找一条非ObjectInputStream输入流就能绕过写在脸上了。


  1. extract:95, MvelExtractor (com.tangosol.coherence.rest.util.extractor)

  2. extract:112, ReflectionExtractor (com.tangosol.util.extractor)
  3. extract:105, ChainedExtractor (com.tangosol.util.extractor)

  4. // extract:96, MultiExtractor (com.tangosol.util.extractor)

  5. compare:79, AbstractExtractor (com.tangosol.util.extractor)
  6. compare:416, SortedBag$WrapperComparator (com.tangosol.util)
  7. compare:1295, TreeMap (java.util)
  8. put:538, TreeMap (java.util)
  9. add:152, SortedBag (com.tangosol.util)
  10. add:268, TopNAggregator$PartialResult (com.tangosol.util.aggregator)
  11. readExternal:297, TopNAggregator$PartialResult (com.tangosol.util.aggregator)
  12. readExternalizableLite:2265, ExternalizableHelper (com.tangosol.util)
  13. readObjectInternal:2579, ExternalizableHelper (com.tangosol.util)
  14. deserializeInternal:3098, ExternalizableHelper (com.tangosol.util)
  15. fromBinary:334, ExternalizableHelper (com.tangosol.util)
  16. getKey:56, SimpleBinaryEntry (com.tangosol.internal.util)
  17. toString:153, SimpleBinaryEntry (com.tangosol.internal.util)
  18. equals:392, XString (com.sun.org.apache.xpath.internal.objects)
  19. equals:3415, Base (com.tangosol.util)
  20. put:213, LiteMap (com.tangosol.util)
  21. readMap:1900, ExternalizableHelper (com.tangosol.util)
  22. readExternal:190, ConditionalPutAll (com.tangosol.util.processor)
  23. readExternalizableLite:2265, ExternalizableHelper (com.tangosol.util)
  24. readObjectInternal:2579, ExternalizableHelper (com.tangosol.util)
  25. readObject:2524, ExternalizableHelper (com.tangosol.util)
  26. readObject:2502, ExternalizableHelper (com.tangosol.util)
  27. readExternal:406, AttributeHolder (com.tangosol.coherence.servlet)
  28. readExternal:371, AttributeHolder (com.tangosol.coherence.servlet)
  29. readExternalData:2118, ObjectInputStream (java.io)
  30. readOrdinaryObject:2067, ObjectInputStream (java.io)
  31. readObject0:1573, ObjectInputStream (java.io)
复制代码
参考链接

1.https://www.kingkk.com/2020/08/C ... B%E6%80%9D%E8%80%83

2.https://xz.aliyun.com/t/9068

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 02:18 , Processed in 0.012712 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表