自从 Elastic Stack 7.6 之后,SIEM 里已经植入 Detection Engine。我们可以创建 Detection rules 来对我们感兴趣的事件进行检测。随着 Elastic Security 7.6 的发布,Elastic SIEM 看到了92条与 MITRE ATT&CK 一致的威胁搜寻和安全分析检测规则。 我们还在 Elastic SIEM 中引入了信号,该功能可根据这些检测规则显示风险和严重性得分,以实现有效的分析人员分类。在之前的文章 “Elastic Security 入门” 中,我已经展示了如何导入已经集成的那些规则,并使它们检测我们所感兴趣的事件。
在今天的文章中,我将介绍如何使用 Kibana 创建一个我们感兴趣的规则,并让这个规则检测我们所关心的事件。
准备工作
在今天的练习之前,我需要你们阅读我之前的文章:
我们按照文章的要求来安装 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 有一个初步的认识我了解。