Microsoft Defender Advanced Hunting : 10 requêtes KQL utiles pour un administrateur TI

Dix requêtes KQL prêtes à adapter pour surveiller les capteurs MDE, les règles ASR, les connexions, PowerShell, les vulnérabilités et les signes de rançongiciel.

01

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.
02

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.

Santé et fraîcheur des capteurs
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 asc
03

2 — 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.

Appareils exposés ou à forte exposition
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 asc
04

3 — 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.

Activité ASR des 30 derniers jours
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 desc
05

4 — 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.

PowerShell à examiner
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 desc
06

5 — 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.

Échecs regroupés par source et appareil
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 desc
07

6 — 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.

Sessions RDP administratives réussies
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 desc
08

7 — 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.

Connexions sortantes de binaires à double usage
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 desc
09

8 — 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.

Commandes de préparation au chiffrement
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 desc
10

9 — 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.

CVE exploitables par appareil et logiciel
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 desc
11

10 — 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.

Tendance des alertes moyennes et élevées
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 desc
12

Transformer 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.

13

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.