Поделиться через


Охота за угрозами на различных устройствах, в письмах, приложениях и удостоверениях

Область применения:

  • Microsoft Defender XDR

Расширенная охота в Microsoft Defender XDR позволяет упреждающе искать угрозы в:

  • Устройства, управляемые Microsoft Defender для конечной точки
  • Сообщения электронной почты, обработанные Microsoft 365
  • Действия облачного приложения, события проверки подлинности и действия контроллера домена, отслеживаемые Microsoft Defender for Cloud Apps и Microsoft Defender для удостоверений

Благодаря этому уровню видимости вы можете быстро искать угрозы, которые проходят через разделы вашей сети, включая сложные вторжения, поступающие по электронной почте или в Интернете, повысить локальные привилегии, получить привилегированные учетные данные домена и перемещаться поперечно на разных устройствах.

Ниже приведены общие методы и примеры запросов, основанные на различных сценариях охоты, которые помогут вам изучить, как можно создавать запросы при поиске таких сложных угроз.

Получение сведений о сущности

Используйте эти запросы, чтобы узнать, как быстро получить сведения об учетных записях пользователей, устройствах и файлах.

Получение учетных записей пользователей из адресов электронной почты

При формировании запросов по таблицам, относящимся к устройствам и сообщениям электронной почты может возникать необходимость получить названия учетных записей пользователей из электронных адресов отправителя или получателя. Обычно это можно сделать для адреса получателя или отправителя, используя локальный узел из адреса электронной почты.

В приведенном ниже фрагменте кода мы используем функцию Kusto tostring() для извлечения локального узла непосредственно перед @ адресами электронной почты получателей в столбце RecipientEmailAddress.

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

В приведенном ниже запросе показано, как можно использовать этот фрагмент:

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

Объединение таблицы IdentityInfo

Имена учетных записей и другие сведения об учетных записях можно получить путем слияния или присоединения к таблице IdentityInfo. Приведенный ниже запрос получает список обнаружений фишинга и вредоносных программ из таблицы EmailEvents , а затем объединяет эти сведения с таблицей IdentityInfo , чтобы получить подробные сведения о каждом получателе.

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

Просмотрите это короткое видео, чтобы узнать, как использовать язык запросов Kusto для соединения таблиц.

Получение сведений об устройстве

Расширенная схема охоты предоставляет подробные сведения об устройстве в различных таблицах. Например, таблица DeviceInfo содержит исчерпывающую информацию об устройстве на основе регулярно агрегированных данных о событиях. Этот запрос использует таблицу DeviceInfo для проверка, если потенциально скомпрометированный пользователь (<account-name>) вошел на какие-либо устройства, а затем выводит список оповещений, которые были активированы на этих устройствах.

Совет

Этот запрос используется kind=inner для указания внутреннего соединения, которое предотвращает дедупликацию значений левой стороны для 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

Получение сведений о событии файла

Используйте следующий запрос, чтобы получить сведения о событиях, связанных с файлами.

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

Получение сведений о событиях сети

Используйте следующий запрос, чтобы получить сведения о событиях, связанных с сетью.

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

Получение сведений о версии агента устройства

Используйте следующий запрос, чтобы получить версию агента, работающего на устройстве.

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

Пример запроса для устройств macOS

Используйте следующий пример запроса, чтобы просмотреть все устройства под управлением macOS с версией старше 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

Получение сведений о состоянии устройства

Используйте следующий запрос, чтобы получить состояние устройства. В следующем примере запрос проверяет, подключено ли устройство.

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

Сценарии выслеживания

Список действий входа пользователей, которые получили сообщения электронной почты, которые не были успешно завершены

Автоматическая очистка нулевого часа (ZAP) обращается к вредоносным электронным письмам после их получения. В случае сбоя ZAP вредоносный код может в конечном итоге запуститься на устройстве и скомпрометировать учетные записи. Этот запрос проверяет действия входа, выполненные получателями сообщений электронной почты, которые не были успешно адресованы 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

Получение попыток входа по учетным записям домена, нацеленным на кражу учетных данных

Этот запрос сначала определяет все оповещения о доступе к учетным AlertInfo данным в таблице. Затем он объединяет или объединяет таблицу AlertEvidence , которая анализирует имена целевых учетных записей и фильтрует только учетные записи, присоединенные к домену. Наконец, он проверяет таблицу IdentityLogonEvents , чтобы получить все действия входа в систему целевыми учетными записями, присоединенными к домену.

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

Расскажем о том, как проверить, есть ли на устройствах файлы от известного злоумышленника.

Если вы знаете адрес электронной почты, отправляющий вредоносные файлы ([email protected]), вы можете выполнить этот запрос, чтобы определить, существуют ли файлы от этого отправителя на ваших устройствах. Этот запрос можно использовать, например, для идентификации устройств, затронутых кампанией распространения вредоносных программ.

EmailAttachmentInfo
| where SenderFromAddress =~ "[email protected]"
//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

Проверка попыток входа после получения вредоносных сообщений электронной почты

Благодаря этому запросу обнаруживается 10 последних случаев входа, выполненных получателями сообщений электронной почты, в течение 30 минут после получения ими известных вредоносных сообщений. Этот запрос можно использовать, чтобы проверить, не скомпрометированы ли учетные записи получателей сообщений электронной почты.

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

Проверка действий PowerShell после получения сообщений электронной почты от известного злоумышленника

Вредоносные сообщения часто содержат документы и другие специально изготовленные вложения, которые запускают команды PowerShell для создания дополнительных полезных данных. Если вам известно о сообщениях электронной почты, поступающих от известного вредоносного отправителя ([email protected]), этот запрос можно использовать для перечисления и просмотра действий PowerShell, которые произошли в течение 30 минут после получения сообщения от отправителя.

//Define new table for emails from specific sender
let EmailsFromBadSender=EmailEvents
| where SenderFromAddress =~ "[email protected]"
| 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)

Совет

Хотите узнать больше? Общайтесь с членами сообщества Microsoft Security в нашем техническом сообществе: Microsoft Defender XDR Tech Community.