Vyhledávání hrozeb napříč zařízeními, e-maily, aplikacemi a identitami

Poznámka

Chcete vyzkoušet XDR v Microsoft Defenderu? Přečtěte si další informace o tom, jak můžete vyhodnotit a pilotně nasadit XDR v Microsoft Defenderu.

Platí pro:

  • Microsoft Defender XDR

Rozšířené proaktivní vyhledávání v Microsoft Defender XDR umožňuje proaktivně vyhledávat hrozby napříč:

  • Zařízení spravovaná službou Microsoft Defender for Endpoint
  • E-maily zpracovávané Microsoftem 365
  • Aktivity cloudových aplikací, události ověřování a aktivity řadiče domény sledované Microsoft Defender for Cloud Apps a Microsoft Defender for Identity

S touto úrovní viditelnosti můžete rychle vyhledávat hrozby, které procházejí částmi vaší sítě, včetně sofistikovaných vniknutí do e-mailu nebo webu, zvýšit místní oprávnění, získat přihlašovací údaje k privilegované doméně a přesunout se laterálně na vaše zařízení.

Tady jsou obecné techniky a ukázkové dotazy založené na různých scénářích proaktivního vyhledávání, které vám můžou pomoct prozkoumat, jak byste mohli vytvářet dotazy při vyhledávání takových sofistikovaných hrozeb.

Získání informací o entitě

Pomocí těchto dotazů se dozvíte, jak rychle získat informace o uživatelských účtech, zařízeních a souborech.

Získání uživatelských účtů z e-mailových adres

Při vytváření dotazů napříč tabulkami, které pokrývají zařízení a e-maily, budete pravděpodobně muset získat jména uživatelských účtů od e-mailové adresy odesílatele nebo příjemce. Obvykle to můžete udělat pro adresu příjemce nebo odesílatele pomocí místního hostitele z e-mailové adresy.

V následujícím fragmentu kódu použijeme funkci Kusto tostring() k extrahování místního hostitele přímo před e-mailovou @ adresou příjemce ve sloupci RecipientEmailAddress.

//Query snippet showing how to extract the account name from an email address
AccountName = tostring(split(RecipientEmailAddress, "@")[0])

Následující dotaz ukazuje, jak se tento fragment kódu dá použít:

EmailEvents
| where Timestamp > ago(7d)
| project RecipientEmailAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);

Sloučení tabulky IdentityInfo

Názvy účtů a další informace o účtu můžete získat sloučením nebo připojením k tabulce IdentityInfo. Následující dotaz získá seznam detekcí útoků phishing a malwaru z tabulky EmailEvents a potom spojí informace s IdentityInfo tabulkou, aby získal podrobné informace o jednotlivých příjemcích.

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

V tomto krátkém videu se dozvíte, jak můžete pomocí dotazovací jazyk Kusto spojovat tabulky.

Získání informací o zařízení

Schéma rozšířeného proaktivního vyhledávání poskytuje rozsáhlé informace o zařízení v různých tabulkách. Například tabulka DeviceInfo poskytuje komplexní informace o zařízení na základě pravidelně agregovaných dat událostí. Tento dotaz používá DeviceInfo tabulku ke kontrole, jestli se potenciálně ohrožený uživatel (<account-name>) přihlásil k nějakým zařízením, a pak vypíše výstrahy, které se na těchto zařízeních aktivovaly.

Tip

Tento dotaz používá kind=inner k určení vnitřního spojení, které brání odstranění duplicitních hodnot levé strany pro 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

Získání informací o událostech souboru

Pomocí následujícího dotazu získáte informace o událostech souvisejících se soubory.

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

Získání informací o událostech sítě

Pomocí následujícího dotazu získáte informace o událostech souvisejících se sítí.

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

Získání informací o verzi agenta zařízení

Pomocí následujícího dotazu získáte verzi agenta běžícího na zařízení.

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

Příklad dotazu pro zařízení s macOS

Pomocí následujícího ukázkového dotazu zobrazíte všechna zařízení s macOS s verzí starší než 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

Získání informací o stavu zařízení

Pomocí následujícího dotazu získáte stav zařízení. V následujícím příkladu dotaz zkontroluje, jestli je zařízení nasazené.

DeviceInfo
| where Timestamp > ago(1d)
| where OnboardingStatus != "Onboarded"
| summarize by DeviceId
| join kind=inner (
    DeviceInfo
    | where Timestamp > ago(1d)
) on DeviceId
| take 10

Scénáře proaktivního vyhledávání

Výpis aktivit přihlášení uživatelů, kteří obdrželi e-maily, které nebyly úspěšně zapped

Zap (Zero-hour auto purge) řeší škodlivé e-maily po jejich přijetí. Pokud ZAP selže, může se na zařízení nakonec spustit škodlivý kód a nechat ohrožené účty. Tento dotaz zkontroluje aktivitu přihlášení, kterou provedli příjemci e-mailů, které zap úspěšně neřešil.

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

Získání pokusů o přihlášení doménových účtů, na které cílí krádež přihlašovacích údajů

Tento dotaz nejprve identifikuje všechna upozornění na přístup k přihlašovacím údajům v tabulce AlertInfo . Potom sloučí nebo spojí AlertEvidence tabulku, ve které analyzuje názvy cílových účtů a filtruje pouze účty připojené k doméně. Nakonec zkontroluje IdentityLogonEvents tabulku, aby získala všechny přihlašovací aktivity cílových účtů připojených k doméně.

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

Zkontrolujte, jestli jsou na vašich zařízeních soubory od známého odesílatele se zlými úmysly.

Za předpokladu, že víte o e-mailové adrese odesílající škodlivé soubory (MaliciousSender@example.com), můžete spuštěním tohoto dotazu zjistit, jestli soubory od tohoto odesílatele existují na vašich zařízeních. Tento dotaz můžete použít například k identifikaci zařízení ovlivněných kampaní distribuce malwaru.

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

Kontrola pokusů o přihlášení po přijetí škodlivých e-mailů

Tento dotaz najde 10 nejnovějších přihlášení provedených příjemci e-mailu do 30 minut od přijetí známých škodlivých e-mailů. Pomocí tohoto dotazu můžete zkontrolovat, jestli nedošlo k ohrožení účtů příjemců e-mailu.

//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

Kontrola aktivit PowerShellu po přijetí e-mailů od známého škodlivého odesílatele

Škodlivé e-maily často obsahují dokumenty a další speciálně vytvořené přílohy, které spouští příkazy PowerShellu pro doručování dalších datových částí. Pokud víte o e-mailech od známého škodlivého odesílatele (MaliciousSender@example.com), můžete pomocí tohoto dotazu vypsat a zkontrolovat aktivity PowerShellu, ke kterým došlo do 30 minut po přijetí e-mailu od odesílatele.

//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

Chcete se dozvědět více? Spojte se s komunitou zabezpečení společnosti Microsoft v naší technické komunitě: Technická komunita Microsoft Defender XDR.