Avant de lancer les requêtes : portée, rétention et méthode
Advanced Hunting dans Microsoft Defender XDR permet d’interroger les télémétries de sécurité avec Kusto Query Language. Microsoft indique que les données brutes des appareils sont explorables jusqu’à 30 jours; les heures sont interprétées en UTC. Les tables disponibles dépendent toutefois des produits déployés, des licences et des permissions de votre rôle.
Les exemples ci-dessous privilégient les tables Microsoft Defender for Endpoint. Commencez avec une courte période, mesurez le volume, puis adaptez les seuils à votre environnement. Un résultat est un signal à valider dans la chronologie de l’appareil, pas une preuve automatique de compromission.
- Filtrer Timestamp tôt dans la requête pour réduire le coût.
- Utiliser project pour ne retourner que les colonnes nécessaires.
- Préférer in~ et has_any aux égalités fragiles sur les lignes de commande.
- Documenter les exclusions légitimes plutôt que d’élargir silencieusement les seuils.
- Valider les noms ActionType dans la référence de schéma intégrée au portail, car ils peuvent évoluer.
1 — Repérer les capteurs MDE inactifs ou en mauvais état
Cette vue conserve le dernier enregistrement de chaque appareil intégré, puis isole ceux dont le capteur n’est pas actif ou dont la dernière télémétrie date de plus de 24 heures. Ajustez le délai pour les portables rarement connectés et les serveurs volontairement arrêtés.
DeviceInfo
| where Timestamp > ago(30d)
| where OnboardingStatus =~ 'Onboarded'
| summarize arg_max(Timestamp, *) by DeviceId
| where SensorHealthState !~ 'Active' or Timestamp < ago(1d)
| project Timestamp, DeviceName, OSPlatform, ClientVersion,
SensorHealthState, OnboardingStatus, MachineGroup
| order by Timestamp asc2 — Prioriser les appareils exposés à Internet ou très vulnérables
IsInternetFacing et ExposureLevel permettent de produire une courte liste de machines à revoir en priorité. Corrélez le résultat avec le pare-feu, le NAT, les services publiés et la valeur métier de l’actif; une classification ne remplace pas la validation réseau.
DeviceInfo
| where Timestamp > ago(7d)
| summarize arg_max(Timestamp, *) by DeviceId
| where OnboardingStatus =~ 'Onboarded'
| where IsInternetFacing == true or ExposureLevel =~ 'High'
| project DeviceName, OSPlatform, OSVersion, IsInternetFacing,
ExposureLevel, AssetValue, PublicIP, MachineGroup
| order by IsInternetFacing desc, ExposureLevel asc3 — Mesurer l’impact des règles ASR en Audit et en Block
Les événements ASR se trouvent dans DeviceEvents. Cette synthèse sépare les ActionType et montre les processus les plus touchés. Microsoft précise que les événements ASR sont limités aux processus uniques vus dans une heure : utilisez le résultat comme indicateur d’impact, pas comme compteur exhaustif de chaque tentative.
DeviceEvents
| where Timestamp > ago(30d)
| where ActionType startswith 'Asr'
| summarize Events=count(), Devices=dcount(DeviceId),
SampleDevices=make_set(DeviceName, 5)
by ActionType, InitiatingProcessFileName
| order by Events desc4 — Détecter des commandes PowerShell de téléchargement ou encodées
PowerShell est aussi légitime qu’indispensable. Cette requête vise donc des combinaisons courantes de téléchargement, d’exécution en mémoire ou d’encodage. Comparez le compte, le parent, la machine et la ligne de commande avec vos outils d’administration, scripts de connexion et plateformes de déploiement.
DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName in~ ('powershell.exe', 'powershell_ise.exe', 'pwsh.exe')
| where ProcessCommandLine has_any
('DownloadString', 'DownloadFile', 'WebClient', 'Invoke-WebRequest',
'FromBase64String', '-EncodedCommand', 'IEX', 'Invoke-Expression')
| project Timestamp, DeviceId, DeviceName, Account=InitiatingProcessAccountUpn,
FileName, ProcessCommandLine, InitiatingProcessFileName,
InitiatingProcessCommandLine, SHA1
| top 200 by Timestamp desc5 — Identifier les vagues d’échecs d’authentification
Un grand nombre d’échecs provenant d’une même adresse IP peut signaler un mot de passe périmé, un service mal configuré, du password spraying ou une tentative de déplacement latéral. Le regroupement sur 15 minutes rend les pointes visibles sans produire une ligne par événement.
DeviceLogonEvents
| where Timestamp > ago(7d)
| where ActionType == 'LogonFailed'
| summarize Failures=count(), Accounts=dcount(AccountName),
AccountSamples=make_set(AccountName, 10),
Reasons=make_set(FailureReason, 5)
by RemoteIP, DeviceName, LogonType, bin(Timestamp, 15m)
| where Failures >= 10
| order by Failures desc6 — Surveiller les ouvertures RDP réussies avec privilèges locaux
Une session RDP réussie avec un compte administrateur local n’est pas forcément malveillante, mais elle mérite une visibilité particulière sur les serveurs critiques et hors des heures normales. Créez une liste d’adresses de rebond autorisées ou de comptes d’administration pour réduire le bruit.
DeviceLogonEvents
| where Timestamp > ago(7d)
| where ActionType == 'LogonSuccess'
| where LogonType =~ 'RemoteInteractive'
| where IsLocalAdmin == true
| project Timestamp, DeviceId, DeviceName, AccountDomain, AccountName,
RemoteIP, RemoteDeviceName, Protocol, LogonType
| order by Timestamp desc7 — Trouver des LOLBins qui communiquent vers l’extérieur
Des utilitaires Windows signés peuvent être détournés pour télécharger ou exécuter du contenu. Ici, le signal est la combinaison d’un binaire fréquemment détourné et d’une connexion réseau externe. Validez le domaine, l’IP, la ligne de commande et le processus parent avant de conclure.
let LolBins = dynamic(['mshta.exe','rundll32.exe','regsvr32.exe',
'certutil.exe','bitsadmin.exe','wmic.exe']);
DeviceNetworkEvents
| where Timestamp > ago(7d)
| where InitiatingProcessFileName in~ (LolBins)
| where RemoteIPType =~ 'Public' or isnotempty(RemoteUrl)
| project Timestamp, DeviceId, DeviceName, InitiatingProcessFileName,
InitiatingProcessCommandLine, RemoteUrl, RemoteIP, RemotePort,
InitiatingProcessAccountUpn
| top 200 by Timestamp desc8 — Rechercher les préparatifs courants d’un rançongiciel
Microsoft observe régulièrement l’arrêt de services, la suppression des copies fantômes, l’effacement des journaux et la modification du démarrage avant le chiffrement. Chaque commande peut avoir un usage administratif légitime; la combinaison de plusieurs signaux sur le même appareil augmente fortement la priorité d’enquête.
DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName in~ ('vssadmin.exe','wmic.exe','wbadmin.exe',
'bcdedit.exe','wevtutil.exe','cipher.exe','sc.exe')
| where ProcessCommandLine has_any
('delete shadows', 'shadowcopy delete', 'delete catalog',
'recoveryenabled no', 'bootstatuspolicy', ' cl ',
'stop', 'deletejournal', '/w:')
| project Timestamp, DeviceId, DeviceName, FileName, ProcessCommandLine,
InitiatingProcessAccountUpn, InitiatingProcessFileName, SHA1
| order by Timestamp desc9 — Lister les vulnérabilités graves avec exploit public
Cette jointure combine l’inventaire des vulnérabilités trouvées sur les appareils avec la base de connaissances TVM. Elle priorise les CVE graves ou critiques pour lesquelles un exploit public est indiqué. Ces tables doivent être interrogées dans Defender XDR Advanced Hunting; Microsoft précise qu’elles ne sont pas ingérées nativement dans Microsoft Sentinel.
DeviceTvmSoftwareVulnerabilities
| where VulnerabilitySeverityLevel in~ ('High', 'Critical')
| join kind=inner (
DeviceTvmSoftwareVulnerabilitiesKB
| where IsExploitAvailable == true
| project CveId, CvssScore, IsExploitAvailable, PublishedDate
) on CveId
| summarize Devices=dcount(DeviceId), DeviceSamples=make_set(DeviceName, 10),
Versions=make_set(SoftwareVersion, 10), MaxCvss=max(todouble(CvssScore))
by CveId, SoftwareVendor, SoftwareName, VulnerabilitySeverityLevel
| order by MaxCvss desc, Devices desc10 — Produire une vue quotidienne des alertes prioritaires
AlertInfo unifie les alertes provenant des différentes solutions Defender déployées. Cette synthèse montre les titres récurrents, la sévérité et la source. Elle aide à repérer une hausse de bruit ou un type d’alerte dominant, mais l’état de l’incident et la preuve associée doivent être consultés avant toute fermeture en masse.
AlertInfo
| where Timestamp > ago(14d)
| where Severity in~ ('Medium', 'High')
| summarize Alerts=dcount(AlertId),
Techniques=make_set(AttackTechniques, 10)
by bin(Timestamp, 1d), Severity, ServiceSource, Title
| order by Timestamp desc, Alerts descTransformer une chasse en détection personnalisée
Après avoir validé le comportement normal et réduit les faux positifs, certaines requêtes événementielles peuvent devenir des détections personnalisées. Microsoft recommande de conserver Timestamp et, pour les données Endpoint, DeviceId ou DeviceName afin d’associer correctement l’alerte et l’arbre de processus. Une règle peut produire au maximum 150 alertes par exécution; un filtre trop large crée donc du bruit et peut masquer le signal.
Les requêtes d’état, comme la santé des capteurs ou la liste TVM, se prêtent mieux à un rapport planifié qu’à une alerte par événement. Révisez régulièrement les seuils, les exclusions et le coût de calcul affiché dans le portail.
Références officielles et lectures connexes
Les schémas Advanced Hunting évoluent. Vérifiez la référence intégrée au portail avant de transformer un exemple en règle de production, surtout pour les ActionType et les tables en préversion.
- Microsoft Learn — Schéma Advanced Hunting ↗
- Microsoft Learn — Bonnes pratiques KQL ↗
- Microsoft Learn — Table DeviceInfo et santé des capteurs ↗
- Microsoft Learn — Table des vulnérabilités logicielles TVM ↗
- Microsoft Learn — Rechercher les signes de rançongiciel ↗
- Microsoft Learn — Créer une détection personnalisée ↗
- Article connexe — Règles ASR : Audit vers Block →
- Article connexe — Audit de sécurité Active Directory →