OysterLoader Dévoilé : À l’Intérieur d’un Chargeur d’Évasion à Plusieurs Étapes
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
OysterLoader est un chargeur multi-étapes en C++ utilisé pour déployer des rançongiciels et des logiciels malveillants de type Vidar. Il se propage via des sites compromis qui imitent des installateurs de logiciels légitimes et est livré sous forme d’installateur Microsoft (MSI). Pour compliquer l’analyse, il utilise l’inondation d’appels API, la résolution dynamique d’API personnalisée, les vérifications anti-débogage et une routine de décompression LZMA personnalisée. Le chargeur communique avec une infrastructure C2 HTTPS à niveaux en utilisant des en-têtes HTTP obscurcis et un encodage propriétaire de type Base64.
Enquête
Le rapport décrit quatre étapes : un obfuscateur emballé (TextShell), une couche de code shell qui gonfle le contenu avec LZMA, un téléchargeur qui effectue des vérifications de l’environnement et crée un mutex, et une étape finale qui dépose une DLL et installe une tâche planifiée. Le trafic C2 repose sur des IPs/domaines codés en dur, des agents utilisateurs personnalisés, et une livraison de charge utile stéganographique via des icônes PNG. La persistance est maintenue par une tâche planifiée configurée pour s’exécuter toutes les 13 minutes.
Atténuation
Bloquez les installateurs MSI non signés provenant de sources non fiables et surveillez la création de motifs de mutex connus. Signalez les motifs de nom de tâche planifiée et l’utilisation de rundll32.exe pour charger des DLLs depuis %APPDATA%. Lorsque cela est possible, appliquez l’inspection TLS pour identifier les en-têtes HTTP personnalisés et les agents utilisateurs utilisés par le chargeur.
Réponse
Si détecté, isolez l’hôte, terminez la tâche planifiée et supprimez le fichier COPYING3.dll déposé. Cherchez des charges utiles supplémentaires, énumérez les processus correspondant aux valeurs de mutex, bloquez les domaines/IPs C2 répertoriés, et mettez à jour les détections pour le comportement d’inondation d’API et l’encodage Base64 personnalisé.
« graph TB %% Class definitions classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% Nodes initial_access[« <b>Accès initial</b> – <b>T1218.007 Exécution par Proxy de Binaire Système : Msiexec</b><br />MSI malveillant signé livré via un site compromis. »] class initial_access action process_msiexec[« <b>Processus</b> – msiexec.exe<br />Exécute MSI malveillant »] class process_msiexec process stage1[« <b>Étape 1</b> – Packer/Obfuscateur<br /><b>Techniques</b>: T1027 Fichiers ou Informations Obfusqués, T1027.007 Résolution API Dynamique, T1614.001 Découverte de la Langue du Système, T1480.002 Garde-fous d’Exécution : Exclusion Mutuelle, T1497.002 Évasion de Virtualisation/Bac à sable : Vérifications Basées sur l’Activité de l’Utilisateur »] class stage1 malware stage2[« <b>Étape 2</b> – Shellcode<br /><b>Techniques</b>: T1140 Déobfuscation/Décodage de Fichiers (RC4), décompression LZMA »] class stage2 malware stage3[« <b>Étape 3</b> – Téléchargeur & C2<br /><b>Techniques</b>: T1102 Service Web, T1001.003 Impersonnation de Protocole ou Service, T1001.002 Stéganographie, T1102.001 Résolveur de Gouttière Secrète »] class stage3 malware c2_server[« <b>C2</b> – Serveur HTTPS<br />En-têtes personnalisés et faux Agent utilisateur »] class c2_server c2 dll_payload[« <b>Malware</b> – DLL Déposée<br />Stockée dans %APPDATA% »] class dll_payload malware process_rundll32[« <b>Processus</b> – rundll32.exe<br />Exécute la DLL via DllRegisterServer »] class process_rundll32 process task_schtasks[« <b>Persistance</b> – Tâche Planifiée<br />Lance rundll32 avec la DLL déposée »] class task_schtasks persistence stage4[« <b>Étape 4</b> – Persistance & Exécution<br /><b>Techniques</b>: T1546.009 Exécution Déclenchée par un Événement : DLLs AppCert, T1027.003 Stéganographie, T1102.002 Communication Bidirectionnelle »] class stage4 malware %% Connections initial_access u002du002d>|exécute| process_msiexec process_msiexec u002du002d>|livre| stage1 stage1 u002du002d>|génère| stage2 stage2 u002du002d>|télécharge| stage3 stage3 u002du002d>|communique avec| c2_server c2_server u002du002d>|fournit la charge utile à| stage3 stage3 u002du002d>|écrit la DLL à| dll_payload dll_payload u002du002d>|utilisée par| process_rundll32 process_rundll32 u002du002d>|déclenchée par| task_schtasks task_schtasks u002du002d>|programmé depuis| stage4 «
Flux d’attaque
Détections
Schtasks pointe vers un répertoire/script/binaires suspect(s) (via la ligne de commande)
Voir
Exécution du chemin suspect de Rundll32 Dll (via création de processus)
Voir
IOCs (SourceIP) à détecter : OysterLoader Démasqué : Le Chargeur d’Évasion Multi-Étapes
Voir
IOCs (DestinationIP) à détecter : OysterLoader Démasqué : Le Chargeur d’Évasion Multi-Étapes
Voir
Détection de la Communication C2 d’OysterLoader [Connexion Réseau Windows]
Voir
Détection des Techniques Anti-Analyse et d’Exécution d’OysterLoader [Création de Processus Windows]
Voir
Exécution Simulation
Prérequis : La vérification préalable de la télémétrie et de la ligne de base doit avoir réussi.
Raisonnement : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et viser à générer la télémétrie exacte attendue par la logique de détection. Des exemples abstraits ou non liés entraîneront un diagnostic erroné.
-
Récit & Commandes de l’Attaque :
L’adversaire, ayant obtenu un premier accès à l’endpoint, déploie la charge utile OysterLoader.- Enregistrement DLL via Rundll32 – Le chargeur copie une DLL malveillante (
COPYING3.dll) dans le répertoire temporaire et l’enregistre en utilisantrundll32.exeavec le point d’entréeDllRegisterServer, produisant une ligne de commande qui correspond àselection1. - Vérification Anti-Débogage – Pour échapper à l’analyse, la charge utile charge
ntdll.dllet appelleIsDebuggerPresent. Cela génère un enregistrement de processus oùImagecontientntdll.dllet la ligne de commande inclutIsDebuggerPresent, satisfaisantselection2. - Allocation Mémoire – Pour une exécution en mémoire, le chargeur invoque
NtAllocateVirtualMemoryviantdll.dll. L’événement de création de processus résultant contientNtAllocateVirtualMemorydans la ligne de commande, satisfaisantselection3.
- Enregistrement DLL via Rundll32 – Le chargeur copie une DLL malveillante (
-
Script de Test de Régression :
# Script de validation de détection OysterLoader – PowerShell # ---------------------------------------------------- # 1. Créer une DLL malveillante factice (fichier vide pour la simulation) $dllPath = "$env:TEMPCOPYING3.dll" New-Item -Path $dllPath -ItemType File -Force | Out-Null # 2. Déclencher selection1 – rundll32 avec DllRegisterServer Write-Host "Exécution de selection1 (enregistrement DLL rundll32)..." Start-Process -FilePath "rundll32.exe" -ArgumentList "`"$dllPath`" DllRegisterServer" -NoNewWindow # 3. Déclencher selection2 – ntdll avec IsDebuggerPresent Write-Host "Exécution de selection2 (IsDebuggerPresent)..." $scriptBlock = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern bool IsDebuggerPresent(); "@ -Namespace WinAPI -Name NativeMethods [WinAPI.NativeMethods]::IsDebuggerPresent() | Out-Null } Start-Job -ScriptBlock $scriptBlock | Wait-Job | Receive-Job # 4. Déclencher selection3 – ntdll avec NtAllocateVirtualMemory Write-Host "Exécution de selection3 (NtAllocateVirtualMemory)..." $scriptBlock2 = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern int NtAllocateVirtualMemory( IntPtr ProcessHandle, ref IntPtr BaseAddress, IntPtr ZeroBits, ref UIntPtr RegionSize, uint AllocationType, uint Protect); "@ -Namespace WinAPI -Name NativeMethods $process = [System.Diagnostics.Process]::GetCurrentProcess() $handle = $process.Handle $base = [IntPtr]::Zero $size = [UIntPtr]::Zero [WinAPI.NativeMethods]::NtAllocateVirtualMemory($handle, [ref]$base, [IntPtr]::Zero, [ref]$size, 0x1000, 0x04) | Out-Null } Start-Job -ScriptBlock $scriptBlock2 | Wait-Job | Receive-Job # Nettoyage Remove-Item -Path $dllPath -Force Write-Host "Simulation terminée." -
Commandes de Nettoyage :
# Assurez-vous que tout processus rundll32 résiduel ou travaux sont terminés Get-Process -Name "rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force Get-Job | Remove-Job -Force # Supprimer la DLL temporaire si encore présente $tempDll = "$env:TEMPCOPYING3.dll" if (Test-Path $tempDll) { Remove-Item $tempDll -Force }