Repérer des menaces sur les appareils, les e-mails, les applications, et les identités
S’applique à :
- Microsoft Defender XDR
La chasse avancée dans Microsoft Defender XDR vous permet de rechercher de manière proactive les menaces dans les domaines suivants :
- Appareils gérés par Microsoft Defender pour point de terminaison
- E-mails traités par Microsoft 365
- Activités d’application cloud, événements d’authentification et activités de contrôleur de domaine suivies par Microsoft Defender for Cloud Apps et Microsoft Defender pour Identity
Avec ce niveau de visibilité, vous pouvez rapidement rechercher les menaces qui traversent des sections de votre réseau, notamment les intrusions sophistiquées qui arrivent sur la messagerie électronique ou sur le web, élever des privilèges locaux, acquérir des informations d’identification de domaine privilégiées et se déplacer latéralement sur vos appareils.
Voici des techniques générales et des exemples de requêtes basés sur différents scénarios de chasse qui peuvent vous aider à explorer la façon dont vous pouvez construire des requêtes lors de la chasse à des menaces aussi sophistiquées.
Obtenir des informations sur l’entité
Utilisez ces requêtes pour découvrir comment obtenir rapidement des informations sur les comptes d’utilisateur, les appareils et les fichiers.
Obtenir des comptes d’utilisateur des adresses de messagerie électronique :
Lorsque vous construisez des requêtes sur des tableaux qui traitent des appareils et des e-mail, vous devez peut-être obtenir des noms de compte d’utilisateur à partir des adresses e-mail d’expéditeur ou de destinataire. Vous pouvez généralement le faire pour l’adresse du destinataire ou de l’expéditeur à l’aide de l’hôte local de l’adresse e-mail.
Dans l’extrait de code ci-dessous, nous utilisons la fonction kusto tostring() pour extraire l’hôte local juste avant les @
adresses e-mail du destinataire dans la colonne RecipientEmailAddress
.
//Query snippet showing how to extract the account name from an email address
AccountName = tostring(split(RecipientEmailAddress, "@")[0])
La requête ci-dessous montre comment cet extrait de code peut être utilisé :
EmailEvents
| where Timestamp > ago(7d)
| project RecipientEmailAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);
Fusionner la table IdentityInfo
Vous pouvez obtenir des noms de compte et d’autres informations de compte en fusionnant ou en joignant la table IdentityInfo. La requête ci-dessous obtient la liste des détections de hameçonnage et de programmes malveillants à partir de la table EmailEvents , puis joint ces informations à la IdentityInfo
table pour obtenir des informations détaillées sur chaque destinataire.
EmailEvents
| where Timestamp > ago(7d)
//Get email processing events where the messages were identified as either phishing or malware
| where ThreatTypes has "Malware" or ThreatTypes has "Phish"
//Merge email events with identity info to get recipient details
| join (IdentityInfo | distinct AccountUpn, AccountDisplayName, JobTitle,
Department, City, Country) on $left.RecipientEmailAddress == $right.AccountUpn
//Show important message and recipient details
| project Timestamp, NetworkMessageId, Subject, ThreatTypes,
SenderFromAddress, RecipientEmailAddress, AccountDisplayName, JobTitle,
Department, City, Country
Regardez cette courte vidéo pour découvrir comment utiliser Langage de requête Kusto pour joindre des tables.
Obtenir des informations sur l’appareil
Le schéma de repérage avancé fournit des informations complètes sur les appareils dans différentes tables. Par exemple, la table DeviceInfo fournit des informations complètes sur l’appareil basées sur les données d’événement agrégées régulièrement. Cette requête utilise la DeviceInfo
table pour case activée si un utilisateur potentiellement compromis (<account-name>
) s’est connecté à des appareils, puis répertorie les alertes qui ont été déclenchées sur ces appareils.
Conseil
Cette requête utilise kind=inner
pour spécifier une jointure interne, qui empêche la déduplication des valeurs côté gauche pour DeviceId
.
DeviceInfo
//Query for devices that the potentially compromised account has logged onto
| where LoggedOnUsers contains '<account-name>'
| distinct DeviceId
//Crosscheck devices against alert records in AlertEvidence and AlertInfo tables
| join kind=inner AlertEvidence on DeviceId
| project AlertId
//List all alerts on devices that user has logged on to
| join AlertInfo on AlertId
| project AlertId, Timestamp, Title, Severity, Category
Obtenir des informations sur les événements de fichier
Utilisez la requête suivante pour obtenir des informations sur les événements liés aux fichiers.
DeviceInfo
| where Timestamp > ago(1d)
| where ClientVersion startswith "20.1"
| summarize by DeviceId
| join kind=inner (
DeviceFileEvents
| where Timestamp > ago(1d)
) on DeviceId
| take 10
Obtenir des informations sur les événements réseau
Utilisez la requête suivante pour obtenir des informations sur les événements liés au réseau.
DeviceInfo
| where Timestamp > ago(1d)
| where ClientVersion startswith "20.1"
| summarize by DeviceId
| join kind=inner (
DeviceNetworkEvents
| where Timestamp > ago(1d)
) on DeviceId
| take 10
Obtenir les informations de version de l’agent d’appareil
Utilisez la requête suivante pour obtenir la version de l’agent en cours d’exécution sur un appareil.
DeviceInfo
| where Timestamp > ago(1d)
| where ClientVersion startswith "20.1"
| summarize by DeviceId
| join kind=inner (
DeviceNetworkEvents
| where Timestamp > ago(1d)
) on DeviceId
| take 10
Exemple de requête pour les appareils macOS
Utilisez l’exemple de requête suivant pour voir tous les appareils exécutant macOS avec une version antérieure à Catalina.
DeviceInfo
| where Timestamp > ago(1d)
| where OSPlatform == "macOS" and OSVersion !contains "10.15" and OSVersion !contains "11."
| summarize by DeviceId
| join kind=inner (
DeviceInfo
| where Timestamp > ago(1d)
) on DeviceId
| take 10
Obtenir les informations de status de l’appareil
Utilisez la requête suivante pour obtenir status d’un appareil. Dans l’exemple suivant, la requête vérifie si l’appareil est intégré.
DeviceInfo
| where Timestamp > ago(1d)
| where OnboardingStatus != "Onboarded"
| summarize by DeviceId
| join kind=inner (
DeviceInfo
| where Timestamp > ago(1d)
) on DeviceId
| take 10
Scénarios de repérage
Répertorier les activités d’ouverture de session des utilisateurs qui ont reçu des e-mails qui n’ont pas été correctement ignorés
Le vidage automatique de zéro heure (ZAP) traite les e-mails malveillants une fois qu’ils ont été reçus. En cas d’échec de zap, du code malveillant peut éventuellement s’exécuter sur l’appareil et laisser les comptes compromis. Cette requête vérifie l’activité d’ouverture de session effectuée par les destinataires des e-mails qui n’ont pas été correctement traités par ZAP.
EmailPostDeliveryEvents
| where Timestamp > ago(7d)
//List malicious emails that were not zapped successfully
| where ActionType has "ZAP" and ActionResult == "Error"
| project ZapTime = Timestamp, ActionType, NetworkMessageId , RecipientEmailAddress
//Get logon activity of recipients using RecipientEmailAddress and AccountUpn
| join kind=inner IdentityLogonEvents on $left.RecipientEmailAddress == $right.AccountUpn
| where Timestamp between ((ZapTime-24h) .. (ZapTime+24h))
//Show only pertinent info, such as account name, the app or service, protocol, the target device, and type of logon
| project ZapTime, ActionType, NetworkMessageId , RecipientEmailAddress, AccountUpn,
LogonTime = Timestamp, AccountDisplayName, Application, Protocol, DeviceName, LogonType
Obtenir des tentatives d’ouverture de session par des comptes de domaine ciblés par le vol d’informations d’identification
Cette requête identifie d’abord toutes les alertes d’accès aux informations d’identification dans la AlertInfo
table. Il fusionne ensuite ou joint la AlertEvidence
table, qu’il analyse pour les noms des comptes ciblés et filtre uniquement les comptes joints à un domaine. Enfin, il vérifie la IdentityLogonEvents
table pour obtenir toutes les activités d’ouverture de session par les comptes ciblés joints à un domaine.
AlertInfo
| where Timestamp > ago(30d)
//Get all credential access alerts
| where Category == "CredentialAccess"
//Get more info from AlertEvidence table to get the SID of the target accounts
| join AlertEvidence on AlertId
| extend IsJoined=(parse_json(AdditionalFields).Account.IsDomainJoined)
| extend TargetAccountSid=tostring(parse_json(AdditionalFields).Account.Sid)
//Filter for domain-joined accounts only
| where IsJoined has "true"
//Merge with IdentityLogonEvents to get all logon attempts by the potentially compromised target accounts
| join kind=inner IdentityLogonEvents on $left.TargetAccountSid == $right.AccountSid
//Show only pertinent info, such as account name, the app or service, protocol, the accessed device, and type of logon
| project AccountDisplayName, TargetAccountSid, Application, Protocol, DeviceName, LogonType
Vérifier si les fichiers d’un expéditeur malveillant connu figurent sur vos appareils
En supposant que vous connaissez une adresse e-mail qui envoie des fichiers malveillants (MaliciousSender@example.com
), vous pouvez exécuter cette requête pour déterminer si des fichiers de cet expéditeur existent sur vos appareils. Vous pouvez utiliser cette requête, par exemple, pour identifier les appareils affectés par une campagne de distribution de programmes malveillants.
EmailAttachmentInfo
| where SenderFromAddress =~ "MaliciousSender@example.com"
//Get emails with attachments identified by a SHA-256
| where isnotempty(SHA256)
| join (
//Check devices for any activity involving the attachments
DeviceFileEvents
| project FileName, SHA256, DeviceName, DeviceId
) on SHA256
| project Timestamp, FileName , SHA256, DeviceName, DeviceId, NetworkMessageId, SenderFromAddress, RecipientEmailAddress
Examiner les tentatives de connexion après la réception des e-mails malveillants
Cette requête recherche les 10 dernières connexions effectuées par les destinataires du courrier dans un délai de 30 minutes après la réception des e-mails malveillants connus. Vous pouvez utiliser cette requête pour vérifier si les comptes des destinataires de l’e-mail ont été compromis.
//Define new table for malicious emails
let MaliciousEmails=EmailEvents
//List emails detected as malware, getting only pertinent columns
| where ThreatTypes has "Malware"
| project TimeEmail = Timestamp, Subject, SenderFromAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);
MaliciousEmails
| join (
//Merge malicious emails with logon events to find logons by recipients
IdentityLogonEvents
| project LogonTime = Timestamp, AccountName, DeviceName
) on AccountName
//Check only logons within 30 minutes of receipt of an email
| where (LogonTime - TimeEmail) between (0min.. 30min)
| take 10
Examiner les activités PowerShell après réception d'e-mails d'expéditeurs malveillants connus.
Les e-mails malveillants contiennent souvent des documents et d'autres pièces jointes spécialement conçues qui exécutent des commandes PowerShell pour offrir d'autres charges utiles. Si vous connaissez les e-mails provenant d’un expéditeur malveillant connu (MaliciousSender@example.com
), vous pouvez utiliser cette requête pour répertorier et examiner les activités PowerShell qui se sont produites dans les 30 minutes suivant la réception d’un e-mail de l’expéditeur.
//Define new table for emails from specific sender
let EmailsFromBadSender=EmailEvents
| where SenderFromAddress =~ "MaliciousSender@example.com"
| project TimeEmail = Timestamp, Subject, SenderFromAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);
//Merge emails from sender with process-related events on devices
EmailsFromBadSender
| join (
DeviceProcessEvents
//Look for PowerShell activity
| where FileName =~ "powershell.exe"
//Add line below to check only events initiated by Outlook
//| where InitiatingProcessParentFileName =~ "outlook.exe"
| project TimeProc = Timestamp, AccountName, DeviceName, InitiatingProcessParentFileName, InitiatingProcessFileName, FileName, ProcessCommandLine
) on AccountName
//Check only PowerShell activities within 30 minutes of receipt of an email
| where (TimeProc - TimeEmail) between (0min.. 30min)
Voir aussi
- Vue d’ensemble du repérage avancé
- Apprendre le langage de requête
- Utiliser les résultats d’une requête
- Utiliser des requêtes partagées
- Comprendre le schéma
- Appliquer les meilleures pratiques de requête
Conseil
Voulez-vous en savoir plus ? Collaborez avec la communauté Microsoft Security dans notre communauté technique : communauté technique Microsoft Defender XDR.