*鄭重聲明:本文展示的攻擊過程是在模擬環境中進行的。文中涉及的漏洞原理和攻擊方法,只爲交流學習之用。如有人用於非法用途,產生的後果筆者不負任何責任。

0×00 前言

本漏洞的exp放出來快一星期了,目前網上的分析文章也出了幾篇,但是大都集中於通過容器簡單復現攻擊過程,沒有深入的分析產生原因和exp的構造原理。筆者借鑑了大牛Michał Bentkowski,也就是漏洞發現者的博客上的英文ppt(參考鏈接3),寫了這篇文章。本文詳細介紹了在本地搭建了模擬攻擊環境的過程(非docker搭建),並完整分析了這個漏洞的攻擊原理。現在分享給大家。

0×01 漏洞簡介

Kibana存在遠程代碼執行漏洞,影響版本爲5.6.15和6.6.0之前的所有版本。擁有Kibana的Timelion模塊訪問權限的人可以以Kibana的運行權限執行任意代碼,包括反彈shell。

0×02 環境搭建

靶機環境:

 Parrot Security OS 4.7 64位 或其他類Linux操作系統(VMWare 14)
 Elasticsearch6.5.4
 Kibana 6.5.4
 IP:10.10.10.128

攻擊機環境:

 Windows 10 Home 64位
 Netcat 1.12 64位
 Chrome瀏覽器
 IP:172.16.2.62

0×03 漏洞利用

1)在靶機上部署Kibana 和Elasticsearch,並 開放訪問端口 (./config/kibana.xml中的server.host改成0.0.0.0)讓攻擊機可以訪問(如圖1所示)。

圖1 在靶機上部署Elasticsearch和Kibana

2)確認執行權限並啓動Elasticsearch和Kibana(如圖2,3所示)

圖2 在靶機上確認Kibana執行權限

圖3 執行 Elasticsearch和Kibana

在攻擊機上啓動netcat(圖4),並通過Chrome瀏覽器訪問Kibana的Timelion頁面,並輸入payload(圖5)。

圖4 在攻擊機上啓動netcat

圖5 登錄Timelion並在輸入框中輸入payload

payload如圖6所示(爲了避免各類糾紛,本文的攻擊代碼只放圖片版,文字版可以去參考鏈接裏面自取)

(注意替換payload中的反彈IP爲攻擊機IP)

點擊右邊的執行按鈕執行,然後點擊控制面板左邊的Canvas,可以獲取反彈shell

圖6 獲得反彈shell

多次操作之後可能會出現反彈不成功的現象,此時可以刪除kibana目錄並重新部署一次, 記得修改kibana.xml

0×04 漏洞機理

“原型污染”是一種針對JS語言開發的攻擊方法。JS語言中,每一個對象都是有其原型(__proto__)的,而該原型又有其自己的原型對象,直到某個對象的原型爲null。而如果JS對其中定義的對象原型的屬性讀寫缺乏控制,容易讓攻擊者操縱一些敏感特徵,從而實現攻擊者的目的。

本漏洞就是是一個由於JS語言的“原型污染”,導致靶機環境量被污染,最終獲得shell執行的漏洞。具體調試過程如下

1、POC驗證

1) 在Timelion的輸入框中輸入本漏洞的POC:

2) 點擊canvas,可以發現cookie被污染,頁面無法訪問。

3)通過node調試工具(具體使用方法見參考鏈接)連接後臺,刪除Object.prototype的cookie值,刷新發現頁面暫時恢復正常。因此可以判定該處存在JS原型污染漏洞

2、漏洞產生原理和攻擊思路

1)點擊canvas頁面,可以發現後臺大量報錯,報錯原因是9229端口被佔用。因此可以判斷:在點擊canvas頁面的過程中,kibana創建了新的node進程。( 注意此時要連接chrome的node調試工具纔會看到報錯 )因此可以考慮通過劫持環境變量來實現shell命令注入。    

2) 在創建新的node進程過程中,必然使用了NODE_OPTIONS環境變量,如果我們可以劫持該變量,那麼就能影響node的新進程創建。NODE_OPTIONS不限制–require選項,該選項可以在執行js文件之前首先加載其他js模塊。而在本案例中,實現上傳惡意模塊的思路難以實現。因此考慮進一步污染環境變量的方法來間接達到這一目的。

3、payload構建

在構建payload之前,我們通過調試工具查看Object.protoytpe.env變量。

Timelion中,props方法的官方解釋是:

簡單來說,props可以修改任意對象的屬性值。

因此可以採用props方法來對JS中object對象的原型進行修改,同時也就修改了靶機的環境變量。據此,我們構建出瞭如下的代碼:

其中,label.__proto__.env是靶機的環境變量,我們在該變量中添加了一個鍵值對

最後兩個斜槓用於把後面的內容註釋掉。因此我們目前的payload是

點擊執行之後,繼續在調試工具中查看Object.protoytpe.env變量的污染情況:

可以看到env已經被污染

下一步就是污染NODES_OPTIONS變量,讓node命令在運行時執行我們上面構建的反彈shell的命令。

首先考慮使用eval函數,而node的開發者顯然意識到了這是個很危險的設計,因此在NODE_OPTIONS變量中禁用了eval函數,然而卻沒有禁用—require這個選項。因此我們構建這一部分的代碼:

最終,我們構建的payload成了如下結構:

點擊執行之後再次查看env的污染情況

總體來看,我們首先把環境變量修改成了一條js語句,然後又在node執行過程中劫持了執行參數NODE_OPTIONS,這樣構成了完整的攻擊鏈。當然還有 最後一步點擊canvas頁面 ,讓node建立新進程的過程執行起來。從而達到反彈shell的目的。

0×05 危害分析和處理建議

危害分析:

 CNVD評級:高(A*V:N/AC:L/Au:N/C:C/I:C/A:C) 
 CNNVD評級:超危

雖然該漏洞是一個遠程命令執行漏洞,但是本人認爲該漏洞影響不大。

因爲本漏洞是執行在Kibana的宿主機上,而Kibana是一個Elasticsearch的可視化工具,該工具很少有人會把其頁面暴露於公網。

能夠造成威脅的只有一種情況,就是頁面被暴露於公網,而且使用了弱用戶名和弱口令。

故本人認爲該漏洞威脅不大。

處理建議:

 1)及時升級Kibana和Elasticsearch到最新版本,同時儘量用低權限執行Kibana和Elasticsearch。
 2)儘量不要讓Kibana的Timelion頁面暴露於公網,並檢查是否存在使用弱口令登錄的情況。

0×06 參考資料

1) https://nodejs.org/en/docs/inspector

2) https://github.com/mpgn/CVE-2019-7609

3) https://slides.com/securitymb/prototype-pollution-in-kibana/#/

4) CNVD 國家信息安全安全漏洞共享平臺 https://www.cnvd.org.cn/flaw/show/CNVD-2019-12163

5) CNNVD 國家信息安全漏洞庫 http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-201902-1035

*本文原創作者:wangtua,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載

相關文章