ElasticSearch之EQL操作
前述
EQL
的全名是 Event Query Language (EQL)
。事件查询语言(EQL)是一种用于基于事件的时间序列数据(例如日志,指标和跟踪)的查询语言。在 Elastic Security
平台上,当输入有效的 EQL
时,查询会在数据节点上编译,执行查询并返回结果。这一切都快速、并行地发生,让用户立即看到结果。
EQL优点
EQL 使你可以表达事件之间的关系:许多查询语言允许您匹配单个事件。EQL 使你可以匹配不同事件类别和时间跨度的一系列事件
EQL 的学习曲线很低:EQL 语法看起来像其他常见查询语言,例如 SQL。 EQL 使你可以直观地编写和读取查 询,从而可以进行快速,迭代的搜索。
EQL 设计用于安全用例:尽管你可以将其用于任何基于事件的数据,但我们创建了 EQL 来进行威胁搜寻。 EQL 不仅支持危害指标(IOC)搜索,而且可以描述超出 IOC 范围的活动
基础语法
数据准备
要运行 EQL
搜索,搜索到的数据流或索引必须包含时间戳和事件类别字段。默认情况下,EQL
使用 Elastic
通用模式(ECS)中的 @timestamp
和 event.category
字段。 @timestamp
表示时间戳,event.category
表示事件分类。
# 创建索引
PUT /gmall
# 批量增加数据
PUT _bulk
{"index":{"_index":"gmall"}}
{
"@timestamp":"2022-08-10T15:00:00.00+08:00",
"event":{
"category":"page"
},
"page":{
"session_id":"42FC7E13-CB3E-5C05-0000-0010A0125101",
"last_page_id":"",
"page_id":"login",
"user_id":""
}
}
{"index":{"_index":"gmall"}}
{
"@timestamp":"2022-08-10T15:02:00.00+08:00",
"event":{
"category":"page"
},
"page":{
"session_id":"42FC7E13-CB3E-5C05-0000-0010A0125101",
"last_page_id":"login",
"page_id":"good_list",
"user_id":"1"
}
}
{"index":{"_index":"gmall"}}
{
"@timestamp":"2022-08-10T15:05:00.00+08:00",
"event":{
"category":"page"
},
"page":{
"session_id":"42FC7E13-CB3E-5C05-0000-0010A0125101",
"last_page_id":"good_list",
"page_id":"good_detail",
"user_id":"1"
}
}
{"index":{"_index":"gmall"}}
{
"@timestamp":"2022-08-10T15:07:00.00+08:00",
"event":{
"category":"page"
},
"page":{
"session_id":"42FC7E13-CB3E-5C05-0000-0010A0125101",
"last_page_id":"good_detail",
"page_id":"order",
"user_id":"1"
}
}
{"index":{"_index":"gmall"}}
{
"@timestamp":"2022-08-10T15:08:00.00+08:00",
"event":{
"category":"page"
},
"page":{
"session_id":"42FC7E13-CB3E-5C05-0000-0010A0125101",
"last_page_id":"order",
"page_id":"payment",
"user_id":"1"
}
}
{"index":{"_index":"gmall"}}
{
"@timestamp":"2022-08-10T15:08:00.00+08:00",
"event":{
"category":"page"
},
"page":{
"session_id":"42FC7E13-CB3E-5C05-0000-0010A0125102",
"last_page_id":"",
"page_id":"login",
"user_id":"2"
}
}
{"index":{"_index":"gmall"}}
{
"@timestamp":"2022-08-10T15:08:00.00+08:00",
"event":{
"category":"page"
},
"page":{
"session_id":"42FC7E13-CB3E-5C05-0000-0010A0125102",
"last_page_id":"login",
"page_id":"payment",
"user_id":"2"
}
}
数据窗口搜索
在事件响应过程中,有很多时候,了解特定时间发生的所有事件是很有用的。使用一种名为any
的特殊事件类型,针对所有事件进行匹配,如果想要匹配特定事件,就需要指明事件分类名称
#
GET /gmall/_eql/search
{
"query" : """
any where page.user_id == "1"
"""
}
统计符合条件的事件
GET /gmall/_eql/search
{
"query" : """
any where true
""",
"filter": {
"range": {
"@timestamp": {
"gte": "1654056000000",
"lt": "1654056005000"
}
}
}
}
事件序列
- 页面先访问 login,后面又访问了 good_detail的页面
GET /gmall/_eql/search
{
"query" : """
sequence by page.session_id
[page where page.page_id=="login"]
[page where page.page_id=="good_detail"]
"""
}
安全检测
EQL
在 Elastic Securit
中被广泛使用。实际应用时,我们可以使用 EQL
语言来进行检测安全威胁和其他可疑行为。
数据准备
regsvr32.exe
是一个内置的命令行实用程序,用于在Windows
中注册.dll
库。作为本机工具,regsvr32.exe
具有受信任的状态,从而使它可以绕过大多数允许列表软件和脚本阻止 程序。有权访问用户命令行的攻击者可以使用 regsvr32.exe
通过.dll
库运行恶意脚本,即使在其他情况下也不允许这些脚本运行。
regsvr32
滥用的一种常见变体是Squfullydoo
攻击。在 Squfullydoo
攻击中,regsvr32.exe
命令使用 scrobj.dll
库注册并运行远程脚本。
测试数据来自 Atomic Red Team
的测试数据集,其中包括模仿Squibledoo
攻击的事件。 数据已映射到Elastic
通用架构(ECS)字段:normalized-T1117-AtomicRed-regsvr32.json
将文件内容导入到ES
软件中:
# 创建索引
PUT my-eql-index
# 导入数据
POST my-eql-index/_bulk?pretty&refresh
{"index":{}}
{
......
}
- 查看数据导入情况
GET /_cat/indices/my-eql-index?v=true&h=health,status,index,docs.count
获取regsvr32事件的计数
- 获取与
regsvr32.exe
进程关联的事件数
# 查询数据
# ?filter_path=-hits.events 从响应中排除hits.events 属性。此搜索仅用于获取事件计数,而不是匹配事件的列表
# query : 匹配任何进程名称为regsvr32.exe的事件
# size : 最多返回200个匹配事件的匹配,实际查询结果为143个
GET my-eql-index/_eql/search?filter_path=-hits.events
{
"query": """
any where process.name == "regsvr32.exe"
""",
"size": 200
}
检查命令行参数
该查询将一个事件与创建的event.type
相匹配,指示regsvr32.exe
进程的开始。根据事件的 process.command_line
值,regsvr32.exe
使用 scrobj.dll
注册了脚本 RegSvr32.sct
.这符合Squibledoo
攻击的行为
# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{
"query": """
process where process.name == "regsvr32.exe" and process.command_line.keyword != null
"""
}
检查恶意脚本加载
- 检查
regsvr32.exe
以后是否加载scrobj.dll
库
# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{
"query": """
library where process.name == "regsvr32.exe" and dll.name == "scrobj.dll"
"""
}
检查攻击成功可能性
在许多情况下,攻击者使用恶意脚本连接到远程服务器或下载其他文件。 使用EQL
序列查询来检查以下一系列事件:
regsvr32.exe
进程- 通过相同的进程加载
scrobj.dll
库 - 同一过程中的任何网络事件
# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{
"query": """
sequence by process.pid
[process where process.name == "regsvr32.exe"]
[library where dll.name == "scrobj.dll"]
[network where true]
"""
}