CobaltStrike 作为流行的cs控制工具,当CVE-2022-39197 公布后,居然可以RCE ,这对红蓝双方带来的影响自然不言而喻。
0x01 背景
这个漏洞可能是继Spring4Shell 之后的又一Java 🔥漏洞。漏洞是由beichen 师傅发现的,然后java小王子浅蓝师傅没过多久就卷出来了,接着pandan师傅、漂亮鼠师傅陆续都复现了,直到整个java安全圈都有在分析这个漏洞。
这个漏洞是很值得分析的:
- CobaltStrike RCE,这个不用多说,攻防互换,每一种反制手段都极其罕见
- 是Java Swing GUI 的漏洞,GUI 的RCE 凤毛麟角,很是珍贵
- 是通用漏洞,比如 CobaltStrike 用到的Apache bakit
- 据说beichen有jdk的链,期待
赛博群名言:只要知道有洞,就会被群友卷出来。
知道有漏洞,再去定向分析,已经是开卷考试了。但是分析过程仍然坎坷、复杂,因此对beichen 师傅认真膜一个,能从一个set点坚持找到对应的利用链,真的是很需要耐心和细心。
0x02 漏洞分析
本文这里只做漏洞原理分析,并不像以往进行思路分析,只是从source、sink、gadget 去复现该漏洞,暂不解释各自的发现思路。
2.1 Source: ObjectView
这里参考【1】中漂亮鼠师傅详细讲解了ObjectView,这里不赘述
javax.swing.text.html.ObjectView
1 | protected Component createComponent() { |
直接引用结论:
- classid传入需要实例化的类,类必须继承与Component
- 必须有无参构造方法,貌似是因为newinstant是调用的无参构造方法
- 必须存在一个setXXX方法的XXX属性
- setXXX方法的传参数必须是接受一个string类型的参数
2.2 查找Component
1 | match PATH=(m:Method)-[r2:HAS]-(source:Class)-[r:EXTENDS*]-(sink:Class {NAME:"java.awt.Component"}) |
没啥技巧,只能一个个尝试,了解原理一个个排除。
这里先暂时直接给结论,org.apache.batik.swing.JSVGCanvas#setURI可以。
有师傅们也给了codeql的搜索条件:
2.3 Sink
粗略跟跟setURI
JSVGCanvas#setURI
1 | // public class JSVGCanvas extends JSVGComponent |
AbstractJSVGComponent#loadSVGDocument
1 | //public class AbstractJSVGComponent extends JGVTComponent |
SVGDocumentLoader#run
1 | //public class SVGDocumentLoader extends HaltingThread |
DocumentLoader#loadDocument
1 | //public class DocumentLoader { |
然后找到不多的几个实现类,SAXSVGDocumentFactory#createSVGDocument,大致功能为load svg file。
2.4 SVG Script
那么接下来就看看svg有哪些标签可用,参考【2】中可以发现,svg支持script,bakit的具体实现上支持rhino和jar,那么构造对应的poc即可。
1 | <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> |
注意:
- 该poc不能直接打cs,因为cs中默认不含rhino
1 | <svg xmlns="http://www.w3.org/2000/svg" |
注意:
- Manifest 中需要指定SVG-Handler-Class: com.m0d9.sec.SVGHandler
- xlink:href
- implements EventListenerInitializer 实现handleEvent。
调用栈:
1 | exec:347, Runtime (java.lang) |
0x03 小结
这个漏洞是高难度的,能发现真的很厉害,漏洞本身危害也不小,算得上是Swing 的一个攻击面了。pyn3rd师傅提供的参考【4】中,其实很早就有关swing xss的风险,这个漏洞提供了新的RCE 攻击方式。
Component 的查找可以做到自动化,codeql/tabby 都能做,但是这一步只能算整个漏洞的1/2,剩下的sink点以及后半段gadget,因为涉及到GUI及异步框架,从调用链中也可以看到,目前无法自动化。
Java 安全真心卷。