Buscar ameaças em dispositivos, e-mails, aplicativos 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 Ponto de Extremidade
  • 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 para Aplicativos de Nuvem 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.

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, 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 Consulta 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 marcar se um utilizador potencialmente comprometido (<account-name>) tiver iniciado sessão em quaisquer dispositivos e, em seguida, listar os alertas que foram acionados nesses dispositivos.

Dica

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 status do dispositivo

Utilize a seguinte consulta para obter status 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 busca

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

Verificar se os arquivos de um remetente mal-intencionado 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

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

Dica

Você deseja aprender mais? Participe da comunidade de Segurança da Microsoft em nossa Tech Community: Tech Community do Microsoft Defender XDR.