Cercare minacce tra dispositivi, posta elettronica, app e identità
Si applica a:
- Microsoft Defender XDR
La ricerca avanzata in Microsoft Defender XDR consente di cercare in modo proattivo le minacce in:
- Dispositivi gestiti da Microsoft Defender per endpoint
- Messaggi di posta elettronica elaborati da Microsoft 365
- Attività dell'app cloud, eventi di autenticazione e attività del controller di dominio monitorate da Microsoft Defender for Cloud Apps e Microsoft Defender per identità
Con questo livello di visibilità, è possibile cercare rapidamente le minacce che attraversano le sezioni della rete, incluse intrusioni sofisticate che arrivano sulla posta elettronica o sul Web, elevare i privilegi locali, acquisire credenziali di dominio con privilegi e spostarsi lateralmente tra i dispositivi.
Di seguito sono riportate le tecniche generali e le query di esempio basate su vari scenari di ricerca che consentono di esplorare come è possibile costruire query durante la ricerca di minacce così sofisticate.
Ottenere informazioni sull'entità
Usare queste query per informazioni su come ottenere rapidamente informazioni su account utente, dispositivi e file.
Ottenere account utente da indirizzi di posta elettronica
Durante la creazione di query su tabelle che includono sia dispositivi che messaggi di posta elettronica, è probabile che sia necessario ottenere i nomi degli account utente dagli indirizzi di posta elettronica del mittente o del destinatario. In genere è possibile eseguire questa operazione per l'indirizzo destinatario o mittente usando l'host locale dall'indirizzo di posta elettronica.
Nel frammento di codice seguente viene usata la funzione Kusto tostring() per estrarre l'host locale immediatamente prima di @
da indirizzi di posta elettronica del destinatario nella colonna RecipientEmailAddress
.
//Query snippet showing how to extract the account name from an email address
AccountName = tostring(split(RecipientEmailAddress, "@")[0])
La query seguente mostra come usare questo frammento di codice:
EmailEvents
| where Timestamp > ago(7d)
| project RecipientEmailAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);
Unire la tabella IdentityInfo
È possibile ottenere nomi di account e altre informazioni sull'account unendo o unendo la tabella IdentityInfo. La query seguente ottiene l'elenco dei rilevamenti di phishing e malware dalla tabella EmailEvents e quindi aggiunge tali informazioni alla IdentityInfo
tabella per ottenere informazioni dettagliate su ogni destinatario.
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
Guardare questo breve video per informazioni su come usare Linguaggio di query Kusto per unire le tabelle.
Ottenere informazioni sul dispositivo
Lo schema di ricerca avanzata fornisce informazioni complete sui dispositivi in varie tabelle. Ad esempio, la tabella DeviceInfo fornisce informazioni complete sul dispositivo in base ai dati degli eventi aggregati regolarmente. Questa query usa la DeviceInfo
tabella per verificare se un utente potenzialmente compromesso (<account-name>
) ha eseguito l'accesso a qualsiasi dispositivo e quindi elenca gli avvisi attivati in tali dispositivi.
Consiglio
Questa query usa kind=inner
per specificare un inner join, che impedisce la deduplicazione dei valori sul lato sinistro per 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
Ottenere informazioni sull'evento file
Utilizzare la query seguente per ottenere informazioni sugli eventi correlati ai file.
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
Ottenere informazioni sugli eventi di rete
Usare la query seguente per ottenere informazioni sugli eventi correlati alla rete.
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
Ottenere informazioni sulla versione dell'agente di dispositivo
Usare la query seguente per ottenere la versione dell'agente in esecuzione in un dispositivo.
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
Query di esempio per i dispositivi macOS
Usare la query di esempio seguente per visualizzare tutti i dispositivi che eseguono macOS con una versione precedente a 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
Ottenere informazioni sullo stato del dispositivo
Usare la query seguente per ottenere lo stato di un dispositivo. Nell'esempio seguente la query verifica se il dispositivo è stato caricato.
DeviceInfo
| where Timestamp > ago(1d)
| where OnboardingStatus != "Onboarded"
| summarize by DeviceId
| join kind=inner (
DeviceInfo
| where Timestamp > ago(1d)
) on DeviceId
| take 10
Scenari di ricerca
Elencare le attività di accesso degli utenti che hanno ricevuto messaggi di posta elettronica non zapped correttamente
L'eliminazione automatica a zero ore (ZAP) risolve i messaggi di posta elettronica dannosi dopo che sono stati ricevuti. Se ZAP ha esito negativo, il codice dannoso potrebbe essere eseguito nel dispositivo e lasciare gli account compromessi. Questa query verifica la presenza di attività di accesso eseguite dai destinatari dei messaggi di posta elettronica non risolti correttamente da 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
Ottenere i tentativi di accesso per account di dominio destinati al furto di credenziali
Questa query identifica prima di tutto tutti gli avvisi di accesso alle credenziali nella AlertInfo
tabella . Quindi unisce o unisce la AlertEvidence
tabella, che analizza per i nomi degli account di destinazione e filtri solo per gli account aggiunti a un dominio. Infine, controlla la IdentityLogonEvents
tabella per ottenere tutte le attività di accesso dagli account di destinazione aggiunti al dominio.
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
Verificare se nei dispositivi sono presenti file di un mittente malintenzionato noto
Supponendo di essere a conoscenza di un indirizzo di posta elettronica che invia file dannosi (MaliciousSender@example.com
), è possibile eseguire questa query per determinare se i file di questo mittente esistono nei dispositivi. È possibile usare questa query, ad esempio, per identificare i dispositivi interessati da una campagna di distribuzione di malware.
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
Rivedere i tentativi di accesso dopo aver ricevuto messaggi pericolosi
Questa query trova i 10 accessi più recenti eseguiti dai destinatari dei messaggi entro 30 minuti dalla ricezione di messaggi pericoloso. È possibile usare questa query per verificare se gli account dei destinatari dei messaggi di posta elettronica sono stati compromessi.
//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
Esaminare le attività di PowerShell dopo la ricezione di messaggi di posta elettronica da un mittente malintenzionato noto
I messaggi di posta elettronica pericolosi contengono spesso documenti e altri allegati appositamente predisposti che eseguono comandi di PowerShell per l'esecuzione di altri payload. Se si è a conoscenza dei messaggi di posta elettronica provenienti da un mittente dannoso noto (MaliciousSender@example.com
), è possibile usare questa query per elencare ed esaminare le attività di PowerShell che si sono verificate entro 30 minuti dalla ricezione di un messaggio di posta elettronica dal mittente.
//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)
Argomenti correlati
- Panoramica della rilevazione avanzata
- Capire il linguaggio delle query
- Usare i risultati delle query
- Utilizzare le query condivise
- Comprensione dello schema
- Applicare le procedure consigliate per le query
Consiglio
Per saperne di più, Visitare la community di Microsoft Security nella Tech Community: Tech Community di Microsoft Defender XDR.