lookyloo/website/web/templates/hostname_popup.html

378 lines
16 KiB
HTML
Raw Normal View History

2020-05-18 18:35:20 +02:00
{% extends "main.html" %}
2020-08-25 18:00:16 +02:00
{% from "macros.html" import known_content_details %}
{% from "macros.html" import ressource_legitimacy_details %}
2020-07-12 01:56:29 +02:00
{% from "macros.html" import indexed_hash %}
{% from "macros.html" import indexed_cookies %}
{% from "macros.html" import popup_icons_request %}
{% from "macros.html" import popup_icons_response %}
2020-07-15 18:04:34 +02:00
{% from "macros.html" import shorten_string %}
{% from "macros.html" import other_captures_table %}
{% from "macros.html" import get_ressource_button %}
{% from "macros.html" import context_form %}
{% from "macros.html" import pandora_submit %}
2020-05-18 18:35:20 +02:00
2020-09-24 18:46:43 +02:00
{% block title %}Details for {{ hostnode.name }} {% endblock %}
2020-05-18 18:35:20 +02:00
{% block scripts %}
2020-05-27 12:38:25 +02:00
{{ super() }}
<script type="text/javascript">
2020-08-11 19:17:39 +02:00
$(document).ready(() => {
$('table.table').DataTable( {
"order": [[ 1, "desc" ]],
"paging": false,
"info": false,
"columns": [
{ "orderable": false},
{ "orderable": false},
{ "orderable": false}
],
"columnDefs": [{
"targets": 1,
2020-08-11 19:17:39 +02:00
"render": (data) => {
const date = new Date(data);
return date.getFullYear() + '-' + (date.getMonth() + 1).toString().padStart(2, "0") + '-' + date.getDate().toString().padStart(2, "0") + ' ' + date.toTimeString();
}
}]
} );
});
</script>
2020-05-18 18:35:20 +02:00
<script>
let whereAmI = (hostnode_uuid) => window.opener.LocateNode(hostnode_uuid);
let openTreeInNewTab = (capture_uuid, hostnode_uuid=Null) => {
let success = window.opener.openTreeInNewTab(capture_uuid, hostnode_uuid);
if (! success) {
2020-11-18 15:03:27 +01:00
alert("Your browser doesn't allow Lookyloo to open a new tab. There should be an icon on the right side of your URL bar *in the main window* to allow it.");
}
}
2020-05-18 18:35:20 +02:00
</script>
2020-05-27 12:38:25 +02:00
<script>
2020-08-11 19:17:39 +02:00
$(document).ready(() => {
// Grab any text in the attribute 'data-copy' and pass it to the copy function
$('.js-copy').tooltip();
$('.js-copy').click(function() {
const text = $(this).attr('data-copy');
const el = $(this);
copyToClipboard(text, el);
2020-05-27 12:38:25 +02:00
});
2020-08-11 19:17:39 +02:00
});
2020-05-27 12:38:25 +02:00
</script>
<script>
$(document).ready(() => {
$(function () {
$('[data-bs-toggle="tooltip"]').tooltip()
})
});
</script>
<script>
function submit_pandora(node_uuid, ressource_hash){
let data = {};
if (node_uuid) {
data.node_uuid = node_uuid;
};
if (ressource_hash) {
data.ressource_hash = ressource_hash;
};
fetch("{{ url_for('pandora_submit', tree_uuid=tree_uuid)}}", {
method: "POST",
body: JSON.stringify(data),
})
.then(response => response.json())
.then(data => {
2022-08-25 15:08:08 +02:00
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(data.link);
}
openURLInNewTab(data.link);
})
.catch((error) => {
throw new Error(error);
});
};
let openURLInNewTab = (url) => {
let success = window.opener.openURLInNewTab(url);
if (! success) {
alert("Your browser doesn't allow Lookyloo to open a new tab. There should be an icon on the right side of your URL bar *in the main window* to allow it.");
}
}
</script>
2020-05-18 18:35:20 +02:00
{% endblock %}
{% block content %}
2020-07-12 01:56:29 +02:00
{# Headers #}
<center>
2020-09-24 18:46:43 +02:00
<h3>{{ hostnode.name }}</h3>
<button type="button" class="btn btn-primary" onclick="whereAmI('{{ hostnode_uuid }}')">Locate in tree</button>
2021-04-26 00:52:08 +02:00
{% if uwhois_available %}
<a href="{{ url_for('whois', query=hostnode.name) }}" class="btn btn-primary" role="button">
2021-04-26 00:52:08 +02:00
Download whois entry
</a>
{% endif %}
<a href="{{ url_for('urls_hostnode', tree_uuid=tree_uuid, node_uuid=hostnode_uuid) }}" class="btn btn-primary" role="button">
2021-04-06 23:34:57 +02:00
Download all URLs as text
2020-10-21 12:22:50 +02:00
</a>
<a href="{{ url_for('hashes_hostnode', tree_uuid=tree_uuid, node_uuid=hostnode_uuid) }}" class="btn btn-primary" role="button">
2021-04-06 23:34:57 +02:00
Download all Hashes as text
2020-10-21 12:22:50 +02:00
</a>
</center>
</br>
2020-09-24 18:46:43 +02:00
<div>
{% if hostnode.cname %}
<h5>CNAME(s) for this domain:</h5>
2020-09-24 18:46:43 +02:00
<ul>
{% for cname in hostnode.cname %}
2021-04-26 00:52:08 +02:00
<li>{{ cname }}{% if uwhois_available %} (<a href="{{ url_for('whois', query=cname)}}">whois</a>){% endif %}</li>
2020-09-24 18:46:43 +02:00
{% endfor %}
</ul>
{% endif %}
2020-09-29 14:24:18 +02:00
{% if hostnode.resolved_ips %}
<h5>Domain IPs from a standalone DNS lookup:</h5>
2023-01-16 15:10:10 +01:00
{% if 'v4' in hostnode.resolved_ips and 'v6' in hostnode.resolved_ips%}
<ul>
{% for ip in hostnode.resolved_ips['v4'] %}
<li>
{{ ip }}{% if uwhois_available %} (<a href="{{ url_for('whois', query=ip)}}">whois</a>){% endif %}
{% if 'ipasn' in hostnode.features and hostnode.ipasn.get(ip) %}- AS{{ hostnode.ipasn[ip]['asn'] }} {% if uwhois_available %} (<a href="{{ url_for('whois', query='AS'+hostnode.ipasn[ip]['asn'])}}">whois</a>){% endif %}{% endif %}
{% if 'cloudflare' in hostnode.features and hostnode.cloudflare.get(ip) %} - Known Cloudflare IP{% endif %}
2023-01-16 15:10:10 +01:00
</li>
{% endfor %}
{% for ip in hostnode.resolved_ips['v6'] %}
<li>
{{ ip }}{% if uwhois_available %} (<a href="{{ url_for('whois', query=ip)}}">whois</a>){% endif %}
{% if 'ipasn' in hostnode.features and hostnode.ipasn.get(ip) %}- AS{{ hostnode.ipasn[ip]['asn'] }} {% if uwhois_available %} (<a href="{{ url_for('whois', query='AS'+hostnode.ipasn[ip]['asn'])}}">whois</a>){% endif %}{% endif %}
{% if 'cloudflare' in hostnode.features and hostnode.cloudflare.get(ip) %} - Known Cloudflare IP{% endif %}
2023-01-16 15:10:10 +01:00
</li>
{% endfor %}
</ul>
{%else%}
2020-09-29 14:24:18 +02:00
<ul>
{% for ip in hostnode.resolved_ips %}
2022-12-23 16:36:11 +01:00
<li>
{{ ip }}{% if uwhois_available %} (<a href="{{ url_for('whois', query=ip)}}">whois</a>){% endif %}
{% if 'ipasn' in hostnode.features and hostnode.ipasn.get(ip) %}- AS{{ hostnode.ipasn[ip]['asn'] }} {% if uwhois_available %} (<a href="{{ url_for('whois', query='AS'+hostnode.ipasn[ip]['asn'])}}">whois</a>){% endif %}{% endif %}
</li>
2020-09-29 14:24:18 +02:00
{% endfor %}
</ul>
2023-01-16 15:10:10 +01:00
{% endif %}
2020-09-29 14:24:18 +02:00
{% endif %}
2020-09-24 18:46:43 +02:00
</div>
2020-07-12 01:56:29 +02:00
{# Start list of URLs #}
2020-05-22 17:36:22 +02:00
<ul class="list-group-flush">
2020-06-04 18:23:36 +02:00
{% for url in urls %}
2020-07-12 01:56:29 +02:00
{# URL Display #}
2020-05-23 03:37:24 +02:00
<li class="list-group-item">
<div class="h3" title="{{ url['url_object'].name }}">
2020-07-12 01:56:29 +02:00
{# HTTPs or not #}
2020-06-04 18:23:36 +02:00
{% if url['encrypted'] %}
2020-08-06 17:47:39 +02:00
<img src="/static/secure.svg" title="Encrypted request" width="21" height="21"/>
2020-05-27 12:38:25 +02:00
{% else %}
2020-08-06 17:47:39 +02:00
<img src="/static/insecure.svg" title="Unencrypted request" width="21" height="21"/>
2020-05-27 12:38:25 +02:00
{%endif%}
2020-07-12 01:56:29 +02:00
{# URL #}
2020-07-15 18:04:34 +02:00
... /{{ shorten_string(url['url_path'], 50)}}
2020-07-30 17:45:07 +02:00
{# Copy full URL to clipbard #}
<button type="button" class="btn btn-default btn-copy js-copy"
data-bs-toggle="tooltip" data-bs-placement="bottom" data-copy="{{ url['url_object'].name }}" data-original-title="Copy to clipboard">
2020-07-30 17:45:07 +02:00
<svg class="bi bi-clipboard" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/>
<path fill-rule="evenodd" d="M9.5 1h-3a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/>
</svg>
</button>
2020-05-27 12:38:25 +02:00
</div>
{% if url['url_object'].ip_address %}
<div>
IP from HAR: <b>{{ url['url_object'].ip_address }}</b>
{% if uwhois_available %}(<a href="{{ url_for('whois', query=url['url_object'].ip_address)}}">whois</a>){% endif %}
</div>
{% endif %}
{% if url['url_object'].security_details %}
<div>TLS certificate details:
<ul>
{% for k, v in url['url_object'].security_details.items() %}
<li><b>{{k}}</b>: {{v}}</li>
{% endfor%}
</ul>
</div>
{% endif %}
<div></div>
2020-05-23 03:37:24 +02:00
<ul class="list-group">
2020-07-17 18:39:50 +02:00
<li class="list-group-item">
<p class="h4">Request</p>
{{ popup_icons_request(url['url_object'], tree_uuid) }}
2020-07-17 18:39:50 +02:00
{% if url['url_object'].posted_data %}
<a href="{{ url_for('urlnode_post_request', tree_uuid=tree_uuid, node_uuid=url['url_object'].uuid) }}">
Download posted data
</a></br>
{% if url['url_object'].posted_data is string %}
Posted data size: {{ sizeof_fmt(url['url_object'].posted_data|length) }}
{% endif %}
2020-07-17 18:39:50 +02:00
{% endif %}
{% if url['cookies_sent'] %}
<div>
<p class="h5">This request contains cookies.
<button class="btn btn-primary collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#request_cookies_full_list_{{ url['url_object'].uuid }}" aria-expanded="false" aria-controls="collapseExample">
2020-07-17 18:39:50 +02:00
<span class="if-collapsed">Show cookies sent.</span>
<span class="if-not-collapsed">Hide cookies sent.</span>
</button>
</p>
<div class="collapse" id="request_cookies_full_list_{{ url['url_object'].uuid }}">
<div class="card card-body">
{{ indexed_cookies("List of cookies sent in the request", "Node setting this cookie", url['cookies_sent']) }}
2020-07-17 18:39:50 +02:00
</div>
</div>
</div>
{% endif %}
</li>
2020-05-23 03:37:24 +02:00
<li class="list-group-item">
{# Details of the response #}
2020-08-07 15:14:13 +02:00
<p class="h4">Response
<small>(Status code:
<span title="{{ http_status_description(url['url_object'].response['status']) }}">
{{ url['url_object'].response['status'] }})
</span>
-
<span>Load time: {{ url['url_object'].time.total_seconds() }}s</span>
2020-08-07 15:14:13 +02:00
</small>
</p>
{{ popup_icons_response(url['url_object'], tree_uuid) }}
2020-05-28 17:33:43 +02:00
{% if url['url_object'].downloaded_filename %}
<div>
{% if has_pandora %}
<div> Downloaded file: <b>{{url['url_object'].downloaded_filename}}</b> ({{sizeof_fmt(url['url_object'].downloaded_file.getbuffer().nbytes)}})</div>
{{ pandora_submit() }}
{% else %}
<a href="{{ url_for('data', tree_uuid=tree_uuid)}}">
Download {{url['url_object'].downloaded_filename}}
</a> ({{sizeof_fmt(url['url_object'].downloaded_file.getbuffer().nbytes)}})
{% endif%}
</div>
{% endif%}
{% if url['url_object'].rendered_html %}
<div>
<a href="{{ url_for('urlnode_rendered_content', tree_uuid=tree_uuid, node_uuid=url['url_object'].uuid) }}">
Download rendered HTML page
2022-08-14 17:23:23 +02:00
</a>({{ sizeof_fmt(url['url_object'].rendered_html.getbuffer().nbytes)}})
</br>
<a href="{{ url_for('urlnode_urls_in_rendered_content', tree_uuid=tree_uuid, node_uuid=url['url_object'].uuid) }}">
Download URLs in rendered HTML page
</a>
</div>
{% endif %}
<div>
{% if url['url_object'].empty_response %}
Empty HTML body.
{% else %}
{{ ressource_legitimacy_details(url['legitimacy'], url['url_object'].body.getbuffer().nbytes) }}
{% if has_pandora %}
{{ pandora_submit(url['url_object'].uuid) }}
{% endif %}
{% endif %}
</div>
2020-05-27 12:38:25 +02:00
2020-08-25 18:00:16 +02:00
{% if url['known_content'] %}
{{ known_content_details(url['known_content']) }}
{% endif %}
2020-07-12 01:56:29 +02:00
{# Everything we know about the response content #}
2020-07-15 01:35:55 +02:00
{% if url['body_hash_details'] and url['body_hash_details']['hash_freq'] %}
<div>
This file can be found <b>{{ url['body_hash_details']['hash_freq'] }}</b> times
across all the captures on this lookyloo instance, in <b>{{ url['body_hash_details']['hash_domains_freq'] }}</b> unique domains.
2022-07-27 14:36:56 +02:00
{# other captures related with the same content #}
2020-07-11 02:10:56 +02:00
{% if 'other_captures' in url['body_hash_details'] %}
2022-08-14 17:49:04 +02:00
</br>
2020-07-12 01:56:29 +02:00
{{ indexed_hash(url['body_hash_details']['other_captures'], url['url_object'].uuid) }}
{% endif %}
2020-07-12 01:56:29 +02:00
{# Link to list of captures with the same hash #}
<p>
2021-04-20 17:32:17 +02:00
<a href="{{ url_for('body_hash_details', body_hash=url['url_object'].body_hash, from_popup=True) }}">
Show more information about this response body.
2020-07-12 01:56:29 +02:00
</a>
</p>
</div>
2023-07-24 16:00:55 +02:00
{% if url['url_object'].hhhash %}
<button type="button" class="btn btn-sm btn-link" onclick="openURLInNewTab('{{ url_for('hhh_detail', hhh=url['url_object'].hhhash) }}')">See other captures with the same HTTP Headers Hash</button>
{% endif %}
{% endif %}
{% if enable_context_by_users %}
2022-08-14 17:49:04 +02:00
</br>
{{ context_form(tree_uuid, url['url_object'].uuid, hostnode_uuid, url['url_object'].body_hash, 'hostnode_popup') }}
{% endif %}
2020-05-28 17:33:43 +02:00
{% if url['embedded_ressources'] %}
2020-07-12 01:56:29 +02:00
{# Details on embedded resources #}
2020-07-17 18:39:50 +02:00
<div><b>This response contains embedded ressources</b>
<button class="btn btn-primary collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#embedded_full_list_{{ url['url_object'].uuid }}" aria-expanded="false" aria-controls="collapseExample">
2020-07-17 18:39:50 +02:00
<span class="if-collapsed">Show embedded resources.</span>
<span class="if-not-collapsed">Hide embedded resources.</span>
</button>
2020-07-17 18:39:50 +02:00
</div>
<div class="collapse" id="embedded_full_list_{{ url['url_object'].uuid }}">
<div class="card card-body">
{% for hash, details in url['embedded_ressources'].items() %}
<div>
2020-08-25 18:00:16 +02:00
{% if details['known_content'] %}
{{ known_content_details(details['known_content']) }}
{% endif %}
{{ ressource_legitimacy_details(details['legitimacy'], details['body_size']) }}
</div>
{% if has_pandora %}
{{ pandora_submit(url['url_object'].uuid, hash) }}
{% endif %}
<div>
This file {% if details['type'] %}(<b>{{ details['type'] }}</b>){% endif %} can be found <b>{{ details['hash_freq'] }}</b> times
across all the captures on this lookyloo instance, in <b>{{ details['hash_domains_freq'] }}</b> unique domains.
{{ get_ressource_button(tree_uuid, url['url_object'].uuid, hash,
'Download the embedded ressource',
details['type'] and details['type'].startswith('image')) }}
</br>
{% if enable_context_by_users %}
{{ context_form(tree_uuid, url['url_object'].uuid, hostnode_uuid, hash, 'hostnode_popup') }}
{% endif %}
2020-07-11 02:10:56 +02:00
{% if 'other_captures' in details %}
2020-07-12 01:56:29 +02:00
{{ indexed_hash(details['other_captures'], hash) }}
{% endif %}
2021-04-20 17:32:17 +02:00
<p><a href="{{ url_for('body_hash_details', body_hash=url['url_object'].body_hash, from_popup=True) }}">
Show more information about this embedded content.
</a></p>
</div>
{% endfor %}
</div>
</div>
{% endif %}
2020-06-04 18:23:36 +02:00
{% if url['cookies_received'] %}
2020-06-11 15:13:31 +02:00
<div>
<p class="h5">This response contains cookies.
<button class="btn btn-primary collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#response_cookies_full_list_{{ url['url_object'].uuid }}" aria-expanded="false" aria-controls="collapseExample">
2020-07-17 18:39:50 +02:00
<span class="if-collapsed">Show cookies received.</span>
<span class="if-not-collapsed">Hide cookies received.</span>
</button>
</p>
<div class="collapse" id="response_cookies_full_list_{{ url['url_object'].uuid }}">
<div class="card card-body">
{{ indexed_cookies("This response contains 3rd party cookies:", "Node sending this cookie", url['cookies_received']['3rd_party']) }}
{{ indexed_cookies("Cookies, sent somewhere in the capture", "Node sending this cookie", url['cookies_received']['sent']) }}
{{ indexed_cookies("Cookies, never sent", "", url['cookies_received']['not_sent']) }}
</div>
</div>
</div>
2020-06-04 18:23:36 +02:00
{% endif %}
2020-05-23 03:37:24 +02:00
</li>
2020-06-09 15:06:35 +02:00
</ul>
2020-05-23 03:37:24 +02:00
</li>
{% endfor %}
2020-05-22 17:36:22 +02:00
</ul>
2020-05-18 18:35:20 +02:00
{% endblock %}