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


Запрос к графу уязвимости предприятия

Используйте граф корпоративной уязвимости в Управление рисками Microsoft Security для упреждающего поиска угроз риска на предприятии при расширенной охоте на портале Microsoft Defender.

В этой статье приведены некоторые примеры, советы и указания для создания запросов в графе воздействия предприятия.

Предварительные условия

Создание расширенных запросов охоты

Использование оператора make-graph

Оператор Kusto make-graph загружает данные узлов и ребер в память.

  • Так как Kusto загружает только используемые столбцы, явно выбирать столбцы не требуется.
  • NodeProperties Однако столбец содержит все сведения об узле и поэтому имеет большой размер.
  • В большинстве сценариев полезно извлекать только необходимые сведения перед их передачей в make-graph оператор.

Пример

let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..

Использование динамических столбцов и интеллектуального индексирования

NodeProperties и Categories являются динамическими столбцами.

  • Kusto знает, что эти столбцы содержат содержимое, похожее на JSON, и применяет интеллектуальное индексирование.
  • Однако не все операторы Kusto используют индекс. Например, set_has_element, isemptyisnotnull не используют индекс, если они применяются к динамическому столбцу и isnotnull(Properties["containsSensitiveData"] не используют индекс.
  • Вместо этого используйте has() оператор , который всегда использует индекс.

Пример

В следующем запросе has оператор проверяет data строку, а set_has_element — элемент data .

Использование обоих операторов важно, has() так как оператор возвращает значение true даже для категории prefix_data.

Categories has('data') and set_has_element(Categories, 'data')

Дополнительные сведения о строковых терминах см. в этой статье.

Примеры запросов на раскрытие

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

Вывод списка всех меток узлов в клиенте

Следующий запрос группирует данные в ExposureGraphNodes таблице и использует оператор Kusto summarize для их перечисления по .NodeLabel

ExposureGraphNodes
| summarize by NodeLabel

Вывод списка всех меток edge в клиенте

Следующий запрос группирует данные в ExposureGraphEdges таблице и использует оператор Kusto summarize для их перечисления по граничным меткам (EdgeLabel).

ExposureGraphEdges
| summarize by EdgeLabel

Вывод списка всех подключений из указанной метки узла

Следующий запрос группирует данные в ExposureGraphEdges таблице и, где метка исходного узла — microsoft.compute/virtualmachines, он суммирует данные виртуальной машины по EdgeLabel. В нем перечислены ребра, которые подключают ресурсы к виртуальным машинам в графе уязвимости безопасности.

ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel

Вывод списка всех подключений к определенной метки узла

В следующем запросе приведены ребра, которые подключают виртуальные машины к другим ресурсам графа уязвимости безопасности. Он группирует данные в ExposureGraphEdges таблице и, где метка целевого узла — microsoft.compute/virtualmachines, использует оператор Kusto summarize для перечисления метки целевого узла по .EdgeLabel

ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel

Список свойств определенной метки узла

В следующем запросе перечислены свойства метки узла виртуальной машины. Он группирует данные в ExposureGraphNodes таблице, отфильтрованные только для отображения метки узла "microsoft.compute/virtualmachines". При использовании project-keep оператора запрос сохраняет NodeProperties столбец. Возвращаемые данные ограничены одной строкой.

ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1

Запрос графа экспозиции

Чтобы запросить граф экспозиции, выполните следующие действия:

  1. На портале Microsoft Defender выберите Охота —> расширенная охота.

  2. В области Запрос введите запрос. Используйте схему графа, функции и таблицы операторов или приведенные ниже примеры, чтобы помочь в создании запроса.

  3. Выберите Выполнить запрос.

Примеры запросов, ориентированных на граф

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

Вывод списка всех меток узла с ребром до определенной метки узла

Следующий запрос приводит к выводу списка всех меток входящих узлов с соединителем для метки узла виртуальной машины. Он создает структуру графа путем сопоставления SourceNodeId данных столбца в ExposureGraphEdges таблице со столбцом TargetNodeId в ExposureGraphNodes таблице с оператором make-graph для построения структуры графа.

Затем оператор используется graph-match для создания шаблона графа, в котором целевой узел TargetNode и NodeLabel совпадают microsoft.compute/virtualmachines. Оператор project используется для сохранения только .IncomingNodeLabels В нем перечислены результаты по .IncomingNodeLabels

ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
       where TargetNode.NodeLabel == "microsoft.compute/virtualmachines"
       project IncomingNodeLabels = SourceNode.NodeLabel 
| summarize by IncomingNodeLabels

Перечисление всех меток узла с окейловой меткой определенного узла

Следующий запрос возвращает список всех исходящих меток узла с соединителем к метке узла виртуальной машины.

  • Он создает структуру графа путем сопоставления столбца SourceNodeId использует данные в ExposureGraphEdges таблице со столбцом TargetNodeId в ExposureGraphNodes таблице с помощью make-graph оператора для построения структуры графа.
  • Затем оператор используется для graph-match сопоставления шаблона графа, где SourceNode и NodeLabel .microsoft.compute/virtualmachines
  • Оператор project используется для сохранения только .OutgoingNodeLabels В нем перечислены результаты по .OutgoingNodeLabels
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
       where SourceNode.NodeLabel == "microsoft.compute/virtualmachines"
       project OutgoingNodeLabels = SourceNode.NodeLabel 
| summarize by OutgoingNodeLabels

Обнаружение виртуальных машин, доступных в Интернете с помощью уязвимости RCE

Следующий запрос позволяет обнаружить виртуальные машины, доступные в Интернете, и уязвимость удаленного выполнения кода (RCE).

  • В нем используется ExposureGraphNodes таблица схемы.
  • Если и , NodePropertiesи true, он проверяет, что категория (Categories) является виртуальными машинами (virtual_machine).vulnerableToRCEexposedToInternet
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")

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

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

  • В нем используется ExposureGraphNodes таблица схемы.
  • Если NodeProperties используется подключение к Интернету (IsInternetFacing) и VulnerableToPrivilegeEscalation, запрос проверяет, являются ли элементы в Categories действительности устройствами (device).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")

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

Этот запрос приводит к выводу списка пользователей, вошедшего в несколько критически важных устройств, а также количества устройств, на которые они вошли.

  • Она создает таблицу IdentitiesAndCriticalDevices с использованием ExposureGraphNodes данных, отфильтрованных по устройствам с уровнем важности выше 4 или по identity.
  • Затем он создает структуру графа с оператором make-graph , где EdgeLabel имеет значение Can Authenticate As.
  • Оператор используется для graph-match сопоставления экземпляров, где соответствует deviceidentity.
  • Затем оператор используется project для хранения идентификаторов удостоверений и идентификаторов устройств.
  • Оператор mv-apply фильтрует идентификаторы устройств и идентификаторы удостоверений по типу. Он суммирует их и отображает результаты в таблице с заголовками , Number Of devices user is logged-in toи User Id.
let IdentitiesAndCriticalDevices = ExposureGraphNodes
| where
 // Critical Device
 (set_has_element(Categories, "device") and isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel < 4)
 // or identity
 or set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel == "Can Authenticate As"
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (Device)-[canConnectAs]->(Identity)
       where set_has_element(Identity.Categories, "identity") and set_has_element(Device.Categories, "device")
       project IdentityIds=Identity.EntityIds, DeviceIds=Device.EntityIds
| mv-apply DeviceIds on (
    where DeviceIds.type == "DeviceInventoryId")
| mv-apply IdentityIds on (
    where IdentityIds.type == "SecurityIdentifier")
| summarize NumberOfDevicesUserLoggedinTo=count() by tostring(IdentityIds.id)
| where NumberOfDevicesUserLoggedinTo > 1
| project ["Number Of devices user is logged-in to"]=NumberOfDevicesUserLoggedinTo, ["User Id"]=IdentityIds_id

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

Следующий запрос содержит список устройств с уязвимостями RCE и их идентификаторами устройств, а также устройств с высоким уровнем критических уязвимостей и их идентификаторами устройств.

  • Она создает таблицу, включающую IdentitiesAndCriticalDevices устройства (device) с уязвимостями RCE с критичностью ниже четырех и удостоверениями (identity), которые с помощью фильтрации и сопоставления шаблонов показывают устройства с критическими уязвимостями.
  • Список фильтруется для отображения только тех подключений, которые имеют метки Can Authenticate As ребер и CanRemoteInteractiveLogonTo.
let IdentitiesAndCriticalDevices = ExposureGraphNodes // Reduce the number of nodes to match
| where 
 // Critical devices & devices with RCE vulnerabilities
 (set_has_element(Categories, "device") and 
    (
        // Critical devices
        (isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel < 4)
        or 
        // Devices with RCE vulnerability
        isnotnull(NodeProperties.rawData.vulnerableToRCE)
    )
  )
 or 
 // identity
 set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel in~ ("Can Authenticate As", "CanRemoteInteractiveLogonTo") // Reduce the number of edges to match
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (DeviceWithRCE)-[CanConnectAs]->(Identity)-[CanRemoteLogin]->(CriticalDevice)
       where 
             CanConnectAs.EdgeLabel =~ "Can Authenticate As" and
             CanRemoteLogin.EdgeLabel =~ "CanRemoteInteractiveLogonTo" and
             set_has_element(Identity.Categories, "identity") and 
             set_has_element(DeviceWithRCE.Categories, "device") and isnotnull(DeviceWithRCE.NodeProperties.rawData.vulnerableToRCE) and
             set_has_element(CriticalDevice.Categories, "device") and isnotnull(CriticalDevice.NodeProperties.rawData.criticalityLevel)
       project DeviceWithRCEIds=DeviceWithRCE.EntityIds, DeviceWithRCEName=DeviceWithRCE.NodeName, CriticalDeviceIds=CriticalDevice.EntityIds, CriticalDeviceName=CriticalDevice.NodeName

Укажите все пути от определенного идентификатора узла к узлу с определенной меткой

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

  • Для создания структуры графа ExposureGraphNodes используются таблицы схемы и ExposureGraphEdgesmake-graph и операторы и graph-match .
  • project С помощью оператора отображается список IP-идентификаторов, свойств IP-адресов, идентификаторов виртуальных машин и свойств виртуальных машин.
let IPsAndVMs = ExposureGraphNodes
| where (set_has_element(Categories, "ip_address") or set_has_element(Categories, "virtual_machine"));
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with IPsAndVMs on NodeId
| graph-match (IP)-[anyEdge*1..3]->(VM)
       where set_has_element(IP.Categories, "ip_address") and set_has_element(VM.Categories, "virtual_machine")
       project IpIds=IP.EntityIds, IpProperties=IP.NodeProperties.rawData, VmIds=VM.EntityIds, VmProperties=VM.NodeProperties.rawData

Дальнейшие действия

Изучите карту направлений атаки.