Dreigingen in apparaten, e-mailberichten, apps en identiteiten opsporen
Van toepassing op:
- Microsoft Defender XDR
Met geavanceerde opsporing in Microsoft Defender XDR kunt u proactief zoeken naar bedreigingen in:
- Apparaten die worden beheerd door Microsoft Defender voor Eindpunt
- E-mailberichten verwerkt door Microsoft 365
- Activiteiten van cloud-apps, verificatiegebeurtenissen en activiteiten van domeincontrollers die worden bijgehouden door Microsoft Defender for Cloud Apps en Microsoft Defender for Identity
Met dit niveau van zichtbaarheid kunt u snel zoeken naar bedreigingen die secties van uw netwerk doorkruisen, waaronder geavanceerde indringers die binnenkomen via e-mail of het web, lokale bevoegdheden verhogen, bevoegde domeinreferenties verkrijgen en lateraal naar alle apparaten gaan.
Hier volgen algemene technieken en voorbeeldquery's op basis van verschillende opsporingsscenario's die u kunnen helpen bij het maken van query's bij het opsporen van dergelijke geavanceerde bedreigingen.
Entiteitsgegevens ophalen
Gebruik deze query's om te leren hoe u snel informatie kunt krijgen over gebruikersaccounts, apparaten en bestanden.
Gebruikersaccounts ophalen van e-mailadressen
Wanneer u query's maakt voor tabellen die betrekking hebben op apparaten en e-mailberichten, moet u waarschijnlijk gebruikersaccountnamen ophalen van e-mailadressen van afzenders of geadresseerden. Over het algemeen kunt u dit doen voor het adres van de geadresseerde of afzender met behulp van de lokale host van het e-mailadres.
In het onderstaande codefragment gebruiken we de functie tostring() Kusto om de local-host direct vóór de e-mailadressen van de @
geadresseerde in de kolom RecipientEmailAddress
te extraheren.
//Query snippet showing how to extract the account name from an email address
AccountName = tostring(split(RecipientEmailAddress, "@")[0])
In de onderstaande query ziet u hoe dit codefragment kan worden gebruikt:
EmailEvents
| where Timestamp > ago(7d)
| project RecipientEmailAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);
De tabel IdentityInfo samenvoegen
U kunt accountnamen en andere accountgegevens ophalen door de tabel IdentityInfo samen te voegen of samen te voegen. De onderstaande query haalt de lijst met phishing- en malwaredetecties op uit de tabel EmailEvents en voegt deze informatie vervolgens samen met de IdentityInfo
tabel om gedetailleerde informatie over elke ontvanger op te halen.
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
Bekijk deze korte video voor meer informatie over hoe u Kusto-querytaal kunt gebruiken om tabellen samen te voegen.
Apparaatgegevens ophalen
Het geavanceerde opsporingsschema biedt uitgebreide apparaatinformatie in verschillende tabellen. De tabel DeviceInfo bevat bijvoorbeeld uitgebreide apparaatinformatie op basis van gebeurtenisgegevens die regelmatig worden geaggregeerd. Deze query gebruikt de DeviceInfo
tabel om te controleren of een mogelijk gecompromitteerde gebruiker (<account-name>
) zich heeft aangemeld bij apparaten en geeft vervolgens de waarschuwingen weer die op die apparaten zijn geactiveerd.
Tip
Deze query gebruikt kind=inner
om een inner-join op te geven, waardoor de ontdubbeling van waarden aan de linkerkant voor DeviceId
wordt voorkomen.
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
Bestands gebeurtenisgegevens ophalen
Gebruik de volgende query om informatie op te halen over bestandsgerelateerde gebeurtenissen.
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
Netwerk-gebeurtenisgegevens ophalen
Gebruik de volgende query om informatie op te halen over netwerkgerelateerde gebeurtenissen.
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
Versiegegevens van apparaatagent ophalen
Gebruik de volgende query om de versie van de agent op een apparaat op te halen.
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
Voorbeeldquery voor macOS-apparaten
Gebruik de volgende voorbeeldquery om alle apparaten met macOS weer te geven met een oudere versie dan 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
Apparaatstatusgegevens ophalen
Gebruik de volgende query om de status van een apparaat op te halen. In het volgende voorbeeld wordt met de query gecontroleerd of het apparaat is onboarded.
DeviceInfo
| where Timestamp > ago(1d)
| where OnboardingStatus != "Onboarded"
| summarize by DeviceId
| join kind=inner (
DeviceInfo
| where Timestamp > ago(1d)
) on DeviceId
| take 10
Opsporingsscenario's
Aanmeldingsactiviteiten weergeven van gebruikers die e-mailberichten hebben ontvangen die niet zijn getypt
Zero-hour auto purge (ZAP) adresseren schadelijke e-mailberichten nadat ze zijn ontvangen. Als ZAP mislukt, kan schadelijke code uiteindelijk op het apparaat worden uitgevoerd en accounts gecompromitteerd raken. Met deze query wordt gecontroleerd op aanmeldingsactiviteit die is gemaakt door de geadresseerden van e-mailberichten die niet zijn geadresseerd door 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
Aanmeldingspogingen ophalen door domeinaccounts waarop referentiediefstal is gericht
Met deze query worden eerst alle waarschuwingen voor toegang tot referenties in de AlertInfo
tabel geïdentificeerd. Vervolgens wordt de AlertEvidence
tabel samengevoegd of toegevoegd, die wordt geparseerd voor de namen van de doelaccounts en alleen voor accounts die lid zijn van een domein. Ten slotte wordt de IdentityLogonEvents
tabel gecontroleerd om alle aanmeldingsactiviteiten op te halen door de aan het domein gekoppelde doelaccounts.
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
Controleren of bestanden van een bekende kwaadwillende afzender zich op uw apparaten bevinden
Ervan uitgaande dat u weet dat een e-mailadres schadelijke bestanden verzendt (MaliciousSender@example.com
), kunt u deze query uitvoeren om te bepalen of er bestanden van deze afzender op uw apparaten aanwezig zijn. U kunt deze query bijvoorbeeld gebruiken om apparaten te identificeren die worden beïnvloed door een malwaredistributiecampagne.
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
Aanmeldingspogingen controleren na ontvangst van schadelijke e-mailberichten
Met deze query vindt u de 10 meest recente aanmeldingen die zijn uitgevoerd door e-mailontvangers binnen 30 minuten nadat ze bekende schadelijke e-mailberichten hebben ontvangen. U kunt deze query gebruiken om te controleren of de accounts van de e-mailontvangers zijn gecompromitteerd.
//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
PowerShell-activiteiten controleren na ontvangst van e-mailberichten van bekende kwaadwillende afzenders
Schadelijke e-mailberichten bevatten vaak documenten en andere speciaal vervaardigde bijlagen die PowerShell-opdrachten uitvoeren om extra nettoladingen te leveren. Als u op de hoogte bent van e-mailberichten die afkomstig zijn van een bekende kwaadwillende afzender (MaliciousSender@example.com
), kunt u deze query gebruiken om PowerShell-activiteiten weer te geven en te bekijken die plaatsvonden binnen 30 minuten nadat een e-mailbericht van de afzender is ontvangen.
//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)
Verwante onderwerpen
- Overzicht van geavanceerd opsporen
- De querytaal leren
- Werken met queryresultaten
- Gedeelde query's gebruiken
- Meer informatie over het schema
- Aanbevolen procedures voor query's toepassen
Tip
Wil je meer weten? Engage met de Microsoft Security-community in onze Tech Community: Microsoft Defender XDR Tech Community.