Elasticsearch:为 Elastic Security 定制 Detection rules

1,217 阅读9分钟

自从 Elastic Stack 7.6 之后,SIEM 里已经植入 Detection Engine。我们可以创建 Detection rules 来对我们感兴趣的事件进行检测。随着 Elastic Security 7.6 的发布,Elastic SIEM 看到了92条与 MITRE ATT&CK 一致的威胁搜寻和安全分析检测规则。 我们还在 Elastic SIEM 中引入了信号,该功能可根据这些检测规则显示风险和严重性得分,以实现有效的分析人员分类。在之前的文章 “Elastic Security 入门” 中,我已经展示了如何导入已经集成的那些规则,并使它们检测我们所感兴趣的事件。

在今天的文章中,我将介绍如何使用 Kibana 创建一个我们感兴趣的规则,并让这个规则检测我们所关心的事件。

 

准备工作

在今天的练习之前,我需要你们阅读我之前的文章:

1)Elastic:Elastic Security 入门

我们按照文章的要求来安装 Elastic Stack 及 Endpoint agent。需要注意的一点是:我们不需要启动所有的 Detection rules。在今天的练习中,我们将使用我们自己创建的规则来检查我们感兴趣的事件。启动 Elastic Stack 以及 Endpoint agent。我们可以在 Kibana 中看到一些数据:

2)Elasticsearch:EQL 入门 - 使用 EQL 检测威胁

你需要对 EQL 有一些最基本的了解。我们将使用 EQL 来创建规则。

 

创建规则

在今天的练习中,我们将创建一个规则来检测如下的命令按照顺序执行,并且这所有的命令必须是在 60 秒之内完成的:

cmd.exe
powershell.exe
tasklist.exe
whoami.exe

虽然这可能并不是一个实际的安全威胁的模式,我们的重点是来介绍如何使用 Detection Engine 来进行捕获这样的事件。

熟悉一下 EQL 查询

如上面所示,我们可以在 Elastic Security 中看到数据。但是我们该如何对这些由 Endpoint 所产生的数据进行查询呢?我们打开 Fleet 的用户界面:

在上面,我们可以看出来,有不同 category 的数据。在上面我们可以看到 file, library, process 以及 security 等等的数据。对于我们今天的查询来说,我们仅关心 process 里的数据。请注意一点的是:上面的数据都存于 data stream 里。如果你对 data stream 还不是很熟的话,那么请阅读我之前的文章 “Data stream 在索引生命周期管理中的应用”。 那又说回来,我们该如何对这个数据来进行查询呢?

我们回到 Kibana 的 Dev Tools 里,并打入如下的命令:

GET _cat/indices/.ds-logs*

上面的命令显示所有的以 .ds-logs 为开头的 data stream 的索引。上面的命令显示结果:

yellow open .ds-logs-endpoint.events.file-default-000001     LMIy0CQ3Q82gfuZ2D9q3Kg 1 1  6744 0   3.7mb   3.7mb
yellow open .ds-logs-elastic_agent.metricbeat-default-000001 zsfj15WoQA-8iRLTx0JOvw 1 1  5852 0   2.3mb   2.3mb
yellow open .ds-logs-endpoint.events.security-default-000001 dcWxxEQLTbi4cl6kyB1Qnw 1 1   309 0 330.8kb 330.8kb
yellow open .ds-logs-elastic_agent-default-000001            1HTTM0FsSD6qzGIsvbJ3jg 1 1   400 0 135.8kb 135.8kb
yellow open .ds-logs-endpoint.events.library-default-000001  xAK3DVcTRqKqLkp0qN7BqA 1 1  1528 0 732.3kb 732.3kb
yellow open .ds-logs-endpoint.events.network-default-000001  k9mKZeczSdOa5a5Eq9o_ug 1 1  6939 0   3.8mb   3.8mb
yellow open .ds-logs-endpoint.events.process-default-000001  GXOc-BpYSne66PbjLcFJaw 1 1  2775 0   2.4mb   2.4mb
yellow open .ds-logs-elastic_agent.filebeat-default-000001   1we0Dap9TL26M7wnO85NYw 1 1  1020 0 253.3kb 253.3kb
yellow open .ds-logs-endpoint.events.registry-default-000001 cLdDs8gIS466z18dJntoRA 1 1 11280 0   4.5mb   4.5mb

针对我们的情况,我们对 category 为 process 的索引 .ds-logs-endpoint.events.process-default 感兴趣。我们该如何访问这个索引呢?我们可以阅读文章 “An introduction to the Elastic data stream naming scheme”,当然你也可以阅读我之前的文章 “Data stream 在索引生命周期管理中的应用”。我们可以通过如下的方式来访问这个 data stream:

GET logs-endpoint.events.process-default/_search

上面的查询将会显示诸如下面的这种文档:

    "hits" : [
      {
        "_index" : ".ds-logs-endpoint.events.process-default-000001",
        "_type" : "_doc",
        "_id" : "WCqzYXcB-nE6Q-9knNfU",
        "_score" : 1.0,
        "_source" : {
          "agent" : {
            "id" : "91f6a6b3-bd71-a788-164c-7654c511c46b",
            "type" : "endpoint",
            "version" : "7.10.1"
          },
          "process" : {
            "Ext" : {
              "ancestry" : [
                "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTg0OC0xMzI1NTA4OTY2Ni44MTg3MDUyMDA=",
                "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTYzMi0xMzI1NTA4OTY2Ni41NTc2MTgwMDA=",
                "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTQ5Ni0xMzI1NTA4OTY2NC40NTk5NDAxMDA="
              ],
              "code_signature" : [
                {
                  "trusted" : true,
                  "subject_name" : "Microsoft Windows",
                  "exists" : true,
                  "status" : "trusted"
                }
              ]
            },
            "parent" : {
              "args" : [
                """C:\WINDOWS\system32\svchost.exe""",
                "-k",
                "DcomLaunch",
                "-p"
              ],
              "name" : "svchost.exe",
              "pid" : 848,
              "args_count" : 4,
              "entity_id" : "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTg0OC0xMzI1NTA4OTY2Ni44MTg3MDUyMDA=",
              "command_line" : """C:\WINDOWS\system32\svchost.exe -k DcomLaunch -p""",
              "executable" : """C:\Windows\System32\svchost.exe"""
            },
            "pid" : 10064,
            "entity_id" : "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTEwMDY0LTEzMjU2NTM4NDk5LjU5MDQ5NzIwMA==",
            "executable" : """C:\Windows\System32\backgroundTaskHost.exe""",
            "args" : [
              """C:\WINDOWS\system32\backgroundTaskHost.exe""",
              "-ServerName:App.AppXmtcan0h2tfbfy7k9kn8hbxb6dmzz1zh0.mca"
            ],
            "code_signature" : {
              "trusted" : true,
              "subject_name" : "Microsoft Windows",
              "exists" : true,
              "status" : "trusted"
            },
            "pe" : {
              "original_file_name" : "backgroundTaskHost.exe"
            },
            "exit_code" : 1,
            "name" : "backgroundTaskHost.exe",
            "args_count" : 2,
            "command_line" : "\"C:\\WINDOWS\\system32\\backgroundTaskHost.exe\" -ServerName:App.AppXmtcan0h2tfbfy7k9kn8hbxb6dmzz1zh0.mca",
            "hash" : {
              "sha1" : "dc27f57a3ba5d13b476b1fd0872b8972744a01f8",
              "sha256" : "74b3323405cdfb85cfc9d5c1cd29c816c80361df154801e44f14863c9058906e",
              "md5" : "e22e7bd6b146bde93dc48643b772d8bb"
            }
          },
          "message" : "Endpoint process event",
          "@timestamp" : "2021-01-31T03:48:24.1748839Z",
          "ecs" : {
            "version" : "1.5.0"
          },
          "data_stream" : {
            "namespace" : "default",
            "type" : "logs",
            "dataset" : "endpoint.events.process"
          },
          "elastic" : {
            "agent" : {
              "id" : "4fe0da01-7f95-4c82-8cf9-4cc450230d0b"
            }
          },
          "host" : {
            "hostname" : "XIAOGUOLIU4110",
            "os" : {
              "Ext" : {
                "variant" : "Windows 10 Pro"
              },
              "kernel" : "1903 (10.0.18362.720)",
              "name" : "Windows",
              "family" : "windows",
              "version" : "1903 (10.0.18362.720)",
              "platform" : "windows",
              "full" : "Windows 10 Pro 1903 (10.0.18362.720)"
            },
            "ip" : [
              "10.211.55.3",
              "fdb2:2c26:f4e4:0:31c8:34c0:2a8f:a3fc",
              "fdb2:2c26:f4e4:0:ad95:2fc3:a5ef:1db3",
              "fe80::31c8:34c0:2a8f:a3fc",
              "127.0.0.1",
              "::1"
            ],
            "name" : "XIAOGUOLIU4110",
            "id" : "66a55086-f72c-45a3-beb9-787695051365",
            "mac" : [
              "00:1c:42:a7:28:57"
            ],
            "architecture" : "x86_64"
          },
          "event" : {
            "sequence" : 197142,
            "ingested" : "2021-02-02T07:44:57.011354Z",
            "created" : "2021-01-31T03:48:24.1748839Z",
            "kind" : "event",
            "module" : "endpoint",
            "action" : "end",
            "id" : "M+Htx0X7Ic+Imf8A++++/ofq",
            "category" : [
              "process"
            ],
            "type" : [
              "end"
            ],
            "dataset" : "endpoint.events.process"
          },
          "user" : {
            "domain" : "XIAOGUOLIU4110",
            "name" : "liuxg",
            "id" : "S-1-5-21-3773714537-4116087099-697591026-1000"
          }
        }
      }

如上所示,这个文档的 category 是 process。我们在 Windows 的 Powershell 中打入如下的 cmd.exe 命令:

我们在 Kibana 中进行如下的 EQL 查询:

GET logs-endpoint.events.process-default/_eql/search
{
  "query": """
     process where process.name == "cmd.exe"  
  """
}

在上面,我们针对 category 为 process 做查询,我们可以看到如下的查询结果:

  "hits" : {
    "total" : {
      "value" : 10,
      "relation" : "eq"
    },
    "events" : [
      {
        "_index" : ".ds-logs-endpoint.events.process-default-000001",
        "_id" : "FSqzYXcB-nE6Q-9kisWC",
        "_source" : {
          "agent" : {
            "id" : "91f6a6b3-bd71-a788-164c-7654c511c46b",
            "type" : "endpoint",
            "version" : "7.10.1"
          },
          "process" : {
            "Ext" : {
              "ancestry" : [
                "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTE2MjQ0LTEzMjU2NTM4MjY5LjIyNTA1NDUwMA==",
                "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTEyMTItMTMyNTUwODk2NjcuMzMxODk3OTAw",
                "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTYzMi0xMzI1NTA4OTY2Ni41NTc2MTgwMDA=",
                "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTQ5Ni0xMzI1NTA4OTY2NC40NTk5NDAxMDA="
              ],
              "code_signature" : [
                {
                  "trusted" : true,
                  "subject_name" : "Microsoft Windows",
                  "exists" : true,
                  "status" : "trusted"
                }
              ],
              "token" : {
                "integrity_level_name" : "system",
                "elevation_level" : "default"
              }
            },
            "args" : [
              """C:\WINDOWS\system32\cmd.exe""",
              "/c",
              """C:\WINDOWS\system32\wusa.exe""",
              """C:\Program Files\CUAssistant\Download\windows10.0-kb4592449-x64_aa193efa8432018464d6173c497ce3de71a581e2.msu""",
              "/quiet",
              "/norestart"
            ],
            "parent" : {
              "args" : [
                """C:\Program Files\CUAssistant\culauncher.exe"""
              ],
              "name" : "culauncher.exe",
              "pid" : 16244,
              "args_count" : 1,
              "entity_id" : "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTE2MjQ0LTEzMjU2NTM4MjY5LjIyNTA1NDUwMA==",
              "command_line" : "\"C:\\Program Files\\CUAssistant\\culauncher.exe\"",
              "executable" : """C:\Program Files\CUAssistant\culauncher.exe"""
            },
            "code_signature" : {
              "trusted" : true,
              "subject_name" : "Microsoft Windows",
              "exists" : true,
              "status" : "trusted"
            },
            "pe" : {
              "original_file_name" : "Cmd.Exe"
            },
            "name" : "cmd.exe",
            "pid" : 17676,
            "args_count" : 6,
            "entity_id" : "OTFmNmE2YjMtYmQ3MS1hNzg4LTE2NGMtNzY1NGM1MTFjNDZiLTE3Njc2LTEzMjU2NTM4Mzc4LjQzNzc0ODMwMA==",
            "command_line" : """C:\WINDOWS\system32\cmd.exe /c C:\WINDOWS\system32\wusa.exe "C:\Program Files\CUAssistant\Download\windows10.0-kb4592449-x64_aa193efa8432018464d6173c497ce3de71a581e2.msu" /quiet /norestart""",
            "executable" : """C:\Windows\System32\cmd.exe""",
            "hash" : {
              "sha1" : "8dca9749cd48d286950e7a9fa1088c937cbccad4",
              "sha256" : "ff79d3c4a0b7eb191783c323ab8363ebd1fd10be58d8bcc96b07067743ca81d5",
              "md5" : "d7ab69fad18d4a643d84a271dfc0dbdf"
            }
          },
          "message" : "Endpoint process event",
          "@timestamp" : "2021-01-31T03:46:18.4377483Z",
          "ecs" : {
            "version" : "1.5.0"
          },
          "data_stream" : {
            "namespace" : "default",
            "type" : "logs",
            "dataset" : "endpoint.events.process"
          },
          "elastic" : {
            "agent" : {
              "id" : "4fe0da01-7f95-4c82-8cf9-4cc450230d0b"
            }
          },
          "host" : {
            "hostname" : "XIAOGUOLIU4110",
            "os" : {
              "Ext" : {
                "variant" : "Windows 10 Pro"
              },
              "kernel" : "1903 (10.0.18362.720)",
              "name" : "Windows",
              "family" : "windows",
              "version" : "1903 (10.0.18362.720)",
              "platform" : "windows",
              "full" : "Windows 10 Pro 1903 (10.0.18362.720)"
            },
            "ip" : [
              "10.211.55.3",
              "fdb2:2c26:f4e4:0:31c8:34c0:2a8f:a3fc",
              "fdb2:2c26:f4e4:0:ad95:2fc3:a5ef:1db3",
              "fe80::31c8:34c0:2a8f:a3fc",
              "127.0.0.1",
              "::1"
            ],
            "name" : "XIAOGUOLIU4110",
            "id" : "66a55086-f72c-45a3-beb9-787695051365",
            "mac" : [
              "00:1c:42:a7:28:57"
            ],
            "architecture" : "x86_64"
          },
          "event" : {
            "sequence" : 192011,
            "ingested" : "2021-02-02T07:44:52.345950Z",
            "created" : "2021-01-31T03:46:18.4377483Z",
            "kind" : "event",
            "module" : "endpoint",
            "action" : "start",
            "id" : "M+Htx0X7Ic+Imf8A++++/l2C",
            "category" : [
              "process"
            ],
            "type" : [
              "start"
            ],
            "dataset" : "endpoint.events.process"
          },
          "user" : {
            "domain" : "NT AUTHORITY",
            "name" : "SYSTEM",
            "id" : "S-1-5-18"
          }
        }
      },
   ...
 ]
}

很显然它就是我们要查询的事件。

接下来,我们回到我们最先提出来的问题。侦测在60秒之内安装如下的顺序发生的事件:

cmd.exe
powershell.exe
tasklist.exe
whoami.exe

为此,我们需要使用如下的 EQL 来进行查询:

GET logs-endpoint.events.process-default/_eql/search
{
    "query": """
       sequence with maxspan=60s
         [ process where process.name == "cmd.exe" ]
         [ process where process.name == "powershell.exe" ] 
         [ process where process.name == "tasklist.exe" ] 
         [ process where process.name == "whoami.exe" ]  
  """
}

如上所示,我们定义在60秒以内,先执行 cmd.exe, 然后, powershell.exe,tasklist.exe 及 whoami.exe。我们希望有这样的顺序执行的命令发生。我们接着在 Windows 下的 Powershell.exe 中依次执行上面的命令:

我们执行上面的 EQL 查询,那么我们可以看到被搜索处理的结果:

从查询的结果里,我们可以看出来 cmd.exe 是一个执行的然后,是 powershell.exe,再之后就是 tasklist.exe 以及 whoami 命令。这说明我们的 EQL  查询是正确的。

 

创建检测规则

在上面,我们已经熟悉了 EQL 的查询,那么在这节里,我将展示如何创建一个规则来检查上面的事件。

我们选择每隔一分钟检查一次:

我们选择不做任何的操作。当然你可以选择如下写任何一个操作:

点击 Create & activate rule:

这样我们就创建了一个我们定制的检测。目前它是在 activated 的状态。我们到 Windows 的 Powershell 里打入如下的命令:

cmd.exe
powershell.exe
tasklist.exe
whoami.exe

我们确保上面的命令是按照顺序执行的,并且是在60秒之内完成的。我们接着切换到 Detections 的界面:

从上面我们可以看出来有一个新生成的 alert。它是被 Detect_cmd_powershell_tasklist_whoami 这个规则所捕获。我们可以进一步对这个事件来进行分析。

好了,今天的练习就到这里。希望大家通过对这个简单的事件的侦测对 Detection Engine 有一个初步的认识我了解。