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 RecipientEmailAddresste 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 DeviceIdwordt 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)

Tip

Wil je meer weten? Engage met de Microsoft Security-community in onze Tech Community: Microsoft Defender XDR Tech Community.