function checkall(clickchk, relChkbox) { var checker = $('#' + clickchk); var multichk = $('.' + relChkbox); checker.click(function() { multichk.prop('checked', $(this).prop('checked')); }); } function multiCheck(tb_var) { tb_var.on("change", ".chk-parent", function() { var e = $(this).closest("table").find("td:first-child .child-chk"), a = $(this).is(":checked"); $(e).each(function() { a ? ($(this).prop("checked", !0), $(this).closest("tr").addClass("active")) : ($(this).prop("checked", !1), $(this).closest("tr").removeClass("active")) }) }), tb_var.on("change", "tbody tr .new-control", function() { $(this).parents("tr").toggleClass("active") }) } function GetIEVersion() { var sAgent = window.navigator.userAgent; var Idx = sAgent.indexOf("MSIE"); // If IE, return version number. if (Idx > 0) return parseInt(sAgent.substring(Idx + 5, sAgent.indexOf(".", Idx))); // If IE 11 then look for Updated user agent string. else if (!!navigator.userAgent.match(/Trident\/7\./)) return 11; else return 0; //It is not IE } function truncate(str, n) { return (str.length > n) ? str.substr(0, n - 1) + '…' : str; }; function return_str_if_not_null(val) { return val ? val : ''; } // separate hostname and url // Referenced from https://stackoverflow.com/questions/736513/how-do-i-parse-a-url-into-hostname-and-path-in-javascript function getParsedURL(url) { var parser = new URL(url); return parser.pathname + parser.search; }; function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } // Source: https://portswigger.net/web-security/cross-site-scripting/preventing#encode-data-on-output function htmlEncode(str) { return String(str).replace(/[^\w. ]/gi, function(c) { return '&#' + c.charCodeAt(0) + ';'; }); } // Source: https://portswigger.net/web-security/cross-site-scripting/preventing#encode-data-on-output function jsEscape(str) { return String(str).replace(/[^\w. ]/gi, function(c) { return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); }); } function deleteScheduledScan(id) { const delAPI = "../delete/scheduled_task/" + id; swal.queue([{ title: 'Are you sure you want to delete this?', text: "This action can not be undone.", icon: 'warning', showCancelButton: true, confirmButtonText: 'Delete', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(delAPI, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken") } }).then(function(response) { return response.json(); }).then(function(data) { // TODO Look for better way return location.reload(); }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to delete the scheduled task!' }) }) } }]) } function change_scheduled_task_status(id, checkbox) { if (checkbox.checked) { text_msg = 'Schedule Scan Started'; } else { text_msg = 'Schedule Scan Stopped'; } Snackbar.show({ text: text_msg, pos: 'top-right', duration: 2500 }); const taskStatusApi = "../toggle/scheduled_task/" + id; return fetch(taskStatusApi, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken") } }) } function change_vuln_status(id) { const vulnStatusApi = "../toggle/vuln_status/" + id; return fetch(vulnStatusApi, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken") } }) } // splits really long strings into multiple lines // Souce: https://stackoverflow.com/a/52395960 function split_into_lines(str, maxWidth) { const newLineStr = "
"; done = false; res = ''; do { found = false; // Inserts new line at first whitespace of the line for (i = maxWidth - 1; i >= 0; i--) { if (test_white_space(str.charAt(i))) { res = res + [str.slice(0, i), newLineStr].join(''); str = str.slice(i + 1); found = true; break; } } // Inserts new line at maxWidth position, the word is too long to wrap if (!found) { res += [str.slice(0, maxWidth), newLineStr].join(''); str = str.slice(maxWidth); } if (str.length < maxWidth) done = true; } while (!done); return res + str; } function test_white_space(x) { const white = new RegExp(/^\s$/); return white.test(x.charAt(0)); }; // span values function will separate the values by comma and put badge around it function parse_comma_values_into_span(data, color, outline = null) { if (data) { var badge = ``; var data_with_span = ""; data.split(/\s*,\s*/).forEach(function(split_vals) { data_with_span += badge + split_vals + ""; }); return data_with_span; } return ''; } function get_severity_badge(severity) { switch (severity) { case 'Info': return "  INFO  "; break; case 'Low': return "  LOW  "; break; case 'Medium': return "  MEDIUM  "; break; case 'High': return "  HIGH  "; break; case 'Critical': return "  CRITICAL  "; break; case 'Unknown': return "  UNKNOWN  "; default: return ""; } } // Source: https://stackoverflow.com/a/54733055 function typingEffect(words, id, i) { let word = words[i].split(""); var loopTyping = function() { if (word.length > 0) { let elem = document.getElementById(id); elem.setAttribute('placeholder', elem.getAttribute('placeholder') + word.shift()); } else { deletingEffect(words, id, i); return false; }; timer = setTimeout(loopTyping, 150); }; loopTyping(); }; function deletingEffect(words, id, i) { let word = words[i].split(""); var loopDeleting = function() { if (word.length > 0) { word.pop(); document.getElementById(id).setAttribute('placeholder', word.join("")); } else { if (words.length > (i + 1)) { i++; } else { i = 0; }; typingEffect(words, id, i); return false; }; timer = setTimeout(loopDeleting, 90); }; loopDeleting(); }; function fullScreenDiv(id, btn) { let fullscreen = document.querySelector(id); let button = document.querySelector(btn); document.fullscreenElement && document.exitFullscreen() || document.querySelector(id).requestFullscreen() fullscreen.setAttribute("style", "overflow:auto"); } function get_randid() { return '_' + Math.random().toString(36).substr(2, 9); } function delete_all_scan_results() { const delAPI = "../scan/delete/scan_results/"; swal.queue([{ title: 'Are you sure you want to delete all scan results?', text: "You won't be able to revert this!", icon: 'warning', showCancelButton: true, confirmButtonText: 'Delete', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(delAPI, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken") } }).then(function(response) { return response.json(); }).then(function(data) { // TODO Look for better way return location.reload(); }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to delete Delete scan results!' }) }) } }]) } function delete_all_screenshots() { const delAPI = "../scan/delete/screenshots/"; swal.queue([{ title: 'Are you sure you want to delete all Screenshots?', text: "You won't be able to revert this!", icon: 'warning', showCancelButton: true, confirmButtonText: 'Delete', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(delAPI, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken") } }).then(function(response) { return response.json(); }).then(function(data) { // TODO Look for better way return location.reload(); }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to delete Empty Screenshots!' }) }) } }]) } function load_image_from_url(src, append_to_id) { img = document.createElement('img'); img.src = src; img.style.width = '100%'; document.getElementById(append_to_id).appendChild(img); } function setTooltip(btn, message) { hide_all_tooltips(); const instance = tippy(document.querySelector(btn)); instance.setContent(message); instance.show(); setTimeout(function() { instance.hide(); }, 500); } function hide_all_tooltips() { $(".tooltip").tooltip("hide"); } function get_response_time_text(response_time) { if (response_time) { var text_color = 'danger'; if (response_time < 0.5) { text_color = 'success' } else if (response_time >= 0.5 && response_time < 1) { text_color = 'warning' } return `${response_time.toFixed(4)}s`; } return ''; } function parse_technology(data, color, scan_id = null, domain_id=null) { var badge = `` + data[key]['name'] + ""; } else if (domain_id) { data_with_span += badge + ` onclick="get_tech_details('${data[key]['name']}', scan_id=null, domain_id=domain_id)">` + data[key]['name'] + ""; } } return data_with_span; } // span values function will separate the values by comma and put badge around it function parse_ip(data, cdn) { if (cdn) { var badge = ``; } else { var badge = ``; } var data_with_span = ""; data.split(/\s*,\s*/).forEach(function(split_vals) { data_with_span += badge + split_vals + ""; }); return data_with_span; } //to remove the image element if there is no screenshot captured function removeImageElement(element) { element.parentElement.remove(); } // https://stackoverflow.com/a/18197341/9338140 function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } function vuln_status_change(checkbox, id) { if (checkbox.checked) { checkbox.parentNode.parentNode.parentNode.className = "table-success text-strike"; } else { checkbox.parentNode.parentNode.parentNode.classList.remove("table-success"); checkbox.parentNode.parentNode.parentNode.classList.remove("text-strike"); } change_vuln_status(id); } function report_hackerone(vulnerability_id, severity) { message = "" if (severity == 'Info' || severity == 'Low' || severity == 'Medium') { message = "We do not recommended sending this vulnerability report to hackerone due to the severity, do you still want to report this?" } else { message = "This vulnerability report will be sent to Hackerone."; } const vulnerability_report_api = "../../api/vulnerability/report/?vulnerability_id=" + vulnerability_id; swal.queue([{ title: 'Reporting vulnerability to hackerone', text: message, icon: 'warning', showCancelButton: true, confirmButtonText: 'Report', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(vulnerability_report_api, { method: 'GET', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken") } }).then(function(response) { return response.json(); }).then(function(data) { console.log(data.status) if (data.status == 111) { swal.insertQueueStep({ icon: 'error', title: 'Target does not has team_handle to send report to.' }) } else if (data.status == 201) { swal.insertQueueStep({ icon: 'success', title: 'Vulnerability report successfully submitted to hackerone.' }) } else if (data.status == 400) { swal.insertQueueStep({ icon: 'error', title: 'Invalid Report.' }) } else if (data.status == 401) { swal.insertQueueStep({ icon: 'error', title: 'Hackerone authentication failed.' }) } else if (data.status == 403) { swal.insertQueueStep({ icon: 'error', title: 'API Key forbidden by Hackerone.' }) } else if (data.status == 423) { swal.insertQueueStep({ icon: 'error', title: 'Too many requests.' }) } }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to send vulnerability report to hackerone, check your target team_handle or hackerone configurarions!' }) }) } }]) } function get_interesting_subdomains(target_id, scan_history_id) { if (target_id) { url = `/api/listInterestingEndpoints/?target_id=${target_id}&format=datatables`; non_orderable_targets = [0, 1, 2, 3]; } else if (scan_history_id) { url = `/api/listInterestingSubdomains/?scan_id=${scan_history_id}&format=datatables`; non_orderable_targets = []; } var interesting_subdomain_table = $('#interesting_subdomains').DataTable({ "drawCallback": function(settings, start, end, max, total, pre) { // if no interesting subdomains are found, hide the datatable and show no interesting subdomains found badge if (this.fnSettings().fnRecordsTotal() == 0) { $('#interesting_subdomain_div').empty(); // $('#interesting_subdomain_div').append(`
//
// //
//
Interesting subdomains could not be identified
//
//
//
// reNgine could not identify any interesting subdomains. You can customize interesting subdomain keywords from here and this section would be automatically updated. //
//
`); } else { // show nav bar $('.interesting-tab-show').removeAttr('style'); $('#interesting_subdomain_alert_count').html(`${this.fnSettings().fnRecordsTotal()} Interesting Subdomains`) $('#interesting_subdomain_count_badge').empty(); $('#interesting_subdomain_count_badge').html(`${this.fnSettings().fnRecordsTotal()}`); } }, "oLanguage": { "oPaginate": { "sPrevious": '', "sNext": '' }, "sInfo": "Showing page _PAGE_ of _PAGES_", "sSearch": '', "sSearchPlaceholder": "Search...", "sLengthMenu": "Results : _MENU_", }, "processing": true, "dom": "<'dt--top-section'<'row'<'col-12 col-sm-6 d-flex justify-content-sm-start justify-content-center'f><'col-12 col-sm-6 d-flex justify-content-sm-end justify-content-center'l>>>" + "<'table-responsive'tr>" + "<'dt--bottom-section d-sm-flex justify-content-sm-between text-center'<'dt--pages-count mb-sm-0 mb-3'i><'dt--pagination'p>>", "destroy": true, "bInfo": false, "stripeClasses": [], 'serverSide': true, "ajax": url, "order": [ [3, "desc"] ], "lengthMenu": [5, 10, 20, 50, 100], "pageLength": 10, "columns": [{ 'data': 'name' }, { 'data': 'page_title' }, { 'data': 'http_status' }, { 'data': 'content_length' }, { 'data': 'http_url' }, { 'data': 'technologies' }, ], "columnDefs": [{ "orderable": false, "targets": non_orderable_targets }, { "targets": [4], "visible": false, "searchable": false, }, { "targets": [5], "visible": false, "searchable": true, }, { "className": "text-center", "targets": [2] }, { "render": function(data, type, row) { tech_badge = ''; if (row['technologies']) { // tech_badge = `
` + parse_technology(row['technologies'], "primary", outline=true, scan_id=null); } if (row['http_url']) { return `` + data + `` + tech_badge; } return `` + data + `` + tech_badge; }, "targets": 0 }, { "render": function(data, type, row) { // display badge based on http status // green for http status 2XX, orange for 3XX and warning for everything else if (data >= 200 && data < 300) { return "" + data + ""; } else if (data >= 300 && data < 400) { return "" + data + ""; } else if (data == 0) { // datatable throws error when no data is returned return ""; } return `` + data + ``; }, "targets": 2, }, ], }); } function get_interesting_endpoints(target_id, scan_history_id) { var non_orderable_targets = []; if (target_id) { url = `/api/listInterestingEndpoints/?target_id=${target_id}&format=datatables`; // non_orderable_targets = [0, 1, 2, 3]; } else if (scan_history_id) { url = `/api/listInterestingEndpoints/?scan_id=${scan_history_id}&format=datatables`; // non_orderable_targets = [0, 1, 2, 3]; } $('#interesting_endpoints').DataTable({ "drawCallback": function(settings, start, end, max, total, pre) { if (this.fnSettings().fnRecordsTotal() == 0) { $('#interesting_endpoint_div').remove(); } else { $('.interesting-tab-show').removeAttr('style'); $('#interesting_endpoint_alert_count').html(`, ${this.fnSettings().fnRecordsTotal()} Interesting Endpoints`) $('#interesting_endpoint_count_badge').empty(); $('#interesting_endpoint_count_badge').html(`${this.fnSettings().fnRecordsTotal()}`); } }, "oLanguage": { "oPaginate": { "sPrevious": '', "sNext": '' }, "sInfo": "Showing page _PAGE_ of _PAGES_", "sSearch": '', "sSearchPlaceholder": "Search...", "sLengthMenu": "Results : _MENU_", }, "processing": true, "dom": "<'dt--top-section'<'row'<'col-12 col-sm-6 d-flex justify-content-sm-start justify-content-center'f><'col-12 col-sm-6 d-flex justify-content-sm-end justify-content-center'l>>>" + "<'table-responsive'tr>" + "<'dt--bottom-section d-sm-flex justify-content-sm-between text-center'<'dt--pages-count mb-sm-0 mb-3'i><'dt--pagination'p>>", 'serverSide': true, "destroy": true, "bInfo": false, "ajax": url, "order": [ [3, "desc"] ], "lengthMenu": [5, 10, 20, 50, 100], "pageLength": 10, "columns": [{ 'data': 'http_url' }, { 'data': 'page_title' }, { 'data': 'http_status' }, { 'data': 'content_length' }, ], "columnDefs": [{ "orderable": false, "targets": non_orderable_targets }, { "className": "text-center", "targets": [2] }, { "render": function(data, type, row) { var url = split_into_lines(data, 70); return "" + url + ""; }, "targets": 0 }, { "render": function(data, type, row) { // display badge based on http status // green for http status 2XX, orange for 3XX and warning for everything else if (data >= 200 && data < 300) { return "" + data + ""; } else if (data >= 300 && data < 400) { return "" + data + ""; } else if (data == 0) { // datatable throws error when no data is returned return ""; } return `` + data + ``; }, "targets": 2, }, ], }); } function get_important_subdomains(target_id, scan_history_id) { var url = `/api/querySubdomains/?only_important&no_lookup_interesting&format=json`; if (target_id) { url += `&target_id=${target_id}`; } else if (scan_history_id) { url += `&scan_id=${scan_history_id}`; } $.getJSON(url, function(data) { $('#important-count').empty(); $('#important-subdomains-list').empty(); if (data['subdomains'].length > 0) { $('#important-count').html(`${data['subdomains'].length}`); for (var val in data['subdomains']) { subdomain = data['subdomains'][val]; div_id = 'important_' + subdomain['id']; $("#important-subdomains-list").append(`

${subdomain['name']}


`); } } else { $('#important-count').html(`0`); $('#important-subdomains-list').append(`

No subdomains marked as important!

`); } $('.bs-tooltip').tooltip(); }); } function mark_important_subdomain(row, subdomain_id) { if (row) { parentNode = row.parentNode.parentNode.parentNode.parentNode; if (parentNode.classList.contains('table-danger')) { parentNode.classList.remove('table-danger'); } else { parentNode.className = "table-danger"; } } var data = {'subdomain_id': subdomain_id} const subdomainImpApi = "/api/toggle/subdomain/important/"; if ($("#important_subdomain_" + subdomain_id).length == 0) { $("#subdomain-" + subdomain_id).prepend(``); setTooltip("#subdomain-" + subdomain_id, 'Marked Important!'); } else { $("#important_subdomain_" + subdomain_id).remove(); setTooltip("#subdomain-" + subdomain_id, 'Marked Un-Important!'); } return fetch(subdomainImpApi, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); } function delete_scan(id) { const delAPI = "../delete/scan/" + id; swal.queue([{ title: 'Are you sure you want to delete this scan history?', text: "You won't be able to revert this!", icon: 'warning', showCancelButton: true, confirmButtonText: 'Delete', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(delAPI, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken") } }).then(function(response) { return response.json(); }).then(function(data) { // TODO Look for better way return location.reload(); }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to delete the scan history!' }) }) } }]); } function stop_scan(scan_id=null, subscan_id=null, reload_scan_bar=true, reload_location=false) { const stopAPI = "/api/action/stop/scan/"; if (scan_id) { var data = {'scan_id': scan_id} } else if (subscan_id) { var data = {'subscan_id': subscan_id} } swal.queue([{ title: 'Are you sure you want to stop this scan?', text: "You won't be able to revert this!", icon: 'warning', showCancelButton: true, confirmButtonText: 'Stop', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(stopAPI, { method: 'POST', credentials: "same-origin", body: JSON.stringify(data), headers: { "X-CSRFToken": getCookie("csrftoken"), "Content-Type": 'application/json', } }).then(function(response) { return response.json(); }).then(function(data) { // TODO Look for better way if (data.status) { Snackbar.show({ text: 'Scan Successfully Aborted.', pos: 'top-right', duration: 1500 }); if (reload_scan_bar) { getScanStatusSidebar(); } if (reload_location) { window.location.reload(); } } else { Snackbar.show({ text: 'Oops! Could not abort the scan. ' + data.message, pos: 'top-right', duration: 1500 }); } }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to stop the scan' }) }) } }]) } function extractContent(s) { var span = document.createElement('span'); span.innerHTML = s; return span.textContent || span.innerText; }; function delete_datatable_rows(table_id, rows_id, show_snackbar = true, snackbar_title) { // this function will delete the datatables rows after actions such as delete // table_id => datatable_id with # // rows_ids: list/array => list of all numerical ids to delete, to maintain consistency // rows id will always follow this pattern: datatable_id_row_n // show_snackbar = bool => whether to show snackbar or not! // snackbar_title: str => snackbar title if show_snackbar = True var table = $(table_id).DataTable(); for (var row in rows_id) { table.row(table_id + '_row_' + rows_id[row]).remove().draw(); } Snackbar.show({ text: snackbar_title, pos: 'top-right', duration: 1500, actionTextColor: '#fff', backgroundColor: '#e7515a', }); } function delete_subscan(subscan_id) { // This function will delete the sunscans using rest api // Supported method: POST const delAPI = "/api/action/rows/delete/"; var data = { 'type': 'subscan', 'rows': [subscan_id] } swal.queue([{ title: 'Are you sure you want to delete this subscan?', text: "You won't be able to revert this!", icon: 'warning', showCancelButton: true, confirmButtonText: 'Delete', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(delAPI, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), "Content-Type": "application/json" }, body: JSON.stringify(data) }).then(function(response) { return response.json(); }).then(function(response) { if (response['status']) { delete_datatable_rows('#subscan_history_table', [subscan_id], show_snackbar = true, '1 Subscan Deleted!') } }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to delete the scan history!' }) }) } }]) } function show_subscan_results(subscan_id) { // This function will popup a modal and show the subscan results // modal being used is from base var api_url = '/api/fetch/results/subscan/?format=json'; var data = { 'subscan_id': subscan_id }; Swal.fire({ title: 'Fetching Results...' }); swal.showLoading(); fetch(api_url, { method: 'POST', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), 'Content-Type': 'application/json' }, body: JSON.stringify(data) }).then(response => response.json()).then(function(response) { console.log(response); swal.close(); if (response['subscan']['status'] == -1) { swal.fire("Error!", "Scan has not yet started! Please wait for other scans to complete...", "warning", { button: "Okay", }); return; } // else if (response['subscan']['status'] == 1) { // swal.fire("Error!", "Scan is in progress! Please come back later...", "warning", { // button: "Okay", // }); // return; // } $('#xl-modal-title').empty(); $('#xl-modal-content').empty(); $('#xl-modal-footer').empty(); var task_name = ''; if (response['subscan']['task'] == 'port_scan') { task_name = 'Port Scan'; } else if (response['subscan']['task'] == 'vulnerability_scan') { task_name = 'Vulnerability Scan'; } else if (response['subscan']['task'] == 'fetch_url') { task_name = 'Fetch URLs'; } else if (response['subscan']['task'] == 'dir_file_fuzz') { task_name = 'Directory and Files Fuzzing'; } $('#xl-modal_title').html(`${task_name} Results on ${response['subscan']['subdomain_name']}`); var scan_status = ''; var badge_color = 'danger'; if (response['subscan']['status'] == 0) { scan_status = 'Failed'; } else if (response['subscan']['status'] == 2) { scan_status = 'Successful'; badge_color = 'success'; } else if (response['subscan']['status'] == 3) { scan_status = 'Aborted'; } else { scan_status = 'Unknown'; } $('#xl-modal-content').append(`
Scan Status: ${scan_status}
`); console.log(response); $('#xl-modal-content').append(`
Engine Used: ${htmlEncode(response['subscan']['engine'])}
`); if (response['result'].length > 0) { if (response['subscan']['task'] == 'port_scan') { $('#xl-modal-content').append(`
`); for (var ip in response['result']) { var ip_addr = response['result'][ip]['address']; var id_name = `ip_${ip_addr}`; $('#port_results_li').append(`
IP Address: ${ip_addr}

${response['result'][ip]['ports'].length} Ports Open
`); $('#port_results_li').append(``); for (var port_obj in response['result'][ip]['ports']) { var port = response['result'][ip]['ports'][port_obj]; var port_color = 'primary'; if (port["is_uncommon"]) { port_color = 'danger'; } $('#port_results_li ul').append(`
  • ${port['number']}/${port['service_name']}/${port['description']}
  • `); } } $('#xl-modal-footer').append(`* Uncommon Ports`); } else if (response['subscan']['task'] == 'vulnerability_scan') { render_vulnerability_in_xl_modal(vuln_count = response['result'].length, subdomain_name = response['subscan']['subdomain_name'], result = response['result']); } else if (response['subscan']['task'] == 'fetch_url') { render_endpoint_in_xlmodal(endpoint_count = response['result'].length, subdomain_name = response['subscan']['subdomain_name'], result = response['result']); } else if (response['subscan']['task'] == 'dir_file_fuzz') { if (response['result'][0]['directory_files'].length == 0) { $('#xl-modal-content').append(` `); } else { render_directories_in_xl_modal(response['result'][0]['directory_files'].length, response['subscan']['subdomain_name'], response['result'][0]['directory_files']); } } } else { $('#xl-modal-content').append(` `); } $('#modal_xl_scroll_dialog').modal('show'); $("body").tooltip({ selector: '[data-toggle=tooltip]' }); }); } function get_http_status_badge(data) { if (data >= 200 && data < 300) { return "" + data + ""; } else if (data >= 300 && data < 400) { return "" + data + ""; } else if (data == 0) { // datatable throws error when no data is returned return ""; } return "" + data + ""; } function render_endpoint_in_xlmodal(endpoint_count, subdomain_name, result) { // This function renders endpoints datatable in xl modal // Used in Subscan results and subdomain to endpoints modal $('#xl-modal-content').append(`
    ${endpoint_count} Endpoints Discovered on subdomain ${subdomain_name}
    `); $('#xl-modal-content').append(`
    HTTP URL Status Page Title Tags Content Type Content Length Response Time
    `); $('#endpoint_tbody').empty(); for (var endpoint_obj in result) { var endpoint = result[endpoint_obj]; var tech_badge = ''; var web_server = ''; if (endpoint['technologies']) { tech_badge = '
    ' + parse_technology(endpoint['technologies'], "primary", outline = true); } if (endpoint['webserver']) { web_server = `${endpoint['webserver']}`; } var url = split_into_lines(endpoint['http_url'], 70); var rand_id = get_randid(); tech_badge += web_server + '
    '; var http_url_td = "` + url + "" + tech_badge; $('#endpoint_tbody').append(` ${http_url_td} ${get_http_status_badge(endpoint['http_status'])} ${return_str_if_not_null(endpoint['page_title'])} ${parse_comma_values_into_span(endpoint['matched_gf_patterns'], "danger", outline=true)} ${return_str_if_not_null(endpoint['content_type'])} ${return_str_if_not_null(endpoint['content_length'])} ${get_response_time_text(endpoint['response_time'])} `); } $("#endpoint-modal-datatable").DataTable({ "oLanguage": { "oPaginate": { "sPrevious": '', "sNext": '' }, "sInfo": "Showing page _PAGE_ of _PAGES_", "sSearch": '', "sSearchPlaceholder": "Search...", "sLengthMenu": "Results : _MENU_", }, "dom": "<'dt--top-section'<'row'<'col-12 col-sm-6 d-flex justify-content-sm-start justify-content-center'f><'col-12 col-sm-6 d-flex justify-content-sm-end justify-content-center'l>>>" + "<'table-responsive'tr>" + "<'dt--bottom-section d-sm-flex justify-content-sm-between text-center'<'dt--pages-count mb-sm-0 mb-3'i><'dt--pagination'p>>", "order": [ [5, "desc"] ], drawCallback: function() { $(".dataTables_paginate > .pagination").addClass("pagination-rounded") } }); } function render_vulnerability_in_xl_modal(vuln_count, subdomain_name, result) { // This function will render the vulnerability datatable in xl modal $('#xl-modal-content').append(`
    ${vuln_count} Vulnerabilities Discovered on subdomain ${subdomain_name}
    `); $('#xl-modal-content').append(`
      `); $('#xl-modal-content').append(`
      Type Title Severity CVSS Score CVE/CWE Vulnerable URL Description Action
      `); $('#vuln_tbody').empty(); for (var vuln in result) { var vuln_obj = result[vuln]; var vuln_type = vuln_obj['type'] ? `  ${vuln_obj['type'].toUpperCase()}  ` : ''; var tags = ''; var cvss_metrics_badge = ''; switch (vuln_obj['severity']) { case 'Info': color = 'primary' badge_color = 'soft-primary' break; case 'Low': color = 'low' badge_color = 'soft-warning' break; case 'Medium': color = 'warning' badge_color = 'soft-warning' break; case 'High': color = 'danger' badge_color = 'soft-danger' break; case 'Critical': color = 'critical' badge_color = 'critical' break; default: } if (vuln_obj['tags']) { tags = '
      '; vuln_obj['tags'].forEach(tag => { tags += `${tag.name}`; }); tags += '
      '; } if (vuln_obj['cvss_metrics']) { cvss_metrics_badge = `
      ${vuln_obj['cvss_metrics']}
      `; } var vuln_title = `` + vuln_obj['name'] + `` + cvss_metrics_badge + tags; var badge = 'danger'; var cvss_score = ''; if (vuln_obj['cvss_score']) { if (vuln_obj['cvss_score'] > 0.1 && vuln_obj['cvss_score'] <= 3.9) { badge = 'info'; } else if (vuln_obj['cvss_score'] > 3.9 && vuln_obj['cvss_score'] <= 6.9) { badge = 'warning'; } else if (vuln_obj['cvss_score'] > 6.9 && vuln_obj['cvss_score'] <= 8.9) { badge = 'danger'; } cvss_score = `${vuln_obj['cvss_score']}`; } var cve_cwe_badge = '
      '; if (vuln_obj['cve_ids']) { vuln_obj['cve_ids'].forEach(cve => { cve_cwe_badge += `${cve.name.toUpperCase()}`; }); } if (vuln_obj['cwe_ids']) { vuln_obj['cwe_ids'].forEach(cwe => { cve_cwe_badge += `${cwe.name.toUpperCase()}`; }); } cve_cwe_badge += '
      '; var http_url = vuln_obj['http_url'].includes('http') ? "" + htmlEncode(vuln_obj['http_url']) + "" : vuln_obj['http_url']; var description = vuln_obj['description'] ? `
      ${split_into_lines(vuln_obj['description'], 30)}
      ` : ''; // show extracted results, and show matcher names, matcher names can be in badges if (vuln_obj['matcher_name']) { description += `${vuln_obj['matcher_name']}`; } if (vuln_obj['extracted_results'] && vuln_obj['extracted_results'].length > 0) { description += `
      `; description += `
      '; } if (vuln_obj['references'] && vuln_obj['references'].length > 0) { description += `
      `; description += `
      '; } if (vuln_obj['curl_command']) { description += `
      `; description += `
      '; } var action_icon = vuln_obj['hackerone_report_id'] ? '' : `
      `; $('#vuln_tbody').append(` ${vuln_type} ${vuln_title} ${get_severity_badge(vuln_obj['severity'])} ${cvss_score} ${cve_cwe_badge} ${http_url} ${description} ${action_icon} `); } $("#vulnerability-modal-datatable").DataTable({ "oLanguage": { "oPaginate": { "sPrevious": '', "sNext": '' }, "sInfo": "Showing page _PAGE_ of _PAGES_", "sSearch": '', "sSearchPlaceholder": "Search...", "sLengthMenu": "Results : _MENU_", }, "dom": "<'dt--top-section'<'row'<'col-12 col-sm-6 d-flex justify-content-sm-start justify-content-center'f><'col-12 col-sm-6 d-flex justify-content-sm-end justify-content-center'l>>>" + "<'table-responsive'tr>" + "<'dt--bottom-section d-sm-flex justify-content-sm-between text-center'<'dt--pages-count mb-sm-0 mb-3'i><'dt--pagination'p>>", "order": [ [5, "desc"] ], drawCallback: function() { $(".dataTables_paginate > .pagination").addClass("pagination-rounded") } }); } function render_directories_in_xl_modal(directory_count, subdomain_name, result) { $('#xl-modal-content').append(`
      ${directory_count} Directories Discovered on subdomain ${subdomain_name}
      `); $('#xl-modal-content').append(`
      Directory HTTP Status Content Length Lines Words
      `); $('#directory_tbody').empty(); for (var dir_obj in result) { var dir = result[dir_obj]; $('#directory_tbody').append(` ${dir.name} ${get_http_status_badge(dir.http_status)} ${dir.length} ${dir.lines} ${dir.words} `); } var interesting_keywords_array = []; var dir_modal_table = $("#directory-modal-datatable").DataTable({ "oLanguage": { "oPaginate": { "sPrevious": '', "sNext": '' }, "sInfo": "Showing page _PAGE_ of _PAGES_", "sSearch": '', "sSearchPlaceholder": "Search...", "sLengthMenu": "Results : _MENU_", }, "dom": "<'dt--top-section'<'row'<'col-12 col-sm-6 d-flex justify-content-sm-start justify-content-center'f><'col-12 col-sm-6 d-flex justify-content-sm-end justify-content-center'l>>>" + "<'table-responsive'tr>" + "<'dt--bottom-section d-sm-flex justify-content-sm-between text-center'<'dt--pages-count mb-sm-0 mb-3'i><'dt--pagination'p>>", "order": [ [2, "desc"] ], drawCallback: function() { $(".dataTables_paginate > .pagination").addClass("pagination-rounded"); } }); // TODO: Find interetsing dirs // fetch("/api/listInterestingKeywords") // .then(response => { // return response.json(); // }) // .then(data => { // interesting_keywords_array = data; // dir_modal_table.rows().every(function(){ // console.log(this.data()); // }); // }); } function get_and_render_subscan_history(subdomain_id, subdomain_name) { // This function displays the subscan history in a modal for any particular subdomain var data = { 'subdomain_id': subdomain_id }; fetch('/api/listSubScans/?format=json', { method: 'POST', credentials: "same-origin", body: JSON.stringify(data), headers: { "X-CSRFToken": getCookie("csrftoken"), "Content-Type": 'application/json', } }).then(function(response) { return response.json(); }).then(function(data) { console.log(data); if (data['status']) { $('#modal_title').html('Subscan History for subdomain ' + subdomain_name); $('#modal-content').empty(); $('#modal-content').append(`
      `); $('#subscan_history_table').empty(); for (var result in data['results']) { var result_obj = data['results'][result]; console.log(result_obj) var error_message = ''; var task_name = result_obj.type; if (result_obj.status == 0) { color = 'danger'; bg_color = 'bg-soft-danger'; status_badge = 'Failed'; error_message = `
      Error: ${result_obj.error_message}`; } else if (result_obj.status == 3) { color = 'danger'; bg_color = 'bg-soft-danger'; status_badge = 'Aborted'; } else if (result_obj.status == 2) { color = 'success'; bg_color = 'bg-soft-success'; status_badge = 'Task Completed'; } $('#subscan_history_table').append(` `); } $('#modal_dialog').modal('show'); } }); } function fetch_whois(domain_name) { // this function will fetch WHOIS record for any subdomain and also display // snackbar once whois is fetched var url = `/api/tools/whois/?format=json&ip_domain=${domain_name}`; $('[data-toggle="tooltip"]').tooltip('hide'); Snackbar.show({ text: 'Fetching WHOIS...', pos: 'top-right', duration: 1500, }); $("#whois_not_fetched_alert").hide(); $("#whois_fetching_alert").show(); fetch(url, {}).then(res => res.json()) .then(function(response) { $("#whois_fetching_alert").hide(); document.getElementById('domain_age').innerHTML = response['domain']['domain_age'] + ' ' + response['domain']['date_created']; document.getElementById('ip_address').innerHTML = response['domain']['ip_address']; document.getElementById('ip_geolocation').innerHTML = response['domain']['geolocation']; document.getElementById('registrant_name').innerHTML = response['registrant']['name']; console.log(response['registrant']['organization']) document.getElementById('registrant_organization').innerHTML = response['registrant']['organization'] ? response['registrant']['organization'] : ' '; document.getElementById('registrant_address').innerHTML = response['registrant']['address'] + ' ' + response['registrant']['city'] + ' ' + response['registrant']['state'] + ' ' + response['registrant']['country']; document.getElementById('registrant_phone_numbers').innerHTML = response['registrant']['tel']; document.getElementById('registrant_fax').innerHTML = response['registrant']['fax']; Snackbar.show({ text: 'Whois Fetched...', pos: 'top-right', duration: 3000 }); $("#whois_fetched_alert").show(); $("#whois_fetched_alert").fadeTo(2000, 500).slideUp(1500, function() { $("#whois_fetched_alert").slideUp(500); }); }).catch(function(error) { console.log(error); }); } function get_target_whois(domain_name) { var url = `/api/tools/whois/?format=json&ip_domain=${domain_name}` Swal.fire({ title: `Fetching WHOIS details for ${domain_name}...` }); swal.showLoading(); fetch(url, { method: 'GET', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), 'Content-Type': 'application/json' }, }).then(response => response.json()).then(function(response) { console.log(response); if (response.status) { swal.close(); display_whois_on_modal(response); } else { fetch(`/api/tools/whois/?format=json&ip_domain=${domain_name}`, { method: 'GET', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), 'Content-Type': 'application/json' }, }).then(response => response.json()).then(function(response) { console.log(response); if (response.status) { swal.close(); display_whois_on_modal(response); } else { Swal.fire({ title: 'Oops!', text: `reNgine could not fetch WHOIS records for ${domain_name}!`, icon: 'error' }); } }); } }); } function get_domain_whois(domain_name, show_add_target_btn=false) { // this function will get whois for domains that are not targets, this will // not store whois into db nor create target var url = `/api/tools/whois/?format=json&ip_domain=${domain_name}` Swal.fire({ title: `Fetching WHOIS details for ${domain_name}...` }); $('.modal').modal('hide'); swal.showLoading(); fetch(url, { method: 'GET', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), 'Content-Type': 'application/json' }, }).then(response => response.json()).then(function(response) { swal.close(); if (response.status) { display_whois_on_modal(response, show_add_target_btn=show_add_target_btn); } else { Swal.fire({ title: 'Oops!', text: `reNgine could not fetch WHOIS records for ${domain_name}! ${response['message']}`, icon: 'error' }); } }); } function display_whois_on_modal(response, show_add_target_btn=false) { console.log(response); // this function will display whois data on modal, should be followed after get_domain_whois() $('#modal_dialog').modal('show'); $('#modal-content').empty(); $("#modal-footer").empty(); content = `

       Contact Information

      Name  ${response.registrant.name}
      Organization  ${response.registrant.organization}
      Email  ${response.registrant.email}
      Phone/Fax  ${response.registrant.phone}  ${response.registrant.fax}
      Address  ${response.registrant.address}
      Address City: ${response.registrant.city} State: ${response.registrant.state} Zip Code: ${response.registrant.zipcode} Country: ${response.registrant.country}
      Name  ${response.admin.name}
      Organization  ${response.admin.organization}
      Admin ID  ${response.admin.id}
      Email  ${response.admin.email}
      Phone/Fax  ${response.admin.phone}  ${response.admin.fax}
      Address  ${response.admin.address}
      Address City: ${response.admin.city} State: ${response.admin.state} Zip Code: ${response.admin.zipcode} Country: ${response.admin.country}
      Name  ${response.technical_contact.name}
      Organization  ${response.technical_contact.organization}
      Tech ID  ${response.technical_contact.id}
      Email  ${response.technical_contact.email}
      Phone/Fax  ${response.technical_contact.phone}  ${response.technical_contact.fax}
      Address  ${response.technical_contact.address}
      Address City: ${response.technical_contact.city} State: ${response.technical_contact.state} Zip Code: ${response.technical_contact.zipcode} Country: ${response.technical_contact.country}
      ${response.raw_text}
      `; for (var ns in response.nameservers) { var ns_object = response.nameservers[ns]; content += `${ns_object}`; } content += `
      `; if (show_add_target_btn) { content += `
      ` } $('#modal-content').append(content); $('[data-toggle="tooltip"]').tooltip(); } function show_quick_add_target_modal() { // this function will display the modal to add target $('#modal_title').html('Add target'); $('#modal-content').empty(); $('#modal-content').append(` If you would like to add IP/CIDRs, multiple domain, Please click here.
      `); $('#modal_dialog').modal('show'); } function add_quick_target() { // this function will be a onclick for add target button on add_target modal $('#modal_dialog').modal('hide'); var domain_name = $('#target_name_modal').val(); var description = $('#target_description_modal').val(); var h1_handle = $('#h1_handle_modal').val(); add_target(domain_name, h1_handle = h1_handle, description = description); } function add_target(domain_name, h1_handle = null, description = null) { // this function will add domain_name as target console.log('Adding new target ' + domain_name) const add_api = '/api/add/target/?format=json'; const data = { 'domain_name': domain_name, 'h1_team_handle': h1_handle, 'description': description }; swal.queue([{ title: 'Add Target', text: `Would you like to add ${domain_name} as target?`, icon: 'info', showCancelButton: true, confirmButtonText: 'Add Target', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { return fetch(add_api, { method: 'POST', credentials: "same-origin", headers: { 'X-CSRFToken': getCookie("csrftoken"), 'Content-Type': 'application/json' }, body: JSON.stringify(data) }).then(function(response) { console.log(response) return response.json(); }).then(function(data) { console.log(data) if (data.status) { swal.queue([{ title: 'Target Successfully added!', text: `Do you wish to initiate the scan on new target?`, icon: 'success', showCancelButton: true, confirmButtonText: 'Initiate Scan', padding: '2em', showLoaderOnConfirm: true, preConfirm: function() { window.location = `/scan/start/${data.domain_id}`; } }]); } else { swal.insertQueueStep({ icon: 'error', title: data.message }); } }).catch(function() { swal.insertQueueStep({ icon: 'error', title: 'Oops! Unable to add target !' }); }) } }]); } function loadSubscanHistoryWidget(scan_history_id = null, domain_id = null) { // This function will load the subscan history widget if (scan_history_id) { var data = { 'scan_history_id': scan_history_id } } if (domain_id) { var data = { 'domain_id': domain_id } } fetch('/api/listSubScans/?format=json', { method: 'POST', credentials: "same-origin", body: JSON.stringify(data), headers: { "X-CSRFToken": getCookie("csrftoken"), "Content-Type": 'application/json', } }).then(function(response) { return response.json(); }).then(function(data) { console.log(data); $('#subscan_history_widget').empty(); if (data['status']) { $('#sub_scan_history_count').append(` ${data['results'].length} `) for (var result in data['results']) { var error_message = ''; var result_obj = data['results'][result]; var task_name = get_task_name(result_obj); if (result_obj.status == 0) { color = 'danger'; bg_color = 'bg-soft-danger'; status_badge = 'Failed'; error_message = `
      Error: ${result_obj.error_message}`; } else if (result_obj.status == 3) { color = 'danger'; bg_color = 'bg-soft-danger'; status_badge = 'Aborted'; } else if (result_obj.status == 2) { color = 'success'; bg_color = 'bg-soft-success'; status_badge = 'Task Completed'; } else if (result_obj.status == 1) { color = 'primary'; bg_color = 'bg-soft-primary'; status_badge = 'Running'; } $('#subscan_history_widget').append(` `); } } else { $('#sub_scan_history_count').append(` 0 `) $('#subscan_history_widget').append(` `); } }); } function get_ips(scan_id=null, domain_id=null){ // this function will fetch and render ips in widget var url = '/api/queryIps/?'; if (scan_id) { url += `scan_id=${scan_id}`; } if (domain_id) { url += `target_id=${domain_id}`; } url += `&format=json`; $.getJSON(url, function(data) { $('#ip-address-count').empty(); for (var val in data['ips']){ ip = data['ips'][val] badge_color = ip['is_cdn'] ? 'warning' : 'primary'; if (scan_id) { $("#ip-address").append(`${ip['address']}`); } else if (domain_id) { $("#ip-address").append(`${ip['address']}`); } // $("#ip-address").append(`${ip['address']}`); } $('#ip-address-count').html(`${data['ips'].length}`); $("body").tooltip({ selector: '[data-toggle=tooltip]' }); }); } function get_technologies(scan_id=null, domain_id=null){ // this function will fetch and render tech in widget var url = '/api/queryTechnologies/?'; if (scan_id) { url += `scan_id=${scan_id}`; } if (domain_id) { url += `target_id=${domain_id}`; } url += `&format=json`; $.getJSON(url, function(data) { $('#technologies-count').empty(); for (var val in data['technologies']){ tech = data['technologies'][val] if (scan_id) { $("#technologies").append(`${tech['name']}`); } else if (domain_id) { $("#technologies").append(`${tech['name']}`); } } $('#technologies-count').html(`${data['technologies'].length}`); $("body").tooltip({ selector: '[data-toggle=tooltip]' }); }); } function get_ports(scan_id=null, domain_id=null){ // this function will fetch and render ports in widget var url = '/api/queryPorts/?'; if (scan_id) { url += `scan_id=${scan_id}`; } if (domain_id) { url += `target_id=${domain_id}`; } url += `&format=json`; $.getJSON(url, function(data) { $('#ports-count').empty(); for (var val in data['ports']){ port = data['ports'][val] badge_color = port['is_uncommon'] ? 'danger' : 'primary'; if (scan_id) { $("#ports").append(`${port['number']}/${port['service_name']}`); } else if (domain_id){ $("#ports").append(`${port['number']}/${port['service_name']}`); } } $('#ports-count').html(`${data['ports'].length}`); $("body").tooltip({ selector: '[data-toggle=tooltip]' }); }); } function get_ip_details(ip_address, scan_id=null, domain_id=null){ var port_url = `/api/queryPorts/?ip_address=${ip_address}`; var subdomain_url = `/api/querySubdomains/?ip_address=${ip_address}`; if (scan_id) { port_url += `&scan_id=${scan_id}`; subdomain_url += `&scan_id=${scan_id}`; } else if(domain_id){ port_url += `&target_id=${domain_id}`; subdomain_url += `&target_id=${domain_id}`; } port_url += `&format=json`; subdomain_url += `&format=json`; var interesting_badge = `Interesting`; var port_loader = ``; var subdomain_loader = ``; // add tab modal title $('#modal_title').html('Details for IP: ' + ip_address + ''); $('#modal-content').empty(); $('#modal-tabs').empty(); $('#modal-content').append(``); $('#modal_tab_nav').append(``); $('#modal_tab_nav').append(``) // add content area $('#modal_tab_content').empty(); $('#modal_tab_content').append(``); $('#modal-open-ports').append(``); $('#modal-text-open-port').append(``); $('#modal_content_port').append(``); $('#modal_content_subdomain').append(``); $.getJSON(port_url, function(data) { $('#modal_content_port').empty(); $('#modal_content_port').append(`

      IP Addresses ${ip_address} has ${data['ports'].length} Open Ports`); $('#modal-open-ports-count').html(`${data['ports'].length}  `); for (port in data['ports']){ port_obj = data['ports'][port]; badge_color = port_obj['is_uncommon'] ? 'danger' : 'info'; $("#modal_content_port").append(`

    1. ${port_obj['description']} (${port_obj['number']}/${port_obj['service_name']})
    2. `) } $("#port-modal-loader").remove(); }); $('#modal_dialog').modal('show'); // query subdomains $.getJSON(subdomain_url, function(data) { $('#modal_content_subdomain').empty(); $('#modal_content_subdomain').append(`

      ${data['subdomains'].length} Subdomains are associated with IP ${ip_address}`); $('#modal-subdomain-count').html(`${data['subdomains'].length}  `); for (subdomain in data['subdomains']){ subdomain_obj = data['subdomains'][subdomain]; badge_color = subdomain_obj['http_status'] >= 400 ? 'danger' : ''; li_id = get_randid(); if (subdomain_obj['http_url']) { $("#modal_content_subdomain").append(`

    3. ${subdomain_obj['name']}
    4. `) } else { $("#modal_content_subdomain").append(`
    5. ${subdomain_obj['name']}
    6. `); } if (subdomain_obj['http_status']) { $("#"+li_id).append(get_http_badge(subdomain_obj['http_status'])); $('.bs-tooltip').tooltip(); } if (subdomain_obj['is_interesting']) { $("#"+li_id).append(interesting_badge) } } $("#modal-text-subdomain").append(`*Subdomains highlighted are 40X HTTP Status`); $("#subdomain-modal-loader").remove(); }); } function get_port_details(port, scan_id=null, domain_id=null){ var ip_url = `/api/queryIps/?port=${port}`; var subdomain_url = `/api/querySubdomains/?port=${port}`; if (scan_id) { ip_url += `&scan_id=${scan_id}`; subdomain_url += `&scan_id=${scan_id}`; } else if(domain_id){ ip_url += `&target_id=${domain_id}`; subdomain_url += `&target_id=${domain_id}`; } ip_url += `&format=json`; subdomain_url += `&format=json`; var interesting_badge = `Interesting`; var ip_spinner = ``; var subdomain_spinner = ``; $('#modal_title').html('Details for Port: ' + port + ''); $('#modal-content').empty(); $('#modal-tabs').empty(); $('#modal-content').append(``); $('#modal_tab_nav').append(``); $('#modal_tab_nav').append(``) // add content area $('#modal_tab_content').append(``); $('#modal_content_ip').append(``); $('#modal_content_subdomain').append(``); $('#modal_dialog').modal('show'); $.getJSON(ip_url, function(data) { $('#modal_ip_ul').empty(); $('#modal_ip_ul').append(`

      ${data['ips'].length} IP Addresses have Port ${port} Open`); $('#modal-ip-count').html(`${data['ips'].length}  `); for (ip in data['ips']){ ip_obj = data['ips'][ip]; text_color = ip_obj['is_cdn'] ? 'warning' : ''; $("#modal_ip_ul").append(`

    7. ${ip_obj['address']}
    8. `) } $('#modal_ip_ul').append(`*IP Address highlighted are CDN IP Address`); $("#ip-modal-loader").remove(); }); // query subdomains $.getJSON(subdomain_url, function(data) { $('#modal_subdomain_ul').empty(); $('#modal_subdomain_ul').append(`

      ${data['subdomains'].length} Subdomains have Port ${port} Open`); $('#modal-subdomain-count').html(`${data['subdomains'].length}  `); for (subdomain in data['subdomains']){ subdomain_obj = data['subdomains'][subdomain]; badge_color = subdomain_obj['http_status'] >= 400 ? 'danger' : ''; li_id = get_randid(); if (subdomain_obj['http_url']) { $("#modal_subdomain_ul").append(`

    9. ${subdomain_obj['name']}
    10. `) } else { $("#modal_subdomain_ul").append(`
    11. ${subdomain_obj['name']}
    12. `); } if (subdomain_obj['http_status']) { $("#"+li_id).append(get_http_badge(subdomain_obj['http_status'])); $('.bs-tooltip').tooltip(); } if (subdomain_obj['is_interesting']) { $("#"+li_id).append(interesting_badge) } } $("#modal_subdomain_ul").append(`*Subdomains highlighted are 40X HTTP Status`); $("#subdomain-modal-loader").remove(); }); } function get_tech_details(tech, scan_id=null, domain_id=null){ var url = `/api/querySubdomains/?tech=${tech}`; if (scan_id) { url += `&scan_id=${scan_id}`; } else if(domain_id){ url += `&target_id=${domain_id}`; } url += `&format=json`; var interesting_badge = `Interesting`; // render tab modal $('.modal-title').html('Details for Technology: ' + tech + ''); $('#modal_dialog').modal('show'); $('.modal-text').empty(); $('#modal-footer').empty(); $('.modal-text').append(``); // query subdomains $.getJSON(url, function(data) { $('#modal-loader').empty(); $('#modal-content').empty(); $('#modal-content').append(`${data['subdomains'].length} Subdomains are using ${tech}`); for (subdomain in data['subdomains']){ subdomain_obj = data['subdomains'][subdomain]; badge_color = subdomain_obj['http_status'] >= 400 ? 'danger' : ''; li_id = get_randid(); if (subdomain_obj['http_url']) { $("#modal-content").append(`
    13. ${subdomain_obj['name']}
    14. `) } else { $("#modal-content").append(`
    15. ${subdomain_obj['name']}
    16. `); } if (subdomain_obj['http_status']) { $("#"+li_id).append(get_http_badge(subdomain_obj['http_status'])); $('.bs-tooltip').tooltip(); } if (subdomain_obj['is_interesting']) { $("#"+li_id).append(interesting_badge) } } $("#modal-content").append(`*Subdomains highlighted are 40X HTTP Status`); $("#subdomain-modal-loader").remove(); }).fail(function(){ $('#modal-loader').empty(); }); } function get_http_badge(http_status){ switch (true) { case (http_status >= 400): badge_color = 'danger' break; case (http_status >= 300): badge_color = 'warning' break; case (http_status >= 200): badge_color = 'success' break; default: badge_color = 'danger' } if (http_status) { badge = `${http_status}`; return badge } } function get_and_render_cve_details(cve_id){ var api_url = `/api/tools/cve_details/?cve_id=${cve_id}&format=json`; Swal.fire({ title: 'Fetching CVE Details...' }); swal.showLoading(); fetch(api_url, { method: 'GET', credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), "Content-Type": "application/json" }, }).then(response => response.json()).then(function(response) { console.log(response); swal.close(); if (response.status) { $('#xl-modal-title').empty(); $('#xl-modal-content').empty(); $('#xl-modal-footer').empty(); $('#xl-modal_title').html(`CVE Details of ${cve_id}`); var cvss_score_badge = 'danger'; if (response.result.cvss > 0.1 && response.result.cvss <= 3.9) { cvss_score_badge = 'info'; } else if (response.result.cvss > 3.9 && response.result.cvss <= 6.9) { cvss_score_badge = 'warning'; } content = `
      `; content += `

      ${cve_id}

      Assigner: ${response.result.assigner} CVSS Vector: ${response.result['cvss-vector']}
         
      CVSS Score ${response.result.cvss ? response.result.cvss: "-"}
      Confidentiality Impact ${response.result.impact.confidentiality ? response.result.impact.confidentiality: "N/A"}
      Integrity Impact ${response.result.impact.integrity ? response.result.impact.integrity: "N/A"}
      Availability Impact ${response.result.impact.availability ? response.result.impact.availability: "N/A"}
      Access Complexity ${response.result.access.complexity ? response.result.access.complexity: "N/A"}
      Authentication ${response.result.access.authentication ? response.result.access.authentication: "N/A"}
      CWE ID ${response.result.cwe ? response.result.cwe: "N/A"}
      `; content += `
      `; content += `
        `; for (var prod in response.result.vulnerable_product) { content += `
      • ${response.result.vulnerable_product[prod]}
      • `; } content += `
      `; content += `
        `; for (var conf in response.result.vulnerable_configuration) { content += `
      • ${response.result.vulnerable_configuration[conf]['id']}
      • `; } content += `
      `; content += `
      `; $('#xl-modal-content').append(content); $('#modal_xl_scroll_dialog').modal('show'); $("body").tooltip({ selector: '[data-toggle=tooltip]' }); } else{ swal.fire("Error!", response.message, "error", { button: "Okay", }); } }); } function get_most_vulnerable_target(scan_id=null, target_id=null, ignore_info=false, limit=50){ $('#most_vulnerable_target_div').empty(); $('#most_vulnerable_spinner').append(`
      `); var data = {}; if (scan_id) { data['scan_history_id'] = scan_id; } else if (target_id) { data['target_id'] = target_id; } data['ignore_info'] = ignore_info; data['limit'] = limit; fetch('/api/fetch/most_vulnerable/?format=json', { method: 'POST', credentials: "same-origin", body: JSON.stringify(data), headers: { "X-CSRFToken": getCookie("csrftoken"), "Content-Type": 'application/json', } }).then(function(response) { return response.json(); }).then(function(response) { $('#most_vulnerable_spinner').empty(); if (response.status) { $('#most_vulnerable_target_div').append(`
      Target Vulnerabilities Count
      `); for (var res in response.result) { var targ_obj = response.result[res]; var tr = ``; if (scan_id || target_id) { tr = ``; } $('#most_vulnerable_target_tbody').append(` ${tr}
      ${targ_obj.name}
      ${targ_obj.vuln_count} Vulnerabilities `); } } else{ $('#most_vulnerable_target_div').append(`
      Could not find most vulnerable targets.
      Once the vulnerability scan is performed, reNgine will identify the most vulnerable targets.
      `); } }); } function get_most_common_vulnerability(scan_id=null, target_id=null, ignore_info=false, limit=50){ $('#most_common_vuln_div').empty(); $('#most_common_vuln_spinner').append(`
      `); var data = {}; if (scan_id) { data['scan_history_id'] = scan_id; } else if (target_id) { data['target_id'] = target_id; } data['ignore_info'] = ignore_info; data['limit'] = limit; fetch('/api/fetch/most_common_vulnerability/?format=json', { method: 'POST', credentials: "same-origin", body: JSON.stringify(data), headers: { "X-CSRFToken": getCookie("csrftoken"), "Content-Type": 'application/json', } }).then(function(response) { return response.json(); }).then(function(response) { $('#most_common_vuln_spinner').empty(); if (response.status) { $('#most_common_vuln_div').append(`
      Vulnerability Name Count Severity
      `); for (var res in response.result) { var vuln_obj = response.result[res]; var vuln_badge = ''; switch (vuln_obj.severity) { case -1: vuln_badge = get_severity_badge('Unknown'); break; case 0: vuln_badge = get_severity_badge('Info'); break; case 1: vuln_badge = get_severity_badge('Low'); break; case 2: vuln_badge = get_severity_badge('Medium'); break; case 3: vuln_badge = get_severity_badge('High'); break; case 4: vuln_badge = get_severity_badge('Critical'); break; default: vuln_badge = get_severity_badge('Unknown'); } $('#most_common_vuln_tbody').append(`
      ${vuln_obj.name}
      ${vuln_obj.count} ${vuln_badge} `); } } else{ $('#most_common_vuln_div').append(`
      Could not find Most Common Vulnerabilities.
      Once the vulnerability scan is performed, reNgine will identify the Most Common Vulnerabilities.
      `); } }); } function highlight_search(search_keyword, content){ // this function will send the highlighted text from search keyword var reg = new RegExp('('+search_keyword+')', 'gi'); return content.replace(reg, '$1'); } function validURL(str) { // checks for valid http url var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\#[-a-z\\d_]*)?$','i'); // fragment locator return !!pattern.test(str); } function shadeColor(color, percent) { //https://stackoverflow.com/a/13532993 var R = parseInt(color.substring(1,3),16); var G = parseInt(color.substring(3,5),16); var B = parseInt(color.substring(5,7),16); R = parseInt(R * (100 + percent) / 100); G = parseInt(G * (100 + percent) / 100); B = parseInt(B * (100 + percent) / 100); R = (R<255)?R:255; G = (G<255)?G:255; B = (B<255)?B:255; var RR = ((R.toString(16).length==1)?"0"+R.toString(16):R.toString(16)); var GG = ((G.toString(16).length==1)?"0"+G.toString(16):G.toString(16)); var BB = ((B.toString(16).length==1)?"0"+B.toString(16):B.toString(16)); return "#"+RR+GG+BB; }