Buscar ameaças em dispositivos, e-mails, aplicativos e identidades

Observação

Quer experimentar Microsoft Defender XDR? Saiba mais sobre como você pode avaliar e pilotar Microsoft Defender XDR.

Aplica-se a:

  • Microsoft Defender XDR

A caça avançada no Microsoft Defender XDR permite que você procure proativamente por ameaças:

  • Dispositivos gerenciados por Microsoft Defender para Ponto de Extremidade
  • Emails processados pelo Microsoft 365
  • Atividades de aplicativo de nuvem, eventos de autenticação e atividades do controlador de domínio controladas por Microsoft Defender para Aplicativos de Nuvem e Microsoft Defender para Identidade

Com esse nível de visibilidade, você pode procurar rapidamente ameaças que percorrem seções de sua rede, incluindo invasões sofisticadas que chegam no email ou na Web, elevar privilégios locais, adquirir credenciais de domínio privilegiadas e mover lateralmente para entre seus dispositivos.

Aqui estão técnicas gerais e consultas de exemplo com base em vários cenários de caça que podem ajudá-lo a explorar como você pode construir consultas ao procurar ameaças tão sofisticadas.

Obter informações de entidade

Use essas consultas para saber como obter informações rapidamente sobre contas de usuário, dispositivos e arquivos.

Adicionar contas de usuário a partir de endereços de email

Ao criar consultas em tabelas que abrangem dispositivos e emails, provavelmente será necessário obter nomes de contas de usuário dos endereços de email de remetentes ou destinatários. Geralmente, você pode fazer isso para o destinatário ou o endereço do remetente usando o host local do endereço de email.

No snippet abaixo, usamos a função Kusto tostring() para extrair o host local logo antes dos @ endereços de email 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 esse snippet pode ser usado:

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

Mesclar a tabela IdentityInfo

Você pode obter nomes de conta e outras informações da conta mesclando ou ingressando na tabela IdentityInfo. A consulta a seguir obtém a lista de detecções de phishing e malware da tabela EmailEvents e, em seguida, junta 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

Assista a este pequeno vídeo para saber como você pode usar Linguagem de Consulta Kusto para unir tabelas.

Obter informações do dispositivo

O esquema de caça avançado fornece informações de dispositivo extensas em várias tabelas. Por exemplo, a tabela DeviceInfo fornece informações abrangentes do dispositivo com base em dados de evento agregados regularmente. Essa consulta usa a DeviceInfo tabela para marcar se um usuário potencialmente comprometido (<account-name>) tiver se conectado a qualquer dispositivo e, em seguida, listar os alertas que foram disparados nesses dispositivos.

Dica

Essa consulta usa kind=inner para especificar uma junção interna, o que impede a eliminação da eliminação de duplicação 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 de evento de arquivo

Use a consulta a seguir para obter informações sobre eventos relacionados ao arquivo.

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 de evento de rede

Use a consulta a seguir para obter informações sobre eventos relacionados à 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 de versão do agente de dispositivo

Use a consulta a seguir para obter a versão do agente em execução em um 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

Use a consulta de exemplo a seguir para ver todos os dispositivos que executam o macOS com uma versão mais antiga que 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 status de dispositivo

Use a consulta a seguir para obter status de um dispositivo. No exemplo a seguir, 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 busca

Listar atividades de logon de usuários que receberam emails que não foram atingidos com êxito

O ZAP (limpeza automática) de zero hora aborda emails mal-intencionados depois de serem recebidos. Se o ZAP falhar, o código mal-intencionado poderá eventualmente ser executado no dispositivo e deixar as contas comprometidas. Essa consulta verifica a atividade de logon feita pelos destinatários de emails que não foram abordados 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 logon por contas de domínio direcionadas por roubo de credencial

Essa consulta primeiro identifica todos os alertas de acesso de credencial na AlertInfo tabela. Em seguida, ele mescla ou ingressa na AlertEvidence tabela, que analisa apenas os nomes das contas de destino e filtros para contas ingressadas no domínio. Por fim, ele verifica a IdentityLogonEvents tabela para obter todas as atividades de logon pelas contas de destino ingressadas no 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

Verificar se os arquivos de um remetente mal-intencionado conhecido estão nos seus dispositivos

Supondo que você saiba de um endereço de email que envia arquivos mal-intencionados (MaliciousSender@example.com), você pode executar essa consulta para determinar se os arquivos desse remetente existem em seus dispositivos. Você pode usar essa consulta, por exemplo, para identificar dispositivos afetados por uma campanha de distribuição de 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

Analisar as tentativas de logon após o recebimento de emails mal-intencionados

Essa consulta localiza os 10 logons mais recentes executados pelos destinatários de email em 30 minutos depois do recebimento de emails mal-intencionados conhecidos. Você pode usar essa consulta para verificar se as contas dos destinatários de email 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

Analisar as atividades do PowerShell após o recebimento de emails mal-intencionados de remetentes conhecidos

Os emails mal-intencionados geralmente contêm documentos e outros anexos especialmente criados que executam comandos do PowerShell para fornecer cargas adicionais. Se você estiver ciente dos emails provenientes de um remetente mal-intencionado conhecido (MaliciousSender@example.com), poderá usar essa consulta para listar e revisar as atividades do PowerShell que ocorreram dentro de 30 minutos depois que um email foi recebido 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)

Dica

Você deseja aprender mais? Engage com a comunidade de Segurança da Microsoft em nossa Comunidade Tecnológica: Microsoft Defender XDR Tech Community.