diff --git a/content/blog/2024-06-03-Nullbulge-Ranner.md b/content/blog/2024-06-03-Nullbulge-Ranner.md new file mode 100644 index 0000000..2c3a688 --- /dev/null +++ b/content/blog/2024-06-03-Nullbulge-Ranner.md @@ -0,0 +1,218 @@ +--- +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