免责声明:
本公众号致力于安全研究和红队攻防技术分享等内容,本文中所有涉及的内容均不针对任何厂商或个人,同时由于传播、利用本公众号所发布的技术或工具造成的任何直接或者间接的后果及损失,均由使用者本人承担。请遵守中华人民共和国相关法律法规,切勿利用本公众号发布的技术或工具从事违法犯罪活动。最后,文中提及的图文若无意间导致了侵权问题,请在公众号后台私信联系作者,进行删除操作。
此漏洞一直存在于/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发在小密圈,有想讨论的师傅欢迎加圈领取
后台回复“加群”或“小助手”,或扫描下方二维码加入我们的付费圈子,一起进步吧
原文始发于微信公众号(Lambda小队):某报表系统黑名单绕过分析-附POC
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论