KoreanHackerTeam
Moderator
Apache Spark 未授权访问漏洞
Apache Spark 是一款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点未启动 ACL(访问控制),我们将可以在集群中执行任意代码。漏洞环境
执行如下命令,将以standalone
模式启动一个 Apache Spark
集群,集群里有一个 master
与一个 slave
:
코드:
|
코드:
|
master
的管理页面,访问http://your-ip:8081即可看到 slave
的管理页面。漏洞利用
该漏洞本质是未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。提交方式有两种:
- 利用REST API
- 利用 submissions 网关(集成在 7077 端口中) 应用可以是 Java 或 Python,就是一个最简单的类
코드:
|
코드:
|
코드:
|
코드:
|
用 REST API 方式提交应用:
standalone
模式下,master
将在 6066
端口启动一个 HTTP 服务器,我们向这个端口提交 REST 格式的 API:
코드:
|
코드:
|
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
:
코드:
|
코드:
|
master
参数是 rest
服务器,这个脚本会先尝试使用 rest api
来提交应用;如果发现不是 rest
服务器,则会降级到使用 submission gateway
来提交应用。查看结果的方式与前面一致。