不久前Elasticsearch發佈了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在嚴重的本地文件包含漏洞可導致拒絕服務攻擊、任意文件讀取攻擊、配合第三方應用反彈SHELL攻擊,下文筆者對其漏洞背景、攻擊原理和行為進行分析 ...
不久前Elasticsearch發佈了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在嚴重的本地文件包含漏洞可導致拒絕服務攻擊、任意文件讀取攻擊、配合第三方應用反彈SHELL攻擊,下文筆者對其漏洞背景、攻擊原理和行為進行分析和復現。
0X01 影響範圍
Elasticsearch Kibana是荷蘭Elasticsearch公司的一套開源的、基於瀏覽器的分析和搜索Elasticsearch儀錶板工具,作為Elasticsearch的核心組件,Kibana可作為產品或服務提供,並與各種系統,產品,網站和企業中的其他Elastic Stack產品配合使用。 由於Kibana在大數據領域用途較為廣泛,此次漏洞影響範圍較大, Shodan搜索結果如圖
0x02 漏洞場景
筆者選擇Kibana-6.1.1-linux-x86_64.tar.gz版本,搭建過程不表,網上很多參考資料
2.1、拒絕服務
拒絕服務筆者選擇/cli_plugin/index.js演示,攻擊向量如下
GET請求發出去後客戶端打不開應用頁面,在服務端Kibana進程退出,應用服務掛掉具體看下圖
2.2、任意文件讀取
文件讀取筆者選擇/etc/passwd演示,攻擊向量如下
2.3、配合第三方應用
通常情況下Kibana與其他的應用程式一起部署,如果應用程式可以上傳或者寫入Javascript文件的話,攻擊者可以通過Nodejs創建一個Reverse Shell,內容如下
路徑遍歷允許攻擊者訪問Kibana伺服器任何文件的位置,如下
Nc反彈監聽得到交互會話
0X03 漏洞分析
漏洞污染點位於 \src\core_plugins\console\api_server\server.js
Apis得到的值傳遞給賦值參數name,從圖上也能看到name變數的內容沒有進行任何過濾被引入到require,而require模塊在Nodejs里表示載入模塊的方式,可以載入核心模塊,例如內置的“http”,也可以是包含名為“index.js”這樣的文件或目錄如果參數以“/”、“./”、”../”開頭則函數知道該模塊是文件或者文件夾,繼續跟進到函數asJson所在的api.js文件中
在同級目錄下ES_5_0.js 中有一個這個類的導出實例
總結一下此函數的正常流程是獲取導出API類實例並調用函數asJson的JavaScript文件的名稱,但是忽略了過濾驗證因此我們可以指定任意文件,配合目錄跳轉遍歷就可以實現Kibana伺服器上任意文件讀取的操作。基於上述的分析很明顯Nodejs應用程式需要大量的文件,如果這些文件里包含了process.exit指令,那麼就可能關閉Kibana進程並導致拒絕服務攻擊,通過搜索找到了三個可能的攻擊向量
0x04 一點總結
LFI通常出現在PHP應用中,通樣是require這次應用在Nodejs程式中,相信未來還會有更多的Nodejs程式存在這種問題,原因是本地包含漏洞出現了很多年,但依舊有很多軟體開發人員和架構師沒有考慮到這點,這篇文章很好的說明瞭Kibana中存在的一個關鍵LFI漏洞,使得攻擊者能夠在伺服器上運行本地代碼,可造成直接的危害就是拒絕服務攻擊,若在生產環境下業務實在傷不起,需要引起對Nodejs LFI的重視。
0x05 參考鏈接
https://github.com/appsecco/vulnerable-apps/tree/master/node-reverse-shell
https://www.elastic.co/downloads/kibana
http://www.cnvd.org.cn/flaw/show/CNVD-2018-23907
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17246