Campagne Photo ZIP ciblant l’industrie hôtelière délivre un implant Node.js pour un accès persistant
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Une campagne d’intrusion active en plusieurs étapes cible le secteur de l’hôtellerie via des archives ZIP à thème photo qui contiennent des fichiers LNK malveillants. La chaîne d’infection utilise des décodeurs PowerShell obfusqués, une compilation DLL .NET à la volée, et un implant basé sur Node.js pour la persistance et la communication de commandement et de contrôle. L’acteur de la menace blanchit également l’authentification par des services légitimes tels que Calendly et Google pour réduire la probabilité de détection basée sur les e-mails.
Enquête
Microsoft a identifié deux vagues distinctes de la campagne et a observé une progression des chargeurs PowerShell simples à des étapes de compilation .NET plus complexes. L’enquête a également révélé une stratégie de double persistance reposant à la fois sur des clés de registre HKCURun and HKCURunOnce . Les chercheurs ont également noté l’utilisation de domaines frontaux Cloudflare et de ports de commandement et de contrôle non standard pour masquer l’infrastructure de soutien.
Atténuation
Les organisations devraient prioriser les détections multicouches pour l’exécution de raccourcis, la compilation .NET inattendue, et les processus Node.js lancés depuis des répertoires utilisateur modifiables. L’activation des règles de réduction de la surface d’attaque et la surveillance des changements non autorisés d’exclusion Microsoft Defender sont fortement recommandées. Bloquer les modèles de domaine .cfd suspects et surveiller le trafic sortant sur des ports inhabituels peut également aider à réduire l’exposition.
Réponse
Si cette activité est détectée, la remédiation devrait inclure la suppression à la fois de l’entrée ProgramData RunOnce et de la clé Node.js Run pour empêcher l’implant de se rétablir. Les équipes de sécurité devraient également supprimer le runtime Node.js et les charges utiles associées du .js répertoire AppDataLocalNodejs. Un nettoyage complet nécessite de s’attaquer à la fois à la charge utile active et à tout mécanisme de persistance laissé par derrière. AppDataLocalNodejs directory. Complete cleanup requires addressing both the active payload and any persistence mechanisms left behind.
Flux d’attaque
Détections
Commandement et Contrôle suspect par requête DNS de domaine de premier niveau inhabituel (TLD)
Voir
Points de persistance possibles [ASEPs – Ruche Software/NTUSER] (via événement de registre)
Voir
Fichier LNK malveillant possible avec double extension (via cmdline)
Voir
Node possiblement lancé par un processus connu abusé (via cmdline)
Voir
Changements suspects des préférences Windows Defender (via powershell)
Voir
Indicateurs d’obfuscation PowerShell possibles (via powershell)
Voir
Runtimes de script initiant des connexions TLS sortantes (via network_connection)
Voir
Détection des ports C2 non standards et du trafic de domaine .cfd [Connexion Réseau Windows]
Voir
Détecter le décodeur de BigInt PowerShell Obfusqué avec évitement de Defender [Windows Powershell]
Voir
Exécution de simulation
Prérequis : Le contrôle préalable de télémétrie et de référence doit être passé.
Justification : 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 pertinents entraîneront un diagnostic erroné.
-
Narratif d’attaque & Commandes : Un adversaire a obtenu un accès initial via un lien de spearphishing (T1566.002). Pour établir la persistance et le Commandement et Contrôle (C2), l’adversaire déploie un implant léger basé sur PowerShell. Pour éviter la détection par des règles de pare-feu de base qui ne surveillent que les ports standard, l’attaquant décide d’utiliser un port non standard (8443) pour le battement de cœur principal. De plus, l’implant est configuré pour effectuer un second « retour » à un domaine de secours hébergé sur un
.cfdTLD pour garantir la résilience si l’IP principale est bloquée. Cela imite le comportement de la campagne Photo-Zip mentionnée dans les références de la règle. -
Script de test de régression :
# Script de simulation : Émulation C2 pour validation de règle # Ce script simule des connexions réseau vers des ports non standards et des domaines .cfd. Write-Host "[+] Début de la simulation C2..." -ForegroundColor Cyan # 1. Simuler la connexion à un port C2 non standard (8443) # Nous utilisons une IP publique qui écoute sur 8443 (ou un écouteur local si disponible) Write-Host "[+] Tentative de connexion au port non standard 8443..." -ForegroundColor Yellow try { $tcpClient = New-Object System.Net.Sockets.TcpClient $tcpClient.Connect("8.8.8.8", 8443) # En utilisant Google DNS comme cible factice pour le test de port } catch { Write-Host "[!] Échec de la connexion au port 8443 (prévu si le port est fermé), mais la télémétrie devrait toujours être générée." -ForegroundColor Gray } finally { $tcpClient.Close() } # 2. Simuler la connexion à un domaine .cfd # Nous tentons de résoudre et de nous connecter à un domaine factice .cfd Write-Host "[+] Tentative de connexion au domaine .cfd..." -ForegroundColor Yellow $cfdDomain = "malicious-c2-test.cfd" try { # Utilisation de Resolve-DnsName pour déclencher la télémétrie DNS, suivie d'une requête web Resolve-DnsName -Name $cfdDomain -ErrorAction SilentlyContinue Invoke-WebRequest -Uri "http://$cfdDomain" -TimeoutSec 2 -ErrorAction SilentlyContinue } catch { Write-Host "[!] Échec de la connexion au domaine .cfd (prévu pour le domaine factice), mais la télémétrie devrait être générée." -ForegroundColor Gray } Write-Host "[+] Simulation terminée." -ForegroundColor Cyan -
Commandes de nettoyage :
# Nettoyage : Aucun artefact persistant n'a été créé par ce script spécifique. # Si un écouteur a été démarré, il devra être arrêté. Write-Host "[+] Aucun nettoyage requis pour cette simulation sans état." -ForegroundColor Green