查询企业曝光图

使用 Microsoft 安全风险管理 中的企业曝光图在 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
..

使用动态列和智能索引

NodePropertiesCategories 是动态列。

  • Kusto 知道这些列包含类似 json 的内容,并应用智能索引。
  • 但是,并非所有 Kusto 运算符都使用 索引。 例如, set_has_elementisemptyisnotnull 在应用于动态列时不使用索引,并且isnotnull(Properties["containsSensitiveData"]不使用索引。
  • 请改用 has() 运算符,该运算符始终使用索引。

示例

在以下查询中, has 运算符检查 data 字符串,并 set_has_element 检查 data 元素。

使用这两个运算符非常重要, has() 因为即使对于类别 prefix_data,运算符也会返回 true。

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

详细了解 如何理解字符串术语

公开查询示例

以下示例可帮助你编写查询来了解租户中的安全暴露数据。

列出租户中的所有节点标签

以下查询对表中的数据进行分组, ExposureGraphNodes 并使用 Kusto 的 summarize 运算符按 NodeLabel列出数据。

ExposureGraphNodes
| summarize by NodeLabel

列出租户中的所有边缘标签

以下查询对表中的数据 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列数据映射到表中的ExposureGraphEdgesTargetNodeIdExposureGraphNodesmake-graph来生成图形结构,从而生成图形结构。

然后, graph-match 它使用 运算符创建一个图形模式,其中目标节点 TargetNodeNodeLabel 匹配 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表中TargetNodeId的列ExposureGraphNodesmake-graph来生成图形结构,从而ExposureGraphEdges生成图形结构。
  • 然后, graph-match 它使用 运算符来匹配 图形模式,其中 SourceNodeNodeLabel 匹配 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 漏洞的 Internet 公开的 VM

通过以下查询,可以发现向 Internet 和远程代码执行公开的虚拟机, (RCE) 漏洞。

  • 它使用 ExposureGraphNodes 架构表。
  • 当 和 vulnerableToRCENodePropertiesexposedToInternet为 true 时,它会检查 () Categories 类别是否为虚拟机 (virtual_machine) 。
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")

发现具有特权提升漏洞的面向 Internet 的设备

以下查询查找暴露在特权提升漏洞中的面向 Internet 的设备,该漏洞可能允许访问系统中的更高级别特权。

  • 它使用 ExposureGraphNodes 架构表。
  • 当 同时面向 Internet (IsInternetFacing) 和 VulnerableToPrivilegeEscalationNodeProperties,查询会检查中的Categories项是否实际上是 (device) 设备。
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")

显示登录到多个关键设备的所有用户

此查询将生成登录多个关键设备的用户列表,以及他们登录的设备数。

  • 它使用ExposureGraphNodes按严重性级别高于 4 的设备或 按 identity筛选的数据创建IdentitiesAndCriticalDevices表。
  • 然后,它使用 make-graph 运算符创建图形结构,其中 为 EdgeLabelCan Authenticate As
  • 它使用 graph-match 运算符来匹配 与 匹配的deviceidentity实例。
  • 然后, project 它使用 运算符来保留标识 ID 和设备 ID。
  • 操作员 mv-apply 按类型筛选设备 ID 和标识 ID。 它对这些结果进行汇总,并在具有 标头 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 漏洞的设备及其设备 ID 的列表,以及具有高严重漏洞的设备及其设备 ID 的列表。

  • 它创建一个 IdentitiesAndCriticalDevices 表,其中包括 device 具有严重性低于 4 的 RCE 漏洞 () 的设备,以及标识 (identity) ,通过筛选和模式匹配显示具有严重漏洞的设备。
  • 列表经过筛选,仅显示具有边缘标签 Can Authenticate AsCanRemoteInteractiveLogonTo的那些连接。
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

提供从特定节点 ID 到具有特定标签的节点的所有路径

此查询显示来自特定 IP 节点的路径,并传递最多三个资产,导致连接到虚拟机节点标签。

  • 它使用 ExposureGraphNodesExposureGraphEdges 架构表以及 make-graphgraph-match 运算符来创建图形结构。
  • project使用 运算符,它将显示 IP ID、IP 属性、虚拟机 ID 和虚拟机属性的列表。
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

后续步骤

使用攻击面地图进行探索