La campagne TerminalFix construit des tunnels inversés pour un accès persistant
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
La campagne TerminalFix est une variante de ClickFix qui utilise des superpositions CAPTCHA Cloudflare fictives pour manipuler les utilisateurs et les amener à exécuter des commandes PowerShell malveillantes. La chaîne d’attaque combine le chargement de DLL via le détournement, l’extraction stéganographique de charges utiles à partir d’images PNG et une reconnaissance approfondie de l’Active Directory. La campagne déploie finalement un implant de tunnel inverse basé sur Python personnalisée qui donne aux attaquants un accès persistant au niveau du réseau via un proxy.
Enquête
Microsoft Threat Intelligence a analysé la chaîne d’attaque à plusieurs étapes, qui exploite le binaire signé légitime LockScreenContentServer.exe pour le chargement de DLL détourné. L’enquête a montré comment les charges utiles malveillantes sont dissimulées dans des pixels PNG et comment un runtime Python établit un tunnel inverse basé sur WebSocket. Les chercheurs ont également identifié l’infrastructure de commande-et-contrôle et les techniques de reconnaissance utilisées pour cartographier les réseaux internes.
Atténuation
Les organisations devraient restreindre l’exécution de PowerShell via AppLocker ou la stratégie de groupe et surveiller les LockScreenContentServer.exe exécutions à partir de lieux inhabituels ou non standards. Les règles de réduction de la surface d’attaque (ASR) peuvent aider à bloquer les scripts obfusqués et les lancements exécutables non autorisés. La formation à la sensibilisation des utilisateurs axée sur la reconnaissance des faux CAPTCHA est également une mesure préventive importante.
Réponse
Si une activité TerminalFix est détectée, les appareils concernés doivent être traités comme des points de pivot de réseau potentiels et faire l’objet d’une enquête pour tout mouvement latéral. La rotation des identifiants doit être priorisée, en particulier pour les comptes administrateurs de domaine accessibles depuis le système compromis. Les équipes de sécurité devraient également effectuer des analyses médico-légales pour les runtimes Python non autorisés et les connexions WebSocket sortantes suspectes.
Flux d’attaque
Nous mettons encore à jour cette partie.
Détections
Points de persistance possibles [ASEPs – Software/NTUSER Hive] (via registry_event)
Modèles d’attaque ClickFix possibles en ligne de commande (via cmdline)
Exécution Python à partir de dossiers suspects (via cmdline)
Appel de classes/méthodes .NET suspectes depuis Powershell CommandLine (via process_creation)
Énumération système possible (via cmdline)
Découverte de système distant possible ou vérification de connectivité (via cmdline)
Découverte de relations de confiance de domaine suspects (via cmdline)
Exécution Attrib pour masquer des fichiers (via cmdline)
Téléchargements directs possibles de l’interprète Python (via cmdline)
Un archive a été extrait dans un répertoire suspect en utilisant Powershell (via powershell)
IOC (HashSha256) à détecter : campagne TerminalFix déploie un tunnel inverse à travers une intrusion en plusieurs étapes
Tunnel WebSocket TLS sortant vers gitnow.dev [Connexion réseau Windows]
Détection du tunnel inverse TerminalFix et du chargement de DLL via détournement [Création de processus Windows]
Chargement de DLL et extraction stéganographique de charge utile dans la campagne TerminalFix [Chargement d’image Windows]
Exécution de PowerShell et boucle de commande de la campagne TerminalFix [Windows Powershell]
Exécution de simulation
Prérequis : Le contrôle pré-vol de la télémétrie et de la référence doit avoir été passé.
Raisonnement : Cette section détaille l’exécution précise de la technique d’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le narratif DOIVENT refléter directement les TTP identifiés et viser à générer exactement la télémétrie attendue par la logique de détection. Des exemples abstraits ou non liés mèneront à un mauvais diagnostic.
-
Narratif de l’attaque & Commandes : L’adversaire a l’intention d’établir un tunnel inverse persistant. Pour se fondre dans les processus système, il dépose d’abord un binaire à l’apparence légitime,
LockScreenContentServer.exe, dans un répertoire. Il utilise ensuite le chargement de DLL détourné pour exécuter du code malveillant. Ensuite, il initie un tunnel basé sur Python en utilisantpythonw.exe(pour éviter une fenêtre de console visible) et exécute un script nomméclient.py. Cette séquence est conçue pour créer une porte dérobée au niveau réseau qui contourne les restrictions standard du pare-feu via le tunneling WebSocket. -
Script de Test de Régression :
# Script de Simulation : Émulation du Tunnel Inverse TerminalFix # 1. Configurer l'Environnement $targetDir = "C:UsersPublicDownloadsSystemFiles" New-Item -Path $targetDir -ItemType Directory -Force # 2. Créer un 'LockScreenContentServer.exe' fictif (Simulation du binaire détourné) # Dans une vraie attaque, il s'agirait d'un vrai fichier PE. $dummyExe = Join-Path $targetDir "LockScreenContentServer.exe" New-Item -Path $dummyExe -ItemType File -Force # 3. Créer un script Python fictif 'client.py' $pythonScript = Join-Path $targetDir "client.py" "print('Establishing tunnel...')" | Out-File -FilePath $pythonScript -Encoding ascii # 4. Exécuter les processus 'malveillants' pour déclencher la logique de détection # Déclencheur Partie A : LockScreenContentServer.exe Start-Process -FilePath $dummyExe -WindowStyle Hidden # Déclencheur Partie B : pythonw.exe avec client.py en ligne de commande # Remarque : Nous utilisons le chemin complet vers pythonw.exe comme prévu par la règle $pythonwPath = "C:WindowsSystem32pythonw.exe" # Si pythonw n'est pas dans System32, nous le localisons if (-not (Test-Path $pythonwPath)) { $pythonwPath = (Get-Command pythonw.exe).Source } Start-Process -FilePath $pythonwPath -ArgumentList $pythonScript -WindowStyle Hidden -
Commandes de Nettoyage :
# Script de Nettoyage $targetDir = "C:UsersPublicDownloadsSystemFiles" if (Test-Path $targetDir) { Remove-Item -Path $targetDir -Recurse -Force }