mirror of
https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
synced 2026-10-12 02:06:59 +00:00
* Runtime Executable Tampering Detection * Add security.py * Code QA Performance * Code QA Runtime EXEC tampering detection * Corellium API QA + Domain support * REST API Docs + Datatables export
1863 lines
74 KiB
HTML
Executable File
1863 lines
74 KiB
HTML
Executable File
{% extends "base/base_layout.html" %}
|
||
{% load static %}
|
||
{% block sidebar_option %}
|
||
sidebar-mini
|
||
{% endblock %}
|
||
{% block extra_css %}
|
||
<!-- DataTables -->
|
||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
|
||
<style type="text/css" media="print">
|
||
@page { size: landscape; }
|
||
@media print {
|
||
.btn, #scan_options {
|
||
display: none;
|
||
}
|
||
}
|
||
</style>
|
||
<style>
|
||
#app_icon{
|
||
width: 64px;
|
||
height: 64px;
|
||
}
|
||
#pre-wrap {
|
||
white-space: pre-wrap; /* css-3 */
|
||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||
white-space: -pre-wrap; /* Opera 4-6 */
|
||
white-space: -o-pre-wrap; /* Opera 7 */
|
||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||
}
|
||
</style>
|
||
{% endblock %}
|
||
{% block sidebar %}
|
||
<!-- Main Sidebar Container -->
|
||
<!-- Sidebar -->
|
||
<div class="sidebar">
|
||
<!-- Sidebar user panel (optional) -->
|
||
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
|
||
<div class="info">
|
||
<a href="#" class="d-block">Static Analyzer</a>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Sidebar Menu -->
|
||
<nav class="mt-2">
|
||
<ul class="nav nav-pills nav-sidebar flex-column nav-child-indent" data-widget="treeview" role="menu" data-accordion="false">
|
||
|
||
<li class="nav-item">
|
||
<a href="#information" class="nav-link">
|
||
<i class="nav-icon fas fa-info-circle"></i>
|
||
<p>
|
||
Information
|
||
</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#scan_options" class="nav-link">
|
||
<i class="nav-icon fas fa-cog"></i>
|
||
<p>
|
||
Scan Options
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<li class="nav-item">
|
||
<a href="#url_schemes" class="nav-link">
|
||
<i class="nav-icon fas fa-hashtag"></i>
|
||
<p>
|
||
URL Schemes
|
||
</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#permissions" class="nav-link">
|
||
<i class="nav-icon fas fa-list"></i>
|
||
<p>
|
||
Permissions
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
<li class="nav-item has-treeview">
|
||
<a href="#" class="nav-link">
|
||
<i class="nav-icon fas fa-shield-alt"></i>
|
||
<p>
|
||
Security Analysis
|
||
<i class="fas fa-angle-left right"></i>
|
||
</p>
|
||
</a>
|
||
<ul class="nav nav-treeview">
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<li class="nav-item">
|
||
<a href="#transport_security" class="nav-link">
|
||
<i class="nav-icon fas fa-lock"></i>
|
||
<p>
|
||
Transport Security
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
<li class="nav-item">
|
||
<a href="#binary_code_analysis" class="nav-link">
|
||
<i class="fa fa-code nav-icon"></i>
|
||
<p>
|
||
Binary Code Analysis
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<li class="nav-item">
|
||
<a href="#binary_analysis" class="nav-link">
|
||
<i class="nav-icon fa fa-braille"></i>
|
||
<p>
|
||
Binary Analysis
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
{% if app_type not in 'A' %}
|
||
<li class="nav-item">
|
||
<a href="#dylib_analysis" class="nav-link">
|
||
<i class="nav-icon fas fa-flag"></i>
|
||
<p>Dylib & Framework Analysis</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
{% if app_type in 'A' %}
|
||
<li class="nav-item">
|
||
<a href="#a_analysis" class="nav-link">
|
||
<i class="nav-icon fas fa-flag"></i>
|
||
<p>Static Library Analysis</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<li class="nav-item">
|
||
<a href="#file_analysis" class="nav-link">
|
||
<i class="nav-icon fa fa-file"></i>
|
||
<p>
|
||
File Analysis
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
</ul>
|
||
</li>
|
||
<li class="nav-item has-treeview">
|
||
<a href="#" class="nav-link">
|
||
<i class="nav-icon fa fa-bug"></i>
|
||
<p>
|
||
Malware Analysis
|
||
<i class="fas fa-angle-left right"></i>
|
||
</p>
|
||
</a>
|
||
<ul class="nav nav-treeview">
|
||
{% if virus_total %}
|
||
<li class="nav-item">
|
||
<a href="#virus_total" class="nav-link">
|
||
<i class="nav-icon fas fa-spider"></i>
|
||
<p>
|
||
VirusTotal
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
<li class="nav-item">
|
||
<a href="#serverlocations" class="nav-link">
|
||
<i class="fas fa-globe-asia nav-icon"></i>
|
||
<p>Server Locations</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#malware_check" class="nav-link">
|
||
<i class="fab fa-searchengin nav-icon"></i>
|
||
<p>Domain Malware Check</p>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="nav-item has-treeview">
|
||
<a href="#" class="nav-link">
|
||
<i class="nav-icon fa fa-plus"></i>
|
||
<p>
|
||
Reconnaissance
|
||
<i class="fas fa-angle-left right"></i>
|
||
</p>
|
||
</a>
|
||
<ul class="nav nav-treeview">
|
||
<li class="nav-item">
|
||
<a href="#urls" class="nav-link">
|
||
<i class="fas fa-globe nav-icon"></i>
|
||
<p>URLs</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#firebase" class="nav-link">
|
||
<i class="fas fa-database nav-icon"></i>
|
||
<p>Firebase DB</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#emails" class="nav-link">
|
||
<i class="fas fa-envelope nav-icon"></i>
|
||
<p>Emails</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#trackers" class="nav-link">
|
||
<i class="fas fa-user-secret nav-icon"></i>
|
||
<p>Trackers</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#secrets" class="nav-link">
|
||
<i class="fas fa-key nav-icon"></i>
|
||
<p>Hardcoded Secrets</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#strings" class="nav-link">
|
||
<i class="fas fa-font nav-icon"></i>
|
||
<p>Strings</p>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
{% if app_type in 'Dylib,A' %}
|
||
<li class="nav-item">
|
||
<a href="#symbols" class="nav-link">
|
||
<i class="fa fa-th nav-icon"></i>
|
||
<p>Symbols</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<li class="nav-item">
|
||
<a href="#libraries" class="nav-link">
|
||
<i class="fab fa-buffer nav-icon"></i>
|
||
<p>Libraries</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#files" class="nav-link">
|
||
<i class="nav-icon far fa-copy"></i>
|
||
<p>
|
||
Files
|
||
</p>
|
||
</a>
|
||
</li>
|
||
{% endif %}
|
||
<li class="nav-item">
|
||
<a href="{% url "pdf" checksum=md5 %}" class="nav-link">
|
||
<i class="nav-icon fas fa-file-pdf"></i>
|
||
<p>
|
||
PDF Report
|
||
</p>
|
||
</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="javascript:window.print()" class="nav-link">
|
||
<i class="nav-icon fa fa-print"></i>
|
||
<p>
|
||
Print Report
|
||
</p>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
<!-- /.sidebar-menu -->
|
||
</div>
|
||
<!-- /.sidebar -->
|
||
{% endblock %}
|
||
{% block content %}
|
||
<!-- Content Wrapper. Contains page content -->
|
||
<div class="content-wrapper">
|
||
<!-- Content Header (Page header) -->
|
||
<div class="content-header">
|
||
<!--
|
||
<div class="container-fluid">
|
||
<div class="row mb-2">
|
||
<div id="mobsf_header" align="center">
|
||
</div>
|
||
</div>
|
||
</div>-->
|
||
</div>
|
||
<!-- /.content-header -->
|
||
|
||
|
||
<!-- Main content -->
|
||
<a id="information" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<h5 class="card-title"></h5>
|
||
<div class="row">
|
||
<div class="col-2">
|
||
<p><strong><i class="fas fa-check-double"></i> APP SCORES</strong></p>
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<img id="app_icon" src="{% if not appstore_details.error %}{{appstore_details.icon}}{% elif icon_path %}/download/{{ icon_path }}{% else %}{% static 'img/no_icon.png' %}{% endif %}"/>
|
||
<p>
|
||
{% if average_cvss %}
|
||
<span class="badge bg-info">Average CVSS</span> <strong>{{ average_cvss }} </strong><br/>
|
||
{% endif %}
|
||
<span class="badge bg-{% if appsec.security_score < 40 %}danger{% elif appsec.security_score == 100 %}success{% else %}warning{% endif %}">Security Score</span> <strong>{{ appsec.security_score }}/100 </strong><br/>
|
||
{% endif %}
|
||
{% if trackers.detected_trackers > 0 %}
|
||
<span class="badge bg-warning">Trackers Detection</span> <strong>{{ trackers.detected_trackers }}/{{ trackers.total_trackers }}</strong><br/>
|
||
{% else %}
|
||
<span class="badge bg-success">Trackers Detection</span> <strong>{{ trackers.detected_trackers }}/{{ trackers.total_trackers }}</strong><br/>
|
||
{% endif %}
|
||
{% if virus_total and virus_total.items|length > 9 %}
|
||
{% if virus_total.positives > 0 %}
|
||
<span class="badge bg-danger">VirusTotal Detection</span> <strong>{{ virus_total.positives }}/{{ virus_total.total }}</strong><br/>
|
||
{% else %}
|
||
<span class="badge bg-success">VirusTotal Detection</span> <strong>{{ virus_total.positives }}/{{ virus_total.total }}</strong><br/>
|
||
{% endif %}
|
||
{% endif %}
|
||
</p>
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<p> <a href="{% url 'appsec_dashboard' checksum=md5 %}" class="btn btn-outline-primary btn-sm" role="button"><i class="fas fa-user-shield"></i> MobSF Scorecard</a></p>
|
||
{% endif %}
|
||
</div>
|
||
<div class="col-4">
|
||
<p><strong><i class="fas fa-box-open"></i> FILE INFORMATION </strong></p>
|
||
<span class="badge bg-primary">File Name</span>
|
||
{{ file_name }}<br/>
|
||
<span class="badge bg-primary">Size</span>
|
||
{{ size }}<br/>
|
||
<span class="badge bg-primary">MD5</span>
|
||
{{ md5 }}<br/>
|
||
<span class="badge bg-primary">SHA1</span>
|
||
{{ sha1 }}<br/>
|
||
<span class="badge bg-primary">SHA256</span>
|
||
{{ sha256 }}<br/>
|
||
</div>
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<div class="col-3">
|
||
<p><strong><i class="fas fa-info"></i> APP INFORMATION </strong></p>
|
||
<span class="badge bg-primary">App Name</span>
|
||
{{ app_name }}<br/>
|
||
<span class="badge bg-primary">App Type</span>
|
||
{{ app_type }}<br/>
|
||
<span class="badge bg-primary">Identifier</span>
|
||
{{ bundle_id }}<br/>
|
||
<span class="badge bg-primary">SDK Name</span>
|
||
{{ sdk_name }}<br/>
|
||
<span class="badge bg-primary">Version</span>
|
||
{{ app_version }}
|
||
<span class="badge bg-primary">Build</span>
|
||
{{ build }}
|
||
<span class="badge bg-primary">Platform Version</span>
|
||
{{ platform }}
|
||
<span class="badge bg-primary">Min OS Version</span>
|
||
{{ min_os_version }} <br/>
|
||
<span class="badge bg-primary">Supported Platforms</span>
|
||
{% for pl in bundle_supported_platforms %}
|
||
{{pl}},
|
||
{% endfor %}
|
||
</div>
|
||
{% endif %}
|
||
<div class="col-3">
|
||
<p><strong><i class="fas fa-ad"></i> BINARY INFORMATION </strong></p>
|
||
<span class="badge bg-primary">Arch</span>
|
||
{{ binary_info.arch }}<br/>
|
||
<span class="badge bg-primary">Sub Arch</span>
|
||
{{ binary_info.subarch }}<br/>
|
||
<span class="badge bg-primary">Bit</span>
|
||
{{ binary_info.bit }}
|
||
<span class="badge bg-primary">Endian</span>
|
||
{{ binary_info.endian }}<br/>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<!-- App Store -->
|
||
{% if not appstore_details.error %}
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fab fa-app-store-ios"></i> APP STORE INFORMATION</strong>
|
||
</p>
|
||
<span class="badge bg-info">Title</span>
|
||
{{ appstore_details.title }} <br/>
|
||
<span class="badge bg-info">Score</span>
|
||
{{ appstore_details.score}}
|
||
<span class="badge bg-info">Features</span>
|
||
{% for fea in appstore_details.features %}
|
||
{{ fea }},
|
||
{% endfor %}
|
||
<span class="badge bg-info">Price</span>
|
||
{{ appstore_details.price }}
|
||
<span class="badge bg-info">Category</span>
|
||
{% for cat in appstore_details.category %}
|
||
{{ cat }},
|
||
{% endfor %}
|
||
<span class="badge bg-info">App Store URL</span>
|
||
<a target="_blank" href="{{ appstore_details.itunes_url }}" rel="noopener noreferrer">{{ appstore_details.app_id }} </a>
|
||
<br/>
|
||
<span class="badge bg-info">Developer</span>
|
||
{{appstore_details.developer}},
|
||
<span class="badge bg-info">Developer ID</span>
|
||
{{appstore_details.developer_id}} <br/>
|
||
<span class="badge bg-info">Developer Website</span>
|
||
{{appstore_details.developer_website }} <br/>
|
||
<span class="badge bg-info">Developer URL</span>
|
||
{{appstore_details.developer_url}} <br/>
|
||
<span class="badge bg-info">Supported Devices</span>
|
||
{% for dev in appstore_details.supported_devices %}
|
||
{{ dev }},
|
||
{% endfor %}
|
||
<br/>
|
||
<span class="badge bg-info">Description</span>
|
||
<pre id="pre-wrap">{{ appstore_details.description }}</pre>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
{% endif %}
|
||
{% endif %}
|
||
<!-- /.col -->
|
||
<!-- row and container-->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- =========================end information==================================== -->
|
||
|
||
|
||
|
||
<a id="scan_options" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
|
||
<div class="col-lg-4">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-cog"></i> SCAN OPTIONS</strong>
|
||
</p>
|
||
<a role="button" class="btn btn-info" href="{% url 'static_analyzer_ios' checksum=md5 %}?rescan=1" ><i class="fa fa-sync"></i> Rescan</a>
|
||
<a id="supbtn" onclick="list_suppressions()" role="button" class="btn btn-primary" data-target="#sup_list" data-toggle="modal" href="#"><i class="fa fa-list"></i> Manage Suppressions</a>
|
||
</p>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<div class="col-lg-8">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-file-code"></i> DECOMPILED ASSETS</strong>
|
||
</p>
|
||
<p>
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<a role="button" class="btn btn-primary" data-target="#mplist" data-toggle="modal" href="#"><i class="fa fa-list"></i> View Info.plist</a>
|
||
{% endif %}
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<a target="_blank" href="{% url 'view_file_ios' %}?file=classdump.txt&md5={{ md5 }}&type=ios" class="btn btn-warning" role="button"><i class="fa fa-code"></i> View Class Dump</a>
|
||
{% endif %}
|
||
<a href="{% url 'generate_downloads' %}?hash={{ md5 }}&file_type={% if app_type in 'Dylib' %}dylib{% elif app_type in 'A' %}a{% else %}ipa{% endif %}" class="btn btn-warning"> <i class="fa fa-download"></i> Download {% if app_type in 'Dylib' %}DYLIB{% elif app_type in 'A' %}A{% else %}IPA{% endif %}</a>
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end scan options================================== -->
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<a id="url_schemes" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-hashtag"></i> CUSTOM URL SCHEMES</strong>
|
||
<p>
|
||
{% if bundle_url_types|length > 0 %}
|
||
<div class="table-responsive">
|
||
<table class="table table-bordered table-hover table-striped">
|
||
|
||
<thead>
|
||
<tr>
|
||
<th>URL NAME</th>
|
||
<th>SCHEMES</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for scheme in bundle_url_types %}
|
||
<tr>
|
||
<td>
|
||
{{scheme | key:"CFBundleURLName" }}
|
||
{% if scheme|key:"CFBundleTypeRole" %}
|
||
<br>
|
||
{{scheme | key:"CFBundleTypeRole" }}
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
{% if scheme|key:"CFBundleURLSchemes" %}
|
||
{% for ul in scheme.CFBundleURLSchemes %}
|
||
{{ul}} <br/>
|
||
{% endfor %}
|
||
{% endif %}
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{% else %}
|
||
<p>
|
||
No URL Schemes found.
|
||
</p>
|
||
{% endif %}
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end url schemes ================================== -->
|
||
|
||
<a id="permissions" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fa fa-list"></i> APPLICATION PERMISSIONS</strong>
|
||
<p>
|
||
{% if permissions %}
|
||
<div class="table-responsive">
|
||
<table class="table table-bordered table-hover table-striped">
|
||
|
||
<thead>
|
||
<tr>
|
||
<th>PERMISSIONS</th>
|
||
<th>STATUS</th>
|
||
<th>INFO</th>
|
||
<th>REASON IN MANIFEST</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
|
||
{% for perm, desc in permissions.items %}
|
||
<tr>
|
||
<td>
|
||
{{ perm }}
|
||
</td>
|
||
<td>
|
||
{% if desc.status == 'dangerous' %}
|
||
<span class="badge bg-danger">dangerous</span>
|
||
{% else %}
|
||
<span class="badge bg-info">normal</span>
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
{{ desc.info}}
|
||
</td>
|
||
<td>
|
||
{{ desc.description }}
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{% else %}
|
||
<p>
|
||
No Permissions required.
|
||
</p>
|
||
{% endif %}
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end permission ================================== -->
|
||
<a id="transport_security" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-lock"></i> APP TRANSPORT SECURITY (ATS)</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if ats_analysis and 'ats_summary' in ats_analysis and ats_analysis.ats_summary|length > 0 %}
|
||
<div class="row">
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block border-right">
|
||
<span class="text-danger">HIGH</span>
|
||
<h5 class="description-header">{{ ats_analysis.ats_summary.high }}</h5>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block border-right">
|
||
<span class="text-warning"></i> WARNING</span>
|
||
<h5 class="description-header">{{ ats_analysis.ats_summary.warning }}</h5>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block border-right">
|
||
<span class="text-info">INFO</span>
|
||
<h5 class="description-header">{{ ats_analysis.ats_summary.info }}</h5>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block">
|
||
<span class="text-success">SECURE</span>
|
||
<h5 class="description-header">{{ ats_analysis.ats_summary.secure }}</h5>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
{% endif %}
|
||
<table class="table table-bordered table-hover table-striped">
|
||
|
||
<thead>
|
||
<tr>
|
||
<th>NO</th>
|
||
<th>ISSUE</th>
|
||
<th>SEVERITY</th>
|
||
<th>DESCRIPTION</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% if ats_analysis and 'ats_findings' in ats_analysis %}
|
||
{% for findings in ats_analysis.ats_findings %}
|
||
<tr>
|
||
<td>{{ forloop.counter }}</td>
|
||
<td>
|
||
{{findings.issue}}
|
||
<td>
|
||
{% if findings.severity == "high" %}
|
||
<span class="badge bg-danger"> high </span>
|
||
{% elif findings.severity == "secure" %}
|
||
<span class="badge bg-success"> secure</span>
|
||
{% elif findings.severity == "warning" %}
|
||
<span class="badge bg-warning"> warning</span>
|
||
{% elif findings.severity == "info" %}
|
||
<span class="badge bg-info"> info</span>
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
{{findings.description}}
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
{% endif %}
|
||
</tbody>
|
||
</table>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ===========================end transport security ================================== -->
|
||
{% endif %}
|
||
<a id="binary_code_analysis" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fa fa-code"></i> {% if app_type not in 'Dylib,A' %}IPA {% endif %}BINARY CODE ANALYSIS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if binary_analysis and 'summary' in binary_analysis and binary_analysis.summary|length > 0 %}
|
||
<div class="row">
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block border-right">
|
||
<span class="text-danger">HIGH</span>
|
||
<h5 class="description-header">{{ binary_analysis.summary.high }}</h5>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block border-right">
|
||
<span class="text-warning"></i> WARNING</span>
|
||
<h5 class="description-header">{{ binary_analysis.summary.warning }}</h5>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block border-right">
|
||
<span class="text-info">INFO</span>
|
||
<h5 class="description-header">{{ binary_analysis.summary.info }}</h5>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block border-right">
|
||
<span class="text-success">SECURE</span>
|
||
<h5 class="description-header">{{ binary_analysis.summary.secure }}</h5>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="col-sm-2 col-6">
|
||
<div class="description-block">
|
||
<span class="text-disabled">SUPPRESSED</span>
|
||
<h5 class="description-header">{{ binary_analysis.summary.suppressed }}</h5>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
</div>
|
||
{% endif %}
|
||
<table id="table_code" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>NO</th>
|
||
<th>ISSUE</th>
|
||
<th>SEVERITY</th>
|
||
<th>STANDARDS</th>
|
||
<th>DESCRIPTION</th>
|
||
<th>OPTIONS</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% if binary_analysis and 'findings' in binary_analysis %}
|
||
{% for issue, details in binary_analysis.findings.items %}
|
||
<tr>
|
||
<td>{{ forloop.counter }}</td>
|
||
<td>
|
||
{{ issue }}
|
||
</td>
|
||
<td>
|
||
{% if details|key:"severity" == 'info' %}
|
||
<span class='badge bg-info'>info</span>
|
||
{% elif details|key:"severity" == 'good' %}
|
||
<span class='badge bg-success'>secure</span>
|
||
{% elif details|key:"severity" == 'high' %}
|
||
<span class='badge bg-danger'>high</span>
|
||
{% elif details|key:"severity" == 'warning' %}
|
||
<span class='badge bg-warning'>warning</span>
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
{% if average_cvss %}
|
||
<strong>CVSS V2:</strong>
|
||
{{ details|key:"cvss" }}
|
||
{% if details|key:"cvss" > 6 %}
|
||
(high)
|
||
{% elif details|key:"cvss" == 0 %}
|
||
(info)
|
||
{% elif details|key:"cvss" >= 4 %}
|
||
(medium)
|
||
{% elif details|key:"cvss" < 4 %}
|
||
(low)
|
||
{% endif %}
|
||
</br>
|
||
{% endif %}
|
||
{% if details|key:"cwe" %} <strong>CWE: </strong>{{ details|key:"cwe" }}{% endif %}
|
||
{% if details|key:"owasp-mobile" %}</br> <strong>OWASP Top 10: </strong>{{ details|key:"owasp-mobile" }}{% endif %}
|
||
{% if details|key:"masvs" %}</br> <strong>OWASP MASVS: </strong>{{ details|key:"masvs" }}{% endif %}
|
||
</td>
|
||
<td>
|
||
{{ details|key:"detailed_desc" }}
|
||
</td>
|
||
<td>
|
||
|
||
<div class="dropdown show">
|
||
<a class="btn btn-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||
<i class="fa fa-eye-slash"></i>
|
||
</a>
|
||
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
|
||
<a style="cursor:pointer;" class="dropdown-item" onclick="suppress('{{issue | escapejs }}', false, $(this.closest('tr')))">Suppress the rule <b>{{ issue }}</b> in <b>{{bundle_id}}</b></a>
|
||
</div>
|
||
</div>
|
||
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
{% endif %}
|
||
</tbody>
|
||
</table>
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end binary code analysis ================================== -->
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<a id="binary_analysis" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fa fa-braille"></i> IPA BINARY ANALYSIS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
<table class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>PROTECTION</th>
|
||
<th>STATUS</th>
|
||
<th>SEVERITY</th>
|
||
<th>DESCRIPTION</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% if not macho_analysis %}
|
||
Binary Analysis Failed.
|
||
{% else %}
|
||
<tr>
|
||
<td><b>NX</b></td>
|
||
<td>{{macho_analysis.nx.has_nx}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.nx.severity == 'high' %}danger{% elif macho_analysis.nx.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.nx.severity}}</span></td>
|
||
<td>{{macho_analysis.nx.description}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>PIE</b></td>
|
||
<td>{{macho_analysis.pie.has_pie}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.pie.severity == 'high' %}danger{% elif macho_analysis.pie.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.pie.severity}}</span></td>
|
||
<td>{{macho_analysis.pie.description}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>STACK CANARY</b></td>
|
||
<td>{{macho_analysis.stack_canary.has_canary}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.stack_canary.severity == 'high' %}danger{% elif macho_analysis.stack_canary.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.stack_canary.severity}}</span></td>
|
||
<td>{{macho_analysis.stack_canary.description}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>ARC</b></td>
|
||
<td>{{macho_analysis.arc.has_arc}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.arc.severity == 'high' %}danger{% elif macho_analysis.arc.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.arc.severity}}</span></td>
|
||
<td>{{macho_analysis.arc.description}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>RPATH</b></td>
|
||
<td>{{macho_analysis.rpath.has_rpath}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.rpath.severity == 'high' %}danger{% elif macho_analysis.rpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.rpath.severity}}</span></td>
|
||
<td>{{macho_analysis.rpath.description}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>CODE SIGNATURE</b></td>
|
||
<td>{{macho_analysis.code_signature.has_code_signature}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.code_signature.severity == 'high' %}danger{% elif macho_analysis.code_signature.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.code_signature.severity}}</span></td>
|
||
<td>{{macho_analysis.code_signature.description}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>ENCRYPTED</b></td>
|
||
<td>{{macho_analysis.encrypted.is_encrypted}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.encrypted.severity == 'high' %}danger{% elif macho_analysis.encrypted.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.encrypted.severity}}</span></td>
|
||
<td>{{macho_analysis.encrypted.description}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>SYMBOLS STRIPPED</b></td>
|
||
<td>{{macho_analysis.symbol.is_stripped}}</td>
|
||
<td><span class="badge bg-{% if macho_analysis.symbol.severity == 'high' %}danger{% elif macho_analysis.symbol.severity == 'warning' %}warning{% else %}info{% endif %}">{{macho_analysis.symbol.severity}}</span></td>
|
||
<td>{{macho_analysis.symbol.description}}</td>
|
||
</tr>
|
||
{% endif %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ===========================end binary analysis ================================== -->
|
||
{% endif %}
|
||
{% if app_type not in 'A' %}
|
||
<a id="dylib_analysis" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fa fa-flag"></i> DYNAMIC LIBRARY & FRAMEWORK BINARY ANALYSIS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
<table id="table_dylib" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
{% if app_type not in 'Dylib' %}
|
||
<th>NO</th>
|
||
<th>DYLIB/FRAMEWORK</th>
|
||
{% endif %}
|
||
<th>NX</th>
|
||
<th>STACK CANARY</th>
|
||
<th>ARC</th>
|
||
<th>RPATH</th>
|
||
<th>CODE SIGNATURE</th>
|
||
<th>ENCRYPTED</th>
|
||
<th>SYMBOLS STRIPPED</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% if not dylib_analysis and not framework_analysis %}
|
||
No Dylibs/Frameworks found.
|
||
{% endif %}
|
||
{% for dy in dylib_analysis %}
|
||
<tr>
|
||
{% if app_type not in 'Dylib' %}
|
||
<td>{{ forloop.counter }}</td>
|
||
<td>{{dy.name | relative_path}}</br>
|
||
<a class="btn btn-primary btn-xs" href="{% url 'scan_library' checksum=md5 %}?library={{ dy.name }}" target="_blank" rel="noopener noreferrer"><i class="fa fa-search"></i> Analyze</a>
|
||
</td>
|
||
{% endif %}
|
||
<td><b>{{dy.nx.has_nx}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.nx.severity == 'high' %}danger{% elif dy.nx.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.nx.severity}}</span>
|
||
<br/>{{dy.nx.description}}</td>
|
||
<td><b>{{dy.stack_canary.has_canary}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.stack_canary.severity == 'high' %}danger{% elif dy.stack_canary.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.stack_canary.severity}}</span>
|
||
<br/>{{dy.stack_canary.description}}</td>
|
||
<td><b>{{dy.arc.has_arc}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.arc.severity == 'high' %}danger{% elif dy.arc.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.arc.severity}}</span>
|
||
<br/>{{dy.arc.description}}</td>
|
||
<td><b>{{dy.rpath.has_rpath}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.rpath.severity == 'high' %}danger{% elif dy.rpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.rpath.severity}}</span>
|
||
<br/>{{dy.rpath.description}}</td>
|
||
<td><b>{{dy.code_signature.has_code_signature}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.code_signature.severity == 'high' %}danger{% elif dy.code_signature.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.code_signature.severity}}</span>
|
||
<br/>{{dy.code_signature.description}}</td>
|
||
<td><b>{{dy.encrypted.is_encrypted}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.encrypted.severity == 'high' %}danger{% elif dy.encrypted.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.encrypted.severity}}</span>
|
||
<br/>{{dy.encrypted.description}}</td>
|
||
<td><b>{{dy.symbol.is_stripped}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.symbol.severity == 'high' %}danger{% elif dy.symbol.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.symbol.severity}}</span>
|
||
<br/>{{dy.symbol.description}}</td>
|
||
</tr>
|
||
{% endfor %}
|
||
{% for frm in framework_analysis %}
|
||
<tr>
|
||
<td>{{ forloop.counter }}</td>
|
||
<td>{{frm.name | relative_path}}</br>
|
||
<a class="btn btn-primary btn-xs" href="{% url 'scan_library' checksum=md5 %}?library={{ frm.name }}" target="_blank" rel="noopener noreferrer"><i class="fa fa-search"></i> Analyze</a>
|
||
</td>
|
||
<td><b>{{frm.nx.has_nx}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if frm.nx.severity == 'high' %}danger{% elif frm.nx.severity == 'warning' %}warning{% else %}info{% endif %}">{{frm.nx.severity}}</span>
|
||
<br/>{{frm.nx.description}}</td>
|
||
<td><b>{{frm.stack_canary.has_canary}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if frm.stack_canary.severity == 'high' %}danger{% elif frm.stack_canary.severity == 'warning' %}warning{% else %}info{% endif %}">{{frm.stack_canary.severity}}</span>
|
||
<br/>{{frm.stack_canary.description}}</td>
|
||
<td><b>{{frm.arc.has_arc}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if frm.arc.severity == 'high' %}danger{% elif frm.arc.severity == 'warning' %}warning{% else %}info{% endif %}">{{frm.arc.severity}}</span>
|
||
<br/>{{frm.arc.description}}</td>
|
||
<td><b>{{frm.rpath.has_rpath}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if frm.rpath.severity == 'high' %}danger{% elif frm.rpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{frm.rpath.severity}}</span>
|
||
<br/>{{frm.rpath.description}}</td>
|
||
<td><b>{{frm.code_signature.has_code_signature}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if frm.code_signature.severity == 'high' %}danger{% elif frm.code_signature.severity == 'warning' %}warning{% else %}info{% endif %}">{{frm.code_signature.severity}}</span>
|
||
<br/>{{frm.code_signature.description}}</td>
|
||
<td><b>{{frm.encrypted.is_encrypted}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if frm.encrypted.severity == 'high' %}danger{% elif frm.encrypted.severity == 'warning' %}warning{% else %}info{% endif %}">{{frm.encrypted.severity}}</span>
|
||
<br/>{{frm.encrypted.description}}</td>
|
||
<td><b>{{frm.symbol.is_stripped}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if frm.symbol.severity == 'high' %}danger{% elif frm.symbol.severity == 'warning' %}warning{% else %}info{% endif %}">{{frm.symbol.severity}}</span>
|
||
<br/>{{frm.symbol.description}}</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end dylib analysis ================================== -->
|
||
{% endif %}
|
||
<!--static library-->
|
||
{% if app_type in 'A' %}
|
||
|
||
<a id="a_analysis" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fa fa-flag"></i> STATIC LIBRARY BINARY ANALYSIS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
|
||
{% if binary_info.arch == 'MachO' %}
|
||
|
||
<table id="table_macho_static" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>NO</th>
|
||
<th>STATIC OBJECT</th>
|
||
<th>NX</th>
|
||
<th>STACK CANARY</th>
|
||
<th>ARC</th>
|
||
<th>RPATH</th>
|
||
<th>SYMBOLS STRIPPED</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% if not dylib_analysis %}
|
||
No Static Objects found.
|
||
{% endif %}
|
||
{% for dy in dylib_analysis %}
|
||
<tr>
|
||
<td>{{ forloop.counter }}</td>
|
||
<td>{{dy.name}}</td>
|
||
<td><b>{{dy.nx.has_nx}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.nx.severity == 'high' %}danger{% elif dy.nx.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.nx.severity}}</span>
|
||
<br/>{{dy.nx.description}}</td>
|
||
<td><b>{{dy.stack_canary.has_canary}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.stack_canary.severity == 'high' %}danger{% elif dy.stack_canary.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.stack_canary.severity}}</span>
|
||
<br/>{{dy.stack_canary.description}}</td>
|
||
<td><b>{{dy.arc.has_arc}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.arc.severity == 'high' %}danger{% elif dy.arc.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.arc.severity}}</span>
|
||
<br/>{{dy.arc.description}}</td>
|
||
<td><b>{{dy.rpath.has_rpath}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.rpath.severity == 'high' %}danger{% elif dy.rpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.rpath.severity}}</span>
|
||
<br/>{{dy.rpath.description}}</td>
|
||
<td><b>{{dy.symbol.is_stripped}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if dy.symbol.severity == 'high' %}danger{% elif dy.symbol.severity == 'warning' %}warning{% else %}info{% endif %}">{{dy.symbol.severity}}</span>
|
||
<br/>{{dy.symbol.description}}</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% else %}
|
||
|
||
<table id="table_elf_static" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>NO</th>
|
||
<th>SHARED OBJECT</th>
|
||
<th>NX</th>
|
||
<th>STACK CANARY</th>
|
||
<th>RPATH</th>
|
||
<th>RUNPATH</th>
|
||
<th>FORTIFY</th>
|
||
<th>SYMBOLS STRIPPED</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% if not dylib_analysis %}
|
||
No Static Objects found.
|
||
{% endif %}
|
||
{% for so in dylib_analysis %}
|
||
<tr>
|
||
<td>{{ forloop.counter }}</td>
|
||
<td>{{so.name}}</td>
|
||
<td><b>{{so.nx.is_nx}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if so.nx.severity == 'high' %}danger{% elif so.nx.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.nx.severity}}</span>
|
||
<br/>{{so.nx.description}}</td>
|
||
<td><b>{{so.stack_canary.has_canary}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if so.stack_canary.severity == 'high' %}danger{% elif so.stack_canary.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.stack_canary.severity}}</span>
|
||
<br/>{{so.stack_canary.description}}</td>
|
||
<td><b>{{so.rpath.rpath}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if so.rpath.severity == 'high' %}danger{% elif so.rpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.rpath.severity}}</span>
|
||
<br/>{{so.rpath.description}}</td>
|
||
<td><b>{{so.runpath.runpath}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if so.runpath.severity == 'high' %}danger{% elif so.runpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.runpath.severity}}</span>
|
||
<br/>{{so.runpath.description}}</td>
|
||
<td><b>{{so.fortify.is_fortified}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if so.fortify.severity == 'high' %}danger{% elif so.fortify.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.fortify.severity}}</span>
|
||
<br/>{{so.fortify.description}}</td>
|
||
<td><b>{{so.symbol.is_stripped}}</b>
|
||
<br/>
|
||
<span class="badge bg-{% if so.symbol.severity == 'high' %}danger{% elif so.symbol.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.symbol.severity}}</span>
|
||
<br/>{{so.symbol.description}}</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
|
||
{% endif %}
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end a analysis ================================== -->
|
||
|
||
{% endif %}
|
||
<!-- end static library-->
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<a id="file_analysis" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fa fa-file"></i> FILE ANALYSIS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
<table class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>NO</th>
|
||
<th>ISSUE</th>
|
||
<th>FILES</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for item in file_analysis %}
|
||
<tr>
|
||
<td>{{ forloop.counter }}</td>
|
||
<td>
|
||
{{ item.issue }}
|
||
</td>
|
||
<td>
|
||
{% for file in item.files %}
|
||
{% if file.type %}
|
||
<a href="{% url 'view_file_ios' %}?file={{file.file_path}}&type={{file.type}}&md5={{file.hash}}">{{ file.file_path }}</a>
|
||
{% else %}
|
||
{{ file.file_path }}
|
||
{% endif %}
|
||
<br/>
|
||
{% endfor %}
|
||
</td>
|
||
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end file analysis ================================== -->
|
||
{% endif %}
|
||
{% if virus_total %}
|
||
<a id="virus_total" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-spider"></i> VIRUSTOTAL SCAN</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if virus_total.items|length < 9 %} {% comment %} Basic check to determine if the response is a msg or a result {% endcomment %}
|
||
<p align="left"> <strong>{{ virus_total.verbose_msg }}</strong></p>
|
||
{% else %}
|
||
<p align="left"> <strong> {{ virus_total.positives }} / {{ virus_total.total }} AVs found this file Malicious! </strong> <a href="{{ virus_total.permalink }}" target="_blank" rel="noopener"><i class="fas fa-th-list"></i> Full Report</a></p>
|
||
{% if virus_total.positives > 0 %}
|
||
<table id="table_vt" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>AV</th>
|
||
<th>DETECTION</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for av_name,av_result in virus_total.scans.items %}
|
||
{% if av_result.detected == True %}
|
||
<tr>
|
||
<td>
|
||
{{ av_name }}
|
||
</td>
|
||
<td>
|
||
<span class="badge bg-danger">{{ av_result.result }}</span>
|
||
</td>
|
||
</tr>
|
||
{% endif %}
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}{% comment %} if results.positive > 0 {% endcomment %}
|
||
{% endif %}{% comment %} if this is the upload msg or a result {% endcomment %}
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
{% endif %}
|
||
<!-- ===========================end virus total ================================== -->
|
||
<style>
|
||
#chartdiv {
|
||
width: 100%;
|
||
height: 500px;
|
||
overflow: hidden;
|
||
}
|
||
</style>
|
||
<a id="serverlocations" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-globe-asia"></i> SERVER LOCATIONS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
<div id="chartdiv"></div>
|
||
</div>
|
||
|
||
<div class="table-responsive">
|
||
{% if domains %}
|
||
<p></br>This app may communicate with the following OFAC sanctioned list of countries.</p>
|
||
<table id="table_ofac" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>DOMAIN</th>
|
||
<th>COUNTRY/REGION</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for domain, details in domains.items %}
|
||
{% if details|key:"ofac" == True %}
|
||
<tr><td>{{domain}}</td>
|
||
<td>
|
||
<strong>IP: </strong>{{details|key:"geolocation"|key:"ip"}} <br/>
|
||
<strong>Country: </strong>{{details|key:"geolocation"|key:"country_long"}} <br/>
|
||
<strong>Region: </strong>{{details|key:"geolocation"|key:"region"}} <br/>
|
||
<strong>City: </strong>{{details|key:"geolocation"|key:"city"}} <br/>
|
||
</td>
|
||
</tr>
|
||
{% endif %}
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
</div>
|
||
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end server locations ================================== -->
|
||
<a id="malware_check" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fab fa-searchengin"></i> DOMAIN MALWARE CHECK</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if domains %}
|
||
<table id="table_malware" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>DOMAIN</th>
|
||
<th>STATUS</th>
|
||
<th>GEOLOCATION</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for domain, details in domains.items %}
|
||
<tr><td>{{domain}}</td><td>
|
||
|
||
{% if details|key:"bad" == "yes" %}
|
||
<span class="badge bg-danger">malware</span><br/>
|
||
<pre>
|
||
<strong>URL: </strong>{{details|key:"domain_or_url"}}
|
||
<strong>IP: </strong><span class="badge bg-danger">{{details|key:"ip"}}</span>
|
||
<strong>Description: </strong>{{details|key:"desc"}}
|
||
</pre>
|
||
{% else %}
|
||
<span class="badge bg-success">ok</span><br/>
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
{% if details|key:"geolocation" %}
|
||
<strong>IP: </strong>{{details|key:"geolocation"|key:"ip"}} <br/>
|
||
<strong>Country: </strong>{{details|key:"geolocation"|key:"country_long"}} <br/>
|
||
<strong>Region: </strong>{{details|key:"geolocation"|key:"region"}} <br/>
|
||
<strong>City: </strong>{{details|key:"geolocation"|key:"city"}} <br/>
|
||
<strong>Latitude: </strong>{{details|key:"geolocation"|key:"latitude"}} <br/>
|
||
<strong>Longitude: </strong>{{details|key:"geolocation"|key:"longitude"}} <br/>
|
||
<strong>View: <a target="_blank" href="http://maps.google.com/maps?q={{details|key:"geolocation"|key:"latitude"}},{{details|key:"geolocation"|key:"longitude"}}">Google Map</a>
|
||
|
||
{% else %}
|
||
No Geolocation information available.
|
||
{% endif %}
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end domain malware check ================================== -->
|
||
<a id="urls" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-globe"></i> URLS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if urls %}
|
||
<table id="table_urls" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>URL</th>
|
||
<th>FILE</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for urldict in urls %}
|
||
<tr>
|
||
<td>
|
||
{% for u in urldict|key:"urls" %}
|
||
{{ u }} <br/>
|
||
{% endfor %}
|
||
</td>
|
||
<td>
|
||
<a href="{% url 'view_file_ios' %}?file={{urldict|key:"path"}}&md5={{ md5}}&type=ipa">{{urldict|key:"path"}}</a>
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end urls ================================== -->
|
||
<a id="firebase" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-database"></i> FIREBASE DATABASE</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if firebase_urls %}
|
||
<table id="table_firebase" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>FIREBASE URL</th>
|
||
<th>DETAILS</th>
|
||
</tr>
|
||
</thead>
|
||
|
||
<tbody>
|
||
{% for item in firebase_urls %}
|
||
<tr>
|
||
<td>
|
||
{{ item.url }}
|
||
</td>
|
||
<td>
|
||
{% if item.open %}
|
||
<span class="badge bg-danger">high</span><br/>Firebase Database is exposed publicly.
|
||
{% else %}
|
||
<span class="badge bg-primary">info</span><br/>App talks to a Firebase database.
|
||
{% endif %}
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end firebase db ================================== -->
|
||
<a id="emails" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-envelope"></i> EMAILS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if emails %}
|
||
<table id="table_emails" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>EMAIL</th>
|
||
<th>FILE</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for email_dict in emails %}
|
||
<tr>
|
||
<td>
|
||
{% for e in email_dict|key:"emails" %}
|
||
{{ e }} <br/>
|
||
{% endfor %}
|
||
</td>
|
||
<td>
|
||
<a href="{% url 'view_file_ios' %}?file={{email_dict|key:"path"}}&md5={{ md5}}&type=ipa">{{email_dict|key:"path"}}</a>
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end emails ================================== -->
|
||
<a id="trackers" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-user-secret"></i> TRACKERS</strong>
|
||
</p>
|
||
<div class="table-responsive">
|
||
{% if trackers %}
|
||
<table id="table_trackers" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>TRACKER NAME</th>
|
||
<th>CATEGORIES</th>
|
||
<th>URL</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for trk in trackers|key:"trackers" %}
|
||
<tr>
|
||
<td>
|
||
{{trk.name}}
|
||
</td>
|
||
<td>
|
||
{{trk.categories}}
|
||
</td>
|
||
<td>
|
||
<a target="_blank" href="{{trk.url}}" rel="noopener noreferrer">{{trk.url}}</a>
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end trackers ================================== -->
|
||
<a id="secrets" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-key"></i> POSSIBLE HARDCODED SECRETS</strong>
|
||
</p>
|
||
<div class="list-group">
|
||
<p>
|
||
{% for val in secrets %}
|
||
{{ val }}<br/>
|
||
{% endfor %}
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end secrets ================================== -->
|
||
<a id="strings" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fas fa-font"></i> STRINGS</strong>
|
||
</p>
|
||
<div class="list-group">
|
||
{% for string in strings %}
|
||
{{string}} <br>
|
||
{% endfor %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end strings ================================== -->
|
||
{% if app_type in 'Dylib,A' %}
|
||
<a id="symbols" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fa fa-th"></i> SYMBOLS</strong>
|
||
</p>
|
||
<div class="list-group">
|
||
<p>
|
||
{% for val in file_analysis %}
|
||
{{ val }}<br/>
|
||
{% endfor %}
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end symbols (only for dylibs) ================================== -->
|
||
{% endif %}
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<a id="libraries" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="fab fa-buffer"></i> LIBRARIES</strong>
|
||
</p>
|
||
<div class="list-group">
|
||
<p>
|
||
{% for lib in libraries %}
|
||
{{ lib }}
|
||
<br/>
|
||
{% endfor %}
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end libraries ================================== -->
|
||
<a id="files" class="anchor"></a>
|
||
<section class="content">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<p>
|
||
<strong><i class="far fa-copy"></i> FILES</strong>
|
||
</p>
|
||
<div class="list-group">
|
||
<p>
|
||
{% for file in files %}
|
||
{{ file}} <br/>
|
||
{% endfor %}
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><!-- /.card -->
|
||
</div>
|
||
<!-- end row -->
|
||
</div>
|
||
</section>
|
||
<!-- ===========================end files ================================== -->
|
||
{% endif %}
|
||
<!-- end of contents -->
|
||
</div>
|
||
|
||
{% if app_type not in 'Dylib,A' %}
|
||
<!-- Modal -->
|
||
|
||
<div class="modal" id="mplist" tabindex="-1" role="dialog">
|
||
<div class="modal-dialog modal-xl">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<h4 class="modal-title">Info.plist</h4>
|
||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||
<span aria-hidden="true">×</span>
|
||
</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<pre><code>
|
||
{{ info_plist }}
|
||
</code></pre>
|
||
</div>
|
||
</div>
|
||
<!-- /.modal-content -->
|
||
</div>
|
||
<!-- /.modal-dialog -->
|
||
</div>
|
||
{% endif %}
|
||
|
||
<!--Modals-->
|
||
<div class="modal" id="sup_list" tabindex="-1" role="dialog">
|
||
<div class="modal-dialog modal-xl">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<h4 class="modal-title">Suppression Rules</h4>
|
||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||
<span aria-hidden="true">×</span>
|
||
</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<table id="sup_table" class="table table-bordered table-hover table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>Suppression Type</th>
|
||
<th>By Rule ID</th>
|
||
<th>By Files</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<!-- /.modal-content -->
|
||
</div>
|
||
<!-- /.modal-dialog -->
|
||
</div>
|
||
|
||
|
||
{% endblock %}
|
||
<!--end new UI-->
|
||
{% block extra_scripts %}
|
||
<!-- DataTables -->
|
||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||
<script src="{% static "amcharts/core.js" %}"></script>
|
||
<script src="{% static "amcharts/maps.js" %}"></script>
|
||
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
|
||
<script src="{% static "amcharts/animated.js" %}"></script>
|
||
<script src="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.js" %}"></script>
|
||
<script>
|
||
var list_suppressions_url = '{% url 'list_suppressions' %}';
|
||
var suppress_by_files_url = '{% url 'suppress_by_files' %}';
|
||
var suppress_by_rule_url = '{% url 'suppress_by_rule' %}';
|
||
var delete_suppression_url = '{% url 'delete_suppression' %}';
|
||
</script>
|
||
<script src="{% static "others/js/suppression.js" %}"></script>
|
||
<script>
|
||
|
||
// Remove rescan parameter
|
||
window.history.replaceState({}, '', window.location.pathname);
|
||
|
||
|
||
// Globals
|
||
const csrf = '{{ csrf_token }}'
|
||
const pkg = '{{ bundle_id }}'
|
||
const hash = '{{ md5 }}'
|
||
|
||
|
||
// Navbar Active
|
||
$(".nav-link").on("click", function() {
|
||
$(".nav-link").removeClass("active");
|
||
$(this).addClass("active");
|
||
});
|
||
</script>
|
||
<script>
|
||
// Themes begin
|
||
am4core.useTheme(am4themes_animated);
|
||
// Themes end
|
||
|
||
// Create map instance
|
||
var chart = am4core.create("chartdiv", am4maps.MapChart);
|
||
|
||
// Set map definition
|
||
chart.geodata = am4geodata_worldIndiaLow;
|
||
|
||
// Set projection
|
||
chart.projection = new am4maps.projections.Miller();
|
||
|
||
// Create map polygon series
|
||
var polygonSeries = chart.series.push(new am4maps.MapPolygonSeries());
|
||
|
||
// Exclude Antartica
|
||
polygonSeries.exclude = ["AQ"];
|
||
|
||
// Make map load polygon (like country names) data from GeoJSON
|
||
polygonSeries.useGeodata = true;
|
||
|
||
// Configure series
|
||
var polygonTemplate = polygonSeries.mapPolygons.template;
|
||
polygonTemplate.tooltipText = "{name}";
|
||
polygonTemplate.polygon.fillOpacity = 0.6;
|
||
|
||
// Create hover state and set alternative fill color
|
||
var hs = polygonTemplate.states.create("hover");
|
||
hs.properties.fill = chart.colors.getIndex(0);
|
||
|
||
// Add image series
|
||
var imageSeries = chart.series.push(new am4maps.MapImageSeries());
|
||
imageSeries.mapImages.template.propertyFields.longitude = "longitude";
|
||
imageSeries.mapImages.template.propertyFields.latitude = "latitude";
|
||
imageSeries.mapImages.template.tooltipText = "{title}";
|
||
imageSeries.mapImages.template.propertyFields.url = "url";
|
||
|
||
var circle = imageSeries.mapImages.template.createChild(am4core.Circle);
|
||
circle.radius = 3;
|
||
circle.propertyFields.fill = "color";
|
||
|
||
var circle2 = imageSeries.mapImages.template.createChild(am4core.Circle);
|
||
circle2.radius = 3;
|
||
circle2.propertyFields.fill = "color";
|
||
|
||
|
||
circle2.events.on("inited", function(event){
|
||
animateBullet(event.target);
|
||
})
|
||
|
||
function animateBullet(circle) {
|
||
var animation = circle.animate([{ property: "scale", from: 1, to: 5 }, { property: "opacity", from: 1, to: 0 }], 1000, am4core.ease.circleOut);
|
||
animation.events.on("animationended", function(event){
|
||
animateBullet(event.target.object);
|
||
})
|
||
}
|
||
|
||
var colorSet = new am4core.ColorSet();
|
||
imageSeries.data = [
|
||
{% if domains %}
|
||
{% for domain, details in domains.items %}
|
||
{% if details|key:"geolocation" %}
|
||
{
|
||
'title': '{{details|key:"geolocation"|key:"country_long"}}/{{details|key:"geolocation"|key:"region"}}',
|
||
'latitude': {{details|key:"geolocation"|key:"latitude"}},
|
||
'longitude': {{details|key:"geolocation"|key:"longitude"}},
|
||
'color':colorSet.next()
|
||
},
|
||
{% endif %}
|
||
{% endfor %}
|
||
{% endif %}
|
||
];
|
||
</script>
|
||
{% endblock %}
|