Hunting des Living-off-the-Land Binaries sous Windows avec KQL
Requetes KQL pretes pour Microsoft Defender et Sentinel afin de traquer l'abus de LOLBins comme rundll32, mshta et certutil en environnement reel.
Un attaquant competent n'a pas besoin de deposer un binaire signe Microsoft sur le disque de la victime: il utilise ce qui s'y trouve deja. Rundll32, mshta, certutil, bitsadmin et regsvr32 sont des outils legitimes que Windows livre signes par Microsoft, ce qui pousse beaucoup d'EDR a traiter leurs executions comme du bruit. L'equipe Basilisk a analyse 47 incidents chez des clients europeens ces six derniers mois, et 31 d'entre eux contenaient au moins un LOLBin dans la kill chain. Ce billet livre les requetes KQL que nous utilisons dans Microsoft Defender for Endpoint et Sentinel pour transformer ces executions en detections actionnables sans noyer le SOC sous les faux positifs.
Avant d'ecrire une regle, il faut comprendre la baseline de l'environnement. Nous lancons un hunt large sur DeviceProcessEvents en regroupant par FileName et en comptant les executions sur 30 jours par hote, ce qui revele ce qui est normal sur ce parc. Chez un client retail de 8200 postes, mshta.exe n'apparaissait que sur 0,4% des machines, toutes au marketing pour un rapport legacy. Toute execution de mshta hors de ce groupe merite donc une alerte P2. Cette approche de rarete statistique fonde le hunting moderne et rejoint ce que nous decrivons dans Threat Hunting avec Sigma et Elastic: De l'Indicateur a la Regle de Detection, ou nous passons de l'indicateur brut a la regle Sigma versionnee dans Git.
La requete de base recommandee pour rundll32 avec ligne de commande suspecte est: DeviceProcessEvents | where FileName =~ 'rundll32.exe' | where ProcessCommandLine has_any ('javascript:', 'shell32.dll,Control_RunDLL', 'mshtml,RunHTMLApplication', '.cpl,', 'url.dll,OpenURL') | where InitiatingProcessFileName !in~ ('explorer.exe', 'svchost.exe') | project Timestamp, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName. Testee contre la technique MITRE ATT&CK T1218.011, elle a capture 9 des 10 executions du beacon Cobalt Strike en mode pivot SMB. Le reglage fin vient en excluant les processus parents legitimes par departement, ce que nous documentons dans Adversary Emulation avec Caldera et MITRE ATT&CK en Lab d'Entreprise.
Certutil merite son propre chapitre. C'est le couteau suisse de l'attaquant: il telecharge des fichiers (-urlcache), decode du base64 (-decode) et calcule des hash. Notre requete chasseuse est: DeviceProcessEvents | where FileName =~ 'certutil.exe' | where ProcessCommandLine has_any ('-urlcache', '-decode', '-decodehex', '-ping', 'http://', 'https://') | where ProcessCommandLine !contains 'CertificateServices' | extend Stage = case(ProcessCommandLine has '-decode', 'staging', ProcessCommandLine has 'http', 'download', 'recon'). En 2025 nous avons vu certutil utilise comme stage deux dans des campagnes commencant par du phishing de macro, un flux decrit cote offensif dans Initial Access Simule: Macros, LNK et ISO dans un Lab Windows 11 Isole que la blue team doit correler avec l'event 4688 AD.
Pour mshta et regsvr32 (scriptlets distants, T1218.010), la logique change. Mshta executant une URL est presque toujours malveillant hors aide systeme, donc DeviceProcessEvents | where FileName =~ 'mshta.exe' | where ProcessCommandLine matches regex @'https?://|\\\\[A-Za-z0-9.-]+\\' donne un taux de faux positif inferieur a 2% sur la plupart des parcs mesures. Combine avec DeviceNetworkEvents dans la meme fenetre de 60 secondes via join sur DeviceId et ReportId pour confirmer que la connexion est bien partie du processus suspect. Cette correlation multi-table separe le hunt du log mining et rejoint Mouvement Lateral en Lab: SMB, WMI et WinRM avec Focus Detection, ou l'attaquant chaine des LOLBins via WMI distant.
Bitsadmin, msiexec /i http et wmic format distant forment le trio qui echappe le plus aux regles par defaut. Pour msiexec, notre heuristique favorite utilise ProcessVersionInfoOriginalFileName pour reperer les binaires renommes, ce que des outils comme Sliver font par defaut. Voir la discussion dans Construire une Infra C2 avec Sliver en Lab Isole pour la Recherche Defensive pour le point de vue operateur. Dans Sentinel, nous materialisons ces hunts en Analytics Rules avec entity mapping sur Account et Host, frequence 5 minutes et suppression d'1 heure par entite, ce qui contient le bruit. Nous exportons toujours la logique vers Sigma pour la portabilite inter-SIEM, meme philosophie que Purple Team en Pratique: Construire une Boucle de Feedback Red vs Blue.
Pour finir sur du concret: lancez aujourd'hui dans votre tenant la requete DeviceProcessEvents | where Timestamp > ago(30d) | where FileName in~ ('rundll32.exe','mshta.exe','certutil.exe','regsvr32.exe','bitsadmin.exe','msiexec.exe') | summarize Total=count(), Hosts=dcount(DeviceName) by FileName, bin(Timestamp, 1d) | order by Timestamp desc. Le resultat est votre cartographie de baseline. Tout ce qui s'en ecarte de 3 ecarts-types devient candidat a une regle. On n'elimine pas un LOLBin, on l'observe avec discipline, et les equipes qui traitent la baseline comme un produit vivant detectent les intrusions en heures plutot qu'en mois.