2020-05-18 18:35:20 +02:00
|
|
|
{% extends "main.html" %}
|
|
|
|
|
2020-05-19 17:47:55 +02:00
|
|
|
{% block title %}Details for {{ hostname }} {% endblock %}
|
2020-05-18 18:35:20 +02:00
|
|
|
|
|
|
|
{% block scripts %}
|
2020-05-27 12:38:25 +02:00
|
|
|
{{ super() }}
|
2020-05-18 18:35:20 +02:00
|
|
|
<script>
|
2020-06-04 18:23:36 +02:00
|
|
|
function whereAmI(hostname_uuid) {
|
|
|
|
window.opener.ProcessChildMessage(hostname_uuid);
|
2020-05-18 18:35:20 +02:00
|
|
|
};
|
|
|
|
</script>
|
2020-05-27 12:38:25 +02:00
|
|
|
<script>
|
|
|
|
// Source: https://codepen.io/nathanlong/pen/ZpAmjv
|
|
|
|
function copyToClipboard(text, el) {
|
|
|
|
var elOriginalText = el.attr('data-original-title');
|
|
|
|
|
|
|
|
var copyTextArea = document.createElement("textarea");
|
|
|
|
copyTextArea.value = text;
|
|
|
|
document.body.appendChild(copyTextArea);
|
|
|
|
copyTextArea.select();
|
|
|
|
|
|
|
|
var successful = document.execCommand('copy');
|
|
|
|
var msg = successful ? 'Copied!' : 'Whoops, not copied!';
|
|
|
|
el.attr('data-original-title', msg).tooltip('show');
|
|
|
|
|
|
|
|
document.body.removeChild(copyTextArea);
|
|
|
|
el.attr('data-original-title', elOriginalText);
|
|
|
|
}
|
|
|
|
|
|
|
|
$(document).ready(function() {
|
|
|
|
// Copy to clipboard
|
|
|
|
// Grab any text in the attribute 'data-copy' and pass it to the copy function
|
|
|
|
$('.js-copy').tooltip();
|
|
|
|
$('.js-copy').click(function() {
|
|
|
|
var text = $(this).attr('data-copy');
|
|
|
|
var el = $(this);
|
|
|
|
copyToClipboard(text, el);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
2020-05-18 18:35:20 +02:00
|
|
|
{% endblock %}
|
|
|
|
|
|
|
|
{% block content %}
|
2020-05-19 17:47:55 +02:00
|
|
|
<center>
|
|
|
|
<h3>{{ hostname }}</h3>
|
2020-06-04 18:23:36 +02:00
|
|
|
<button type="button" class="btn btn-info" onclick="whereAmI('{{ hostname_uuid }}')">Locate node on tree</button>
|
2020-05-20 19:11:15 +02:00
|
|
|
<a href="{{ url_for('hostnode_details_text', tree_uuid=tree_uuid, node_uuid=hostname_uuid) }}" class="btn btn-info" role="button">Get URLs as text</a>
|
2020-05-19 17:47:55 +02:00
|
|
|
</center>
|
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-05-23 03:37:24 +02:00
|
|
|
<li class="list-group-item">
|
2020-05-27 12:38:25 +02:00
|
|
|
<div class="h3">
|
|
|
|
<button type="button" class="btn btn-default btn-copy js-copy"
|
2020-06-04 18:23:36 +02:00
|
|
|
data-toggle="tooltip" data-placement="bottom" data-copy="{{ url['url_object'].name }}" title="Copy to clipboard">
|
2020-05-27 12:38:25 +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-06-04 18:23:36 +02:00
|
|
|
{% if url['encrypted'] %}
|
2020-05-27 12:38:25 +02:00
|
|
|
<svg class="bi bi-lock" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
|
|
<path fill-rule="evenodd" d="M11.5 8h-7a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1zm-7-1a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h7a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-7zm0-3a3.5 3.5 0 1 1 7 0v3h-1V4a2.5 2.5 0 0 0-5 0v3h-1V4z"/>
|
|
|
|
</svg>
|
|
|
|
{% else %}
|
|
|
|
<svg class="bi bi-unlock" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
|
|
<path fill-rule="evenodd" d="M9.655 8H2.333c-.264 0-.398.068-.471.121a.73.73 0 0 0-.224.296 1.626 1.626 0 0 0-.138.59V14c0 .342.076.531.14.635.064.106.151.18.256.237a1.122 1.122 0 0 0 .436.127l.013.001h7.322c.264 0 .398-.068.471-.121a.73.73 0 0 0 .224-.296 1.627 1.627 0 0 0 .138-.59V9c0-.342-.076-.531-.14-.635a.658.658 0 0 0-.255-.237A1.122 1.122 0 0 0 9.655 8zm.012-1H2.333C.5 7 .5 9 .5 9v5c0 2 1.833 2 1.833 2h7.334c1.833 0 1.833-2 1.833-2V9c0-2-1.833-2-1.833-2zM8.5 4a3.5 3.5 0 1 1 7 0v3h-1V4a2.5 2.5 0 0 0-5 0v3h-1V4z"/>
|
|
|
|
</svg>
|
|
|
|
{%endif%}
|
2020-06-11 15:13:31 +02:00
|
|
|
... /{{ url['url_path_short'] }}
|
2020-05-27 12:38:25 +02:00
|
|
|
</div>
|
2020-05-23 03:37:24 +02:00
|
|
|
<ul class="list-group">
|
|
|
|
<li class="list-group-item">
|
|
|
|
<p class="h4">Response</p>
|
2020-05-28 17:33:43 +02:00
|
|
|
|
2020-05-23 03:37:24 +02:00
|
|
|
<div>
|
|
|
|
{% for key, path in keys_response.items() %}
|
2020-06-04 18:23:36 +02:00
|
|
|
{% if url['url_object'][key] %}
|
2020-05-26 17:45:04 +02:00
|
|
|
{% if key == "response_cookie" %}
|
2020-06-04 18:23:36 +02:00
|
|
|
<a href="{{ url_for('urlnode_response_cookies', tree_uuid=tree_uuid, node_uuid=url['url_object'].uuid) }}">
|
2020-05-26 17:45:04 +02:00
|
|
|
<img src="{{ path }}" alt="{{ key }}" width="21" height="21"/>
|
|
|
|
</a>
|
|
|
|
{% else %}
|
2020-05-23 03:37:24 +02:00
|
|
|
<img src="{{ path }}" alt="{{ key }}" width="21" height="21"/>
|
2020-05-26 17:45:04 +02:00
|
|
|
{%endif%}
|
2020-05-22 17:36:22 +02:00
|
|
|
{%endif%}
|
2020-05-23 03:37:24 +02:00
|
|
|
{% endfor %}
|
|
|
|
</div>
|
2020-05-28 17:33:43 +02:00
|
|
|
|
2020-05-23 03:37:24 +02:00
|
|
|
<div>
|
2020-06-04 18:23:36 +02:00
|
|
|
{% if not url['url_object'].empty_response %}
|
|
|
|
<a href="{{ url_for('urlnode_details', tree_uuid=tree_uuid, node_uuid=url['url_object'].uuid) }}">
|
2020-05-23 03:37:24 +02:00
|
|
|
Download response body.
|
|
|
|
</a></br>
|
2020-06-04 18:23:36 +02:00
|
|
|
Body size: {{ sizeof_fmt(url['url_object'].body.getbuffer().nbytes) }}
|
2020-05-23 03:37:24 +02:00
|
|
|
{% else %}
|
|
|
|
Empty body.
|
2020-05-22 17:36:22 +02:00
|
|
|
{%endif%}
|
2020-05-27 12:38:25 +02:00
|
|
|
</div>
|
2020-05-28 17:33:43 +02:00
|
|
|
|
2020-05-27 12:38:25 +02:00
|
|
|
<div>
|
2020-06-04 18:23:36 +02:00
|
|
|
Status Code: {{ url['url_object'].response['status'] }}
|
2020-05-27 12:38:25 +02:00
|
|
|
</div>
|
|
|
|
|
2020-05-28 17:33:43 +02:00
|
|
|
|
2020-06-20 02:09:45 +02:00
|
|
|
{% if url['sane_js'] %}
|
|
|
|
<div>
|
|
|
|
{% if url['sane_js'] is string %}
|
|
|
|
<b>{{ url['sane_js'] }} </b>
|
|
|
|
{% else %}
|
|
|
|
This file is known as part of <b>{{ url['sane_js'][0] }}</b>
|
|
|
|
version <b>{{ url['sane_js'][1] }}</b>: <b>{{ url['sane_js'][2] }}</b>.
|
|
|
|
{% if url['sane_js'][3] > 1%}
|
|
|
|
It is also present in <b>{{ url['sane_js'][3] -1 }}</b> other libraries.
|
|
|
|
{%endif%}
|
|
|
|
{%endif%}
|
|
|
|
</div>
|
|
|
|
{% endif %}
|
|
|
|
|
2020-06-19 16:10:35 +02:00
|
|
|
{% if url['body_hash_details'] %}
|
2020-06-19 00:25:24 +02:00
|
|
|
<div>
|
2020-06-19 16:10:35 +02:00
|
|
|
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.
|
2020-06-19 00:25:24 +02:00
|
|
|
</br>
|
2020-06-24 11:37:54 +02:00
|
|
|
|
|
|
|
{% set total_captures = url['body_hash_details']['other_captures']['different_url']|length + url['body_hash_details']['other_captures']['same_url']|length %}
|
|
|
|
|
|
|
|
{% if total_captures > 0 %}
|
2020-06-20 02:09:45 +02:00
|
|
|
<p>
|
2020-06-24 11:37:54 +02:00
|
|
|
The same file was seen in <b>{{ total_captures }}</b> other captures.
|
2020-06-20 02:09:45 +02:00
|
|
|
<button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#captureslist_{{ url['url_object'].uuid }}" aria-expanded="false" aria-controls="collapseExample">
|
|
|
|
Toggle list.
|
|
|
|
</button>
|
|
|
|
</p>
|
|
|
|
<div class="collapse" id="captureslist_{{ url['url_object'].uuid }}">
|
|
|
|
<div class="card card-body">
|
2020-06-23 02:16:33 +02:00
|
|
|
{% if url['body_hash_details']['other_captures']['different_url']|length > 0 %}
|
|
|
|
<div>
|
|
|
|
<p>The following captures get the same file from a <b>different URL</b></p>
|
|
|
|
<ul>
|
|
|
|
{% for capture_uuid, urlnode_uuid, title, hostname in url['body_hash_details']['other_captures']['different_url'] %}
|
|
|
|
<li>
|
|
|
|
<a href="{{ url_for('tree', tree_uuid=capture_uuid, urlnode_uuid=urlnode_uuid) }}">{{ title }}</a> - {{ hostname }}
|
|
|
|
</li>
|
|
|
|
{% endfor %}
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
{% endif %}
|
|
|
|
|
|
|
|
{% if url['body_hash_details']['other_captures']['same_url']|length > 0 %}
|
|
|
|
</br>
|
|
|
|
<div>
|
|
|
|
<p>The following captures get the same file from the <b>same URL</b></p>
|
|
|
|
<ul>
|
|
|
|
{% for capture_uuid, urlnode_uuid, title, hostname in url['body_hash_details']['other_captures']['same_url'] %}
|
|
|
|
<li>
|
|
|
|
<a href="{{ url_for('tree', tree_uuid=capture_uuid, urlnode_uuid=urlnode_uuid) }}">{{ title }}</a> - {{ hostname }}
|
|
|
|
</li>
|
|
|
|
{% endfor %}
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
{% endif %}
|
2020-06-20 02:09:45 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{% else %}
|
2020-06-29 11:01:37 +02:00
|
|
|
<p>This file is loaded multiple times in this capture.</p>
|
2020-06-19 16:10:35 +02:00
|
|
|
{% endif %}
|
2020-06-20 02:09:45 +02:00
|
|
|
<p><a href="{{ url_for('body_hash_details', body_hash=url['url_object'].body_hash) }}">
|
|
|
|
Show more information about this response body.
|
|
|
|
</a></p>
|
2020-06-19 00:25:24 +02:00
|
|
|
<div>
|
|
|
|
{% endif %}
|
2020-05-28 17:33:43 +02:00
|
|
|
|
2020-06-04 18:23:36 +02:00
|
|
|
{% if url['cookies_received'] %}
|
2020-06-11 15:13:31 +02:00
|
|
|
<div>
|
|
|
|
<p class="h5">Cookies</p>
|
|
|
|
{% if url['cookies_received']['3rd_party'] %}
|
|
|
|
<div>This response contains 3rd party cookies:</div>
|
|
|
|
<ul>
|
|
|
|
{% for cookie, details in url['cookies_received']['3rd_party'].items() %}
|
2020-06-13 02:49:07 +02:00
|
|
|
{% set cookie_name_value = cookie.split('=', 1) %}
|
2020-06-11 15:13:31 +02:00
|
|
|
{% for detail in details %}
|
|
|
|
{% if detail|length == 1 %}
|
2020-06-13 02:49:07 +02:00
|
|
|
<li>
|
2020-06-23 02:16:33 +02:00
|
|
|
{{ detail[0] }}: <a href="{{ url_for('cookies_name_detail', cookie_name=cookie_name_value[0]) }}">
|
2020-06-13 02:49:07 +02:00
|
|
|
{{ cookie_name_value[0] }}</a>={{ cookie_name_value[1] }}
|
|
|
|
</li>
|
2020-06-11 15:13:31 +02:00
|
|
|
{% else %}
|
2020-06-13 02:49:07 +02:00
|
|
|
<li>
|
2020-06-23 02:16:33 +02:00
|
|
|
{{ detail[0] }}: <a href="{{ url_for('cookies_name_detail', cookie_name=cookie_name_value[0]) }}">
|
2020-06-13 02:49:07 +02:00
|
|
|
{{ cookie_name_value[0] }}</a>={{ cookie_name_value[1] }} -
|
2020-06-11 15:13:31 +02:00
|
|
|
<button type="button" class="btn btn-info" onclick="whereAmI('{{ detail[1] }}')">Show node sending this cookie</button>
|
2020-06-13 02:49:07 +02:00
|
|
|
</li>
|
2020-06-11 15:13:31 +02:00
|
|
|
{% endif %}
|
2020-06-04 18:23:36 +02:00
|
|
|
{% endfor %}
|
2020-06-11 15:13:31 +02:00
|
|
|
{% endfor %}
|
|
|
|
</ul>
|
|
|
|
{% endif %}
|
|
|
|
|
|
|
|
{% if url['cookies_received']['sent'] %}
|
|
|
|
<div>Other cookies sent somewhere else in the capture</div>
|
|
|
|
<ul>
|
|
|
|
{% for cookie, details in url['cookies_received']['sent'].items() %}
|
2020-06-13 02:49:07 +02:00
|
|
|
{% set cookie_name_value = cookie.split('=', 1) %}
|
2020-06-11 15:13:31 +02:00
|
|
|
{% for detail in details %}
|
2020-06-13 02:49:07 +02:00
|
|
|
<li>
|
|
|
|
{{ detail[0] }}: <a href="{{ url_for('cookies_name_detail', cookie_name=cookie_name_value[0]) }}">
|
|
|
|
{{ cookie_name_value[0] }}</a>={{ cookie_name_value[1] }}
|
2020-06-11 15:13:31 +02:00
|
|
|
<button type="button" class="btn btn-info" onclick="whereAmI('{{ detail[1] }}')">Show node sending this cookie</button>
|
|
|
|
</li>
|
|
|
|
{% endfor %}
|
|
|
|
{% endfor %}
|
|
|
|
</ul>
|
|
|
|
{% endif %}
|
|
|
|
|
|
|
|
{% if url['cookies_received']['not_sent'] %}
|
|
|
|
<div>Other cookies, but never sent</div>
|
|
|
|
<ul>
|
|
|
|
{% for cookie, details in url['cookies_received']['not_sent'].items() %}
|
2020-06-13 02:49:07 +02:00
|
|
|
{% set cookie_name_value = cookie.split('=', 1) %}
|
2020-06-11 15:13:31 +02:00
|
|
|
{% for detail in details %}
|
2020-06-13 02:49:07 +02:00
|
|
|
<li>
|
|
|
|
{{ detail[0] }}: <a href="{{ url_for('cookies_name_detail', cookie_name=cookie_name_value[0]) }}">
|
|
|
|
{{ cookie_name_value[0] }}</a>={{ cookie_name_value[1] }}
|
|
|
|
</li>
|
2020-06-11 15:13:31 +02:00
|
|
|
{% endfor %}
|
|
|
|
{% endfor %}
|
|
|
|
</ul>
|
|
|
|
{% endif %}
|
|
|
|
<div>
|
2020-06-04 18:23:36 +02:00
|
|
|
{% endif %}
|
2020-05-23 03:37:24 +02:00
|
|
|
</li>
|
2020-05-28 17:33:43 +02:00
|
|
|
|
2020-05-23 03:37:24 +02:00
|
|
|
<li class="list-group-item">
|
|
|
|
<p class="h4">Request</p>
|
|
|
|
<div>
|
|
|
|
{% for key, path in keys_request.items() %}
|
2020-06-04 18:23:36 +02:00
|
|
|
{% if url['url_object'][key] %}
|
2020-05-26 17:45:04 +02:00
|
|
|
{% if key == "request_cookie" %}
|
2020-06-04 18:23:36 +02:00
|
|
|
<a href="{{ url_for('urlnode_request_cookies', tree_uuid=tree_uuid, node_uuid=url['url_object'].uuid) }}">
|
2020-05-26 17:45:04 +02:00
|
|
|
<img src="{{ path }}" alt="{{ key }}" width="21" height="21"/>
|
|
|
|
</a>
|
|
|
|
{% else %}
|
2020-05-23 03:37:24 +02:00
|
|
|
<img src="{{ path }}" alt="{{ key }}" width="21" height="21"/>
|
2020-05-26 17:45:04 +02:00
|
|
|
{%endif%}
|
2020-05-23 03:37:24 +02:00
|
|
|
{%endif%}
|
|
|
|
{% endfor %}
|
|
|
|
</div>
|
2020-06-04 18:23:36 +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) }}">
|
2020-05-23 03:37:24 +02:00
|
|
|
Download posted data
|
|
|
|
</a></br>
|
2020-06-04 18:23:36 +02:00
|
|
|
Posted data size: {{ sizeof_fmt(url['url_object'].posted_data|length) }}
|
|
|
|
{% endif %}
|
|
|
|
|
|
|
|
{% if url['cookies_sent'] %}
|
2020-06-11 15:13:31 +02:00
|
|
|
<div>
|
|
|
|
<p class="h5">Cookies</p>
|
|
|
|
<div>List of cookies sent in the request</div>
|
|
|
|
<ul>
|
2020-06-04 18:23:36 +02:00
|
|
|
{% for cookie, details in url['cookies_sent'].items() %}
|
2020-06-13 02:49:07 +02:00
|
|
|
{% set cookie_name_value = cookie.split('=', 1) %}
|
2020-06-11 15:13:31 +02:00
|
|
|
{% for detail in details %}
|
|
|
|
{% if detail|length == 1 %}
|
2020-06-13 02:49:07 +02:00
|
|
|
<li>
|
|
|
|
{{ detail[0] }}: <a href="{{ url_for('cookies_name_detail', cookie_name=cookie_name_value[0]) }}">
|
|
|
|
{{ cookie_name_value[0] }}</a>={{ cookie_name_value[1] }}
|
|
|
|
</li>
|
2020-06-11 15:13:31 +02:00
|
|
|
{%else %}
|
2020-06-13 02:49:07 +02:00
|
|
|
<li>
|
|
|
|
{{ detail[0] }}: <a href="{{ url_for('cookies_name_detail', cookie_name=cookie_name_value[0]) }}">
|
|
|
|
{{ cookie_name_value[0] }}</a>={{ cookie_name_value[1] }}
|
2020-06-11 15:13:31 +02:00
|
|
|
<button type="button" class="btn btn-info" onclick="whereAmI('{{ detail[1] }}')">Show on tree node setting this cookie</button>
|
|
|
|
</li>
|
|
|
|
{% endif %}
|
|
|
|
{% endfor %}
|
2020-06-04 18:23:36 +02:00
|
|
|
{% endfor %}
|
2020-06-11 15:13:31 +02:00
|
|
|
</ul>
|
|
|
|
</div>
|
2020-05-23 03:37:24 +02:00
|
|
|
{% endif %}
|
2020-06-09 15:06:35 +02:00
|
|
|
</li>
|
|
|
|
</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 %}
|