feature: UI/UX improvements

This commit is contained in:
Dobin
2024-03-23 12:16:20 +00:00
parent 0333fc2673
commit ba933bd018
7 changed files with 46 additions and 23 deletions
+18 -5
View File
@@ -1,4 +1,6 @@
import pickle
import os
import yaml
from typing import List, Tuple
from model.settings import Settings
@@ -14,20 +16,31 @@ class Storage():
def __init__(self):
self.data: List[Project] = self.get_data()
def get_project(self, name):
def get_project(self, name: str) -> Project:
for project in self.data:
if project.name == name:
return project
return None
def add_project(self, project):
def add_project(self, project: Project):
# data
self.data.append(project)
self.save_data()
def get_data(self):
# directories and contents
os.makedirs("app/projects/{}".format(project.name), exist_ok=True)
with open("app/projects/{}/settings.yaml".format(project.name), "w") as f:
f.write(yaml.dump(project.settings))
def get_data(self) -> List[Project]:
# if file does not exist, create an empty one
if not os.path.exists("app/data.pickle"):
with open("app/data.pickle", "wb") as f:
f.write(pickle.dumps([]))
with open("app/data.pickle", "rb") as f:
data = f.read()
data = pickle.loads(data)
data_raw = f.read()
data: List[Project] = pickle.loads(data_raw)
return data
def save_data(self):
+1 -1
View File
@@ -17,7 +17,7 @@
{% endfor %}
</ul>
<a href="/add_project">Add</a>
<a href="/add_project">Add Project</a>
</div>
</body>
</html>
+1 -1
View File
@@ -14,7 +14,7 @@
<div class="row">
<div class="col-3">
<input type="text" name="comment" class="hidden form-control" value="{{project.comment}}"
<input type="text" name="comment" class="hidden form-control" placeholder="Comment" value="{{project.comment}}"
placeholder="" aria-label="PROJECTNAME" aria-describedby="basic-addon1">
<select class="form-select" name="shellcode" aria-label="SHELLCODE">
+2 -9
View File
@@ -14,9 +14,9 @@
<form method="POST" enctype="multipart/form-data" action="/add_project">
<input type="text" name="project_name" class="form-control" placeholder="Projekt" aria-label="PROJECTNAME" aria-describedby="basic-addon1">
<div class="row row-cols-lg-auto g-3">
<input type="text" name="project_name" class="form-control" placeholder="Projekt name" aria-label="PROJECTNAME" aria-describedby="basic-addon1">
<select class="form-select" name="shellcode" aria-label="SHELLCODE">
{% for shellcode in shellcodes %}
@@ -60,13 +60,6 @@
{% endfor %}
</select>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheckDefault">
<label class="form-check-label" for="flexCheckDefault">
Execute after injection
</label>
</div>
<button class="btn btn-primary" type="submit" value="save">Save</button>
</div>
+12 -3
View File
@@ -9,6 +9,7 @@ from pygments.lexers import CLexer, NasmLexer, DiffLexer, HexdumpLexer
from pygments.formatters import HtmlFormatter
import difflib
from ansi2html import Ansi2HTMLConverter
import shutil
from config import config
from model.settings import Settings
@@ -26,7 +27,6 @@ thread_running = False
@views.route("/")
def index():
print(storage.data)
return render_template('index.html', data=storage.data)
@@ -96,9 +96,11 @@ def add_project():
settings.inject_style = InjectStyle[inject_style]
if storage.get_project(project_name) != None:
# overwrite project
project = storage.get_project(project_name)
project.settings = settings
else:
# add new project
project = Project(project_name, settings)
project.settings = settings
settings.project_name = project_name
@@ -132,11 +134,18 @@ def add_project():
)
def supermega_thread(settings: Settings):
def supermega_thread(settings: Settings, project_name: str):
global thread_running
start(settings)
thread_running = False
# copy generated file to project folder
file_basename = os.path.basename(settings.inject_exe_out)
shutil.copy(
settings.inject_exe_out,
"app/projects/{}/{}".format(project_name, file_basename)
)
@views.route("/start_project", methods=['POST', 'GET'])
def start_project():
@@ -152,7 +161,7 @@ def start_project():
project = storage.get_project(project_name)
project.settings.try_start_final_infected_exe = try_start
thread = Thread(target=supermega_thread, args=(project.settings, ))
thread = Thread(target=supermega_thread, args=(project.settings, project_name, ))
thread.start()
thread_running = True
+6 -2
View File
@@ -8,6 +8,9 @@ import shutil
from config import config
logger = logging.getLogger("Sender")
def scannerDetectsBytes(data: bytes, filename: str, useBrotli=True, verify=False):
params = { 'filename': filename, 'brotli': useBrotli, 'verify': verify }
if useBrotli:
@@ -16,11 +19,12 @@ def scannerDetectsBytes(data: bytes, filename: str, useBrotli=True, verify=False
scanData = data
timeStart = time.time()
print("Send to exec/exe: {}".format(params))
logger.info("Send to exec/exe: {}".format(params))
res = req.post("{}/exec/exe".format(config.get("avred_server")), params=params, data=scanData, timeout=10)
jsonRes = res.json()
print("Response: {}".format(jsonRes))
scanTime = round(time.time() - timeStart, 3)
logger.info("Response: {}s: {}".format(scanTime, jsonRes))
# basically internal server error, e.g. AMSI not working
if res.status_code != 200:
+6 -2
View File
@@ -187,10 +187,14 @@ def start(settings: Settings):
observer.add_code("exe_final", extract_code_from_exe_file_ep(settings.inject_exe_out, 300))
if config.get("avred_server") != "":
filename = os.path.basename(settings.inject_exe_in)
with open(settings.inject_exe_out, "rb") as f:
data = f.read()
scannerDetectsBytes(data, "test.exe", useBrotli=True, verify=settings.verify)
try:
scannerDetectsBytes(data, filename, useBrotli=True, verify=settings.verify)
except Exception as e:
logger.error(f'Error scanning: {e}')
return 4
else:
# Start/verify it at the end
if settings.verify: