某报表系统黑名单绕过分析-附POC

admin 2023年9月21日10:02:30评论231 views字数 3487阅读11分37秒阅读模式

免责声明:

本公众号致力于安全研究和红队攻防技术分享等内容,本文中所有涉及的内容均不针对任何厂商或个人,同时由于传播、利用本公众号所发布的技术或工具造成的任何直接或者间接的后果及损失,均由使用者本人承担。请遵守中华人民共和国相关法律法规,切勿利用本公众号发布的技术或工具从事违法犯罪活动。最后,文中提及的图文若无意间导致了侵权问题,请在公众号后台私信联系作者,进行删除操作。

漏洞概要

此漏洞一直存在于/webroot/decision/remote/design/channel,从最早CB链直接利用到后来多次加入黑名单限制反序列化。


漏洞处的调用链为:

RemoteDesignResource#onMessage              RemoteDesignService.getInstance().onMessage(var1, var2);                WorkContext.handleMessage(var6)                  WorkspaceServerInvoker.handleMessage                    WorkspaceServerInvoker.deserializeInvocation                      (Invocation)SerializerHelper.deserialize(var1, GZipSerializerWrapper.wrap(SafeInvocationSerializer.getDefault()));                        GZipSerializerWrapper.deserialize

     


效果展示

首先我们先去看到黑名单,存在于fine-core-11.0.jar下的com/fr/serialization/blacklist.txt,可以直接反编译也可以用binwalk分离出来,以便于后面做对比分析。


通过拿最新的jar包和修复前的对比,发现新增了这些类:

com.fr.third.springframework.aop.target.HotSwappableTargetSource            java.security.SignedObject            com.fr.third.v2.org.apache.commons.collections4.comparators.TransformingComparator            com.fr.third.v2.org.apache.commons.collections4.functors.ChainedTransformer            com.fr.third.v2.org.apache.commons.collections4.functors.ConstantTransformer            com.fr.third.v2.org.apache.commons.collections4.functors.InstantiateTransformer            com.fr.third.v2.org.apache.commons.collections4.functors.InvokerTransformer            com.fr.third.v2.org.apache.commons.collections4.functors.MapTransformer            com.fr.third.v2.org.apache.commons.collections4.keyvalue.TiedMapEntry            com.fr.third.v2.org.apache.commons.collections4.map.LazyMap            com.fr.third.v2.org.apache.commons.collections4.Transformer            com.fr.third.v2.org.quartz.utils.JNDIConnectionProvider            com.fr.third.v2.org.apache.commons.codec.binary.Base64            com.fr.third.v2.org.apache.commons.collections4.map.TransformedMap            com.sun.jndi.ldap.LdapAttribute            com.lowagie.text.pdf.PdfReader            com.fr.third.v2.lowagie.text.pdf.PdfReader            com.fr.third.lowagie.text.pdf.PdfReader            com.lowagie.text.pdf.PdfStamper            com.fr.third.v2.lowagie.text.pdf.PdfStamper            com.fr.third.lowagie.text.pdf.PdfStamper            com.fr.third.fasterxml.jackson.databind.node.POJONode            com.sun.org.apache.xpath.internal.objects.XString            com.fr.third.springframework.jndi.support.SimpleJndiBeanFactory            com.fr.third.springframework.aop.aspectj.AbstractAspectJAdvice            com.fr.third.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator            com.fr.third.springframework.context.support.ClassPathXmlApplicationContext            com.fr.third.org.apache.commons.collections4.bag.TreeBag            org.apache.commons.collections4.bag.TreeBag            javax.management.remote.rmi.RMIConnector


熟悉二次反序列化的师傅看到SignedObject、RMIConnector就能有大概的思路了,就是构造二次反序列化。

那我们接下来要做的就是找到能触发SignedObject的getObject的方法,从新增的黑名单我们可以直接找到com.fr.third.fasterxml.jackson.databind.node.POJONode来使用,但是常用来触发POJONode#toString的BadAttributeValueExpException类却在第一次的黑名单中就已经ban掉了,所以我们要找出新的链子。

再参考trganda师傅的思路后,找到了com.fr.third.org.apache.commons.collections4.bag.TreeBag方法,可以使用它触发 Comparator 接口的 compare 方法。而org.freehep.util.VersionComparator的compare方法会去调用toString方法。

最终的调用链为:

     * TreeBag#readObject                 *   TreeMap#put                 *     compare(key, key);                 *       ClassComparator#compare                 *         this.comparator.compare(var1, var2);                 *           VersionComparator#compare                 *             obj.toString()                 *               SignedObject#geObject


坑点反思

  • 这条利用链本地复现只用了一天,但是完整构造poc却花费了很久。帆软的jar包在几次变动中依赖发生过变化,在第二次反序列化时11版本的可以用CB链,而10版本却没有,cc4中的ConstantTransformer没有继承序列化接口也无法使用,最终使用Hibernate1链来加载恶意类。

  • 在构造TreeBag的时候,我一开始只关注在它自身的add方法想去直接add一个POJONode对象,但是在add的时候会直接触发到put方法从而在初始化参数时候就触发了二次序列化并且抛出异常退出,最终解决方案是:反射获取TreeBag父类成员变量TreeMap的root节点,再利用反射修改节点的key就能够成功构造了。  


效果展示

       测试POC发在小密圈,有想讨论的师傅欢迎加圈领取    某报表系统黑名单绕过分析-附POC

            

加入我们

后台回复“加群”或“小助手”,或扫描下方二维码加入我们的付费圈子,一起进步吧


某报表系统黑名单绕过分析-附POC

某报表系统黑名单绕过分析-附POC

原文始发于微信公众号(Lambda小队):某报表系统黑名单绕过分析-附POC

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月21日10:02:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某报表系统黑名单绕过分析-附POChttp://cn-sec.com/archives/2054521.html

发表评论

匿名网友 填写信息