From 29f4ff7e4cac52af24c2e78fa74aabb6bbfd7551 Mon Sep 17 00:00:00 2001 From: Yogesh Ojha Date: Fri, 18 Mar 2022 23:32:08 +0530 Subject: [PATCH] fix endpoint rendering --- web/api/urls.py | 4 - web/api/views.py | 130 +- .../static/startScan/js/detail_scan.js | 2887 +++++++++-------- .../templates/startScan/detail_scan.html | 2 +- web/static/custom/custom.js | 138 +- 5 files changed, 1575 insertions(+), 1586 deletions(-) diff --git a/web/api/urls.py b/web/api/urls.py index ab6ea0ce..5901c9ae 100644 --- a/web/api/urls.py +++ b/web/api/urls.py @@ -78,10 +78,6 @@ urlpatterns = [ 'queryVulnerabilities/', ListVulnerability.as_view(), name='queryVulnerabilities'), - path( - 'queryEndpoints/', - ListEndpoints.as_view(), - name='queryEndpoints'), path( 'queryTargetsWithoutOrganization/', ListTargetsWithoutOrganization.as_view(), diff --git a/web/api/views.py b/web/api/views.py index 1ad7bd90..ac837f43 100644 --- a/web/api/views.py +++ b/web/api/views.py @@ -820,33 +820,6 @@ class ListVulnerability(APIView): return Response({'vulnerabilities': vulnerability_serializer.data}) -class ListEndpoints(APIView): - def get(self, request, format=None): - req = self.request - scan_id = req.query_params.get('scan_id') - subdomain_name = req.query_params.get('subdomain_name') - pattern = req.query_params.get('pattern') - - if scan_id: - endpoints = EndPoint.objects.filter(scan_history__id=scan_id) - else: - endpoints = EndPoint.objects.all() - - if subdomain_name: - endpoints = endpoints.filter(subdomain__name=subdomain_name) - - if pattern: - endpoints = endpoints.filter(matched_gf_patterns__icontains=pattern) - - if 'only_urls' in req.query_params: - endpoints_serializer = EndpointOnlyURLsSerializer(endpoints, many=True) - - else: - endpoints_serializer = EndpointSerializer(endpoints, many=True) - - return Response({'endpoints': endpoints_serializer.data}) - - class VisualiseData(APIView): def get(self, request, format=None): req = self.request @@ -1540,81 +1513,90 @@ class EndPointViewSet(viewsets.ModelViewSet): def get_queryset(self): req = self.request + scan_id = req.query_params.get('scan_history') - target_id = req.query_params.get('target_id') - url_query = req.query_params.get('query_param') + subdomain_id = req.query_params.get('subdomain_id') gf_tag = req.query_params.get( 'gf_tag') if 'gf_tag' in req.query_params else None if scan_id: - self.queryset = EndPoint.objects.filter( + endpoints_queryset = EndPoint.objects.filter( scan_history__id=scan_id ).distinct() - elif target_id: - self.queryset = EndPoint.objects.filter( + endpoints_queryset = EndPoint.objects.filter( target_domain__id=target_id).distinct() else: - self.queryset = EndPoint.objects.distinct() + endpoints_queryset = EndPoint.objects.distinct() if url_query: - self.queryset = EndPoint.objects.filter( + endpoints_queryset = endpoints_queryset.filter( Q(target_domain__name=url_query)).distinct() if gf_tag: - self.queryset = self.queryset.filter(matched_gf_patterns__icontains=gf_tag) + endpoints_queryset = endpoints_queryset.filter(matched_gf_patterns__icontains=gf_tag) + + if subdomain_id: + endpoints_queryset = endpoints_queryset.filter(subdomain__id=subdomain_id) + + if 'only_urls' in req.query_params: + self.serializer_class = EndpointOnlyURLsSerializer + + self.queryset = endpoints_queryset return self.queryset def filter_queryset(self, qs): qs = self.queryset.filter() + print(qs) search_value = self.request.GET.get(u'search[value]', None) _order_col = self.request.GET.get(u'order[0][column]', None) _order_direction = self.request.GET.get(u'order[0][dir]', None) - order_col = 'content_length' - if _order_col == '1': - order_col = 'http_url' - elif _order_col == '2': - order_col = 'http_status' - elif _order_col == '3': - order_col = 'page_title' - elif _order_col == '4': - order_col = 'matched_gf_patterns' - elif _order_col == '5': - order_col = 'content_type' - elif _order_col == '6': + if search_value or _order_col or _order_direction: order_col = 'content_length' - elif _order_col == '7': - order_col = 'technologies' - elif _order_col == '8': - order_col = 'webserver' - elif _order_col == '9': - order_col = 'response_time' - if _order_direction == 'desc': - order_col = '-{}'.format(order_col) - # if the search query is separated by = means, it is a specific lookup - # divide the search query into two half and lookup - if '=' in search_value or '&' in search_value or '|' in search_value or '>' in search_value or '<' in search_value or '!' in search_value: - if '&' in search_value: - complex_query = search_value.split('&') - for query in complex_query: - if query.strip(): - qs = qs & self.special_lookup(query.strip()) - elif '|' in search_value: - qs = Subdomain.objects.none() - complex_query = search_value.split('|') - for query in complex_query: - if query.strip(): - qs = self.special_lookup(query.strip()) | qs + if _order_col == '1': + order_col = 'http_url' + elif _order_col == '2': + order_col = 'http_status' + elif _order_col == '3': + order_col = 'page_title' + elif _order_col == '4': + order_col = 'matched_gf_patterns' + elif _order_col == '5': + order_col = 'content_type' + elif _order_col == '6': + order_col = 'content_length' + elif _order_col == '7': + order_col = 'technologies' + elif _order_col == '8': + order_col = 'webserver' + elif _order_col == '9': + order_col = 'response_time' + if _order_direction == 'desc': + order_col = '-{}'.format(order_col) + # if the search query is separated by = means, it is a specific lookup + # divide the search query into two half and lookup + if '=' in search_value or '&' in search_value or '|' in search_value or '>' in search_value or '<' in search_value or '!' in search_value: + if '&' in search_value: + complex_query = search_value.split('&') + for query in complex_query: + if query.strip(): + qs = qs & self.special_lookup(query.strip()) + elif '|' in search_value: + qs = Subdomain.objects.none() + complex_query = search_value.split('|') + for query in complex_query: + if query.strip(): + qs = self.special_lookup(query.strip()) | qs + else: + qs = self.special_lookup(search_value) else: - qs = self.special_lookup(search_value) - else: - qs = self.general_lookup(search_value) - return qs.order_by(order_col) - + qs = self.general_lookup(search_value) + return qs.order_by(order_col) + return qs def general_lookup(self, search_value): qs = self.queryset.filter( Q(http_url__icontains=search_value) | diff --git a/web/startScan/static/startScan/js/detail_scan.js b/web/startScan/static/startScan/js/detail_scan.js index 4d6c2e0f..2027a513 100644 --- a/web/startScan/static/startScan/js/detail_scan.js +++ b/web/startScan/static/startScan/js/detail_scan.js @@ -1,1654 +1,1659 @@ function get_ips_from_port(port_number, history_id){ - document.getElementById("detailScanModalLabel").innerHTML='IPs with port ' + port_number + ' OPEN'; - var ip_badge = ''; - fetch('../port/ip/'+port_number+'/'+history_id+'/') - .then(response => response.json()) - .then(data => render_ips(data)); + document.getElementById("detailScanModalLabel").innerHTML='IPs with port ' + port_number + ' OPEN'; + var ip_badge = ''; + fetch('../port/ip/'+port_number+'/'+history_id+'/') + .then(response => response.json()) + .then(data => render_ips(data)); } function get_ports_for_ip(ip, history_id){ - console.log(ip, history_id); - document.getElementById("detailScanModalLabel").innerHTML='Open Ports identified for ' + ip; - var port_badge = ''; - fetch('../ip/ports/'+ip+'/'+history_id+'/') - .then(response => response.json()) - .then(data => render_ports(data)); + console.log(ip, history_id); + document.getElementById("detailScanModalLabel").innerHTML='Open Ports identified for ' + ip; + var port_badge = ''; + fetch('../ip/ports/'+ip+'/'+history_id+'/') + .then(response => response.json()) + .then(data => render_ports(data)); } function render_ports(data) { - var port_badge = '' - ip_address_content = document.getElementById("detailScanModalContent"); - Object.entries(JSON.parse(data)).forEach(([key, value]) => { - badge_color = value[3] ? 'danger' : 'info'; - title = value[3] ? 'Uncommon Port - ' + value[2] : value[2]; - port_badge += `${value[0]}/${value[1]}` - }); - ip_address_content.innerHTML = port_badge; - $('.bs-tooltip').tooltip(); + var port_badge = '' + ip_address_content = document.getElementById("detailScanModalContent"); + Object.entries(JSON.parse(data)).forEach(([key, value]) => { + badge_color = value[3] ? 'danger' : 'info'; + title = value[3] ? 'Uncommon Port - ' + value[2] : value[2]; + port_badge += `${value[0]}/${value[1]}` + }); + ip_address_content.innerHTML = port_badge; + $('.bs-tooltip').tooltip(); } function render_ips(data) { - var ip_badge = '' - content = document.getElementById("detailScanModalContent"); - Object.entries(JSON.parse(data)).forEach(([key, value]) => { - badge_color = value[1] ? 'warning' : 'info'; - title = value[1] ? 'CDN IP Address' : ''; - ip_badge += `${value[0]}` - }); - content.innerHTML = ip_badge; - $('.bs-tooltip').tooltip(); + var ip_badge = '' + content = document.getElementById("detailScanModalContent"); + Object.entries(JSON.parse(data)).forEach(([key, value]) => { + badge_color = value[1] ? 'warning' : 'info'; + title = value[1] ? 'CDN IP Address' : ''; + ip_badge += `${value[0]}` + }); + content.innerHTML = ip_badge; + $('.bs-tooltip').tooltip(); } function get_endpoints(scan_history_id, gf_tags){ - if (scan_history_id) { - var lookup_url = `/api/listEndpoints/?scan_history=${scan_history_id}&format=datatables`; - } - else{ - var lookup_url = `/api/listEndpoints/?&format=datatables`; - } - if (gf_tags){ - lookup_url += `&gf_tag=${gf_tags}` - } - var endpoint_table = $('#endpoint_results').DataTable({ - "destroy": true, - "processing": true, - "oLanguage": { - "oPaginate": { "sPrevious": '', "sNext": '' }, - "sInfo": "Showing page _PAGE_ of _PAGES_", - "sLengthMenu": "Results : _MENU_", - "sProcessing": "Processing... Please wait..." - }, - "dom": "<'row'<'col-lg-12 col-md-12 col-12 mb-2'l>>" + - "<'row'<'col'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>>", - "stripeClasses": [], - "lengthMenu": [100, 200, 300, 500, 1000], - "pageLength": 100, - 'serverSide': true, - "ajax": lookup_url, - "order": [[ 6, "desc" ]], - "columns": [ - {'data': 'id'}, - {'data': 'http_url'}, - {'data': 'http_status'}, - {'data': 'page_title'}, - {'data': 'matched_gf_patterns'}, - {'data': 'content_type'}, - {'data': 'content_length', 'searchable': false}, - {'data': 'technologies'}, - {'data': 'webserver'}, - {'data': 'response_time', 'searchable': false}, - ], - "columnDefs": [ - { - "targets": [ 0 ], - "visible": false, - "searchable": false, - }, - { - "targets": [ 7, 8 ], - "visible": false, - "searchable": true, - }, - { - "render": function ( data, type, row ) { - var tech_badge = ''; - var web_server = ''; - if (row['technologies']){ - tech_badge = `
` + parse_technology(row['technologies'], "primary", outline=true); - } + if (scan_history_id) { + var lookup_url = `/api/listEndpoints/?scan_history=${scan_history_id}&format=datatables`; + } + else{ + var lookup_url = `/api/listEndpoints/?&format=datatables`; + } + if (gf_tags){ + lookup_url += `&gf_tag=${gf_tags}` + } + var endpoint_table = $('#endpoint_results').DataTable({ + "destroy": true, + "processing": true, + "oLanguage": { + "oPaginate": { "sPrevious": '', "sNext": '' }, + "sInfo": "Showing page _PAGE_ of _PAGES_", + "sLengthMenu": "Results : _MENU_", + "sProcessing": "Processing... Please wait..." + }, + "dom": "<'row'<'col-lg-12 col-md-12 col-12 mb-2'l>>" + + "<'row'<'col'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>>", + "stripeClasses": [], + "lengthMenu": [100, 200, 300, 500, 1000], + "pageLength": 100, + 'serverSide': true, + "ajax": lookup_url, + "order": [[ 6, "desc" ]], + "columns": [ + {'data': 'id'}, + {'data': 'http_url'}, + {'data': 'http_status'}, + {'data': 'page_title'}, + {'data': 'matched_gf_patterns'}, + {'data': 'content_type'}, + {'data': 'content_length', 'searchable': false}, + {'data': 'technologies'}, + {'data': 'webserver'}, + {'data': 'response_time', 'searchable': false}, + ], + "columnDefs": [ + { + "targets": [ 0 ], + "visible": false, + "searchable": false, + }, + { + "targets": [ 7, 8 ], + "visible": false, + "searchable": true, + }, + { + "render": function ( data, type, row ) { + var tech_badge = ''; + var web_server = ''; + if (row['technologies']){ + tech_badge = `
` + parse_technology(row['technologies'], "primary", outline=true); + } - if (row['webserver']) { - web_server = `${row['webserver']}`; - } + if (row['webserver']) { + web_server = `${row['webserver']}`; + } - var url = split_into_lines(data, 70); - var action_icons = ` -
- - - - -
- `; - tech_badge += web_server; + var url = split_into_lines(data, 70); + var action_icons = ` +
+ + + + +
+ `; + tech_badge += web_server; - return `
` + "`+ url +"" + tech_badge + "
" + action_icons ; - }, - "targets": 1, - }, - { - "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) { - return get_http_status_badge(data); - } - return ''; + return `
` + "`+ url +"" + tech_badge + "
" + action_icons ; + }, + "targets": 1, + }, + { + "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) { + return get_http_status_badge(data); + } + return ''; - }, - "targets": 2, - }, - { - "render": function ( data, type, row ) { - if (data){ - return parse_comma_values_into_span(data, "info"); - } - return ""; - }, - "targets": 8, - }, - { - "render": function ( data, type, row ) { - if (data){ - return parse_comma_values_into_span(data, "danger", outline=true); - } - return ""; - }, - "targets": 4, - }, - { - "render": function ( data, type, row ) { - if (data){ - return get_response_time_text(data); - } - return ""; - }, - "targets": 9, - }, - ], - drawCallback: function () { - $("body").tooltip({ selector: '[data-toggle=tooltip]' }); - $('.dataTables_wrapper table').removeClass('table-striped'); - var clipboard = new Clipboard('.copyable'); - $('.bs-tooltip').tooltip(); - clipboard.on('success', function(e) { - setTooltip(e.trigger, 'Copied!'); - hideTooltip(e.trigger); - }); - } - }); - $('#endpoint-search-button').click(function () { - endpoint_table.search($('#endpoints-search').val()).draw() ; - }); + }, + "targets": 2, + }, + { + "render": function ( data, type, row ) { + if (data){ + return parse_comma_values_into_span(data, "info"); + } + return ""; + }, + "targets": 8, + }, + { + "render": function ( data, type, row ) { + if (data){ + return parse_comma_values_into_span(data, "danger", outline=true); + } + return ""; + }, + "targets": 4, + }, + { + "render": function ( data, type, row ) { + if (data){ + return get_response_time_text(data); + } + return ""; + }, + "targets": 9, + }, + ], + drawCallback: function () { + $("body").tooltip({ selector: '[data-toggle=tooltip]' }); + $('.dataTables_wrapper table').removeClass('table-striped'); + var clipboard = new Clipboard('.copyable'); + $('.bs-tooltip').tooltip(); + clipboard.on('success', function(e) { + setTooltip(e.trigger, 'Copied!'); + hideTooltip(e.trigger); + }); + } + }); + $('#endpoint-search-button').click(function () { + endpoint_table.search($('#endpoints-search').val()).draw() ; + }); } function get_subdomain_changes(scan_history_id){ - $('#table-subdomain-changes').DataTable({ - "drawCallback": function(settings, start, end, max, total, pre) { - if (this.fnSettings().fnRecordsTotal() > 0) { - $('#subdomain_change_count').empty(); - $("#subdomain_change_count").html(`${this.fnSettings().fnRecordsTotal()}`); - $('.recon-changes-tab-show').removeAttr('style'); - $('#subdomain_changes_alert').html(`${this.fnSettings().fnRecordsTotal()} Subdomain changes.`) - } - else{ - $('#recon_changes_subdomain_div').remove(); - } - $("#subdomain-changes-loader").remove(); - }, - "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, - "stripeClasses": [], - 'serverSide': true, - "ajax": `/api/listSubdomainChanges/?scan_id=${scan_history_id}&format=datatables`, - "order": [[ 3, "desc" ]], - "columns": [ - {'data': 'name'}, - {'data': 'page_title'}, - {'data': 'http_status'}, - {'data': 'content_length'}, - {'data': 'change'}, - {'data': 'http_url'}, - {'data': 'is_cdn'}, - {'data': 'is_interesting'}, - ], - "bInfo": false, - "columnDefs": [ - { - "targets": [ 5, 6, 7 ], - "visible": false, - "searchable": false, - }, - {"className": "text-center", "targets": [ 2, 4 ]}, - { - "render": function ( data, type, row ) { - badges = ''; - cdn_badge = ''; - tech_badge = ''; - interesting_badge = ''; - if (row['is_cdn']) - { - cdn_badge = "CDN" - } - if(row['is_interesting']) - { - interesting_badge = "Interesting" - } - if(cdn_badge || interesting_badge) - { - badges = cdn_badge + interesting_badge + '
'; - } - if (row['http_url']) { - if (row['cname']) { - return badges + ``+data+`
CNAME
❯ ` + row['cname'].replace(',', '
❯ ')+`
`; - } - return badges + ``+data+``; - } - return badges + ``+data+``; - }, - "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, - }, - { - "render": function ( data, type, row ) { - if (data){ - return `${data}`; - } - return ""; - }, - "targets": 3, - }, - { - "render": function ( data, type, row ) { - if (data == 'added'){ - return ` Added`; - } - else{ - return ` Removed`; - } - }, - "targets": 4, - }, - ], - }); + $('#table-subdomain-changes').DataTable({ + "drawCallback": function(settings, start, end, max, total, pre) { + if (this.fnSettings().fnRecordsTotal() > 0) { + $('#subdomain_change_count').empty(); + $("#subdomain_change_count").html(`${this.fnSettings().fnRecordsTotal()}`); + $('.recon-changes-tab-show').removeAttr('style'); + $('#subdomain_changes_alert').html(`${this.fnSettings().fnRecordsTotal()} Subdomain changes.`) + } + else{ + $('#recon_changes_subdomain_div').remove(); + } + $("#subdomain-changes-loader").remove(); + }, + "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, + "stripeClasses": [], + 'serverSide': true, + "ajax": `/api/listSubdomainChanges/?scan_id=${scan_history_id}&format=datatables`, + "order": [[ 3, "desc" ]], + "columns": [ + {'data': 'name'}, + {'data': 'page_title'}, + {'data': 'http_status'}, + {'data': 'content_length'}, + {'data': 'change'}, + {'data': 'http_url'}, + {'data': 'is_cdn'}, + {'data': 'is_interesting'}, + ], + "bInfo": false, + "columnDefs": [ + { + "targets": [ 5, 6, 7 ], + "visible": false, + "searchable": false, + }, + {"className": "text-center", "targets": [ 2, 4 ]}, + { + "render": function ( data, type, row ) { + badges = ''; + cdn_badge = ''; + tech_badge = ''; + interesting_badge = ''; + if (row['is_cdn']) + { + cdn_badge = "CDN" + } + if(row['is_interesting']) + { + interesting_badge = "Interesting" + } + if(cdn_badge || interesting_badge) + { + badges = cdn_badge + interesting_badge + '
'; + } + if (row['http_url']) { + if (row['cname']) { + return badges + ``+data+`
CNAME
❯ ` + row['cname'].replace(',', '
❯ ')+`
`; + } + return badges + ``+data+``; + } + return badges + ``+data+``; + }, + "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, + }, + { + "render": function ( data, type, row ) { + if (data){ + return `${data}`; + } + return ""; + }, + "targets": 3, + }, + { + "render": function ( data, type, row ) { + if (data == 'added'){ + return ` Added`; + } + else{ + return ` Removed`; + } + }, + "targets": 4, + }, + ], + }); } function get_endpoint_changes(scan_history_id){ - $('#table-endpoint-changes').DataTable({ - "drawCallback": function(settings, start, end, max, total, pre) { - if (this.fnSettings().fnRecordsTotal() > 0) { - $("#endpoint_change_count").empty(); - $("#endpoint_change_count").html(`${this.fnSettings().fnRecordsTotal()}`); - $('.recon-changes-tab-show').removeAttr('style'); - } - else{ - $("#endpoint-changes-div").remove(); - } - $("#endpoint-changes-loader").remove(); - }, - "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, - "stripeClasses": [], - 'serverSide': true, - "ajax": `/api/listEndPointChanges/?scan_id=${scan_history_id}&format=datatables`, - "order": [[ 3, "desc" ]], - "columns": [ - {'data': 'http_url'}, - {'data': 'page_title'}, - {'data': 'http_status'}, - {'data': 'content_length'}, - {'data': 'change'}, - ], - "bInfo": false, - "columnDefs": [ - {"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, - }, - { - "render": function ( data, type, row ) { - if (data == 'added'){ - return ` Added`; - } - else{ - return ` Removed`; - } - }, - "targets": 4, - }, - ], - }); + $('#table-endpoint-changes').DataTable({ + "drawCallback": function(settings, start, end, max, total, pre) { + if (this.fnSettings().fnRecordsTotal() > 0) { + $("#endpoint_change_count").empty(); + $("#endpoint_change_count").html(`${this.fnSettings().fnRecordsTotal()}`); + $('.recon-changes-tab-show').removeAttr('style'); + } + else{ + $("#endpoint-changes-div").remove(); + } + $("#endpoint-changes-loader").remove(); + }, + "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, + "stripeClasses": [], + 'serverSide': true, + "ajax": `/api/listEndPointChanges/?scan_id=${scan_history_id}&format=datatables`, + "order": [[ 3, "desc" ]], + "columns": [ + {'data': 'http_url'}, + {'data': 'page_title'}, + {'data': 'http_status'}, + {'data': 'content_length'}, + {'data': 'change'}, + ], + "bInfo": false, + "columnDefs": [ + {"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, + }, + { + "render": function ( data, type, row ) { + if (data == 'added'){ + return ` Added`; + } + else{ + return ` Removed`; + } + }, + "targets": 4, + }, + ], + }); } function get_ips(scan_id){ - $.getJSON(`/api/queryIps/?scan_id=${scan_id}&format=json`, function(data) { - $('#ip-address-count').empty(); - for (var val in data['ips']){ - ip = data['ips'][val] - badge_color = ip['is_cdn'] ? 'warning' : 'primary'; - $("#ip-address").append(`${ip['address']}`); - // $("#ip-address").append(`${ip['address']}`); - } - $('#ip-address-count').html(`${data['ips'].length}`); - $("body").tooltip({ selector: '[data-toggle=tooltip]' }); - }); + $.getJSON(`/api/queryIps/?scan_id=${scan_id}&format=json`, function(data) { + $('#ip-address-count').empty(); + for (var val in data['ips']){ + ip = data['ips'][val] + badge_color = ip['is_cdn'] ? 'warning' : 'primary'; + $("#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_ip_details(ip_address, scan_id){ - if (scan_id) { - port_url = `/api/queryPorts/?scan_id=${scan_id}&ip_address=${ip_address}&format=json` - subdomain_url = `/api/querySubdomains/?scan_id=${scan_id}&ip_address=${ip_address}&format=json` - } - else { - port_url = `/api/queryPorts/?&ip_address=${ip_address}&format=json` - subdomain_url = `/api/querySubdomains/?&ip_address=${ip_address}&format=json` - } - var interesting_badge = `Interesting`; + if (scan_id) { + port_url = `/api/queryPorts/?scan_id=${scan_id}&ip_address=${ip_address}&format=json` + subdomain_url = `/api/querySubdomains/?scan_id=${scan_id}&ip_address=${ip_address}&format=json` + } + else { + port_url = `/api/queryPorts/?&ip_address=${ip_address}&format=json` + subdomain_url = `/api/querySubdomains/?&ip_address=${ip_address}&format=json` + } + var interesting_badge = `Interesting`; - var port_loader = ``; - var subdomain_loader = ``; + var port_loader = ``; + var subdomain_loader = ``; - // add tab modal title - $('#modal_title').html('Details for IP: ' + ip_address + ''); + // add tab modal title + $('#modal_title').html('Details for IP: ' + ip_address + ''); - $('#modal-content').empty(); - $('#modal-tabs').empty(); + $('#modal-content').empty(); + $('#modal-tabs').empty(); - $('#modal-content').append(``); + $('#modal-content').append(``); - $('#modal_tab_nav').append(``); - $('#modal_tab_nav').append(``) + $('#modal_tab_nav').append(``); + $('#modal_tab_nav').append(``) - // add content area - $('#modal_tab_content').empty(); - $('#modal_tab_content').append(``); + // add content area + $('#modal_tab_content').empty(); + $('#modal_tab_content').append(``); - $('#modal-open-ports').append(``); - $('#modal-text-open-port').append(``); + $('#modal-open-ports').append(``); + $('#modal-text-open-port').append(``); - $('#modal_content_port').append(``); - $('#modal_content_subdomain').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(`

  • ${port_obj['description']} (${port_obj['number']}/${port_obj['service_name']})
  • `) - } - $("#port-modal-loader").remove(); - }); + $.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(`

  • ${port_obj['description']} (${port_obj['number']}/${port_obj['service_name']})
  • `) + } + $("#port-modal-loader").remove(); + }); - $('#modal_dialog').modal('show'); + $('#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(`

  • ${subdomain_obj['name']}
  • `) - } - else { - $("#modal_content_subdomain").append(`
  • ${subdomain_obj['name']}
  • `); - } + // 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(`

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

  • ${ip_obj['address']}
  • `) - } - $('#modal_ip_ul').append(`*IP Address highlighted are CDN IP Address`); - $("#ip-modal-loader").remove(); - }); + $.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(`

  • ${ip_obj['address']}
  • `) + } + $('#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(`

  • ${subdomain_obj['name']}
  • `) - } - else { - $("#modal_subdomain_ul").append(`
  • ${subdomain_obj['name']}
  • `); - } + // 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(`

  • ${subdomain_obj['name']}
  • `) + } + else { + $("#modal_subdomain_ul").append(`
  • ${subdomain_obj['name']}
  • `); + } - if (subdomain_obj['http_status']) { - $("#"+li_id).append(get_http_badge(subdomain_obj['http_status'])); - $('.bs-tooltip').tooltip(); - } + 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) - } + if (subdomain_obj['is_interesting']) { + $("#"+li_id).append(interesting_badge) + } - } - $("#modal_subdomain_ul").append(`*Subdomains highlighted are 40X HTTP Status`); - $("#subdomain-modal-loader").remove(); - }); + } + $("#modal_subdomain_ul").append(`*Subdomains highlighted are 40X HTTP Status`); + $("#subdomain-modal-loader").remove(); + }); } function get_tech_details(tech, scan_id){ - if (scan_id) { - url = `/api/querySubdomains/?scan_id=${scan_id}&tech=${tech}&format=json` - } - else { - url = `/api/querySubdomains/?&tech=${tech}&format=json` - } - var interesting_badge = `Interesting`; - // render tab modal - $('.modal-title').html('Details for Technology: ' + tech + ''); - $('#modal_dialog').modal('show'); + if (scan_id) { + url = `/api/querySubdomains/?scan_id=${scan_id}&tech=${tech}&format=json` + } + else { + url = `/api/querySubdomains/?&tech=${tech}&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(`
  • ${subdomain_obj['name']}
  • `) - } - else { - $("#modal-content").append(`
  • ${subdomain_obj['name']}
  • `); - } + $('.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(`
  • ${subdomain_obj['name']}
  • `) + } + else { + $("#modal-content").append(`
  • ${subdomain_obj['name']}
  • `); + } - if (subdomain_obj['http_status']) { - $("#"+li_id).append(get_http_badge(subdomain_obj['http_status'])); - $('.bs-tooltip').tooltip(); - } + 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) - } + 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(); - }); + } + $("#modal-content").append(`*Subdomains highlighted are 40X HTTP Status`); + $("#subdomain-modal-loader").remove(); + }).fail(function(){ + $('#modal-loader').empty(); + }); } function get_technologies(scan_id){ - $.getJSON(`/api/queryTechnologies/?scan_id=${scan_id}&format=json`, function(data) { - $('#technologies-count').empty(); - for (var val in data['technologies']){ - tech = data['technologies'][val] - $("#technologies").append(`${tech['name']}`); - } - $('#technologies-count').html(`${data['technologies'].length}`); - $("body").tooltip({ selector: '[data-toggle=tooltip]' }); - }); + $.getJSON(`/api/queryTechnologies/?scan_id=${scan_id}&format=json`, function(data) { + $('#technologies-count').empty(); + for (var val in data['technologies']){ + tech = data['technologies'][val] + $("#technologies").append(`${tech['name']}`); + } + $('#technologies-count').html(`${data['technologies'].length}`); + $("body").tooltip({ selector: '[data-toggle=tooltip]' }); + }); } function get_osint_users(scan_id){ - $.getJSON(`/api/queryOsintUsers/?scan_id=${scan_id}&format=json`, function(data) { - $('#osint-users-count').empty(); - for (var val in data['users']){ - user = data['users'][val] - $("#osint-users").append(`${user['author']}`); - } - $('#osint-users-count').html(`${data['users'].length}`); - $("body").tooltip({ selector: '[data-toggle=tooltip]' }); - }).fail(function(){ - $('#osint-users-count').empty(); - $("#osint-users").append(`

    No Users discovered.

    `); - }); + $.getJSON(`/api/queryOsintUsers/?scan_id=${scan_id}&format=json`, function(data) { + $('#osint-users-count').empty(); + for (var val in data['users']){ + user = data['users'][val] + $("#osint-users").append(`${user['author']}`); + } + $('#osint-users-count').html(`${data['users'].length}`); + $("body").tooltip({ selector: '[data-toggle=tooltip]' }); + }).fail(function(){ + $('#osint-users-count').empty(); + $("#osint-users").append(`

    No Users discovered.

    `); + }); } function get_ports(scan_id){ - url = `/api/queryPorts/?scan_id=${scan_id}&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'; - $("#ports").append(`${port['number']}/${port['service_name']}`); - } - $('#ports-count').html(`${data['ports'].length}`); - $("body").tooltip({ selector: '[data-toggle=tooltip]' }); - }); + url = `/api/queryPorts/?scan_id=${scan_id}&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'; + $("#ports").append(`${port['number']}/${port['service_name']}`); + } + $('#ports-count').html(`${data['ports'].length}`); + $("body").tooltip({ selector: '[data-toggle=tooltip]' }); + }); } function get_screenshot(scan_id){ - var port_array = []; - var service_array = []; - var tech_array = []; - var ip_array = []; - var gridzyElement = document.querySelector('.gridzy'); - gridzyElement.classList.add('gridzySkinBlank'); - gridzyElement.setAttribute('data-gridzy-layout', 'waterfall'); - gridzyElement.setAttribute('data-gridzy-spaceBetween', 10); - gridzyElement.setAttribute('data-gridzy-desiredwidth', 350); - gridzyElement.setAttribute('data-gridzySearchField', "#screenshot-search"); - var interesting_badge = `Interesting`; - $.getJSON(`/api/listSubdomains/?scan_id=${scan_id}&no_page&only_screenshot`, function(data) { - $("#screenshot-loader").remove(); - $("#filter-screenshot").show(); - for (var subdomain in data) { - var figure = document.createElement('figure'); - var link = document.createElement('a'); - // return ``; - // currently lookup is supported only for http_status, page title & subdomain name, - interesting_field = data[subdomain]['is_interesting'] ? 'interesting' : ''; - var ips = data[subdomain]['ip_addresses']; - var ip_search_values = ''; - for(var ip in ips){ - ip_address = ips[ip]['address']; - ip_search_values += ip_address + ' '; - } - search_field = `${data[subdomain]['page_title']} ${data[subdomain]['name']} ${data[subdomain]['http_status']} ${ip_search_values} ${interesting_field}`; - link.setAttribute('data-lightbox', 'screenshot-gallery') - link.setAttribute('href', '/media/' + data[subdomain]['screenshot_path']) - link.setAttribute('data-title', `

    `+data[subdomain]['name']+`

    `); - link.classList.add('img-fluid'); - link.classList.add('rounded'); - link.classList.add('screenshot-gallery'); - link.classList.add('mb-4'); - link.classList.add('mt-4'); - link.setAttribute('data-gridzySearchText', search_field); - var newImage = document.createElement('img'); - newImage.setAttribute('data-gridzylazysrc', '/media/' + data[subdomain]['screenshot_path']); - // newImage.setAttribute('data-gridzylazysrc', 'https://placeimg.com/1440/900/any?' + subdomain); - newImage.setAttribute('height', 500); - newImage.setAttribute('width', 500); - newImage.setAttribute('class', 'gridzyImage'); - var figcaption = document.createElement('figcaption'); - figcaption.setAttribute('class', 'gridzyCaption'); - http_status_badge = 'danger'; - if (data[subdomain]['http_status'] >=200 && data[subdomain]['http_status'] < 300){ - http_status_badge = 'success'; - } - else if (data[subdomain]['http_status'] >=300 && data[subdomain]['http_status'] < 400){ - http_status_badge = 'warning'; - } - page_title = data[subdomain]['page_title'] ? data[subdomain]['page_title'] + '
    ': '' ; - subdomain_link = data[subdomain]['http_url'] ? `${data[subdomain]['name']}` : `${data[subdomain]['name']}` - http_status = data[subdomain]['http_status'] ? `${data[subdomain]['http_status']}` : ''; - figcaption.innerHTML = data[subdomain]['is_interesting'] ? page_title + subdomain_link + interesting_badge + http_status : page_title + subdomain_link + http_status; - figure.appendChild(figcaption); - link.appendChild(newImage); - link.appendChild(figure); - gridzyElement.appendChild(link); + var port_array = []; + var service_array = []; + var tech_array = []; + var ip_array = []; + var gridzyElement = document.querySelector('.gridzy'); + gridzyElement.classList.add('gridzySkinBlank'); + gridzyElement.setAttribute('data-gridzy-layout', 'waterfall'); + gridzyElement.setAttribute('data-gridzy-spaceBetween', 10); + gridzyElement.setAttribute('data-gridzy-desiredwidth', 350); + gridzyElement.setAttribute('data-gridzySearchField', "#screenshot-search"); + var interesting_badge = `Interesting`; + $.getJSON(`/api/listSubdomains/?scan_id=${scan_id}&no_page&only_screenshot`, function(data) { + $("#screenshot-loader").remove(); + $("#filter-screenshot").show(); + for (var subdomain in data) { + var figure = document.createElement('figure'); + var link = document.createElement('a'); + // return ``; + // currently lookup is supported only for http_status, page title & subdomain name, + interesting_field = data[subdomain]['is_interesting'] ? 'interesting' : ''; + var ips = data[subdomain]['ip_addresses']; + var ip_search_values = ''; + for(var ip in ips){ + ip_address = ips[ip]['address']; + ip_search_values += ip_address + ' '; + } + search_field = `${data[subdomain]['page_title']} ${data[subdomain]['name']} ${data[subdomain]['http_status']} ${ip_search_values} ${interesting_field}`; + link.setAttribute('data-lightbox', 'screenshot-gallery') + link.setAttribute('href', '/media/' + data[subdomain]['screenshot_path']) + link.setAttribute('data-title', `

    `+data[subdomain]['name']+`

    `); + link.classList.add('img-fluid'); + link.classList.add('rounded'); + link.classList.add('screenshot-gallery'); + link.classList.add('mb-4'); + link.classList.add('mt-4'); + link.setAttribute('data-gridzySearchText', search_field); + var newImage = document.createElement('img'); + newImage.setAttribute('data-gridzylazysrc', '/media/' + data[subdomain]['screenshot_path']); + // newImage.setAttribute('data-gridzylazysrc', 'https://placeimg.com/1440/900/any?' + subdomain); + newImage.setAttribute('height', 500); + newImage.setAttribute('width', 500); + newImage.setAttribute('class', 'gridzyImage'); + var figcaption = document.createElement('figcaption'); + figcaption.setAttribute('class', 'gridzyCaption'); + http_status_badge = 'danger'; + if (data[subdomain]['http_status'] >=200 && data[subdomain]['http_status'] < 300){ + http_status_badge = 'success'; + } + else if (data[subdomain]['http_status'] >=300 && data[subdomain]['http_status'] < 400){ + http_status_badge = 'warning'; + } + page_title = data[subdomain]['page_title'] ? data[subdomain]['page_title'] + '
    ': '' ; + subdomain_link = data[subdomain]['http_url'] ? `${data[subdomain]['name']}` : `${data[subdomain]['name']}` + http_status = data[subdomain]['http_status'] ? `${data[subdomain]['http_status']}` : ''; + figcaption.innerHTML = data[subdomain]['is_interesting'] ? page_title + subdomain_link + interesting_badge + http_status : page_title + subdomain_link + http_status; + figure.appendChild(figcaption); + link.appendChild(newImage); + link.appendChild(figure); + gridzyElement.appendChild(link); - // add http status to filter values - filter_values = 'http_' + data[subdomain]['http_status'] + ' '; + // add http status to filter values + filter_values = 'http_' + data[subdomain]['http_status'] + ' '; - // dynamic filtering menu - http_status = data[subdomain]['http_status']; - http_status_select = document.getElementById('http_select_filter'); - if(!$('#http_select_filter').find("option:contains('" + http_status + "')").length){ - var option = document.createElement('option'); - option.value = ".http_" + http_status; - option.innerHTML = http_status; - http_status_select.appendChild(option); - } + // dynamic filtering menu + http_status = data[subdomain]['http_status']; + http_status_select = document.getElementById('http_select_filter'); + if(!$('#http_select_filter').find("option:contains('" + http_status + "')").length){ + var option = document.createElement('option'); + option.value = ".http_" + http_status; + option.innerHTML = http_status; + http_status_select.appendChild(option); + } - // ip, port and services filtering - ips = data[subdomain]['ip_addresses'] - for(var ip in ips){ - ip_address = ips[ip]['address']; - filter_values += 'ip_' + ip_address.replace(/\./g,"_") + ' '; - if (ip_array.indexOf(ip_address) === -1){ - ip_array.push(ip_address); - } + // ip, port and services filtering + ips = data[subdomain]['ip_addresses'] + for(var ip in ips){ + ip_address = ips[ip]['address']; + filter_values += 'ip_' + ip_address.replace(/\./g,"_") + ' '; + if (ip_array.indexOf(ip_address) === -1){ + ip_array.push(ip_address); + } - ports = ips[ip]['ports']; - for(var port in ports){ - port_number = ips[ip]['ports'][port]['number']; - service_name = ips[ip]['ports'][port]['service_name']; + ports = ips[ip]['ports']; + for(var port in ports){ + port_number = ips[ip]['ports'][port]['number']; + service_name = ips[ip]['ports'][port]['service_name']; - filter_values += 'port_' + port_number + ' '; - if (port_array.indexOf(port_number) === -1){ - port_array.push(port_number); - } + filter_values += 'port_' + port_number + ' '; + if (port_array.indexOf(port_number) === -1){ + port_array.push(port_number); + } - filter_values += 'service_' + service_name + ' '; - if (service_array.indexOf(service_name) === -1){ - service_array.push(service_name); - } - } - } + filter_values += 'service_' + service_name + ' '; + if (service_array.indexOf(service_name) === -1){ + service_array.push(service_name); + } + } + } - // technology stack filtering - technology = data[subdomain]['technologies']; - for(var tech in technology){ - tech_name = technology[tech]['name'] - filter_values += 'tech_' + tech_name.replace(/ /g,"_").toLowerCase() + ' '; - if (tech_array.indexOf(tech_name) === -1){ - tech_array.push(tech_name); - } + // technology stack filtering + technology = data[subdomain]['technologies']; + for(var tech in technology){ + tech_name = technology[tech]['name'] + filter_values += 'tech_' + tech_name.replace(/ /g,"_").toLowerCase() + ' '; + if (tech_array.indexOf(tech_name) === -1){ + tech_array.push(tech_name); + } - } + } - link.setAttribute('class', filter_values); - } + link.setAttribute('class', filter_values); + } - // add port and service and tech to options - port_select = document.getElementById('ports_select_filter'); - if (port_select) { - port_array.sort((a, b) => a - b); - for(var port in port_array){ - if(!$('#ports_select_filter').find("option:contains('" + port_array[port] + "')").length){ - var option = document.createElement('option'); - option.value = ".port_" + port_array[port]; - option.innerHTML = port_array[port]; - port_select.appendChild(option); - } - } - } + // add port and service and tech to options + port_select = document.getElementById('ports_select_filter'); + if (port_select) { + port_array.sort((a, b) => a - b); + for(var port in port_array){ + if(!$('#ports_select_filter').find("option:contains('" + port_array[port] + "')").length){ + var option = document.createElement('option'); + option.value = ".port_" + port_array[port]; + option.innerHTML = port_array[port]; + port_select.appendChild(option); + } + } + } - // add ip to select - ip_select = document.getElementById('ips_select_filter'); - for(var ip in ip_array){ - if(!$('#ips_select_filter').find("option:contains('" + ip_array[ip] + "')").length){ - var option = document.createElement('option'); - option.value = ".ip_" + ip_array[ip]; - option.innerHTML = ip_array[ip]; - ip_select.appendChild(option); - } - } + // add ip to select + ip_select = document.getElementById('ips_select_filter'); + for(var ip in ip_array){ + if(!$('#ips_select_filter').find("option:contains('" + ip_array[ip] + "')").length){ + var option = document.createElement('option'); + option.value = ".ip_" + ip_array[ip]; + option.innerHTML = ip_array[ip]; + ip_select.appendChild(option); + } + } - service_array.sort(); - service_select = document.getElementById('services_select_filter'); - if (service_select) { - for(var service in service_array){ - if(!$('#services_select_filter').find("option:contains('" + service_array[service] + "')").length){ - var option = document.createElement('option'); - option.value = ".service_" + service_array[service]; - option.innerHTML = service_array[service]; - service_select.appendChild(option); - } - } - } + service_array.sort(); + service_select = document.getElementById('services_select_filter'); + if (service_select) { + for(var service in service_array){ + if(!$('#services_select_filter').find("option:contains('" + service_array[service] + "')").length){ + var option = document.createElement('option'); + option.value = ".service_" + service_array[service]; + option.innerHTML = service_array[service]; + service_select.appendChild(option); + } + } + } - tech_select = document.getElementById('tech_select_filter'); - for(var tech in tech_array){ - if(!$('#tech_select_filter').find("option:contains('" + tech_array[tech] + "')").length){ - var option = document.createElement('option'); - option.value = ".tech_" + tech_array[tech].replace(/ /g,"_").toLowerCase(); - option.innerHTML = tech_array[tech]; - tech_select.appendChild(option); - } - } + tech_select = document.getElementById('tech_select_filter'); + for(var tech in tech_array){ + if(!$('#tech_select_filter').find("option:contains('" + tech_array[tech] + "')").length){ + var option = document.createElement('option'); + option.value = ".tech_" + tech_array[tech].replace(/ /g,"_").toLowerCase(); + option.innerHTML = tech_array[tech]; + tech_select.appendChild(option); + } + } - $(".tagging").select2({ - tags: true - }); - // search functionality - var gridzyElements = document.querySelectorAll('.gridzySkinBlank[data-gridzySearchField]'), - pos = gridzyElements.length; + $(".tagging").select2({ + tags: true + }); + // search functionality + var gridzyElements = document.querySelectorAll('.gridzySkinBlank[data-gridzySearchField]'), + pos = gridzyElements.length; - while (pos--) { - (function(gridzyElement) { - var searchField = document.querySelector(gridzyElement.getAttribute('data-gridzySearchField')); - var gridzyInstance = gridzyElement.gridzy; - var gridzyItems = gridzyElement.children; + while (pos--) { + (function(gridzyElement) { + var searchField = document.querySelector(gridzyElement.getAttribute('data-gridzySearchField')); + var gridzyInstance = gridzyElement.gridzy; + var gridzyItems = gridzyElement.children; - if (searchField) { - searchField.addEventListener('input', search); - } + if (searchField) { + searchField.addEventListener('input', search); + } - function search() { - var pos = gridzyItems.length, - child, - itemContent, - found = false, - searchValue = searchField.value.toLowerCase(); + function search() { + var pos = gridzyItems.length, + child, + itemContent, + found = false, + searchValue = searchField.value.toLowerCase(); - if (searchValue) { - while (pos--) { - child = gridzyItems[pos]; - itemContent = (child.getAttribute('data-gridzySearchText') || child.innerText).toLowerCase(); - found = -1 < itemContent.search(searchValue); - child.classList[found ? 'add' : 'remove']('searchResult'); - } - if (gridzyInstance.getOption('filter') !== '.searchResult') { - gridzyInstance.setOptions({filter:'.searchResult'}); - } - } else { - while (pos--) { - gridzyItems[pos].classList.remove('searchResult'); - } - if (gridzyInstance.getOption('filter') !== Gridzy.getDefaultOption('filter')) { - gridzyInstance.setOptions({filter:null}); - } - } - } - })(gridzyElements[pos]); - } + if (searchValue) { + while (pos--) { + child = gridzyItems[pos]; + itemContent = (child.getAttribute('data-gridzySearchText') || child.innerText).toLowerCase(); + found = -1 < itemContent.search(searchValue); + child.classList[found ? 'add' : 'remove']('searchResult'); + } + if (gridzyInstance.getOption('filter') !== '.searchResult') { + gridzyInstance.setOptions({filter:'.searchResult'}); + } + } else { + while (pos--) { + gridzyItems[pos].classList.remove('searchResult'); + } + if (gridzyInstance.getOption('filter') !== Gridzy.getDefaultOption('filter')) { + gridzyInstance.setOptions({filter:null}); + } + } + } + })(gridzyElements[pos]); + } - //filter functionality - var gridzyInstance = document.querySelector('.gridzySkinBlank').gridzy; - $('#http_select_filter, #ips_select_filter, #services_select_filter, #ports_select_filter, #tech_select_filter').on('change', function() { - values = $(this).val(); - console.log(values); - if(values.length && this.id == 'ips_select_filter'){ - var replaces_str = values.map(function(values){return values.replace(/(?<=\..*)\./g, '_');}); - console.log(replaces_str); - gridzyInstance.setOptions({ - filter: replaces_str - }); - } - else if(values.length && this.id != 'ips_select_filter'){ - gridzyInstance.setOptions({ - filter: values - }); - } - else{ - gridzyInstance.setOptions({ - filter: '*' - }); - } - }); - }); + //filter functionality + var gridzyInstance = document.querySelector('.gridzySkinBlank').gridzy; + $('#http_select_filter, #ips_select_filter, #services_select_filter, #ports_select_filter, #tech_select_filter').on('change', function() { + values = $(this).val(); + console.log(values); + if(values.length && this.id == 'ips_select_filter'){ + var replaces_str = values.map(function(values){return values.replace(/(?<=\..*)\./g, '_');}); + console.log(replaces_str); + gridzyInstance.setOptions({ + filter: replaces_str + }); + } + else if(values.length && this.id != 'ips_select_filter'){ + gridzyInstance.setOptions({ + filter: values + }); + } + else{ + gridzyInstance.setOptions({ + filter: '*' + }); + } + }); + }); } function get_metadata(scan_id){ - // populate categories - $.getJSON(`/api/queryDorkTypes/?scan_id=${scan_id}&format=json`, function(data) { - for (var val in data['dorks']){ - dork = data['dorks'][val] - $("#osint-categories-badge").append(`${dork['type']}`); - } - $("body").tooltip({ selector: '[data-toggle=tooltip]' }); - }); + // populate categories + $.getJSON(`/api/queryDorkTypes/?scan_id=${scan_id}&format=json`, function(data) { + for (var val in data['dorks']){ + dork = data['dorks'][val] + $("#osint-categories-badge").append(`${dork['type']}`); + } + $("body").tooltip({ selector: '[data-toggle=tooltip]' }); + }); - // populate detail table - $.getJSON(`/api/queryMetadata/?scan_id=${scan_id}&format=json`, function(data) { - $('#metadata-count').empty(); - $('#metadata-table-body').empty(); - for (var val in data['metadata']){ - doc = data['metadata'][val]; - rand_id = get_randid(); - $('#metadata-table-body').append(``); - if (doc['doc_name']) { - file_name = `${truncate(doc['doc_name'], 30)}`; - } - else{ - file_name = '' - } - subdomain = `${doc['subdomain']['name']}`; - $(`#${rand_id}`).append(`${file_name}
    ${subdomain}`); - if (doc['author']){ - $(`#${rand_id}`).append(`${doc['author']}`); - } - else{ - $(`#${rand_id}`).append('') - } - if (doc['producer'] || doc['creator'] || doc['os']) { - metadata = '' - metadata += doc['producer'] ? 'Software: ' + doc['producer'] : '' - metadata += doc['creator'] ? '/' + doc['creator'] : '' - metadata += doc['os'] ? `
    OS: ` + doc['os'] + '': '' - $(`#${rand_id}`).append(`${metadata}`); - } - else{ - $(`#${rand_id}`).append('') - } - } - $('#metadata-count').html(`${data['metadata'].length}`); - $('.bs-tooltip').tooltip(); - }); + // populate detail table + $.getJSON(`/api/queryMetadata/?scan_id=${scan_id}&format=json`, function(data) { + $('#metadata-count').empty(); + $('#metadata-table-body').empty(); + for (var val in data['metadata']){ + doc = data['metadata'][val]; + rand_id = get_randid(); + $('#metadata-table-body').append(``); + if (doc['doc_name']) { + file_name = `${truncate(doc['doc_name'], 30)}`; + } + else{ + file_name = '' + } + subdomain = `${doc['subdomain']['name']}`; + $(`#${rand_id}`).append(`${file_name}
    ${subdomain}`); + if (doc['author']){ + $(`#${rand_id}`).append(`${doc['author']}`); + } + else{ + $(`#${rand_id}`).append('') + } + if (doc['producer'] || doc['creator'] || doc['os']) { + metadata = '' + metadata += doc['producer'] ? 'Software: ' + doc['producer'] : '' + metadata += doc['creator'] ? '/' + doc['creator'] : '' + metadata += doc['os'] ? `
    OS: ` + doc['os'] + '': '' + $(`#${rand_id}`).append(`${metadata}`); + } + else{ + $(`#${rand_id}`).append('') + } + } + $('#metadata-count').html(`${data['metadata'].length}`); + $('.bs-tooltip').tooltip(); + }); } function get_emails(scan_id){ - var exposed_count = 0; - $.getJSON(`/api/queryEmails/?scan_id=${scan_id}&format=json`, function(data) { - $('#emails-count').empty(); - $('#email-table-body').empty(); - for (var val in data['emails']){ - email = data['emails'][val]; - rand_id = get_randid(); - $('#email-table-body').append(``); - $(`#${rand_id}`).append(`${email['address']}`); - if (email['password']) { - $(`#${rand_id}`).append(`${email['password']}`); - exposed_count++; - } - } - $('#emails-count').html(`${data['emails'].length}`); - if (exposed_count > 0 ) { - $('#exposed_summary').html(` ${exposed_count} Exposed Credentials`); - } - }); + var exposed_count = 0; + $.getJSON(`/api/queryEmails/?scan_id=${scan_id}&format=json`, function(data) { + $('#emails-count').empty(); + $('#email-table-body').empty(); + for (var val in data['emails']){ + email = data['emails'][val]; + rand_id = get_randid(); + $('#email-table-body').append(``); + $(`#${rand_id}`).append(`${email['address']}`); + if (email['password']) { + $(`#${rand_id}`).append(`${email['password']}`); + exposed_count++; + } + } + $('#emails-count').html(`${data['emails'].length}`); + if (exposed_count > 0 ) { + $('#exposed_summary').html(` ${exposed_count} Exposed Credentials`); + } + }); } function get_employees(scan_id){ - $.getJSON(`/api/queryEmployees/?scan_id=${scan_id}&format=json`, function(data) { - $('#employees-count').empty(); - $('#employees-table-body').empty(); - for (var val in data['employees']){ - emp = data['employees'][val]; - rand_id = get_randid(); - $('#employees-table-body').append(``); - $(`#${rand_id}`).append(`${emp['name']}`); - $(`#${rand_id}`).append(`${emp['designation']}`); - } - $('#employees-count').html(`${data['employees'].length}`); - }); + $.getJSON(`/api/queryEmployees/?scan_id=${scan_id}&format=json`, function(data) { + $('#employees-count').empty(); + $('#employees-table-body').empty(); + for (var val in data['employees']){ + emp = data['employees'][val]; + rand_id = get_randid(); + $('#employees-table-body').append(``); + $(`#${rand_id}`).append(`${emp['name']}`); + $(`#${rand_id}`).append(`${emp['designation']}`); + } + $('#employees-count').html(`${data['employees'].length}`); + }); } function get_dorks(scan_id){ - $.getJSON(`/api/queryDorks/?scan_id=${scan_id}&format=json`, function(data) { - $('#dorks-count').empty(); - $('#dorks-table-body').empty(); - for (var val in data['dorks']){ - dork = data['dorks'][val]; - rand_id = get_randid(); - $('#dorks-table-body').append(``); - $(`#${rand_id}`).append(`${dork['type']}`); - $(`#${rand_id}`).append(`${truncate(dork['description'], 120)}`); - $(`#${rand_id}`).append(`${truncate(dork['url'], 60)}`); - } - $('#dorks-count').html(`${data['dorks'].length}`); - }); + $.getJSON(`/api/queryDorks/?scan_id=${scan_id}&format=json`, function(data) { + $('#dorks-count').empty(); + $('#dorks-table-body').empty(); + for (var val in data['dorks']){ + dork = data['dorks'][val]; + rand_id = get_randid(); + $('#dorks-table-body').append(``); + $(`#${rand_id}`).append(`${dork['type']}`); + $(`#${rand_id}`).append(`${truncate(dork['description'], 120)}`); + $(`#${rand_id}`).append(`${truncate(dork['url'], 60)}`); + } + $('#dorks-count').html(`${data['dorks'].length}`); + }); } function get_dork_summary(scan_id){ - $.getJSON(`/api/queryDorkTypes/?scan_id=${scan_id}&format=json`, function(data) { - $('#dork-category-count').empty(); - for (var val in data['dorks']){ - dork = data['dorks'][val] - $("#osint-dork").append(`${dork['type']}`); - } - $('#dork-category-count').html(`${data['dorks'].length}`); - $("body").tooltip({ selector: '[data-toggle=tooltip]' }); - }); + $.getJSON(`/api/queryDorkTypes/?scan_id=${scan_id}&format=json`, function(data) { + $('#dork-category-count').empty(); + for (var val in data['dorks']){ + dork = data['dorks'][val] + $("#osint-dork").append(`${dork['type']}`); + } + $('#dork-category-count').html(`${data['dorks'].length}`); + $("body").tooltip({ selector: '[data-toggle=tooltip]' }); + }); } function get_dork_details(dork_type, scan_id){ - // render tab modal - $('.modal-title').html('Dorking Results in category: ' + dork_type + ''); - $('#modal_dialog').modal('show'); - $('.modal-text').empty(); $('#modal-footer').empty(); - $('.modal-text').append(``); - $.getJSON(`/api/queryDorks/?scan_id=${scan_id}&type=${dork_type}&format=json`, function(data) { - $('#modal-loader').empty(); - $('#modal-content').append(`${data['dorks'].length} results found in this dork category.`); - $('#modal-content').append(`
      `); - for (dork in data['dorks']){ - dork_obj = data['dorks'][dork]; - $("#dork-detail-modal-ul").append(`
    • ${dork_obj['description']}
    • `); - } - }); + // render tab modal + $('.modal-title').html('Dorking Results in category: ' + dork_type + ''); + $('#modal_dialog').modal('show'); + $('.modal-text').empty(); $('#modal-footer').empty(); + $('.modal-text').append(``); + $.getJSON(`/api/queryDorks/?scan_id=${scan_id}&type=${dork_type}&format=json`, function(data) { + $('#modal-loader').empty(); + $('#modal-content').append(`${data['dorks'].length} results found in this dork category.`); + $('#modal-content').append(`
        `); + for (dork in data['dorks']){ + dork_obj = data['dorks'][dork]; + $("#dork-detail-modal-ul").append(`
      • ${dork_obj['description']}
      • `); + } + }); } function get_vulnerability_modal(scan_id, severity, subdomain_name){ - if (scan_id) { - url = `/api/queryVulnerabilities/?scan_id=${scan_id}&severity=${severity}&subdomain_name=${subdomain_name}&format=json`; - } - else{ - url = `/api/queryVulnerabilities/?severity=${severity}&subdomain_name=${subdomain_name}&format=json`; - } - switch (severity) { - case 0: - severity_title = 'Informational' - break; - case 1: - severity_title = 'Low' - break; - case 2: - severity_title = 'Medium' - break; - case 3: - severity_title = 'High' - break; - case 4: - severity_title = 'Critical' - break; - default: - severity_title = '' - } - $('.modal-title').html(`${severity_title} Severity Vulnerabilities`); - $('#modal_dialog').modal('show'); - $('.modal-text').empty(); $('#modal-footer').empty(); - $('.modal-text').append(``); - $.getJSON(url, function(data) { - $('#modal-loader').empty(); - $('#modal-content').append(`
        ${data['vulnerabilities'].length} vulnerabilities found in subdomain ${subdomain_name}.
        `); - $('#modal-content').append(`
          `); - for (vuln in data['vulnerabilities']){ - vuln_obj = data['vulnerabilities'][vuln]; - description = ''; - reference = ''; - extracted_results = ''; - if (vuln_obj['description']) { - description = `
          ${vuln_obj['description']}`; - } - if (vuln_obj['reference']) { - reference = `
          Reference: ${vuln_obj['reference']}`; - } - if (vuln_obj['extracted_results']) { - extracted_results = `
          Extracted Results: ${vuln_obj['extracted_results']}`; - } - $("#vulnerabilities-detail-modal-ul").append(`
        • ${vuln_obj['name']}${description}${reference}${extracted_results}
        • `); - } - }).fail(function(){ - $('#modal-loader').empty(); - $("#modal-content").append(`

          Error loading Vulnerabilities Summary

          `); - }); + if (scan_id) { + url = `/api/queryVulnerabilities/?scan_id=${scan_id}&severity=${severity}&subdomain_name=${subdomain_name}&format=json`; + } + else{ + url = `/api/queryVulnerabilities/?severity=${severity}&subdomain_name=${subdomain_name}&format=json`; + } + switch (severity) { + case 0: + severity_title = 'Informational' + break; + case 1: + severity_title = 'Low' + break; + case 2: + severity_title = 'Medium' + break; + case 3: + severity_title = 'High' + break; + case 4: + severity_title = 'Critical' + break; + default: + severity_title = '' + } + $('.modal-title').html(`${severity_title} Severity Vulnerabilities`); + $('#modal_dialog').modal('show'); + $('.modal-text').empty(); $('#modal-footer').empty(); + $('.modal-text').append(``); + $.getJSON(url, function(data) { + $('#modal-loader').empty(); + $('#modal-content').append(`
          ${data['vulnerabilities'].length} vulnerabilities found in subdomain ${subdomain_name}.
          `); + $('#modal-content').append(`
            `); + for (vuln in data['vulnerabilities']){ + vuln_obj = data['vulnerabilities'][vuln]; + description = ''; + reference = ''; + extracted_results = ''; + if (vuln_obj['description']) { + description = `
            ${vuln_obj['description']}`; + } + if (vuln_obj['reference']) { + reference = `
            Reference: ${vuln_obj['reference']}`; + } + if (vuln_obj['extracted_results']) { + extracted_results = `
            Extracted Results: ${vuln_obj['extracted_results']}`; + } + $("#vulnerabilities-detail-modal-ul").append(`
          • ${vuln_obj['name']}${description}${reference}${extracted_results}
          • `); + } + }).fail(function(){ + $('#modal-loader').empty(); + $("#modal-content").append(`

            Error loading Vulnerabilities Summary

            `); + }); } function get_endpoint_modal(scan_id, subdomain_id){ - if (scan_id) { - url = `/api/listEndpoints/?scan_id=${scan_id}&subdomain_id=${subdomain_id}&format=json` - } - else{ - url = `/api/listEndpoints/?subdomain_id=${subdomain_id}&format=json` - } - $('.modal-title').html(`Endpoints Summary`); - $('#modal_dialog').modal('show'); - $('.modal-text').empty(); $('#modal-footer').empty(); - $('.modal-text').append(``); - $.getJSON(url, function(data) { - $('#modal-loader').empty(); - $('#modal-content').append(`
            ${data['endpoints'].length} endpoints discovered in subdomain ${subdomain_name}.
            `); - $('#modal-content').append(`
              `); - for (endpoint in data['endpoints']){ - endpoint_obj = data['endpoints'][endpoint]; - if (endpoint_obj['page_title']) { - http_url = `
              ${endpoint_obj['http_url']}` - main_title = endpoint_obj['page_title'] + http_url; - } - else { - main_title = endpoint_obj['http_url'] - } - $("#endpoints-detail-modal-ul").append(`
            • ${main_title}
            • `); - } - }).fail(function(){ - $('#modal-loader').empty(); - $("#modal-content").append(`

              Error loading Vulnerabilities Summary

              `); - }); + + $('#xl-modal-title').empty(); + $('#xl-modal-content').empty(); + $('#xl-modal-footer').empty(); + + if (scan_id) { + url = `/api/listEndpoints/?scan_id=${scan_id}&subdomain_id=${subdomain_id}&format=json` + } + else{ + url = `/api/listEndpoints/?subdomain_id=${subdomain_id}&format=json` + } + + Swal.fire({ + title: 'Fetching Endpoints...' + }); + 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); + swal.close(); + $('#xl-modal_title').html(`${response['count']} Endpoints`); + }); + $('#modal_xl_scroll_dialog').modal('show'); + $("body").tooltip({ + selector: '[data-toggle=tooltip]' + }); + } 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 - } + 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 add_todo_for_scanhistory_modal(scan_history_id){ - $("#todoTitle").val(''); - $("#todoDescription").val(''); + $("#todoTitle").val(''); + $("#todoDescription").val(''); - $('#addTaskModal').modal('show'); - subdomain_dropdown = document.getElementById('todoSubdomainDropdown'); - $.getJSON(`/api/querySubdomains?scan_id=${scan_history_id}&no_lookup_interesting&format=json`, function(data) { - document.querySelector("#selectedSubdomainCount").innerHTML = data['subdomains'].length + ' Subdomains'; - for (var subdomain in data['subdomains']){ - subdomain_obj = data['subdomains'][subdomain]; - var option = document.createElement('option'); - option.value = subdomain_obj['id']; - option.innerHTML = subdomain_obj['name']; - subdomain_dropdown.appendChild(option); - } - }); + $('#addTaskModal').modal('show'); + subdomain_dropdown = document.getElementById('todoSubdomainDropdown'); + $.getJSON(`/api/querySubdomains?scan_id=${scan_history_id}&no_lookup_interesting&format=json`, function(data) { + document.querySelector("#selectedSubdomainCount").innerHTML = data['subdomains'].length + ' Subdomains'; + for (var subdomain in data['subdomains']){ + subdomain_obj = data['subdomains'][subdomain]; + var option = document.createElement('option'); + option.value = subdomain_obj['id']; + option.innerHTML = subdomain_obj['name']; + subdomain_dropdown.appendChild(option); + } + }); } // listen to save todo event $(".add-scan-history-todo").click(function(){ - var title = document.getElementById('todoTitle').value; + var title = document.getElementById('todoTitle').value; - var description = document.getElementById('todoDescription').value; + var description = document.getElementById('todoDescription').value; - data = { - 'title': title, - 'description': description - } + data = { + 'title': title, + 'description': description + } - scan_id = parseInt(document.getElementById('summary_identifier_val').value); - data['scan_history'] = scan_id; + scan_id = parseInt(document.getElementById('summary_identifier_val').value); + data['scan_history'] = scan_id; - if ($("#todoSubdomainDropdown").val() != 'Choose Subdomain...') { - data['subdomain'] = parseInt($("#todoSubdomainDropdown").val()); - } + if ($("#todoSubdomainDropdown").val() != 'Choose Subdomain...') { + data['subdomain'] = parseInt($("#todoSubdomainDropdown").val()); + } - fetch('../../recon_note/add_note', { - method: 'post', - headers: { - "X-CSRFToken": getCookie("csrftoken") - }, - body: JSON.stringify(data) - }).then(res => res.json()) - .then(function (response) { - Snackbar.show({ - text: 'Todo Added.', - pos: 'top-right', - duration: 1500, - }); - $('#addTaskModal').modal('hide'); - get_recon_notes(null, scan_id); - }); + fetch('../../recon_note/add_note', { + method: 'post', + headers: { + "X-CSRFToken": getCookie("csrftoken") + }, + body: JSON.stringify(data) + }).then(res => res.json()) + .then(function (response) { + Snackbar.show({ + text: 'Todo Added.', + pos: 'top-right', + duration: 1500, + }); + $('#addTaskModal').modal('hide'); + get_recon_notes(null, scan_id); + }); }); function add_task_for_subdomain(subdomain_id, subdomain_name){ - $('#todo-modal-subdomain-name').html(subdomain_name); - $("#subdomainTodoTitle").val(''); - $("#subdomainTodoDescription").val(''); + $('#todo-modal-subdomain-name').html(subdomain_name); + $("#subdomainTodoTitle").val(''); + $("#subdomainTodoDescription").val(''); - $('#add-todo-subdomain-submit-button').attr('onClick', `add_task_for_subdomain_handler(${subdomain_id});`); + $('#add-todo-subdomain-submit-button').attr('onClick', `add_task_for_subdomain_handler(${subdomain_id});`); - $('#addSubdomainTaskModal').modal('show'); + $('#addSubdomainTaskModal').modal('show'); } function add_task_for_subdomain_handler(subdomain_id){ - var title = document.getElementById('subdomainTodoTitle').value; - var description = document.getElementById('subdomainTodoDescription').value; + var title = document.getElementById('subdomainTodoTitle').value; + var description = document.getElementById('subdomainTodoDescription').value; - data = { - 'title': title, - 'description': description - } + data = { + 'title': title, + 'description': description + } - scan_id = 0; - if (document.getElementById("summary_identifier_val")) { - scan_id = parseInt(document.getElementById('summary_identifier_val').value); - } + scan_id = 0; + if (document.getElementById("summary_identifier_val")) { + scan_id = parseInt(document.getElementById('summary_identifier_val').value); + } - data['scan_history'] = scan_id; - data['subdomain'] = subdomain_id; + data['scan_history'] = scan_id; + data['subdomain'] = subdomain_id; - fetch('../../recon_note/add_note', { - method: 'post', - headers: { - "X-CSRFToken": getCookie("csrftoken") - }, - body: JSON.stringify(data) - }).then(res => res.json()) - .then(function (response) { - Snackbar.show({ - text: 'Todo Added.', - pos: 'top-right', - duration: 1500, - }); - $('#subdomain_scan_results').DataTable().ajax.reload(); - $('#addSubdomainTaskModal').modal('hide'); - }); + fetch('../../recon_note/add_note', { + method: 'post', + headers: { + "X-CSRFToken": getCookie("csrftoken") + }, + body: JSON.stringify(data) + }).then(res => res.json()) + .then(function (response) { + Snackbar.show({ + text: 'Todo Added.', + pos: 'top-right', + duration: 1500, + }); + $('#subdomain_scan_results').DataTable().ajax.reload(); + $('#addSubdomainTaskModal').modal('hide'); + }); } function download_subdomains(scan_id, domain_name){ - Swal.fire({ - title: 'Querying Subdomains...' - }); - swal.showLoading(); - count = ``; - if (scan_id) { - url = `/api/querySubdomains?format=json&no_lookup_interesting&scan_id=${scan_id}`; - } - else{ - url = `/api/querySubdomains?format=json&no_lookup_interesting`; - } - if (domain_name) { - $('.modal-title').html(count + ' Subdomains for : ' + domain_name + ''); - } - else{ - $('.modal-title').html(count + ' Subdomains'); - } - $('.modal-text').empty(); $('#modal-footer').empty(); - $('.modal-text').append(``); - // query subdomains - $.getJSON(url, function(data) { - swal.close(); - if (data['subdomains'].length) { - $('#modal_dialog').modal('show'); - $('.modal_count').html(data['subdomains'].length); - $('#modal-content').empty(); - subdomains = ''; - $('#modal-content').append(``); - for (subdomain in data['subdomains']){ - subdomain_obj = data['subdomains'][subdomain]; - subdomains += subdomain_obj['name'] + '\n' - } - $('#all_subdomains_text_area').append(subdomains); - $("#modal-footer").empty(); - $("#modal-footer").append(` Download Subdomains as txt`); - $("#modal-footer").append(` Copy Subdomains`); - } - else{ - swal.fire("No Subdomains", "Could not find any subdomains.", "warning", { - button: "Okay", - }); - } - }).fail(function(){ - swal.fire("No Subdomains", "Could not find any subdomains.", "warning", { - button: "Okay", - }); - }); + Swal.fire({ + title: 'Querying Subdomains...' + }); + swal.showLoading(); + count = ``; + if (scan_id) { + url = `/api/querySubdomains?format=json&no_lookup_interesting&scan_id=${scan_id}`; + } + else{ + url = `/api/querySubdomains?format=json&no_lookup_interesting`; + } + if (domain_name) { + $('.modal-title').html(count + ' Subdomains for : ' + domain_name + ''); + } + else{ + $('.modal-title').html(count + ' Subdomains'); + } + $('.modal-text').empty(); $('#modal-footer').empty(); + $('.modal-text').append(``); + // query subdomains + $.getJSON(url, function(data) { + swal.close(); + if (data['subdomains'].length) { + $('#modal_dialog').modal('show'); + $('.modal_count').html(data['subdomains'].length); + $('#modal-content').empty(); + subdomains = ''; + $('#modal-content').append(``); + for (subdomain in data['subdomains']){ + subdomain_obj = data['subdomains'][subdomain]; + subdomains += subdomain_obj['name'] + '\n' + } + $('#all_subdomains_text_area').append(subdomains); + $("#modal-footer").empty(); + $("#modal-footer").append(` Download Subdomains as txt`); + $("#modal-footer").append(` Copy Subdomains`); + } + else{ + swal.fire("No Subdomains", "Could not find any subdomains.", "warning", { + button: "Okay", + }); + } + }).fail(function(){ + swal.fire("No Subdomains", "Could not find any subdomains.", "warning", { + button: "Okay", + }); + }); } function download_interesting_subdomains(scan_id, domain_name){ - Swal.fire({ - title: 'Querying Interesting Subdomains...' - }); - swal.showLoading(); - count = ``; - if (scan_id) { - url = `/api/listInterestingSubdomains/?scan_id=${scan_id}&format=json&only_subdomains&no_page`; - } - else{ - url = `/api/listInterestingSubdomains/?format=json&only_subdomains&no_page`; - } - if (domain_name) { - $('.modal-title').html( count + ' Interesting Subdomains for : ' + domain_name + ''); - } - else{ - $('.modal-title').html( count + ' Interesting Subdomains'); - } - $('.modal-text').empty(); $('#modal-footer').empty(); - // query subdomains - $.getJSON(url, function(data) { - swal.close() - if (data.length) { - $('#modal_dialog').modal('show'); - $('.modal_count').html(data.length); - $('#modal-content').empty(); - subdomains = ''; - $('#modal-content').append(``); - for (subdomain in data){ - subdomains += data[subdomain]['name'] + '\n' - } - $('#interesting_subdomains_text_area').append(subdomains); - $("#modal-footer").empty(); - $("#modal-footer").append(` Download Subdomains as txt`); - $("#modal-footer").append(` Copy Subdomains`); - } - else{ - swal.fire("No Interesting Subdomains", "Could not find any interesting subdomains.", "warning", { - button: "Okay", - }); - } + Swal.fire({ + title: 'Querying Interesting Subdomains...' + }); + swal.showLoading(); + count = ``; + if (scan_id) { + url = `/api/listInterestingSubdomains/?scan_id=${scan_id}&format=json&only_subdomains&no_page`; + } + else{ + url = `/api/listInterestingSubdomains/?format=json&only_subdomains&no_page`; + } + if (domain_name) { + $('.modal-title').html( count + ' Interesting Subdomains for : ' + domain_name + ''); + } + else{ + $('.modal-title').html( count + ' Interesting Subdomains'); + } + $('.modal-text').empty(); $('#modal-footer').empty(); + // query subdomains + $.getJSON(url, function(data) { + swal.close() + if (data.length) { + $('#modal_dialog').modal('show'); + $('.modal_count').html(data.length); + $('#modal-content').empty(); + subdomains = ''; + $('#modal-content').append(``); + for (subdomain in data){ + subdomains += data[subdomain]['name'] + '\n' + } + $('#interesting_subdomains_text_area').append(subdomains); + $("#modal-footer").empty(); + $("#modal-footer").append(` Download Subdomains as txt`); + $("#modal-footer").append(` Copy Subdomains`); + } + else{ + swal.fire("No Interesting Subdomains", "Could not find any interesting subdomains.", "warning", { + button: "Okay", + }); + } - }).fail(function(){ - swal.fire("No Interesting Subdomains", "Could not find any interesting subdomains.", "warning", { - button: "Okay", - }); - }); + }).fail(function(){ + swal.fire("No Interesting Subdomains", "Could not find any interesting subdomains.", "warning", { + button: "Okay", + }); + }); } function download_interesting_endpoints(scan_id, domain_name){ - Swal.fire({ - title: 'Querying Interesting Endpoints...' - }); - swal.showLoading(); - count = ``; - if (scan_id) { - url = `/api/listInterestingEndpoints/?scan_id=${scan_id}&format=json&no_page`; - } - else{ - url = `/api/listInterestingEndpoints/?format=json&no_page`; - } - if (domain_name) { - $('.modal-title').html( count + ' Interesting Endpoints for : ' + domain_name + ''); - } - else{ - $('.modal-title').html( count + ' Interesting Endpoints'); - } - $('.modal-text').empty(); $('#modal-footer').empty(); - // query subdomains - $.getJSON(url, function(data) { - swal.close(); - if (data.length) { - $('#modal_dialog').modal('show'); - $('.modal_count').html(data.length); - $('#modal-content').empty(); - endpoints = ''; - $('#modal-content').append(``); - for (endpoint in data){ - endpoints += data[endpoint]['http_url'] + '\n' - } - $('#interesting_endpoints_text_area').append(endpoints); - $("#modal-footer").empty(); - $("#modal-footer").append(` Download Endpoints as txt`); - $("#modal-footer").append(` Copy Endpoints`); - } - else{ - swal.fire("No Interesting Endpoints", "Could not find any interesting Endpoints.", "warning", { - button: "Okay", - }); - } + Swal.fire({ + title: 'Querying Interesting Endpoints...' + }); + swal.showLoading(); + count = ``; + if (scan_id) { + url = `/api/listInterestingEndpoints/?scan_id=${scan_id}&format=json&no_page`; + } + else{ + url = `/api/listInterestingEndpoints/?format=json&no_page`; + } + if (domain_name) { + $('.modal-title').html( count + ' Interesting Endpoints for : ' + domain_name + ''); + } + else{ + $('.modal-title').html( count + ' Interesting Endpoints'); + } + $('.modal-text').empty(); $('#modal-footer').empty(); + // query subdomains + $.getJSON(url, function(data) { + swal.close(); + if (data.length) { + $('#modal_dialog').modal('show'); + $('.modal_count').html(data.length); + $('#modal-content').empty(); + endpoints = ''; + $('#modal-content').append(``); + for (endpoint in data){ + endpoints += data[endpoint]['http_url'] + '\n' + } + $('#interesting_endpoints_text_area').append(endpoints); + $("#modal-footer").empty(); + $("#modal-footer").append(` Download Endpoints as txt`); + $("#modal-footer").append(` Copy Endpoints`); + } + else{ + swal.fire("No Interesting Endpoints", "Could not find any interesting Endpoints.", "warning", { + button: "Okay", + }); + } - }).fail(function(){ - swal.fire("No Interesting Endpoints", "Could not find any interesting Endpoints.", "warning", { - button: "Okay", - }); - }); + }).fail(function(){ + swal.fire("No Interesting Endpoints", "Could not find any interesting Endpoints.", "warning", { + button: "Okay", + }); + }); } function download_important_subdomains(scan_id, domain_name){ - Swal.fire({ - title: 'Querying Interesting Subdomains...' - }); - swal.showLoading(); - count = ``; - if (scan_id) { - url = `/api/querySubdomains?format=json&no_lookup_interesting&only_important&scan_id=${scan_id}`; - } - else{ - url = `/api/querySubdomains?format=json&no_lookup_interesting&only_important`; - } - if (domain_name) { - $('.modal-title').html(count + 'Subdomains marked as important : ' + domain_name + ''); - } - else{ - $('.modal-title').html(count + ' Subdomains marked as important'); - } - $('.modal-text').empty(); $('#modal-footer').empty(); - // query subdomains - $.getJSON(url, function(data) { - swal.close(); - if (data['subdomains'].length) { - $('#modal_dialog').modal('show'); - $('.modal_count').html(data['subdomains'].length); - $('#modal-content').empty(); - subdomains = ''; - $('#modal-content').append(``); - for (subdomain in data['subdomains']){ - subdomain_obj = data['subdomains'][subdomain]; - subdomains += subdomain_obj['name'] + '\n' - } - $('#all_subdomains_text_area').append(subdomains); - $("#modal-footer").empty(); - $("#modal-footer").append(` Download Subdomains as txt`); - $("#modal-footer").append(` Copy Subdomains`); - } - else{ - swal.fire("No Important Endpoints", "No subdomains has been marked as important.", "warning", { - button: "Okay", - }); - } - }).fail(function(){ - swal.fire("No Important Endpoints", "No subdomains has been marked as important.", "warning", { - button: "Okay", - }); - }); + Swal.fire({ + title: 'Querying Interesting Subdomains...' + }); + swal.showLoading(); + count = ``; + if (scan_id) { + url = `/api/querySubdomains?format=json&no_lookup_interesting&only_important&scan_id=${scan_id}`; + } + else{ + url = `/api/querySubdomains?format=json&no_lookup_interesting&only_important`; + } + if (domain_name) { + $('.modal-title').html(count + 'Subdomains marked as important : ' + domain_name + ''); + } + else{ + $('.modal-title').html(count + ' Subdomains marked as important'); + } + $('.modal-text').empty(); $('#modal-footer').empty(); + // query subdomains + $.getJSON(url, function(data) { + swal.close(); + if (data['subdomains'].length) { + $('#modal_dialog').modal('show'); + $('.modal_count').html(data['subdomains'].length); + $('#modal-content').empty(); + subdomains = ''; + $('#modal-content').append(``); + for (subdomain in data['subdomains']){ + subdomain_obj = data['subdomains'][subdomain]; + subdomains += subdomain_obj['name'] + '\n' + } + $('#all_subdomains_text_area').append(subdomains); + $("#modal-footer").empty(); + $("#modal-footer").append(` Download Subdomains as txt`); + $("#modal-footer").append(` Copy Subdomains`); + } + else{ + swal.fire("No Important Endpoints", "No subdomains has been marked as important.", "warning", { + button: "Okay", + }); + } + }).fail(function(){ + swal.fire("No Important Endpoints", "No subdomains has been marked as important.", "warning", { + button: "Okay", + }); + }); } function download_endpoints(scan_id, domain_name, pattern){ - Swal.fire({ - title: 'Querying Endpoints...' - }); - swal.showLoading(); - count = `Loading... `; - if (scan_id) { - url = `/api/queryEndpoints/?format=json&only_urls&scan_id=${scan_id}`; - } - else{ - url = `/api/queryEndpoints/?format=json&only_urls`; - } - if (pattern) { - url += `&pattern=${pattern}`; - } - if (domain_name) { - $('.modal-title').html( count + ' Endpoints for : ' + domain_name + ''); - } - else{ - $('.modal-title').html(count + ' Endpoints'); - } - $('.modal-text').empty(); $('#modal-footer').empty(); - // query subdomains - $.getJSON(url, function(data) { - swal.close(); - $('#modal_dialog').modal('show'); - $('.modal_count').html(data['endpoints'].length); - $('#modal-content').empty(); - endpoints = ''; - $('#modal-content').append(``); - for (endpoint in data['endpoints']){ - endpoint_obj = data['endpoints'][endpoint]; - endpoints += endpoint_obj['http_url'] + '\n' - } - $('#all_endpoints_text_area').append(endpoints); - $("#modal-footer").empty(); - if (domain_name) { - $("#modal-footer").append(` Download Endpoints as txt`); - } - else{ - $("#modal-footer").append(` Download Endpoints as txt`); - } - $("#modal-footer").append(` Copy Endpoints`); - }).fail(function(){ - }); + Swal.fire({ + title: 'Querying Endpoints...' + }); + swal.showLoading(); + count = `Loading... `; + if (scan_id) { + url = `/api/queryEndpoints/?format=json&only_urls&scan_id=${scan_id}`; + } + else{ + url = `/api/queryEndpoints/?format=json&only_urls`; + } + if (pattern) { + url += `&pattern=${pattern}`; + } + if (domain_name) { + $('.modal-title').html( count + ' Endpoints for : ' + domain_name + ''); + } + else{ + $('.modal-title').html(count + ' Endpoints'); + } + $('.modal-text').empty(); $('#modal-footer').empty(); + // query subdomains + $.getJSON(url, function(data) { + swal.close(); + $('#modal_dialog').modal('show'); + $('.modal_count').html(data['endpoints'].length); + $('#modal-content').empty(); + endpoints = ''; + $('#modal-content').append(``); + for (endpoint in data['endpoints']){ + endpoint_obj = data['endpoints'][endpoint]; + endpoints += endpoint_obj['http_url'] + '\n' + } + $('#all_endpoints_text_area').append(endpoints); + $("#modal-footer").empty(); + if (domain_name) { + $("#modal-footer").append(` Download Endpoints as txt`); + } + else{ + $("#modal-footer").append(` Download Endpoints as txt`); + } + $("#modal-footer").append(` Copy Endpoints`); + }).fail(function(){ + }); } function fetch_whois(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(`/api/tools/whois/?format=json&ip_domain=${domain_name}&save_db`, {}).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']; + $('[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(`/api/tools/whois/?format=json&ip_domain=${domain_name}&save_db`, {}).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']; + 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 - }); + Snackbar.show({ + text: 'Whois Fetched...', + pos: 'top-right', + duration: 3000 + }); - $("#whois_fetched_alert").show(); + $("#whois_fetched_alert").show(); - $("#whois_fetched_alert").fadeTo(2000, 500).slideUp(1500, function(){ - $("#whois_fetched_alert").slideUp(500); - }); + $("#whois_fetched_alert").fadeTo(2000, 500).slideUp(1500, function(){ + $("#whois_fetched_alert").slideUp(500); + }); - }); + }); } function initiate_subtask(subdomain_ids){ - var port_scan = $('#port_scan_subtask').is(':checked'); - var osint = $('#osint_subtask').is(':checked'); - var endpoint = $('#endpoint_subtask').is(':checked'); - var dir_fuzz = $('#dir_fuzz_subtask').is(':checked'); - var vuln_scan = $('#vuln_subtask').is(':checked'); - if (!port_scan && !osint && !endpoint && !dir_fuzz && !vuln_scan) { - Swal.fire({ - title: 'Oops!', - text: 'No Subtasks Selected. Please choose atleast one subtask!', - icon: 'error' - }); - return; - } - var data = { - 'subdomain_ids': subdomain_ids, - 'port_scan': port_scan, - 'osint': osint, - 'endpoint': endpoint, - 'dir_fuzz': dir_fuzz, - 'vuln_scan': vuln_scan, - }; - Swal.fire({ - title: 'Initiating Subtask...', - allowOutsideClick: false - }); - swal.showLoading(); - fetch('/api/action/initiate/subtask/', { - 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) { - swal.close(); - if (response['status']) { - Snackbar.show({ - text: 'Subtask initiated successfully!', - pos: 'top-right', - duration: 2500 - }); - } - else{ - Swal.fire({ - title: 'Could not initiate subtask!', - icon: 'fail', - }); - } - }); + var port_scan = $('#port_scan_subtask').is(':checked'); + var osint = $('#osint_subtask').is(':checked'); + var endpoint = $('#endpoint_subtask').is(':checked'); + var dir_fuzz = $('#dir_fuzz_subtask').is(':checked'); + var vuln_scan = $('#vuln_subtask').is(':checked'); + if (!port_scan && !osint && !endpoint && !dir_fuzz && !vuln_scan) { + Swal.fire({ + title: 'Oops!', + text: 'No Subtasks Selected. Please choose atleast one subtask!', + icon: 'error' + }); + return; + } + var data = { + 'subdomain_ids': subdomain_ids, + 'port_scan': port_scan, + 'osint': osint, + 'endpoint': endpoint, + 'dir_fuzz': dir_fuzz, + 'vuln_scan': vuln_scan, + }; + Swal.fire({ + title: 'Initiating Subtask...', + allowOutsideClick: false + }); + swal.showLoading(); + fetch('/api/action/initiate/subtask/', { + 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) { + swal.close(); + if (response['status']) { + Snackbar.show({ + text: 'Subtask initiated successfully!', + pos: 'top-right', + duration: 2500 + }); + } + else{ + Swal.fire({ + title: 'Could not initiate subtask!', + icon: 'fail', + }); + } + }); } // initiate sub scan $('#btn-initiate-subtask').on('click', function(){ - $('#subscan-modal').modal('hide'); - if ($('#btn-initiate-subtask').attr('multiple-subscan') === 'true') { - var subdomain_item = document.getElementsByClassName("subdomain_checkbox"); - var subdomain_ids = []; - for (var i = 0; i < subdomain_item.length; i++) { - if (subdomain_item[i].checked) { - subdomain_ids.push($(subdomain_item[i]).val()); - } - } - initiate_subtask(subdomain_ids); - } - else{ - var subdomain_id = $('#subtask_subdomain_id').val(); - initiate_subtask([subdomain_id]); - } + $('#subscan-modal').modal('hide'); + if ($('#btn-initiate-subtask').attr('multiple-subscan') === 'true') { + var subdomain_item = document.getElementsByClassName("subdomain_checkbox"); + var subdomain_ids = []; + for (var i = 0; i < subdomain_item.length; i++) { + if (subdomain_item[i].checked) { + subdomain_ids.push($(subdomain_item[i]).val()); + } + } + initiate_subtask(subdomain_ids); + } + else{ + var subdomain_id = $('#subtask_subdomain_id').val(); + initiate_subtask([subdomain_id]); + } }); function deleteMultipleSubdomains(){ - if (!checkedCount()) { - swal({ - title: 'Oops! No Subdomains has been selected!', - type: 'error', - padding: '2em' - }) - } else { - // atleast one target is selected - Swal.fire({ - showCancelButton: true, - title: 'Are you sure you want to delete ' + checkedCount() + ' Subdomains?', - text: 'Do you really want to delete these subdomains? This action cannot be undone.', - icon: 'error', - confirmButtonText: 'Delete', - }).then((result) => { - if (result.isConfirmed) { - Swal.fire({ - title: 'Deleting Subdomain...', - allowOutsideClick: false - }); - swal.showLoading(); + if (!checkedCount()) { + swal({ + title: 'Oops! No Subdomains has been selected!', + type: 'error', + padding: '2em' + }) + } else { + // atleast one target is selected + Swal.fire({ + showCancelButton: true, + title: 'Are you sure you want to delete ' + checkedCount() + ' Subdomains?', + text: 'Do you really want to delete these subdomains? This action cannot be undone.', + icon: 'error', + confirmButtonText: 'Delete', + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + title: 'Deleting Subdomain...', + allowOutsideClick: false + }); + swal.showLoading(); - subdomain_item = document.getElementsByClassName("subdomain_checkbox"); - var subdomain_ids = []; - for (var i = 0; i < subdomain_item.length; i++) { - if (subdomain_item[i].checked) { - subdomain_ids.push($(subdomain_item[i]).val()); - } - } - var data = {'subdomain_ids': subdomain_ids}; - fetch('/api/action/subdomain/delete/', { - 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) { - swal.close(); - if (response['status']) { - // remove all rows - var table = $('#subdomain_scan_results').DataTable(); - for (var id in subdomain_ids) { - table.row('#subdomain_row_' + id).remove().draw(); - } - Snackbar.show({ - text: 'Subdomain successfully deleted!', - pos: 'top-right', - duration: 2500 - }); - } - else{ - Swal.fire({ - title: 'Could not delete Subdomain!', - icon: 'fail', - }); - } - }); - } - });; - } + subdomain_item = document.getElementsByClassName("subdomain_checkbox"); + var subdomain_ids = []; + for (var i = 0; i < subdomain_item.length; i++) { + if (subdomain_item[i].checked) { + subdomain_ids.push($(subdomain_item[i]).val()); + } + } + var data = {'subdomain_ids': subdomain_ids}; + fetch('/api/action/subdomain/delete/', { + 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) { + swal.close(); + if (response['status']) { + // remove all rows + var table = $('#subdomain_scan_results').DataTable(); + for (var id in subdomain_ids) { + table.row('#subdomain_row_' + id).remove().draw(); + } + Snackbar.show({ + text: 'Subdomain successfully deleted!', + pos: 'top-right', + duration: 2500 + }); + } + else{ + Swal.fire({ + title: 'Could not delete Subdomain!', + icon: 'fail', + }); + } + }); + } + });; + } } function initiateMultipleSubscan(){ - $('#subscan-modal').modal('show'); - $('a[data-toggle="tooltip"]').tooltip("hide") - // to distinguish multiple subscan or single, put a extra attribute on button - $('#btn-initiate-subtask').attr('multiple-subscan', true); + $('#subscan-modal').modal('show'); + $('a[data-toggle="tooltip"]').tooltip("hide") + // to distinguish multiple subscan or single, put a extra attribute on button + $('#btn-initiate-subtask').attr('multiple-subscan', true); } diff --git a/web/startScan/templates/startScan/detail_scan.html b/web/startScan/templates/startScan/detail_scan.html index 9b5101d2..46c5718e 100644 --- a/web/startScan/templates/startScan/detail_scan.html +++ b/web/startScan/templates/startScan/detail_scan.html @@ -1639,7 +1639,7 @@ $(document).ready(function(){ endpoint_count_badge = ''; if (row['endpoint_count']) { - endpoint_count_badge = `${row['endpoint_count']} Endpoints` + endpoint_count_badge = `${row['endpoint_count']} Endpoints` } vuln_count_badge = ''; diff --git a/web/static/custom/custom.js b/web/static/custom/custom.js index aa6895fb..96583759 100644 --- a/web/static/custom/custom.js +++ b/web/static/custom/custom.js @@ -1115,72 +1115,7 @@ function show_subscan_results(subscan_id) { } }); } else if(response['subscan']['task'] == 'fetch_url') { - $('#xl-modal-content').append(`
              ${response['result'].length} Endpoints Discovered on subdomain ${response['subscan']['subdomain_name']}
              `); - $('#xl-modal-content').append(` -
              - - - - - - - - - - - - - - -
              HTTP URLStatusPage TitleTagsContent TypeContent LengthResponse Time
              -
              - `); - $('#endpoint_tbody').empty(); - for(var endpoint_obj in response['result']) { - var endpoint = response['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") - } - }); + 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(` @@ -1266,3 +1201,74 @@ function get_http_status_badge(data) { } 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 URLStatusPage TitleTagsContent TypeContent LengthResponse 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") + } + }); +}