--- 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 EVASIONObfuscated Files or Information T1027                                              │
│                        │ Virtualization/Sandbox Evasion::System Checks T1497.001                            │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ DISCOVERYFile and Directory Discovery T1083                                                 │
│                        │ System Information Discovery T1082                                                 │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ EXECUTIONCommand and Scripting Interpreter T1059                                            │
│                        │ Shared Modules T1129                                                               │
┕━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙

┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑
│ MBC Objective               │ MBC Behavior                                                                  │
┝━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥
│ ANTI-BEHAVIORAL ANALYSISVirtual Machine Detection [B0009]                                             │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ DATAChecksum::Adler [C0032.005]                                                   │
│                             │ Compress Data [C0024]                                                         │
│                             │ Compression Library [C0060]                                                   │
│                             │ Encode Data::XOR [C0026.002]                                                  │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ DEFENSE EVASIONObfuscated Files or Information::Encoding-Standard Algorithm [E1027.m02]      │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ DISCOVERYAnalysis Tool Discovery::Process detection [B0013.001]                        │
│                             │ File and Directory Discovery [E1083]                                          │
│                             │ System Information Discovery [E1082]                                          │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ EXECUTIONCommand and Scripting Interpreter [E1059]                                     │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ FILE SYSTEMCreate Directory [C0046]                                                      │
│                             │ Delete Directory [C0048]                                                      │
│                             │ Delete File [C0047]                                                           │
│                             │ Read File [C0051]                                                             │
│                             │ Writes File [C0052]                                                           │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ OPERATING SYSTEMEnvironment Variable::Set Variable [C0034.001]                                │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ PROCESSCreate 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                                         │
┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙
{{}} 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 HTTP/1.1 401 Unauthorized {"message": "401: Unauthorized", "code": 0} ``` ## Analyse des Programmcodes Nachdem ich der Malware in der Dynamischen Analyse kaum Informationen entlocken konnte, ging es an die statische Analyse. Da Python 3.10 leider zu neu für die meisten Decompiler ist[^6], musste ich mich mit dem Ergebnis eines Disassemblers zufrieden geben. Aus dem Output dieses (Immerhin 21355 Zeilen!) lies sich der Verdacht, dass es sich bei der Malware um eine Version von PySilon handelt, bestätigen. Es wurden jedoch einige zusätzliche Funktionen eingefügt, so zum Beispiel Ransomware und die Möglichkeit des Nachladens eines Cryptominers. Ebenfalls bin ich über während der Analyse auf andere Malware der gleichen Gruppe gestoßen. Die Ransomware-Mitteilung `NULLBULGE-RANSOMWARE-NOTE.TXT` würde diesen Text enthalten: ``` READ THIS ENTIRELY BEFORE ACTING, IF YOU SHUT DOWN NOW, ALL WILL BE LOST. Your computer is now infected with ransomware. Your file are encrypted with a secure algorithm that is impossible to crack. By now it has moved from your main drive, and has started encrypting other drives. DONT PANIC! IF YOU START LOOKING FOR THE VIRUS, YOU WILL NOT GET ANY FILES ALREADY ENCRYPTED BACK! BUT THEY CAN BE SAVED! To recover your files you need a key. This key is generated once your file have been encrypted. To obtain the key, you must purchase it. You can do this by sending 100 USD to this monero address: 45i7kjWZuzJ4PdSbandaaE8S6mQATmneTYEpgsaaCqDmc7foEJDXwxd3ABR8bn6YE4c7hZ2dYEEr1CwG48gAknPL6zUpYyV Don't know how to get monero? Here are some websites: https://www.kraken.com/learn/buy-monero-xmr https://localmonero.co/?language=en https://www.bestchange.com/visa-mastercard-usd-to-monero.html Cant get monero and want to pay via giftcards instead? contact the email below. Once you have sent the ransom to the monero address you must write an email this this email address: ZeCBMail@proton.me In this email you will include your personal ID so we know who you are. Your personal ID is: Payment is flexable, if you want to discuss pricing send an email with your discord username and I will contact you. Be warned... pricing can go up too! Once you have completeted all of the steps, you will be provided with the key to decrypt your files. Don't know how ransomware works? Read up here: https://www.trellix.com/en-us/security-awareness/ransomware/what-is-ransomware.html https://www.checkpoint.com/cyber-hub/threat-prevention/ransomware/ https://www.trendmicro.com/vinfo/us/security/definition/Ransomware Note: Messing with the ransomware will simply make your files harder to decrypt. Deleting the virus will make it impossible, as the key can not be generated. Good luck -NullBulge ``` Der Crypto-Miner ist XMRIG und mined für den Pool "xmrpool.eu". Der Bot wird sowohl über Discord-Reactions als auch über direkte Befehle gesteuert. Die Reactions können einfachere Funktionen abbilden, wie z.B. das wipen der Malware vom System. Interessanter sind jedoch die "richtigen" Befehle, z.B.: * '.ss' -> Macht einen Screenshot vom Bildschirm des Opfers * '.screenrec' -> zeichnet 15 Sekunden den Bildschirm auf * '.join' -> Tritt einem Voice Channel bei und überträgt die Aufnahmen des Mikrofons * '.show' -> Zeigt informationen, z.B. alle laufenden Prozesse * '.kill' -> Beendet einen Prozesse * '.block-input' -> Deaktiviert Tastatur- und Mauseingaben * '.break-windows' -> Bennent den Boot-Manager um und verhindert damit, dass Windows rebooten kann * '.xmrig' -> Führt den Cryptominer aus * '.webcam photo' -> Macht ein Bild mit der Webcam * '.encrypt' -> Verschlüsselt alle Dateien im angegebenen Verzeichnis * '.cmd' -> Führt beliebigen Befehl aus * '.admin' -> Kann Funktionen ausführen wie Defender, Taskmanager oder UAC deaktiveren. [^1]: Pyinstaller ist Software, die es ermöglicht, in Python geschriebene Programme so zu compilen und bundlen, dass sie auf Systemen ohne Python-Interpreter benutzt werden können. Das kann z.B. als PE-File (Windows .exe) oder ELF (Linux/Unix) sein. [^2]: [mandiant/capa](https://github.com/mandiant/capa), ein Tool, das eine Datei analysiert und versucht, deren Fähigkeiten (capabilities) zu erfassen. [^3]: [horsicq/Detect-It-Easy](https://github.com/horsicq/Detect-It-Easy) gibt einem die Eigenschaften einer Datei zurück. [^4]: [Yara](https://virustotal.github.io/yara/) ist eine Bibliothek zur Analyse von Malware anhand von Pattern/Eigenschaften der Dateien. [^5]: [MITMProxy](https://mitmproxy.org/) ist ein Forward-Proxy, der alle Verbindungen die über ihn laufen aufzeichnet [^6]: Weder [pycdc](https://github.com/zrax/pycdc) noch [unpyc37-3.10](https://github.com/greyblue9/unpyc37-3.10) konnten den Bytecode decompilen.