Поиск угроз на устройствах, в электронной почте, приложениях и учетных записях

Расширенная охота в Microsoft Defender позволяет заранее охотиться на угрозы в:

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

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

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

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

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

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

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

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

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

В следующем примере запроса используется фрагмент извлечения имени учетной записи в запросе EmailEvents :

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 и применив фильтр по OnboardingStatus.

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

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

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

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

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

Благодаря этому запросу обнаруживается 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 для доставки дополнительной вредоносной нагрузки. Если вам известно о сообщениях электронной почты, поступающих от известного вредоносного отправителя (MaliciousSender@example.com), этот запрос можно использовать для перечисления и просмотра действий PowerShell, которые произошли в течение 30 минут после получения сообщения от отправителя.

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

Совет

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