import io import re import os import subprocess import glob import shutil from django.shortcuts import render, get_object_or_404 from scanEngine.models import * from scanEngine.forms import * from scanEngine.forms import ConfigurationForm from django.contrib import messages from django import http from django.urls import reverse from django.conf import settings from django.core.files.storage import default_storage from reNgine.common_func import * def index(request): engine_type = EngineType.objects.all().order_by('id') context = { 'engine_ul_show': 'show', 'engine_li': 'active', 'scan_engine_nav_active': 'active', 'engine_type': engine_type, } return render(request, 'scanEngine/index.html', context) def add_engine(request): form = AddEngineForm() if request.method == "POST": form = AddEngineForm(request.POST) if form.is_valid(): form.save() messages.add_message( request, messages.INFO, 'Scan Engine Added successfully') return http.HttpResponseRedirect(reverse('scan_engine_index')) context = { 'scan_engine_nav_active': 'active', 'form': form} return render(request, 'scanEngine/add_engine.html', context) def delete_engine(request, id): obj = get_object_or_404(EngineType, id=id) if request.method == "POST": obj.delete() responseData = {'status': 'true'} messages.add_message( request, messages.INFO, 'Engine successfully deleted!') else: responseData = {'status': 'false'} messages.add_message( request, messages.ERROR, 'Oops! Engine could not be deleted!') return http.JsonResponse(responseData) def update_engine(request, id): engine = get_object_or_404(EngineType, id=id) form = UpdateEngineForm() if request.method == "POST": form = UpdateEngineForm(request.POST, instance=engine) if form.is_valid(): form.save() messages.add_message( request, messages.INFO, 'Engine edited successfully') return http.HttpResponseRedirect(reverse('scan_engine_index')) else: form.set_value(engine) context = { 'scan_engine_nav_active': 'active', 'form': form} return render(request, 'scanEngine/update_engine.html', context) def wordlist_list(request): wordlists = Wordlist.objects.all().order_by('id') context = { 'scan_engine_nav_active': 'active', 'wordlist_li': 'active', 'wordlists': wordlists} return render(request, 'scanEngine/wordlist/index.html', context) def add_wordlist(request): context = {'scan_engine_nav_active': 'active', 'wordlist_li': 'active'} form = AddWordlistForm(request.POST or None, request.FILES or None) if request.method == "POST": if form.is_valid() and 'upload_file' in request.FILES: txt_file = request.FILES['upload_file'] if txt_file.content_type == 'text/plain': wordlist_content = txt_file.read().decode('UTF-8') wordlist_path = '/app/tools/wordlist/' wordlist_file = open( wordlist_path + form.cleaned_data['short_name'] + '.txt', 'w') wordlist_file.write(wordlist_content) Wordlist.objects.create( name=form.cleaned_data['name'], short_name=form.cleaned_data['short_name'], count=wordlist_content.count('\n')) messages.add_message( request, messages.INFO, 'Wordlist ' + form.cleaned_data['name'] + ' added successfully') return http.HttpResponseRedirect(reverse('wordlist_list')) context['form'] = form return render(request, 'scanEngine/wordlist/add.html', context) def delete_wordlist(request, id): obj = get_object_or_404(Wordlist, id=id) if request.method == "POST": os.remove( settings.TOOL_LOCATION + 'wordlist/' + obj.short_name + '.txt') obj.delete() responseData = {'status': 'true'} messages.add_message( request, messages.INFO, 'Wordlist successfully deleted!') else: responseData = {'status': 'false'} messages.add_message( request, messages.ERROR, 'Oops! Wordlist could not be deleted!') return http.JsonResponse(responseData) def configuration_list(request): configurations = Configuration.objects.all().order_by('id') context = { 'configuration_nav_active': 'true', 'configurations': configurations} return render(request, 'scanEngine/configuration/index.html', context) def add_configuration(request): context = {'configuration_nav_active': 'true'} form = ConfigurationForm(request.POST or None) if request.method == "POST": if form.is_valid(): form.save() messages.add_message( request, messages.INFO, 'Configuration added successfully') return http.HttpResponseRedirect(reverse('configuration_list')) context['form'] = form return render(request, 'scanEngine/configuration/add.html', context) def delete_configuration(request, id): obj = get_object_or_404(Configuration, id=id) if request.method == "POST": obj.delete() responseData = {'status': 'true'} messages.add_message( request, messages.INFO, 'Configuration successfully deleted!') else: responseData = {'status': 'false'} messages.add_message( request, messages.ERROR, 'Oops! Configuration could not be deleted!') return http.JsonResponse(responseData) def update_configuration(request, id): configuration = get_object_or_404(Configuration, id=id) form = ConfigurationForm() if request.method == "POST": form = ConfigurationForm(request.POST, instance=configuration) if form.is_valid(): form.save() messages.add_message( request, messages.INFO, 'Configuration edited successfully') return http.HttpResponseRedirect(reverse('configuration_list')) else: form.set_value(configuration) context = { 'configuration_nav_active': 'true', 'form': form} return render(request, 'scanEngine/configuration/update.html', context) def interesting_lookup(request): lookup_keywords = None context = {} context['scan_engine_nav_active'] = 'active' context['interesting_lookup_li'] = 'active' context['engine_ul_show'] = 'show' form = InterestingLookupForm() if InterestingLookupModel.objects.filter(custom_type=True).exists(): lookup_keywords = InterestingLookupModel.objects.filter(custom_type=True).order_by('-id')[0] else: form.initial_checkbox() if request.method == "POST": if lookup_keywords: form = InterestingLookupForm(request.POST, instance=lookup_keywords) else: form = InterestingLookupForm(request.POST or None) print(form.errors) if form.is_valid(): print(form.cleaned_data) form.save() messages.add_message( request, messages.INFO, 'Lookup Keywords updated successfully') return http.HttpResponseRedirect(reverse('interesting_lookup')) if lookup_keywords: form.set_value(lookup_keywords) context['interesting_lookup_found'] = True context['form'] = form context['default_lookup'] = InterestingLookupModel.objects.filter(id=1) return render(request, 'scanEngine/lookup.html', context) def tool_specific_settings(request): context = {} # check for incoming form requests if request.method == "POST": if 'gfFileUpload' in request.FILES: gf_file = request.FILES['gfFileUpload'] file_extension = gf_file.name.split('.')[len(gf_file.name.split('.'))-1] if file_extension != 'json': messages.add_message(request, messages.ERROR, 'Invalid GF Pattern, upload only *.json extension') else: file_path = '/root/.gf/' + gf_file.name file = open(file_path, "w") file.write(gf_file.read().decode("utf-8")) file.close() messages.add_message(request, messages.INFO, 'Pattern {} successfully uploaded'.format(gf_file.name[:4])) return http.HttpResponseRedirect(reverse('tool_settings')) elif 'nucleiFileUpload' in request.FILES: nuclei_file = request.FILES['nucleiFileUpload'] file_extension = nuclei_file.name.split('.')[len(nuclei_file.name.split('.'))-1] if file_extension != 'yaml': messages.add_message(request, messages.ERROR, 'Invalid Nuclei Pattern, upload only *.yaml extension') else: file_path = '/root/nuclei-templates/' + nuclei_file.name file = open(file_path, "w") file.write(nuclei_file.read().decode("utf-8")) file.close() messages.add_message(request, messages.INFO, 'Nuclei Pattern {} successfully uploaded'.format(nuclei_file.name[:-5])) return http.HttpResponseRedirect(reverse('tool_settings')) elif 'nuclei_config_text_area' in request.POST: with open('/root/.config/nuclei/config.yaml', "w") as fhandle: fhandle.write(request.POST.get('nuclei_config_text_area')) messages.add_message(request, messages.INFO, 'Nuclei config updated!') return http.HttpResponseRedirect(reverse('tool_settings')) elif 'subfinder_config_text_area' in request.POST: with open('/root/.config/subfinder/config.yaml', "w") as fhandle: fhandle.write(request.POST.get('subfinder_config_text_area')) messages.add_message(request, messages.INFO, 'Subfinder config updated!') return http.HttpResponseRedirect(reverse('tool_settings')) elif 'naabu_config_text_area' in request.POST: with open('/root/.config/naabu/naabu.conf', "w") as fhandle: fhandle.write(request.POST.get('naabu_config_text_area')) messages.add_message(request, messages.INFO, 'Naabu config updated!') return http.HttpResponseRedirect(reverse('tool_settings')) elif 'amass_config_text_area' in request.POST: with open('/root/.config/amass.ini', "w") as fhandle: fhandle.write(request.POST.get('amass_config_text_area')) messages.add_message(request, messages.INFO, 'Amass config updated!') return http.HttpResponseRedirect(reverse('tool_settings')) context['settings_nav_active'] = 'active' context['tool_settings_li'] = 'active' context['settings_ul_show'] = 'show' gf_list = (subprocess.check_output(['gf', '-list'])).decode("utf-8") nuclei_custom_pattern = [f for f in glob.glob("/root/nuclei-templates/*.yaml")] context['nuclei_templates'] = nuclei_custom_pattern context['gf_patterns'] = sorted(gf_list.split('\n')) return render(request, 'scanEngine/settings/tool.html', context) def rengine_settings(request): context = {} total, used, _ = shutil.disk_usage("/") total = total // (2**30) used = used // (2**30) context['total'] = total context['used'] = used context['free'] = total-used context['consumed_percent'] = int(100 * float(used)/float(total)) context['settings_nav_active'] = 'active' context['rengine_settings_li'] = 'active' context['settings_ul_show'] = 'show' return render(request, 'scanEngine/settings/rengine.html', context) def notification_settings(request): context = {} form = NotificationForm() notification = None if Notification.objects.all().exists(): notification = Notification.objects.all()[0] form.set_value(notification) else: form.set_initial() if request.method == "POST": if notification: form = NotificationForm(request.POST, instance=notification) else: form = NotificationForm(request.POST or None) if form.is_valid(): form.save() send_slack_message('*reNgine*\nCongratulations! your notification services are working.') send_telegram_message('*reNgine*\nCongratulations! your notification services are working.') send_discord_message('**reNgine**\nCongratulations! your notification services are working.') messages.add_message( request, messages.INFO, 'Notification Settings updated successfully and test message was sent.') return http.HttpResponseRedirect(reverse('notification_settings')) context['settings_nav_active'] = 'active' context['notification_settings_li'] = 'active' context['settings_ul_show'] = 'show' context['form'] = form return render(request, 'scanEngine/settings/notification.html', context) def proxy_settings(request): context = {} form = ProxyForm() context['form'] = form proxy = None if Proxy.objects.all().exists(): proxy = Proxy.objects.all()[0] form.set_value(proxy) else: form.set_initial() if request.method == "POST": if proxy: form = ProxyForm(request.POST, instance=proxy) else: form = ProxyForm(request.POST or None) if form.is_valid(): form.save() messages.add_message( request, messages.INFO, 'Proxies updated.') return http.HttpResponseRedirect(reverse('proxy_settings')) context['settings_nav_active'] = 'active' context['proxy_settings_li'] = 'active' context['settings_ul_show'] = 'show' return render(request, 'scanEngine/settings/proxy.html', context) def test_hackerone(request): context = {} if request.method == "POST": headers = { 'Accept': 'application/json' } body = json.loads(request.body) r = requests.get( 'https://api.hackerone.com/v1/hackers/payments/balance', auth=(body['username'], body['api_key']), headers = headers ) if r.status_code == 200: return http.JsonResponse({"status": 200}) return http.JsonResponse({"status": 401}) def hackerone_settings(request): context = {} form = HackeroneForm() context['form'] = form hackerone = None if Hackerone.objects.all().exists(): hackerone = Hackerone.objects.all()[0] form.set_value(hackerone) else: form.set_initial() if request.method == "POST": if hackerone: form = HackeroneForm(request.POST, instance=hackerone) else: form = HackeroneForm(request.POST or None) if form.is_valid(): form.save() messages.add_message( request, messages.INFO, 'Hackerone Settings updated.') return http.HttpResponseRedirect(reverse('hackerone_settings')) context['settings_nav_active'] = 'active' context['hackerone_settings_li'] = 'active' context['settings_ul_show'] = 'show' return render(request, 'scanEngine/settings/hackerone.html', context)