mirror of
https://github.com/yogeshojha/rengine.git
synced 2026-09-02 05:08:43 +02:00
436 lines
16 KiB
Python
436 lines
16 KiB
Python
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)
|