mirror of
https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
synced 2026-10-11 22:50:09 +00:00
343 lines
16 KiB
HTML
343 lines
16 KiB
HTML
{% load static %}
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="description" content="Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis.">
|
|
<meta name="author" content="Ajin Abraham">
|
|
<link rel="icon" href="{% static "img/favicon.ico" %}">
|
|
<title>Mobile Security Framework - MobSF</title>
|
|
<link rel="stylesheet" href="{% static "adminlte/dashboard/css/adminlte.min.css" %}">
|
|
<link rel="stylesheet" href="{% static "adminlte/plugins/fontawesome-free/css/all.min.css" %}">
|
|
<link rel="stylesheet" href="{% static "others/css/spinner.css" %}">
|
|
<link rel="stylesheet" href="{% static "landing/css/home.css" %}">
|
|
<!-- Google Font: Source Sans Pro -->
|
|
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
|
|
</head>
|
|
<body class="text-center">
|
|
|
|
<div class="d-flex h-100 p-3 mx-auto flex-column">
|
|
<nav class="nav nav-masthead justify-content-center">
|
|
<a class="nav-link active" href="{% url 'recent' %}">SCANS</a>
|
|
<a class="nav-link" href="{% url 'dynamic' %}">DYNAMIC ANALYZER</a>
|
|
<div class="pad">
|
|
<img src="{% static "img/mobsf_logo.png" %}" alt="MobSF Logo" height="30" width="90" />
|
|
</div>
|
|
<a class="nav-link" href="{% url 'api_docs' %}">API</a>
|
|
<a class="nav-link" href="{% url 'about' %}">ABOUT</a>
|
|
{% if user.is_authenticated %}
|
|
<a id="dropdownSubMenu1" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="nav-link dropdown-toggle"><i class="fa fa-user-circle" aria-hidden="true"></i> </a>
|
|
<a class="nav-link"></a>
|
|
<ul aria-labelledby="dropdownSubMenu1" class="dropdown-menu border-0 shadow" style="left: 0px; right: inherit;">
|
|
<li><a href="#" class="dropdown-item"> <small>{{ request.user.username }} <span class="badge badge-primary"> {% if user.is_staff %} Admin {% else %}{{ request.user.groups.all.0 }} {% endif %}</span></small></a></li>
|
|
<li class="dropdown-divider"></li>
|
|
<li><a href="{% url 'change_password' %}" class="dropdown-item"><i class="fa fa-asterisk" aria-hidden="true"></i> Change Password </a></li>
|
|
{% if user.is_staff %}<li><a href="{% url 'users' %}" class="dropdown-item"><i class="fa fa-users" aria-hidden="true"></i> User Management </a></li>{% endif %}
|
|
<li><a href="{% url 'logout' %}" class="dropdown-item"><i class="fa fa-power-off" aria-hidden="true"></i> Logout </a></li>
|
|
</ul>
|
|
{% endif %}
|
|
<a class="nav-link">
|
|
<form action="/search" method="GET">
|
|
<input name="md5" type="text" class="form-control form-control-sm" placeholder="Search MD5">
|
|
</form>
|
|
</a>
|
|
</nav>
|
|
|
|
<header class="masthead mb-auto">
|
|
<div class="inner">
|
|
</div>
|
|
</header>
|
|
|
|
<main role="main" class="inner cover">
|
|
<div class="inner cover">
|
|
<div style="visibility:hidden; opacity:0" id="drop">
|
|
<div id="textnode">Drop anywhere!</div>
|
|
</div>
|
|
</br>
|
|
<form id="upload_form" enctype="multipart/form-data" method="post">
|
|
{% csrf_token %}
|
|
<div class="fileUpload btn btn-lg btn-secondary" id="but">
|
|
<input type="file" name="file" id="uploadFile" placeholder="Choose File" multiple>
|
|
<span class="fas fa-cloud-upload-alt"></span>
|
|
Upload & Analyze
|
|
</div>
|
|
<br />
|
|
<small><i>Drag & Drop anywhere!</i></small>
|
|
<p></p>
|
|
<h5 class="lead" id="status"></h5>
|
|
<progress id="progressBar" value="0" max="100" style="width:300px;visibility:hidden;" ></progress>
|
|
</form>
|
|
</div>
|
|
</main>
|
|
|
|
<footer class="mastfoot mt-auto">
|
|
<input type="download" id="package" class="form-control form-control-sm" placeholder="Download & Scan Package"/>
|
|
<p></p>
|
|
<div class="inner">
|
|
<h6> <a href="{% url 'recent' %}">RECENT SCANS</a> | <a href="{% url 'dynamic' %}">DYNAMIC ANALYZER</a> | <a href="{% url 'api_docs' %}">API</a> | <a href="{% url 'donate' %}">DONATE ♥</a> | <a target="_blank"
|
|
href="https://mobsf.github.io/docs/#/">DOCS</a> | <a href="{% url 'about' %}">ABOUT</a></h6>
|
|
</br>
|
|
<p>© {% now "Y" %} Mobile Security Framework - MobSF {{ version }}</p>
|
|
</div>
|
|
<div id="snackbar">Analysis started! Please wait to be redirected or check recent scans after sometime.</div>
|
|
</footer>
|
|
</div>
|
|
|
|
<!--Loading Ring-->
|
|
<div class="hidden loading">
|
|
<div class='uil-ring-css' style='transform:scale(0.79);'>
|
|
<div></div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="{% static "adminlte/plugins/jquery.min.js" %}"></script>
|
|
<script src="{% static "adminlte/plugins/bootstrap/bootstrap.bundle.min.js" %}"></script>
|
|
<script>
|
|
let warning = "This is a demo MobSF instance. Anything uploaded here will be publicly available. Do you want to continue?";
|
|
// Result View
|
|
function load_result(url){
|
|
hide_loader();
|
|
var xhr = new XMLHttpRequest()
|
|
xhr.open('GET', url, true)
|
|
xhr.addEventListener("loadstart", function(evt){
|
|
var x = document.getElementById("snackbar");
|
|
x.className = "show";
|
|
setTimeout(function(){ x.className = x.className.replace("show", ""); }, 10000);
|
|
})
|
|
xhr.addEventListener("load", function (evt) {
|
|
window.location.href = window.location.href + url;
|
|
}, false);
|
|
xhr.send();
|
|
}
|
|
|
|
//Download and scan APK
|
|
$('#package').keypress(function(event){
|
|
var keycode = (event.keyCode ? event.keyCode : event.which);
|
|
if(keycode == '13'){
|
|
_("status").innerText = 'Trying to download ...';
|
|
show_loader();
|
|
$.ajax({
|
|
url : '{% url "download_scan" %}',
|
|
type : "POST",
|
|
dataType: "json",
|
|
data : {
|
|
package: $('#package').val(),
|
|
csrfmiddlewaretoken: '{{ csrf_token }}',
|
|
},
|
|
success : function(json){
|
|
if (json.status === 'ok'){
|
|
i = 1;
|
|
setInterval(function() {
|
|
dot = '';
|
|
for (x = 1; x <= i; x++) {
|
|
dot += '.';
|
|
}
|
|
_("status").innerText = "Analyzing" + dot;
|
|
i += 1;
|
|
if (i == 5) {
|
|
i = 1;
|
|
}
|
|
}, 2000);
|
|
|
|
url = json.analyzer + '/' + json.hash + '/';
|
|
load_result(url);
|
|
} else {
|
|
hide_loader();
|
|
_("status").innerText = json.description;
|
|
}
|
|
},
|
|
error : function(xhr, ajaxOptions, thrownError) {
|
|
hide_loader();
|
|
if (thrownError === 'Forbidden'){
|
|
_("status").innerText = "You do not have permission to download and scan!";
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
function show_loader(){
|
|
var loadingOverlay = document.querySelector('.loading');
|
|
loadingOverlay.classList.remove('hidden');
|
|
}
|
|
|
|
function hide_loader(){
|
|
var loadingOverlay = document.querySelector('.loading');
|
|
loadingOverlay.classList.add('hidden');
|
|
}
|
|
// Existing
|
|
function _(el){
|
|
return document.getElementById(el);
|
|
}
|
|
// Response Handler
|
|
function responseHandler(json, isbutton) {
|
|
if (json.status === 'error') {
|
|
_("status").innerText = json.description;
|
|
} else {
|
|
i = 1;
|
|
setInterval(function() {
|
|
dot = '';
|
|
for (x = 1; x <= i; x++) {
|
|
dot += '.';
|
|
}
|
|
_("status").innerText = "Analyzing" + dot;
|
|
i += 1;
|
|
if (i == 5) {
|
|
i = 1;
|
|
}
|
|
}, 2000);
|
|
var url = json.analyzer + '/' + json.hash + '/';
|
|
load_result(url);
|
|
}
|
|
}
|
|
function progressHandler(event) {
|
|
var percent = (event.loaded / event.total) * 100;
|
|
console.log("Uploaded..." + Math.round(percent));
|
|
_("progressBar").value = Math.round(percent);
|
|
_("status").innerText = Math.round(percent) + "% Uploaded...";
|
|
}
|
|
function completeHandler(event) {
|
|
if(event.currentTarget.status === 403){
|
|
_("status").innerText = "You do not have permission to upload!";
|
|
return;
|
|
} else {
|
|
var json = JSON.parse(event.target.responseText);
|
|
responseHandler(json);
|
|
}
|
|
}
|
|
function errorHandler(event) {
|
|
_("status").innerText = "Upload Failed!";
|
|
}
|
|
function abortHandler(event) {
|
|
_("status").innerText = "Upload Aborted!";
|
|
}
|
|
// Is valid file extensions
|
|
function isValidExt(file_name){
|
|
var val = file_name.toLowerCase();
|
|
var regex = new RegExp("^(.{1,300}?)\.({{exts}})$");
|
|
val = val.replace(/^.*[\\\/]/, '');
|
|
if (!(regex.test(val))) {
|
|
_('status').innerText = "MobSF only supports APK, APKS, XAPK, AAB, JAR, AAR, SO, IPA, DYLIB, A, ZIP, and APPX files.";
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
// Is allowed mimetype
|
|
function isValidMime(file_mime){
|
|
if (file_mime.length < 1)
|
|
// bypass if mime is not available
|
|
return true;
|
|
var supported = [{% for mime in mimes %}'{{mime}}',{% endfor %}];
|
|
if(supported.indexOf(file_mime) >-1)
|
|
return true;
|
|
_('status').innerText = "MIME type (" + file_mime + ") is not supported!";
|
|
return false;
|
|
}
|
|
// File Upload
|
|
function uploadFile(file, i) {
|
|
try {
|
|
if (!isValidExt(file.name) || !isValidMime(file.type)){
|
|
return;
|
|
}
|
|
_("progressBar").style.visibility = "visible";
|
|
var url = '{% url "upload" %}'
|
|
var xhr = new XMLHttpRequest()
|
|
xhr.open('POST', url, true)
|
|
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
|
|
xhr.setRequestHeader("X-CSRFToken", '{{ csrf_token }}');
|
|
xhr.upload.addEventListener("progress", progressHandler, false);
|
|
xhr.addEventListener("load", completeHandler, false);
|
|
xhr.addEventListener("error", errorHandler, false);
|
|
xhr.addEventListener("abort", abortHandler, false);
|
|
var formdata = new FormData();
|
|
formdata.append("file", file);
|
|
xhr.send(formdata)
|
|
} catch (e) {
|
|
alert("Error:" + e);
|
|
}
|
|
}
|
|
|
|
function handleFiles(files) {
|
|
files = [...files]
|
|
files.forEach(uploadFile)
|
|
}
|
|
|
|
// Full Screen Drag & Drop File Upload
|
|
var lastTarget = null;
|
|
function isFile(evt) {
|
|
var dt = evt.dataTransfer;
|
|
|
|
for (var i = 0; i < dt.types.length; i++) {
|
|
if (dt.types[i] === "Files") {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
window.addEventListener("dragenter", function (e) {
|
|
if (isFile(e)) {
|
|
lastTarget = e.target;
|
|
document.querySelector("#drop").style.visibility = "";
|
|
document.querySelector("#drop").style.opacity = 1;
|
|
document.querySelector("#textnode").style.fontSize = "48px";
|
|
}
|
|
});
|
|
|
|
window.addEventListener("dragleave", function (e) {
|
|
e.preventDefault();
|
|
if (e.target === document || e.target === lastTarget) {
|
|
document.querySelector("#drop").style.visibility = "hidden";
|
|
document.querySelector("#drop").style.opacity = 0;
|
|
document.querySelector("#textnode").style.fontSize = "42px";
|
|
}
|
|
});
|
|
|
|
window.addEventListener("dragover", function (e) {
|
|
e.preventDefault();
|
|
});
|
|
|
|
window.addEventListener("drop", function (e) {
|
|
e.preventDefault();
|
|
document.querySelector("#drop").style.visibility = "hidden";
|
|
document.querySelector("#drop").style.opacity = 0;
|
|
document.querySelector("#textnode").style.fontSize = "42px";
|
|
if(e.dataTransfer.files.length > 0) {
|
|
if (document.location.host === 'mobsf.live'){
|
|
if (confirm(warning) == true) {
|
|
handleFiles(e.dataTransfer.files);
|
|
} else {
|
|
return;
|
|
}
|
|
} else {
|
|
handleFiles(e.dataTransfer.files);
|
|
}
|
|
}
|
|
});
|
|
|
|
$(document).ready(function() {
|
|
// Button File Upload
|
|
$('input[type=file]').change(function() {
|
|
_('status').innerText = "";
|
|
if (_("uploadFile").files.length === 0) {
|
|
return;
|
|
}
|
|
var files = _("uploadFile").files;
|
|
if (document.location.host === 'mobsf.live'){
|
|
if (confirm(warning) == true) {
|
|
_("uploadFile").style.display = "none";
|
|
handleFiles(files);
|
|
} else {
|
|
return;
|
|
}
|
|
} else {
|
|
_("uploadFile").style.display = "none";
|
|
handleFiles(files);
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|