From 605a8556ba93f4ac4ad16d40413f0c670da59507 Mon Sep 17 00:00:00 2001 From: Alice Date: Thu, 28 Mar 2024 11:08:06 +0100 Subject: [PATCH 01/10] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 470c45e..b57fe96 100644 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ install_requires=[ "click", "jinja2", - "pefile>=2019.4.18, <2019.5.0" + "pefile<2023.0.0", "pyyaml>=5.1", "sqlalchemy>=1.4, <1.5", "alembic>=1.7.4, <1.8", From 61d4f28cac55edffc6ec1901566b79d85c68a1fd Mon Sep 17 00:00:00 2001 From: Alice Date: Thu, 28 Mar 2024 11:11:12 +0100 Subject: [PATCH 02/10] Update qemu.py --- vmcloak/platforms/qemu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vmcloak/platforms/qemu.py b/vmcloak/platforms/qemu.py index 0bd8a06..55afd92 100644 --- a/vmcloak/platforms/qemu.py +++ b/vmcloak/platforms/qemu.py @@ -36,9 +36,9 @@ def _create_image_disk(path, size): def _create_snapshot_disk(image_path, path): log.info("Creating snapshot %s with master %s", path, image_path) - subprocess.check_call(["qemu-img", "create", "-f", "qcow2", "-o", + subprocess.check_call(["qemu-img", "create", "-F", "qcow2", "-o", "lazy_refcounts=on,cluster_size=2M", "-b", - image_path, path]) + image_path, "-f", "qcow2", path]) def _make_pre_v41_args(attr): From ff73f0430aa52c362bcec557fdfe19a30cc51604 Mon Sep 17 00:00:00 2001 From: alice Date: Mon, 22 Apr 2024 17:51:46 +0200 Subject: [PATCH 03/10] patching dependencies and adding QEMU compatibility for CAPEv2 --- docs/vmcreation.rst | 8 +- vmcloak/abstract.py | 5 + .../windows/agent/agent_windows_amd64.pyw | 763 ++++++++++++++++++ vmcloak/data/bootstrap/windows/bootstrap.bat | 2 + vmcloak/dependencies/firefox.py | 10 +- vmcloak/dependencies/python.py | 24 +- vmcloak/platforms/qemu.py | 13 +- 7 files changed, 807 insertions(+), 18 deletions(-) create mode 100644 vmcloak/data/bootstrap/windows/agent/agent_windows_amd64.pyw diff --git a/docs/vmcreation.rst b/docs/vmcreation.rst index da97e21..62a6876 100644 --- a/docs/vmcreation.rst +++ b/docs/vmcreation.rst @@ -114,7 +114,7 @@ See the example below for its help page. --network TEXT The network to use in CIDR notation. Example: 192.168.30.0/24. Uses VM platform default if not given. - --port INTEGER Port to run the Agent on. [default: 8000] + --port INTEGER Port to run the Agent on. [default: 8000] Define a port other than 8000 when creating a VM for CAPEv2 --ip TEXT Guest IP address to use --iso TEXT Specify install ISO to use. --vm TEXT Virtual Machinery. [default: qemu] @@ -129,6 +129,12 @@ The install might be frozen, etc. We will be making an image called 'win10base' This command can take a long time to complete depending on your system (20-60 minutes). +If you are using VMCloak to setup a QEMU VM for CAPEv2 define a port other than 8000. The port 8000 is going to be used by the CAPE agent. + +.. code-block:: bash + + vmcloak --debug init --port 8111 --win10x64 --hddsize 128 --cpus 2 --ramsize 4096 --network 192.168.30.0/24 --vm qemu --vrde --vrde-port 1 --ip 192.168.30.2 --iso-mount /mnt/win10x64 win10base qemubr0 + When the command finishes, the image should be available in the list of images. View the list of images and their attributes using: diff --git a/vmcloak/abstract.py b/vmcloak/abstract.py index b3bdfcc..1120397 100644 --- a/vmcloak/abstract.py +++ b/vmcloak/abstract.py @@ -162,9 +162,14 @@ def buildiso(self, mount, newiso, bootstrap, tmp_dir=None, env_vars={}): # Copy the agent binary to the tmp bootstrap folder with the extension # it should have, but using a normalized name. agent_name = f"{random_string(8, 16)}{file_ext}" + agent_name_cape = f"{random_string(8, 16)}.pyw" + agent_path_cape = os.path.splitext(agent_path)[0]+'.pyw' shutil.copy(agent_path, os.path.join(bootstrap_copy, agent_name)) + shutil.copy(agent_path_cape, os.path.join(bootstrap_copy, agent_name_cape)) env_vars["AGENT_FILE"] = agent_name + env_vars["AGENT_FILE_CAPE"] = agent_name_cape env_vars["AGENT_RUNKEY"] = random_string(8, 16) + env_vars["AGENT_RUNKEY_CAPE"] = random_string(8, 16) # Write the configuration values for bootstrap.bat. with open(os.path.join(bootstrap_copy, "settings.bat"), "wb") as f: diff --git a/vmcloak/data/bootstrap/windows/agent/agent_windows_amd64.pyw b/vmcloak/data/bootstrap/windows/agent/agent_windows_amd64.pyw new file mode 100644 index 0000000..f839e58 --- /dev/null +++ b/vmcloak/data/bootstrap/windows/agent/agent_windows_amd64.pyw @@ -0,0 +1,763 @@ +# Copyright (C) 2010-2019 Cuckoo Foundation. +# This file is part of Cuckoo Sandbox - http://www.cuckoosandbox.org +# See the file 'docs/LICENSE' for copying permission. + +import argparse +import base64 +import cgi +import enum +import http.server +import ipaddress +import json +import multiprocessing +import os +import platform +import shlex +import shutil +import socket +import socketserver +import stat +import subprocess +import sys +import tempfile +import traceback +from io import StringIO +from typing import Iterable +from zipfile import ZipFile + +try: + import re2 as re +except ImportError: + import re + +if sys.version_info[:2] < (3, 6): + sys.exit("You are running an incompatible version of Python, please use >= 3.6") + +# You must run x86 version not x64 +# The analysis process interacts with low-level Windows libraries that need a +# x86 Python to be running. +# (see https://github.com/kevoreilly/CAPEv2/issues/1680) +if sys.maxsize > 2**32 and sys.platform == "win32": + sys.exit("You should install python3 x86! not x64") + +AGENT_VERSION = "0.17" +AGENT_FEATURES = [ + "execpy", + "execute", + "pinning", + "logs", + "largefile", + "unicodepath", +] +BASE_64_ENCODING = "base64" + +if sys.platform == "win32": + AGENT_FEATURES.append("mutex") + MUTEX_TIMEOUT_MS = 500 + from ctypes import WinError, windll + + kernel32 = windll.kernel32 + SYNCHRONIZE = 0x100000 + ERROR_FILE_NOT_FOUND = 0x2 + WAIT_ABANDONED = 0x00000080 + WAIT_OBJECT_0 = 0x0 + WAIT_TIMEOUT = 0x102 + WAIT_FAILED = 0xFFFFFFFF + + +class Status(enum.IntEnum): + INIT = 1 + RUNNING = 2 + COMPLETE = 3 + FAILED = 4 + EXCEPTION = 5 + + def __str__(self): + return f"{self.name.lower()}" + + @classmethod + def _missing_(cls, value): + if not isinstance(value, str): + return None + value = value.lower() + for member in cls: + if str(member) == value: + return member + if value.isnumeric() and int(value) == member.value: + return member + return None + + +ANALYZER_FOLDER = "" +agent_mutexes = {} +"""Holds handles of mutexes held by the agent.""" +state = { + "status": Status.INIT, + "description": "", + "async_subprocess": None, + "mutexes": agent_mutexes, +} + + +class MiniHTTPRequestHandler(http.server.SimpleHTTPRequestHandler): + server_version = "CAPE Agent" + + def do_GET(self): + request.client_ip, request.client_port = self.client_address + request.form = {} + request.files = {} + request.method = "GET" + + self.httpd.handle(self) + + def do_POST(self): + environ = { + "REQUEST_METHOD": "POST", + "CONTENT_TYPE": self.headers.get("Content-Type"), + } + + form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ=environ) + + request.client_ip, request.client_port = self.client_address + request.form = {} + request.files = {} + request.method = "POST" + + if form.list: + for key in form.keys(): + value = form[key] + if value.filename: + request.files[key] = value.file + else: + request.form[key] = value.value + self.httpd.handle(self) + + def do_DELETE(self): + environ = { + "REQUEST_METHOD": "DELETE", + "CONTENT_TYPE": self.headers.get("Content-Type"), + } + + form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ=environ) + + request.client_ip, request.client_port = self.client_address + request.form = {} + request.files = {} + request.method = "DELETE" + + if form.list: + for key in form.keys(): + value = form[key] + if value.filename: + request.files[key] = value.file + else: + request.form[key] = value.value + self.httpd.handle(self) + + +class MiniHTTPServer: + def __init__(self): + self.handler = MiniHTTPRequestHandler + + # Reference back to the server. + self.handler.httpd = self + + self.routes = { + "GET": [], + "POST": [], + "DELETE": [], + } + + def run( + self, + host: ipaddress.IPv4Address = "0.0.0.0", + port: int = 8000, + event: multiprocessing.Event = None, + ): + socketserver.TCPServer.allow_reuse_address = True + self.s = socketserver.TCPServer((host, port), self.handler) + + # tell anyone waiting that they're good to go + if event: + event.set() + + self.s.serve_forever() + + def route(self, path: str, methods: Iterable[str] = ["GET"]): + def register(fn): + for method in methods: + self.routes[method].append((re.compile(f"{path}$"), fn)) + return fn + + return register + + def handle(self, obj): + if "client_ip" in state and request.client_ip != state["client_ip"]: + if request.client_ip != "127.0.0.1": + return + if obj.path != "/status" or request.method != "POST": + return + + for route, fn in self.routes[obj.command]: + if route.match(obj.path): + ret = fn() + break + else: + ret = json_error(404, message="Route not found") + + ret.init() + obj.send_response(ret.status_code) + ret.headers(obj) + obj.end_headers() + + if isinstance(ret, jsonify): + obj.wfile.write(ret.json().encode()) + elif isinstance(ret, send_file): + ret.write(obj, obj.wfile) + + if hasattr(self, "s") and self.s._BaseServer__shutdown_request: + self.close_connection = True + + def shutdown(self): + # BaseServer also features a .shutdown() method, but you can't use + # that from the same thread as that will deadlock the whole thing. + if hasattr(self, "s"): + self.s._BaseServer__shutdown_request = True + else: + # When running unit tests in Windows, the system would hang here, + # until this `exit(1)` was added. + print(f"{self} has no 's' attribute") + exit(1) + + +class jsonify: + """Wrapper that represents Flask.jsonify functionality.""" + + def __init__(self, status_code=200, **kwargs): + self.status_code = status_code + self.values = kwargs + + def init(self): + pass + + def json(self): + for valkey in self.values: + if isinstance(self.values[valkey], bytes): + self.values[valkey] = self.values[valkey].decode("utf8", "replace") + try: + retdata = json.dumps(self.values) + except Exception as ex: + retdata = json.dumps({"error": f"Error serializing json data: {ex.args[0]}"}) + + return retdata + + def headers(self, obj): + pass + + +class send_file: + """Wrapper that represents Flask.send_file functionality.""" + + def __init__(self, path, encoding): + self.length = None + self.path = path + self.status_code = 200 + self.encoding = encoding + + def okay_to_send(self): + return os.path.isfile(self.path) and os.access(self.path, os.R_OK) + + def init(self): + if self.okay_to_send(): + if self.encoding != BASE_64_ENCODING: + self.length = os.path.getsize(self.path) + else: + self.status_code = 404 + + def write(self, httplog, sock): + if not self.okay_to_send(): + return + + try: + with open(self.path, "rb") as f: + buf = f.read(1024 * 1024) + while buf: + if self.encoding == BASE_64_ENCODING: + buf = base64.b64encode(buf) + sock.write(buf) + buf = f.read(1024 * 1024) + except Exception as ex: + httplog.log_error(f"Error reading file {self.path}: {ex}") + + def headers(self, obj): + obj.send_header("Content-Length", self.length) + + +class request: + form = {} + files = {} + client_ip = None + client_port = None + method = None + environ = { + "werkzeug.server.shutdown": lambda: app.shutdown(), + } + + +app = MiniHTTPServer() + + +def isAdmin(): + is_admin = None + try: + if sys.platform == "win32": + import ctypes + + is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0 + else: + is_admin = os.getuid() == 0 + except Exception as e: + print(e) + + return is_admin + + +def json_error(error_code: int, message: str, **kwargs) -> jsonify: + r = jsonify(message=message, error_code=error_code, **kwargs) + r.status_code = error_code + return r + + +def json_exception(message: str) -> jsonify: + r = jsonify(message=message, error_code=500, traceback=traceback.format_exc()) + r.status_code = 500 + return r + + +def json_success(message: str, status_code=200, **kwargs) -> jsonify: + return jsonify(message=message, status_code=status_code, **kwargs) + + +@app.route("/") +def get_index(): + is_admin = isAdmin() + return json_success("CAPE Agent!", version=AGENT_VERSION, features=AGENT_FEATURES, is_user_admin=bool(is_admin)) + + +def get_subprocess_status(): + """Return the subprocess status.""" + async_subprocess = state.get("async_subprocess") + message = "Analysis status" + exitcode = async_subprocess.exitcode + if exitcode is None or (sys.platform == "win32" and exitcode == 259): + # Process is still running. + state["status"] = Status.RUNNING + return json_success( + message=message, + status=str(state.get("status")), + description=state.get("description"), + process_id=async_subprocess.pid, + ) + # Process completed; reset async subprocess state. + state["async_subprocess"] = None + if exitcode == 0: + state["status"] = Status.COMPLETE + state["description"] = "" + else: + state["status"] = Status.FAILED + state["description"] = f"Exited with exit code {exitcode}" + return json_success( + message=message, + status=str(state.get("status")), + description=state.get("description"), + exitcode=exitcode, + ) + + +def open_mutex(mutex_name): + assert sys.platform == "win32" + access = SYNCHRONIZE # only flag the mutex for use + inherit_handle = False # don't pass the handle to children + hndl_mutex = kernel32.OpenMutexW(access, inherit_handle, mutex_name) + if not hndl_mutex: + winerr = WinError() + if winerr.errno == ERROR_FILE_NOT_FOUND: + return None, json_error(404, "mutex not found") + return None, json_error(500, f"error accessing mutex: {winerr}") + return hndl_mutex, None + + +def wait_mutex(hndl_mutex): + assert sys.platform == "win32" + ret = kernel32.WaitForSingleObject(hndl_mutex, MUTEX_TIMEOUT_MS) + if ret in (WAIT_ABANDONED, WAIT_OBJECT_0): + return True, None + elif ret == WAIT_TIMEOUT: + return False, json_error(408, "timeout waiting for mutex") + elif ret == WAIT_FAILED: + # get the extended error information + winerr = WinError() + return False, json_error(500, f"failed waiting for mutex: {winerr}") + else: + return False, json_error(500, f"failed waiting for mutex: {ret}") + + +def release_mutex(hndl_mutex): + assert sys.platform == "win32" + ret = kernel32.ReleaseMutex(hndl_mutex) + if not ret: + # get the extended error information + winerr = WinError() + return False, json_error(500, f"failed releasing mutex: {winerr}") + return True, None + + +@app.route("/status") +def get_status(): + if state["status"] != Status.COMPLETE and state.get("async_subprocess") is not None: + return get_subprocess_status() + return json_success("Analysis status", status=str(state.get("status")), description=state.get("description")) + + +@app.route("/mutex", methods=["POST"]) +def post_mutex(): + if sys.platform != "win32": + return json_error(400, f"mutex feature not supported on {sys.platform}") + mutex_name = request.form.get("mutex", "") + if not mutex_name: + return json_error(400, "no mutex provided") + if mutex_name in agent_mutexes: + return json_success(f"have mutex: {mutex_name}") + + # does the mutex exist? + hndl_mutex, error = open_mutex(mutex_name) + if error: + return error + + # try waiting on it + ok, error = wait_mutex(hndl_mutex) + if ok: + # save the mutex handle for future requests + agent_mutexes[mutex_name] = hndl_mutex + return json_success(f"got mutex: {mutex_name}", status_code=201) + return error + + +@app.route("/mutex", methods=["DELETE"]) +def delete_mutex(): + if sys.platform != "win32": + return json_error(400, f"mutex feature not supported on {sys.platform}") + mutex_name = request.form.get("mutex", "") + if not mutex_name: + return json_error(400, "no mutex provided") + if mutex_name not in agent_mutexes: + return json_error(404, f"mutex does not exist: {mutex_name}") + hndl_mutex = agent_mutexes.pop(mutex_name) + ok, error = release_mutex(hndl_mutex) + if ok: + return json_success(f"released mutex: {mutex_name}") + return error + + +@app.route("/status", methods=["POST"]) +def put_status(): + try: + status = Status(request.form.get("status")) + except ValueError: + return json_error(400, "No valid status has been provided") + + state["status"] = status + state["description"] = request.form.get("description") + return json_success("Analysis status updated") + + +@app.route("/logs") +def get_logs(): + if isinstance(sys.stdout, StringIO): + stdoutbuf = sys.stdout.getvalue() + stderrbuf = sys.stderr.getvalue() + else: + stdoutbuf = "verbose mode, stdout not saved" + stderrbuf = "verbose mode, stderr not saved" + return json_success("Agent logs", stdout=stdoutbuf, stderr=stderrbuf) + + +@app.route("/system") +def get_system(): + return json_success("System", system=platform.system()) + + +@app.route("/environ") +def get_environ(): + return json_success("Environment variables", environ=dict(os.environ)) + + +@app.route("/path") +def get_path(): + return json_success("Agent path", filepath=os.path.abspath(__file__)) + + +@app.route("/mkdir", methods=["POST"]) +def do_mkdir(): + if "dirpath" not in request.form: + return json_error(400, "No dirpath has been provided") + + try: + mode = int(request.form.get("mode", 0o777)) + + os.makedirs(request.form["dirpath"], mode=mode, exist_ok=True) + except Exception as ex: + print(f"error creating dir {ex}") + return json_exception("Error creating directory") + + return json_success("Successfully created directory") + + +@app.route("/mktemp", methods=("GET", "POST")) +def do_mktemp(): + suffix = request.form.get("suffix", "") + prefix = request.form.get("prefix", "tmp") + dirpath = request.form.get("dirpath") + + try: + fd, filepath = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dirpath) + except Exception: + return json_exception("Error creating temporary file") + + os.close(fd) + + return json_success("Successfully created temporary file", filepath=filepath) + + +@app.route("/mkdtemp", methods=("GET", "POST")) +def do_mkdtemp(): + suffix = request.form.get("suffix", "") + prefix = request.form.get("prefix", "tmp") + dirpath = request.form.get("dirpath") + + try: + dirpath = tempfile.mkdtemp(suffix=suffix, prefix=prefix, dir=dirpath) + except Exception: + return json_exception("Error creating temporary directory") + + return json_success("Successfully created temporary directory", dirpath=dirpath) + + +@app.route("/store", methods=["POST"]) +def do_store(): + if "filepath" not in request.form: + return json_error(400, "No filepath has been provided") + + if "file" not in request.files: + return json_error(400, "No file has been provided") + + try: + with open(request.form["filepath"], "wb") as f: + shutil.copyfileobj(request.files["file"], f, 10 * 1024 * 1024) + except Exception as ex: + return json_exception(f"Error storing file: {ex}") + + return json_success("Successfully stored file") + + +@app.route("/retrieve", methods=["POST"]) +def do_retrieve(): + if "filepath" not in request.form: + return json_error(400, "No filepath has been provided") + + return send_file(request.form["filepath"], request.form.get("encoding", "")) + + +@app.route("/extract", methods=["POST"]) +def do_extract(): + if "dirpath" not in request.form: + return json_error(400, "No dirpath has been provided") + + if "zipfile" not in request.files: + return json_error(400, "No zip file has been provided") + + try: + with ZipFile(request.files["zipfile"], "r") as archive: + archive.extractall(request.form["dirpath"]) + except Exception as ex: + return json_exception(f"Error extracting zip file {ex}") + + return json_success("Successfully extracted zip file") + + +@app.route("/remove", methods=["POST"]) +def do_remove(): + if "path" not in request.form: + return json_error(400, "No path has been provided") + + try: + if os.path.isdir(request.form["path"]): + # Mark all files as readable so they can be deleted. + for dirpath, _, filenames in os.walk(request.form["path"]): + for filename in filenames: + os.chmod(os.path.join(dirpath, filename), stat.S_IWRITE) + + shutil.rmtree(request.form["path"]) + message = "Successfully deleted directory" + elif os.path.isfile(request.form["path"]): + os.chmod(request.form["path"], stat.S_IWRITE) + os.remove(request.form["path"]) + message = "Successfully deleted file" + else: + return json_error(404, "Path provided does not exist") + except Exception: + return json_exception("Error removing file or directory") + + return json_success(message) + + +@app.route("/execute", methods=["POST"]) +def do_execute(): + local_ip = socket.gethostbyname(socket.gethostname()) + + if "command" not in request.form: + return json_error(400, "No command has been provided") + command_to_execute = shlex.split(request.form["command"]) + + # only allow date command from localhost. Even this is just to + # let it be tested + allowed_commands = ["date", "cmd /c date /t"] + if request.client_ip in ("127.0.0.1", local_ip) and request.form["command"] not in allowed_commands: + return json_error(500, "Not allowed to execute commands") + + # Execute the command asynchronously? As a shell command? + async_exec = "async" in request.form + shell = "shell" in request.form + + cwd = request.form.get("cwd") + stdout = stderr = None + + try: + if async_exec: + subprocess.Popen(command_to_execute, shell=shell, cwd=cwd) + else: + p = subprocess.Popen(command_to_execute, shell=shell, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + if request.form.get("encoding", "") == BASE_64_ENCODING: + stdout = base64.b64encode(stdout) + stderr = base64.b64encode(stderr) + except Exception as ex: + state["status"] = Status.FAILED + state["description"] = "Error execute command" + return json_exception(f"Error executing command: {ex}") + + state["status"] = Status.RUNNING + state["description"] = "" + return json_success("Successfully executed command", stdout=stdout, stderr=stderr) + + +def run_subprocess(command_args, cwd, base64_encode, shell=False): + """Execute the subprocess, wait for completion. + + Return the exitcode (returncode), the stdout, and the stderr. + """ + p = subprocess.Popen( + args=command_args, + cwd=cwd, + shell=shell, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = p.communicate() + if base64_encode: + stdout = base64.b64encode(stdout) + stderr = base64.b64encode(stderr) + return p.returncode, stdout, stderr + + +def background_subprocess(command_args, cwd, base64_encode, shell=False): + """Run subprocess, wait for completion, then exit. + + This process must exit, so the parent process (agent) can find the exit status.""" + # TODO: return the stdout/stderr to the parent process. + returncode, stdout, stderr = run_subprocess(command_args, cwd, base64_encode, shell) + sys.stdout.write(stdout.decode("ascii")) + sys.stderr.write(stderr.decode("ascii")) + sys.exit(returncode) + + +def spawn(args, cwd, base64_encode, shell=False): + """Kick off a subprocess in the background.""" + run_subprocess_args = [args, cwd, base64_encode, shell] + proc = multiprocessing.Process(target=background_subprocess, name=f"child process {args[1]}", args=run_subprocess_args) + proc.start() + state["status"] = Status.RUNNING + state["description"] = "" + state["async_subprocess"] = proc + return json_success("Successfully spawned command", process_id=proc.pid) + + +@app.route("/execpy", methods=["POST"]) +def do_execpy(): + if "filepath" not in request.form: + return json_error(400, "No Python file has been provided") + + # Execute the command asynchronously? As a shell command? + async_exec = "async" in request.form + base64_encode = request.form.get("encoding", "") == BASE_64_ENCODING + + cwd = request.form.get("cwd") + + args = ( + sys.executable, + request.form["filepath"], + ) + + if async_exec and state["status"] == Status.RUNNING and state["async_subprocess"]: + return json_error(400, "Async process already running.") + try: + if async_exec: + return spawn(args, cwd, base64_encode) + exitcode, stdout, stderr = run_subprocess(args, cwd, base64_encode) + if exitcode == 0: + state["status"] = Status.COMPLETE + state["description"] = "" + return json_success("Successfully executed command", stdout=stdout, stderr=stderr) + # Process exited with non-zero result. + state["status"] = Status.FAILED + message = "Error executing python command." + state["description"] = message + return json_error(400, message, stdout=stdout, stderr=stderr, exitcode=exitcode) + except Exception as ex: + state["status"] = Status.FAILED + state["description"] = "Error executing Python command" + return json_exception(f"Error executing Python command: {ex}") + + +@app.route("/pinning") +def do_pinning(): + if "client_ip" in state: + return json_error(500, "Agent has already been pinned to an IP!") + + state["client_ip"] = request.client_ip + return json_success("Successfully pinned Agent", client_ip=request.client_ip) + + +@app.route("/kill") +def do_kill(): + shutdown = request.environ.get("werkzeug.server.shutdown") + if shutdown is None: + return json_error(500, "Not running with the Werkzeug server") + + shutdown() + return json_success("Quit the CAPE Agent") + + +if __name__ == "__main__": + multiprocessing.set_start_method("spawn") + parser = argparse.ArgumentParser() + parser.add_argument("host", nargs="?", default="0.0.0.0") + parser.add_argument("port", type=int, nargs="?", default=8000) + parser.add_argument("-v", "--verbose", action="store_true") + args = parser.parse_args() + + if not args.verbose: + sys.stdout = StringIO() + sys.stderr = StringIO() + + app.run(host=args.host, port=args.port) \ No newline at end of file diff --git a/vmcloak/data/bootstrap/windows/bootstrap.bat b/vmcloak/data/bootstrap/windows/bootstrap.bat index 5615c4c..f1ab2fa 100644 --- a/vmcloak/data/bootstrap/windows/bootstrap.bat +++ b/vmcloak/data/bootstrap/windows/bootstrap.bat @@ -23,6 +23,7 @@ start /w C:\vmcloak\%PYTHONINSTALLER% PrependPath=1 TargetDir=%PYTHONPATH% /pass echo Copying agent file to c:\windows\system32\%AGENT_FILE% copy c:\vmcloak\%AGENT_FILE% c:\windows\system32\%AGENT_FILE% +copy c:\vmcloak\%AGENT_FILE_CAPE% c:\%AGENT_FILE_CAPE% echo Setting the resolution. %PYTHONPATH%\python.exe C:\vmcloak\resolution.py %RESO_WIDTH% %RESO_HEIGHT% @@ -32,6 +33,7 @@ reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\S echo Adding agent autorun key. Agent port: %AGENT_PORT% reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v %AGENT_RUNKEY% /t REG_SZ /d "c:\windows\system32\%AGENT_FILE% -host 0.0.0.0 -port %AGENT_PORT%" /f +reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v %AGENT_RUNKEY_CAPE% /t REG_SZ /d "c:\%AGENT_FILE_CAPE%" /f powershell -ExecutionPolicy bypass -File c:\vmcloak\genericsettings.ps1 diff --git a/vmcloak/dependencies/firefox.py b/vmcloak/dependencies/firefox.py index 46420dc..a32c225 100644 --- a/vmcloak/dependencies/firefox.py +++ b/vmcloak/dependencies/firefox.py @@ -21,12 +21,16 @@ class Firefox(Dependency): "version": "63.0.3", "url": "https://cuckoo.sh/vmcloak/firefox_63_0_3.exe", "sha1": "c5f03fc93aebd2db9da14ba6eb1f01e98e18d95b", + }, { + "version": "latest", + "url": "https://download-installer.cdn.mozilla.net/pub/firefox/releases/123.0/win64/en-US/Firefox%20Setup%20123.0.exe", + "sha1": "75f85bbc5934c7f7ff4c4794a9c8d8ad45e79040", }] def run(self): - self.upload_dependency("C:\\Firefox_Setup_41.0.2.exe") - self.a.execute("C:\\Firefox_Setup_41.0.2.exe -ms") - self.a.remove("C:\\Firefox_Setup_41.0.2.exe") + self.upload_dependency("C:\\Firefox_Setup_123.0.exe") + self.a.execute("C:\\Firefox_Setup_123.0.exe -ms") + self.a.remove("C:\\Firefox_Setup_123.0.exe") class Firefox41(Firefox, Dependency): """Backwards compatibility""" diff --git a/vmcloak/dependencies/python.py b/vmcloak/dependencies/python.py index 4de9800..0c9c14b 100644 --- a/vmcloak/dependencies/python.py +++ b/vmcloak/dependencies/python.py @@ -41,19 +41,31 @@ class Python(Dependency): "window_name": "Python 3.7.3 (64-bit) Setup", "install_path": "C:\\Python3" }, + # { + # "arch": "amd64", + # "version": "3.10.0", + # "target": "win10x64", + # "urls": [ + # "https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe", + # ], + # "sha1": "3ee4e92a8ef94c70fb56859503fdc805d217d689", + # "filename": "python-3.10.0-amd64.exe", + # "window_name": "Python 3.10.0 (64-bit) Setup", + # "install_path": "C:\\Python3" + # } { + #The 32 bits version of python is used for windows 10 because it's the one compatible with CAPE. "arch": "amd64", "version": "3.10.0", "target": "win10x64", "urls": [ - "https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe", - ], - "sha1": "3ee4e92a8ef94c70fb56859503fdc805d217d689", - "filename": "python-3.10.0-amd64.exe", - "window_name": "Python 3.10.0 (64-bit) Setup", + "https://www.python.org/ftp/python/3.10.0/python-3.10.0.exe", + ], + "sha1": "91ee198775bf24ccf4dedfd3e83f7d7ef85a2b9f", + "filename": "python-3.10.0.exe", + "window_name": "Python 3.10.0 (32-bit) Setup", "install_path": "C:\\Python3" } - ] def run(self): diff --git a/vmcloak/platforms/qemu.py b/vmcloak/platforms/qemu.py index 55afd92..3fbc06c 100644 --- a/vmcloak/platforms/qemu.py +++ b/vmcloak/platforms/qemu.py @@ -58,7 +58,8 @@ def _make_pre_v41_args(attr): "-device", "ide-cd,bus=ahci.1,unit=0,drive=cdrom,bootindex=1", "-device", "usb-ehci,id=ehci", "-device", "usb-tablet,bus=ehci.0", - "-soundhw", "hda", + "-device", "intel-hda", + "-device", "hda-duplex", "--enable-kvm" ] @@ -82,7 +83,8 @@ def _make_post_v41_args(attr): "-device", "ide-cd,bus=ahci.1,unit=0,drive=cdrom,bootindex=1", "-device", "usb-ehci,id=ehci", "-device", "usb-tablet,bus=ehci.0", - "-soundhw", "hda", + "-device", "intel-hda", + "-device", "hda-duplex", "-enable-kvm" ] @@ -227,12 +229,7 @@ def create_snapshot(name): # Stop the machine so the memory does not change while making the # memory snapshot. m.stdin.write(b"stop\n") - m.stdin.write(b"migrate_set_speed 1G\n") - # Send the actual memory snapshot command. The args helper tries to find - # lz4 of gzip binaries so we can compress the dump. - m.stdin.write( - f"migrate \"exec:{_get_exec_args(snapshot_path)}\"\n".encode() - ) + m.stdin.write(b"savevm myawesomesnapshot\n") m.stdin.write(b"quit\n") log.debug("Flushing snapshot commands to qemu.") m.stdin.flush() From a9533b571c1cba48e16eaab08a73d78bc5c1079a Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 13 May 2024 17:01:20 +0200 Subject: [PATCH 04/10] Update vcredist.py --- vmcloak/dependencies/vcredist.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vmcloak/dependencies/vcredist.py b/vmcloak/dependencies/vcredist.py index ab56dcc..41f9196 100644 --- a/vmcloak/dependencies/vcredist.py +++ b/vmcloak/dependencies/vcredist.py @@ -296,6 +296,13 @@ class VcRedist(Dependency): "https://hatching.dev/hatchvm/vcredist2019_x64.exe", ], "sha1": "de385d69864413400250f2f3fe9f4aec78eb997b" + },{ + "version": "2022", + "arch": "amd64", + "urls": [ + "https://aka.ms/vs/17/release/vc_redist.x64.exe", + ], + "sha1": "046f00c519900fcbf2e6e955fc155b11156a733b" }] # From e7cf56dd3b3e2ea6f64458652b6542b248b85ec0 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 13 May 2024 17:09:03 +0200 Subject: [PATCH 05/10] Update dotnet.py --- vmcloak/dependencies/dotnet.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/vmcloak/dependencies/dotnet.py b/vmcloak/dependencies/dotnet.py index 694d427..04058f0 100644 --- a/vmcloak/dependencies/dotnet.py +++ b/vmcloak/dependencies/dotnet.py @@ -68,15 +68,19 @@ class DotNet(Dependency): "https://cuckoo.sh/vmcloak/NDP47-KB3186497-x86-x64-AllOS-ENU.exe", ], "sha1": "76054141a492ba307595250bda05ad4e0694cdc3", - }, - { + }, { "version": "4.7.2", "urls": [ "https://hatching.io/hatchvm/NDP472-KB4054530-x86-x64-AllOS-ENU.exe", ], "sha1": "31fc0d305a6f651c9e892c98eb10997ae885eb1e", - } - ] + }, { + "version": "4.8.1", + "urls": [ + "https://download.microsoft.com/download/4/b/2/cd00d4ed-ebdd-49ee-8a33-eabc3d1030e3/NDP481-x86-x64-AllOS-ENU.exe", + ], + "sha1": "6ae30bfbd5c588e73c18f89cad26425835a3541e", + }] def run(self): self.upload_dependency("C:\\setup.exe") From 91357c22ee1ef78dc40414070841691d25281c26 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 13 May 2024 17:19:07 +0200 Subject: [PATCH 06/10] Update vcredist.py --- vmcloak/dependencies/vcredist.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vmcloak/dependencies/vcredist.py b/vmcloak/dependencies/vcredist.py index 41f9196..38e2208 100644 --- a/vmcloak/dependencies/vcredist.py +++ b/vmcloak/dependencies/vcredist.py @@ -22,7 +22,8 @@ class VcRedist(Dependency): "2012": "/passive /norestart", "2013": "/passive /norestart", "2015": "/passive /norestart", - "2019": "/qb /quiet /norestart" + "2019": "/qb /quiet /norestart", + "2022": "/qb /quiet /norestart" } exes = [{ From f39ee00eeecd3d22eebc846cc4a37f36f7715e05 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 13 May 2024 17:34:31 +0200 Subject: [PATCH 07/10] Update dotnet.py --- vmcloak/dependencies/dotnet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vmcloak/dependencies/dotnet.py b/vmcloak/dependencies/dotnet.py index 04058f0..76083e6 100644 --- a/vmcloak/dependencies/dotnet.py +++ b/vmcloak/dependencies/dotnet.py @@ -75,11 +75,11 @@ class DotNet(Dependency): ], "sha1": "31fc0d305a6f651c9e892c98eb10997ae885eb1e", }, { - "version": "4.8.1", + "version": "4.8", "urls": [ - "https://download.microsoft.com/download/4/b/2/cd00d4ed-ebdd-49ee-8a33-eabc3d1030e3/NDP481-x86-x64-AllOS-ENU.exe", + "https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe", ], - "sha1": "6ae30bfbd5c588e73c18f89cad26425835a3541e", + "sha1": "e322e2e0fb4c86172c38a97dc6c71982134f0570", }] def run(self): From 7905ca7661990203708972fa5c25add04dae5837 Mon Sep 17 00:00:00 2001 From: Alice Date: Tue, 14 May 2024 10:37:24 +0200 Subject: [PATCH 08/10] Update wallpaper.py --- vmcloak/dependencies/wallpaper.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vmcloak/dependencies/wallpaper.py b/vmcloak/dependencies/wallpaper.py index 5c35ebe..16dea91 100644 --- a/vmcloak/dependencies/wallpaper.py +++ b/vmcloak/dependencies/wallpaper.py @@ -7,6 +7,7 @@ import os.path import random import requests +from pathlib import Path from vmcloak.abstract import Dependency @@ -22,7 +23,7 @@ class Wallpaper(Dependency): ] def init(self): - self.filepath = None + self.filepath = Path(Dependency.data_path, "wall.jpg") def run(self): uploadpath = os.path.join( From ea15d90626381e7b35e1221910748375bd1d6eea Mon Sep 17 00:00:00 2001 From: Alice Date: Tue, 14 May 2024 10:41:33 +0200 Subject: [PATCH 09/10] Add files via upload --- vmcloak/data/ahs_wallpaper.jpeg | Bin 0 -> 79125 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 vmcloak/data/ahs_wallpaper.jpeg diff --git a/vmcloak/data/ahs_wallpaper.jpeg b/vmcloak/data/ahs_wallpaper.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..58340f59dc6d42071fd39dcdc50fdbb1104ffc7a GIT binary patch literal 79125 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�RU@%Wty(J!|jk7#7~Dma^e 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%0AP>3p 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 Vp4k-3&<9b-aR54ob^hz&{{Vhp7ta6y literal 0 HcmV?d00001 From 6ad4fa37a0c116ed5316574f323048dab4c93a55 Mon Sep 17 00:00:00 2001 From: Alice Date: Tue, 14 May 2024 10:41:57 +0200 Subject: [PATCH 10/10] Rename ahs_wallpaper.jpeg to wall.jpg --- vmcloak/data/{ahs_wallpaper.jpeg => wall.jpg} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename vmcloak/data/{ahs_wallpaper.jpeg => wall.jpg} (100%) diff --git a/vmcloak/data/ahs_wallpaper.jpeg b/vmcloak/data/wall.jpg similarity index 100% rename from vmcloak/data/ahs_wallpaper.jpeg rename to vmcloak/data/wall.jpg