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 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. diff --git a/static/img/blog/2024-06-03-cape-analysis.png b/static/img/blog/2024-06-03-cape-analysis.png new file mode 100644 index 0000000..1c1c751 Binary files /dev/null and b/static/img/blog/2024-06-03-cape-analysis.png differ