Procurar ameaças entre dispositivos, e-mails, aplicações e identidades

Aplica-se a:

  • Microsoft Defender XDR

A investigação avançada no Microsoft Defender XDR permite-lhe procurar proativamente ameaças através de:

  • Dispositivos geridos por Microsoft Defender para Endpoint
  • E-mails processados pelo Microsoft 365
  • Atividades de aplicações na cloud, eventos de autenticação e atividades de controlador de domínio controladas por Microsoft Defender for Cloud Apps e Microsoft Defender para Identidade

Com este nível de visibilidade, pode procurar rapidamente ameaças que atravessam secções da sua rede, incluindo intrusões sofisticadas que chegam ao e-mail ou à Web, elevar privilégios locais, adquirir credenciais de domínio privilegiado e mover-se lateralmente para os seus dispositivos.

Seguem-se técnicas gerais e consultas de exemplo baseadas em vários cenários de investigação que podem ajudá-lo a explorar como pode construir consultas ao procurar ameaças tão sofisticadas.

Obter informações da entidade

Utilize estas consultas para saber como pode obter rapidamente informações sobre contas de utilizador, dispositivos e ficheiros.

Obter contas de utilizador a partir de endereços de e-mail

Ao construir consultas entre tabelas que abrangem dispositivos e e-mails, provavelmente terá de obter nomes de conta de utilizador a partir de endereços de e-mail do remetente ou do destinatário. Geralmente, pode fazê-lo para o endereço do destinatário ou do remetente através do anfitrião local a partir do endereço de e-mail.

No fragmento abaixo, utilizamos a função Kusto tostring() para extrair o anfitrião local imediatamente antes dos @ endereços de e-mail do destinatário na coluna RecipientEmailAddress.

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

A consulta abaixo mostra como este fragmento pode ser utilizado:

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

Intercalar a tabela IdentityInfo

Pode obter nomes de conta e outras informações de conta ao intercalar ou associar a tabela IdentityInfo. A consulta abaixo obtém a lista de deteções de phishing e software maligno a partir da tabela EmailEvents e, em seguida, associa essas informações à IdentityInfo tabela para obter informações detalhadas sobre cada destinatário.

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

Veja este breve vídeo para saber como pode utilizar Linguagem de Pesquisa Kusto para associar tabelas.

Obter informações do dispositivo

O esquema de investigação avançado fornece informações extensas sobre o dispositivo em várias tabelas. Por exemplo, a tabela DeviceInfo fornece informações abrangentes do dispositivo com base nos dados de eventos agregados regularmente. Esta consulta utiliza a DeviceInfo tabela para verificar se um utilizador potencialmente comprometido (<account-name>) iniciou sessão em quaisquer dispositivos e, em seguida, lista os alertas que foram acionados nesses dispositivos.

Sugestão

Esta consulta utiliza kind=inner para especificar uma associação interna, o que impede a eliminação de duplicados de valores do lado esquerdo para 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

Obter informações sobre o evento de ficheiro

Utilize a seguinte consulta para obter informações sobre eventos relacionados com ficheiros.

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

Obter informações sobre eventos de rede

Utilize a seguinte consulta para obter informações sobre eventos relacionados com a rede.

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

Obter informações sobre a versão do agente do dispositivo

Utilize a seguinte consulta para colocar a versão do agente em execução num 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

Consulta de exemplo para dispositivos macOS

Utilize a seguinte consulta de exemplo para ver todos os dispositivos com macOS com uma versão anterior 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

Obter informações de estado do dispositivo

Utilize a seguinte consulta para obter o estado de um dispositivo. No exemplo seguinte, a consulta verifica se o dispositivo está integrado.

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

Cenários de investigação

Listar atividades de início de sessão de utilizadores que receberam e-mails que não foram enviados com êxito

A remoção automática de zero horas (ZAP) endereça e-mails maliciosos depois de terem sido recebidos. Se o ZAP falhar, o código malicioso poderá eventualmente ser executado no dispositivo e deixar as contas comprometidas. Esta consulta verifica a existência de atividade de início de sessão efetuada pelos destinatários de e-mails que não foram resolvidos com êxito pelo 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

Obter tentativas de início de sessão por contas de domínio visadas por roubo de credenciais

Esta consulta identifica primeiro todos os alertas de acesso a credenciais na AlertInfo tabela. Em seguida, intercala ou associa a AlertEvidence tabela, que analisa para os nomes das contas de destino e filtra apenas as contas associadas a um domínio. Por fim, verifica a IdentityLogonEvents tabela para obter todas as atividades de início de sessão pelas contas de destino associadas ao domínio.

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

Verifique se os ficheiros de um remetente malicioso conhecido estão nos seus dispositivos

Partindo do princípio de que sabe de um endereço de e-mail que envia ficheiros maliciosos (MaliciousSender@example.com), pode executar esta consulta para determinar se existem ficheiros deste remetente nos seus dispositivos. Pode utilizar esta consulta, por exemplo, para identificar os dispositivos afetados por uma campanha de distribuição de software maligno.

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

Rever tentativas de início de sessão após a receção de e-mails maliciosos

Esta consulta localiza os 10 inícios de sessão mais recentes efetuados pelos destinatários do e-mail no prazo de 30 minutos após receberem e-mails maliciosos conhecidos. Pode utilizar esta consulta para verificar se as contas dos destinatários do e-mail foram comprometidas.

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

Rever as atividades do PowerShell após a receção de e-mails do remetente malicioso conhecido

Os e-mails maliciosos contêm frequentemente documentos e outros anexos especialmente concebidos que executam comandos do PowerShell para fornecer payloads adicionais. Se tiver conhecimento de e-mails provenientes de um remetente malicioso conhecido (MaliciousSender@example.com), pode utilizar esta consulta para listar e rever as atividades do PowerShell que ocorreram no prazo de 30 minutos após a receção de um e-mail do remetente.

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

Sugestão

Quer saber mais? Interaja com a comunidade do Microsoft Security na nossa Tech Community: Microsoft Defender XDR Tech Community.