VIPERTUNNEL Python-Backdoor: Eine eingehende Analyse
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Der Bericht beschreibt die Analyse von VIPERTUNNEL, einem auf Python basierenden Backdoor, das durch eine geplante Aufgabe persistiert und eine bösartige sitecustomize.py verwendet, um eine verschleierte DLL zu laden. Die DLL entschlüsselt und führt eine mehrstufige Nutzlast aus, die einen SOCKS5-Proxy zu einem fest codierten C2-Server über Port 443 aufbaut. Die Infrastruktur ist mit UNC2165 und EvilCorp verknüpft und teilt Obfuskationstechniken mit dem ShadowCoil-Anmeldeinformationsdieb.
Untersuchung
Forscher untersuchten die Ausgabe von Autoruns, identifizierten die geplante Aufgabe 523135538 und verfolgten die Ausführung bis zu C:ProgramDatacp49spythonw.exe und ihrem sitecustomize.py-Modul. Die Rückwärtserstellung von b5yogiiy3c.dll enthüllte schichtweise Obfuskation, Entschlüsselungsroutinen und eine Endstufe, die einen SOCKS5-Tunnel mit fest codierten Anmeldeinformationen erstellt. Infrastrukturanalysen verbanden mehrere Domains und IPs mit der Kampagne und hoben den Einsatz des Pyramid-C2-Frameworks hervor.
Eindämmung
Endpunkterkennung bereitstellen, die die Ausführung von pythonw.exe ohne Argumente, die Erstellung von geplanten Aufgaben mit numerischen Namen und die Anwesenheit von sitecustomize.py an unerwarteten Orten überwacht. Ausgangsverkehr zu bekannten C2-Domains und zu den Ports 443/8000 mit anomalen HTTP 401-Antworten blockieren. Strenge Anwendungskontrolle implementieren, um das Laden nicht autorisierter Python-Module zu verhindern.
Reaktion
Alarm bei der Erstellung der verdächtigen geplanten Aufgabe und der Ausführung von pythonw.exe ohne Skript. Betroffene Hosts isolieren, Speicherdumps sammeln und nach charakteristischen Klassennamen und fest codierten Anmeldeinformationen suchen. Die kompromittierten Anmeldeinformationen ungültig machen und die im Bericht identifizierte C2-Infrastruktur stören.
graph TB %% Class definitions classDef technique fill:#ffcc99 classDef process fill:#c2f0c2 classDef tool fill:#ffeb99 classDef file fill:#d9d9d9 classDef component fill:#cce5ff classDef c2 fill:#f4b084 classDef credential fill:#ffe6e6 %% Technique nodes tech_persistence[„<b>Technik</b> – T1053.005 Geplanter Task : Persistenz<br/><b>Beschreibung</b>: Erstellt oder modifiziert einen geplanten Task zur Ausführung bei Systemstart oder Zeitplan.“] class tech_persistence technique tech_obfuscation[„<b>Technik</b> – T1027 Obfuskierte Dateien oder Informationen<br/><b>Beschreibung</b>: Verwendet Kodierung, Kompression und kryptografische Verfahren zur Verschleierung von Code.“] class tech_obfuscation technique tech_deobfuscate[„<b>Technik</b> – T1140 Deobfuskation/Decode von Dateien oder Informationen<br/><b>Beschreibung</b>: Dekodiert Base85 und andere Transformationen zur Wiederherstellung des nächsten Codes.“] class tech_deobfuscate technique tech_compile[„<b>Technik</b> – T1027.004 Nach Lieferung kompilieren<br/><b>Beschreibung</b>: Kompiliert Code im Speicher mit compile() und exec().“] class tech_compile technique tech_reflect[„<b>Technik</b> – T1620 Reflektives Code-Loading<br/><b>Beschreibung</b>: Lädt und führt Code direkt im Speicher aus.“] class tech_reflect technique tech_proxy_ext[„<b>Technik</b> – T1090.002 Externer Proxy<br/><b>Beschreibung</b>: Aufbau eines externen SOCKS5-Proxys.“] class tech_proxy_ext technique tech_proxy_int[„<b>Technik</b> – T1090.001 Interner Proxy<br/><b>Beschreibung</b>: Nutzung interner Proxy-Komponenten.“] class tech_proxy_int technique tech_tunnel[„<b>Technik</b> – T1572 Protokoll-Tunneling<br/><b>Beschreibung</b>: Kapselt Traffic in SOCKS5-Tunnel.“] class tech_tunnel technique tech_encrypted[„<b>Technik</b> – T1573 Verschlüsselter Kanal<br/><b>Beschreibung</b>: Verschlüsselt C2-Kommunikation mit ChaCha20/XOR.“] class tech_encrypted technique tech_webc2[„<b>Technik</b> – T1102 Webdienst<br/><b>Beschreibung</b>: HTTPS-Kommunikation mit C2 (Pyramid Service).“] class tech_webc2 technique tech_nonstd[„<b>Technik</b> – T1571 Nicht-Standard-Port<br/><b>Beschreibung</b>: Nutzung von Port 443 zur Tarnung.“] class tech_nonstd technique %% Process and tool nodes process_task[„<b>Prozess</b> – Geplanter Task 523135538<br/><b>Befehl</b>: C:\\ProgramData\\cp49s\\pythonw.exe“] class process_task process tool_pythonw[„<b>Tool</b> – pythonw.exe<br/><b>Rolle</b>: Führt Python ohne Konsole aus.“] class tool_pythonw tool %% File nodes file_sitecustomize[„<b>Datei</b> – sitecustomize.py<br/><b>Zweck</b>: Auto-Import und DLL-Ausführung.“] class file_sitecustomize file file_dll[„<b>Datei</b> – b5yogiiy3c.dll<br/><b>Typ</b>: Obfuskierte Python-Payload.“] class file_dll file %% Component nodes component_wire[„<b>Komponente</b> – Wire-Klasse<br/><b>Funktion</b>: SOCKS5-Client.“] class component_wire component component_relay[„<b>Komponente</b> – Relay-Klasse<br/><b>Funktion</b>: Traffic-Weiterleitung.“] class component_relay component component_commander[„<b>Komponente</b> – Commander-Klasse<br/><b>Funktion</b>: C2-Steuerung.“] class component_commander component %% C2 and credential nodes c2_server[„<b>C2 Server</b> – Pyramid Service<br/><b>Antwort</b>: HTTP 401 Basic realm=Proxy“] class c2_server c2 credentials[„<b>Anmeldedaten</b> – AnyUser / AnyPassword<br/><b>Verwendung</b>: Proxy-Authentifizierung.“] class credentials credential %% Connections tech_persistence –>|creates| process_task process_task –>|launches| tool_pythonw tool_pythonw –>|imports| file_sitecustomize file_sitecustomize –>|loads| file_dll file_dll –>|uses| tech_obfuscation file_dll –>|triggers| tech_deobfuscate tech_deobfuscate –>|leads to| tech_compile tech_compile –>|leads to| tech_reflect tech_reflect –>|executes| component_wire component_wire –>|works with| component_relay component_relay –>|controls| component_commander component_commander –>|contacts| c2_server c2_server –>|uses| tech_proxy_ext c2_server –>|uses| tech_proxy_int c2_server –>|tunnels via| tech_tunnel c2_server –>|encrypts channel| tech_encrypted c2_server –>|communicates over| tech_webc2 c2_server –>|uses port| tech_nonstd component_commander –>|auth with| credentials %% Apply classes class tech_persistence,tech_obfuscation,tech_deobfuscate,tech_compile,tech_reflect,tech_proxy_ext,tech_proxy_int,tech_tunnel,tech_encrypted,tech_webc2,tech_nonstd technique class process_task process class tool_pythonw tool class file_sitecustomize,file_dll file class component_wire,component_relay,component_commander component class c2_server c2 class credentials credential
Angriffsablauf
Erkennungen
Python-Ausführung aus verdächtigen Ordnern (über cmdline)
Anzeigen
Verdächtige geplante Aufgabe (über Prüfung)
Anzeigen
IOC’s (SourceIP) zur Erkennung: Schlängeln durch den Lärm – Tiefenanalyse des VIPERTUNNEL Python-Backdoors Teil 2
Anzeigen
IOC’s (SourceIP) zur Erkennung: Schlängeln durch den Lärm – Tiefenanalyse des VIPERTUNNEL Python-Backdoors Teil 1
Anzeigen
IOC’s (DestinationIP) zur Erkennung: Schlängeln durch den Lärm – Tiefenanalyse des VIPERTUNNEL Python-Backdoors Teil 2
Anzeigen
IOC’s (DestinationIP) zur Erkennung: Schlängeln durch den Lärm – Tiefenanalyse des VIPERTUNNEL Python-Backdoors Teil 1
Anzeigen
Verdächtige Ausführung von Python zur Persistenz über sitecustomize.py [Windows-Prozesserstellung]
Anzeigen
Simulationsausführung
Voraussetzung: Der Telemetrie & Baseline Pre‑flight Check muss bestanden sein.
Begründung: Dieser Abschnitt erläutert die präzise Ausführung der Angreifertechnik (TTP), die darauf abzielt, die Erkennungsregel auszulösen. Die Befehle und die Erzählung MÜSSEN die identifizierten TTPs genau widerspiegeln und darauf abzielen, die genaue Telemetrie zu erzeugen, die von der Erkennungslogik erwartet wird.
-
Angriffserzählung & Befehle:
Der Angreifer lässt zuerst eine bösartige
sitecustomize.pyim selben Verzeichnis wiepythonw.exe. Python importiert automatischsitecustomize.pybeim Start des Interpreters, was dem Angreifer ermöglicht, beliebigen Code auszuführen, ohne einen Skriptpfad in der Befehlszeile anzugeben. Durch Starten vonpythonw.exeohne Argumente, enthält das Prozessereignis zur Erstellung eine leereCommandLineFeld, das die Bedingungen der Sigma-Regel erfüllt. Die Nutzlast etabliert eine geplante Aufgabe zur Persistenz, indem der Interpreter beim Systemstart ausgeführt wird, um langfristig Zugriff zu gewährleisten. -
Regressionstest-Skript:
# ------------------------------------------------- # Bösartige sitecustomize.py einrichten # ------------------------------------------------- $payloadPath = 'C:ProgramDatacp49ssitecustomize.py' $exePath = 'C:ProgramDatacp49spythonw.exe' # Sicherstellen, dass der Zielordner existiert New-Item -ItemType Directory -Path (Split-Path $exePath) -Force | Out-Null # Eine harmlose Kopie von pythonw.exe für den Test bereitstellen (falls nicht bereits vorhanden) # In einem realen Red-Team-Szenario wäre dies der legitime Interpreter if (-Not (Test-Path $exePath)) { # Aus der systemweiten Python-Installation kopieren (bei Bedarf Pfad anpassen) Copy-Item 'C:Python39pythonw.exe' $exePath } # Bösartige sitecustomize.py erstellen (erstellt eine geplante Aufgabe als Machbarkeitsnachweis) @" import subprocess, sys # Erstellen einer geplanten Aufgabe, die pythonw.exe jede Minute ausführt (Persistenz) subprocess.run(['schtasks', '/Create', '/SC', 'MINUTE', '/MO', '1', '/TN', 'UpdateTask', '/TR', sys.executable]) "@ | Set-Content -Path $payloadPath -Encoding UTF8 # ------------------------------------------------- # Die Erkennung auslösen (bösartige Ausführung) # ------------------------------------------------- Write-Host '[+] Starte pythonw.exe mit leerer Befehlszeile...' Start-Process -FilePath $exePath -ArgumentList '' -WindowStyle Hidden # Eine kurze Wartezeit, damit die geplante Aufgabe erstellt wird (optional) Start-Sleep -Seconds 5 Write-Host '[+] Nutzlast ausgeführt. Prüfen Sie Ihr SIEM auf die Warnung.' # ------------------------------------------------- # Ende des Skripts # ------------------------------------------------- -
Aufräum-Befehle:
# Entfernen der bösartigen sitecustomize.py Remove-Item -Path 'C:ProgramDatacp49ssitecustomize.py' -Force -ErrorAction SilentlyContinue # Löschen der vom Payload erstellten geplanten Aufgabe schtasks /Delete /TN UpdateTask /F # Optional die kopierte pythonw.exe entfernen (falls es eine Testkopie war) # Remove-Item -Path 'C:ProgramDatacp49spythonw.exe' -Force Write-Host '[+] Aufräumen abgeschlossen.'