--- title: "Nullbulge-Ranner - Compiled Python Malware" date: 2024-06-03 draft: false --- Ich bin in den letzten Tagen über [Eric Parker](https://www.youtube.com/@EricParker) auf Malware gestößen, über BeamNG-Mods verteilt wurde. Das interessante an dieser Malware ist, dass sie zwar in Python geschrieben ist, aber mithilfe von Pyinstaller[^1] kompiliert wurde. Dadurch, in Verbindung mit der gewählten Python-Version, ist die Malware effektiv nicht dekompilierbar und nur schwer zu reverse engineeren. Die meisten Informationen über die Malware mussten daher über dynamische Analyse in Sandboxen und VMs gewonnen werden. ## Oberflächliche statische Analyse Der Erste Schritt war, die Datei "statisch" zu analysieren, das heißt, sich die Eigenschaften der Malware anzuschauen ohne die Malware selbst auszuführen. Dafür habe ich initial die Tools "capa"[^2], "detect-it-easy"[^3] und "yara"[^4] verwendet. Detect-It-Easy gibt uns genauere Informationen über die Datei, vor allem, dass sie mit PyInstaller "gepackt" wurde. ``` PE64 Linker: Microsoft Linker(14.36.33135) Compiler: Microsoft Visual C/C++(19.36.33135)[C] Tool: Visual Studio(2022 version 17.6) Packer: PyInstaller ``` Capa findet schon sehr viele Informationen: {{< rawhtml >}}
┍━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ │ ATT&CK Tactic │ ATT&CK Technique │ ┝━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ │ DEFENSE EVASION │ Obfuscated Files or Information T1027 │ │ │ Virtualization/Sandbox Evasion::System Checks T1497.001 │ ├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤ │ DISCOVERY │ File and Directory Discovery T1083 │ │ │ System Information Discovery T1082 │ ├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤ │ EXECUTION │ Command and Scripting Interpreter T1059 │ │ │ Shared Modules T1129 │ ┕━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ ┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ │ MBC Objective │ MBC Behavior │ ┝━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ │ ANTI-BEHAVIORAL ANALYSIS │ Virtual Machine Detection [B0009] │ ├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ │ DATA │ Checksum::Adler [C0032.005] │ │ │ Compress Data [C0024] │ │ │ Compression Library [C0060] │ │ │ Encode Data::XOR [C0026.002] │ ├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ │ DEFENSE EVASION │ Obfuscated Files or Information::Encoding-Standard Algorithm [E1027.m02] │ ├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ │ DISCOVERY │ Analysis Tool Discovery::Process detection [B0013.001] │ │ │ File and Directory Discovery [E1083] │ │ │ System Information Discovery [E1082] │ ├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ │ EXECUTION │ Command and Scripting Interpreter [E1059] │ ├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ │ FILE SYSTEM │ Create Directory [C0046] │ │ │ Delete Directory [C0048] │ │ │ Delete File [C0047] │ │ │ Read File [C0051] │ │ │ Writes File [C0052] │ ├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ │ OPERATING SYSTEM │ Environment Variable::Set Variable [C0034.001] │ ├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ │ PROCESS │ Create Process [C0017] │ │ │ Terminate Process [C0018] │ ┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ ┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ │ Capability │ Namespace │ ┝━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ │ reference analysis tools strings │ anti-analysis │ │ reference anti-VM strings targeting Qemu │ anti-analysis/anti-vm/vm-detection │ │ reference anti-VM strings targeting Xen │ anti-analysis/anti-vm/vm-detection │ │ compute adler32 checksum │ data-manipulation/checksum/adler32 │ │ compress data via ZLIB inflate or deflate │ data-manipulation/compression │ │ encode data using XOR (6 matches) │ data-manipulation/encoding/xor │ │ accept command line arguments │ host-interaction/cli │ │ query environment variable (4 matches) │ host-interaction/environment-variable │ │ set environment variable (4 matches) │ host-interaction/environment-variable │ │ get common file path │ host-interaction/file-system │ │ create directory (2 matches) │ host-interaction/file-system/create │ │ delete directory │ host-interaction/file-system/delete │ │ delete file │ host-interaction/file-system/delete │ │ enumerate files on Windows │ host-interaction/file-system/files/list │ │ get file size │ host-interaction/file-system/meta │ │ read file on Windows (10 matches) │ host-interaction/file-system/read │ │ write file on Windows (2 matches) │ host-interaction/file-system/write │ │ get disk information (2 matches) │ host-interaction/hardware/storage │ │ create process on Windows │ host-interaction/process/create │ │ terminate process │ host-interaction/process/terminate │ │ link many functions at runtime (2 matches) │ linking/runtime-linking │ │ linked against ZLIB │ linking/static/zlib │ │ parse PE header (3 matches) │ load-code/pe │ │ resolve function by parsing PE exports │ load-code/pe │ ┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙{{ rawhtml >}} Auch Yara findet einige Pattern in der Datei: ``` DebuggerException__SetConsoleCtrl anti_dbg screenshot win_token win_files_operation Big_Numbers1 CRC32_poly_Constant CRC32_table MachO_File_pyinstaller IsPE64 IsWindowsGUI IsPacked HasOverlay HasDigitalSignature HasDebugData HasRichSignature Microsoft_Visual_Cpp_80 Microsoft_Visual_Cpp_80_DLL ``` Zusammenfassend können wir aus dieser statischen Analyse also sagen, dass die Malware es versucht, einem die Analyse schwerer zu machen und möglicherweise ein RAT ist (kann laut YARA screenshots machen). ## Dynamische Analyse mit CAPE Eine [CAPE-Sandbox-Umgebung](https://www.jmbit.de/blog/2023-11-30-capev2-sandbox/) ist eine gute Möglichkeit, lokal dynamische Analysen von Malware oder potenzieller Malware durchzuführen. In diesem Fall enthält die zu analysierende Datei zwar keine sensiblen Daten, sollte das aber der Fall sein, ist es ggf. nicht sinnvoll, die Datei auf eine Cloud-Platform hochzuladen. Hier fielen vor allem die Anti-Analyse-Funktionen sowie die Requests zu Discord auf. Da die Malware jedoch ohne Verbindung zu Discord relativ inaktiv ist und keine user-interaktion bietet, ist die dynamische analyse hier abgesehen von den Informationen über die installation der Software und ihr Verhalten gegenüber Virtualisierung und Debuggern nicht besonders ergibig. [REPORT](https://cloud.jmbit.de/s/qLtzrFyjY3TfQmX) ## Analyse des Webtraffic mithilfe von MITMProxy Um den Webtraffic genauer anzusehen und mitlesen zu können und eventuelle API-Keys abfangen zu können, habe ich die Malware in einer VM gestartet, die über mitmproxy[^5] ins Internet gegangen ist. Hier wurde aber lediglich versucht, sich als ein Bot in Discord einzuloggen, der Zugriff wurde jedoch abgelehnt: ```http GET /api/v10/users/@me HTTP/1.1 Host: discord.com User-Agent: DiscordBot (https://github.com/Rapptz/discord.py 2.3.2) Python/3.10 aiohttp/3.9.5 Authorization: Bot