msfjs
Version:
Node library for interacting with metasploit
141 lines (87 loc) • 2.62 kB
JavaScript
var Session = require('./session.js');
var msf = null;
var Meterpreter = function(exploit, options) {
this.exploit = exploit;
this.payload = "windows/meterpreter/reverse_tcp";
if(options.payload && ~options.payload.indexOf("meterpreter")) {
// Check for custom meterpreter (not reverse_tcp)
this.payload = options.payload;
}
this.options = options || {};
this.events = null;
}
Meterpreter.prototype.handle = function(process, events) {
this.events = events;
var PROMPT = "meterpreter >";
var checkForSession = function(data) {
data = data.toString().trim().replace(/\s{2,}/g,'').replace(/\u001b\[\d{1,}m/g, '');
if(!data) return;
var session = data.match(/session\s\d{1,}\sopened\s\((.*):(\d{1,5})\s->\s(.*):(\d{1,5})\)/);
if(session) {
this.session = new Session({
process: process,
events: events,
connection: {
from: {
host: session[1],
port: session[2]
},
to: {
host: session[3],
port: session[4]
}
}
});
process.stdout.removeAllListeners('data');
msf.sessions.push(this.session);
events.emit("success", this.session);
process.stdout.on('data', checkForPrompt.bind(this));
process.stdout.on('data', checkForClose.bind(this));
}
}
var checkForPrompt = function(data) {
data = data.toString().trim().replace(/\s{2,}/g,'').replace(/\u001b\[\d{1,}m/g, '');
if(!data) return;
if(data == PROMPT) {
this.session.emit('prompt');
}
}
var checkForClose = function(data) {
data = data.toString().trim().replace(/\s{2,}/g,'').replace(/\u001b\[\d{1,}m/g, '');
var session = data.match(/Meterpreter\ssession\s\d{1,}\sclosed./);
if(session) {
this.session.emit("close");
process.stdout.removeAllListeners('data');
process.stderr.removeAllListeners('data');
this.session = null;
}
}
var checkForError = function(data) {
data = data.toString().trim().replace(/\s{2,}/g,'').replace(/\u001b\[\d{1,}m/g, '');
if(~data.indexOf('[-]')) {
var error = data;
var s = data.match(/([A-Z_]{1,}_[A-Z_]{1,}).*Command=(\d{1,})/);
if(s) {
error = {
CODE: s[1],
ERRNO: s[2],
MESSAGE: s.input
};
}
events.emit("error", error);
return;
}
}
process.stdout.on('data', checkForSession.bind(this));
process.stdout.on('data', checkForError.bind(this));
}
Meterpreter.prototype.addOption = function(key, value) {
this.options[key] = value;
}
Meterpreter.prototype.removeOption = function(key) {
delete this.options[key];
}
module.exports = function(framework) {
msf = framework;
return Meterpreter;
}