Cyril FrançoisAndrew Pease

Situaciones de ITS: ECSagoting de sus datos de amenazas

Los datos estructurados de amenazas se suelen formatear con STIX. Para poder obtener estos datos en Elasticsearch, lanzamos un script de Python que convierte STIX a un formato ECS para que se ingiera en tu pila.

11 min de lecturaHerramientas
Situaciones de STIX: Hacer ECScapar tus datos de amenazas

Preámbulo

Las organizaciones que emplean indicadores de amenazas u observables consumen, crean y/o (idealmente) publican datos de amenazas. Estos datos se pueden emplear interna o externamente como información o inteligencia para informar la toma de decisiones y la priorización de eventos.

Si bien existen varios formatos para estructurar esta información, el estándar de facto de la industria es la Expresión Estructurada de Información de Amenazas (STIX). STIX es gestionado por el Comité Técnico de Inteligencia de Amenazas Cibernéticas de OASIS y permite a las organizaciones compartir datos de amenazas en un formato estándar y legible por máquina.

En Elastic, desarrollamos el Elastic Common Schema (ECS) como una capacidad de normalización de datos. "[ECS] es una especificación de código abierto, desarrollada con el apoyo de la comunidad de usuarios de Elastic. ECS define un conjunto común de campos para almacenar datos de eventos en Elasticsearch, como registros y métricas". En abril de 2023, Elastic contribuyó con ECS a las convenciones semánticas de OpenTelemetry (OTel) como compromiso con el desarrollo conjunto de un esquema abierto.

La comunidad de seguridad comparte datos de amenazas en formato STIX, por lo que para almacenar esos datos en Elasticsearch para el análisis y la detección de amenazas [1] [2] [3] [4], creamos una herramienta que convierte los documentos STIX en ECS y genera los datos de amenazas como un archivo o directamente en los índices de Elasticsearch. Si esto fue un desafío para nosotros, fue un desafío para otros, por lo tanto, decidimos lanzar una versión de la herramienta.

Esta herramienta emplea la Licencia Elástica 2.0 y está disponible para su descarga aquí.

Cómo empezar

Este proyecto tomará un documento JSON con formato STIX 2.x y creará una versión ECS. Hay tres opciones de salida: STDOUT como JSON, un archivo NDJSON y/o directamente a un clúster de Elasticsearch.

Prerrequisitos

El proyecto STIX 2 ECS requiere Python 3.10+ y los módulos stix2, Elasticsearch y getpass .

Si exporta a Elasticsearch, necesitará la información del host y las credenciales de autenticación. La autenticación de API aún no está implementada.

Arreglo

Cree un entorno virtual e instale los requisitos previos necesarios.

git clone https://github.com/elastic/labs-releases.git
cd tools/stix2ecs
python -m venv /path/to/virtual/environments/stix2ecs
source /path/to/virtual/environments/stix2ecs/bin/activate
python -m pip install -r requirements.txt

Operación

La entrada es un documento JSON de STIX 2.x (o una carpeta de documentos JSON); el valor predeterminado de la salida es STDOUT, con una opción para crear un archivo NDJSON y/o enviarlo a un clúster de Elasticsearch.

stix_to_ecs.py [-h] -i INPUT [-o OUTPUT] [-e] [--index INDEX] [--url URL] \
[--user USER] [-p PROVIDER] [-r]

De forma predeterminada, el archivo ECS tiene el mismo nombre que la entrada del archivo STIX, pero con .ecs.ndjson anexado.

Arguments

El script tiene varios argumentos, el único campo obligatorio es -i para la entrada. De forma predeterminada, el script generará el documento NDJSON en STDOUT.

OpciónDescripción
-hMuestra el menú Ayuda
-iespecifica el documento STIX de entrada (obligatorio)
-oespecifica el documento ECS de salida (opcional)
-pdefine el campo proveedor de ECS (opcional)
-rmodo recursivo para convertir varios documentos STIX (opcional)
-eespecifica el modo de salida de Elasticsearch (opcional)
--indexdefine el índice de Elasticsearch, requiere -e (opcional)
--urldefine la URL de Elasticsearch, requiere -e (opcional)
--usuariodefine el nombre de usuario de Elasticsearch, requiere -e (opcional)

Ejemplos

Hay dos archivos de ejemplo ubicados en el directorio test-inputs/ . Uno es de CISA (Agencia de Seguridad de Infraestructura y Ciberseguridad), y el otro es de OpenCTI (una plataforma de inteligencia de amenazas de código abierto).

Entrada de archivo STIX a STDOUT

Esto generará el documento STIX a STDOUT en formato ECS.

python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json | jq

[
  {
    "threat": {
      "indicator": {
        "file": {
          "name": "123.ps1",
          "hash": {
            "sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
          }
        },
        "type": "file",
        "description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
        "first_seen": "2023-11-21T18:57:25.000Z",
        "provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
        "modified_at": "2023-11-21T18:57:25.000Z",
        "marking": {
          "tlp": "clear"
        }
      }
    }
  },
...

Entrada de archivo STIX a la salida de archivo ECS

Esto creará una carpeta llamada ecs en el directorio actual y escribirá el archivo ECS allí.

python python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs

cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
  "threat": {
    "indicator": {
      "file": {
        "name": "123.ps1",
        "hash": {
          "sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
        }
      },
      "type": "file",
      "description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
      "first_seen": "2023-11-21T18:57:25.000Z",
      "provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
      "modified_at": "2023-11-21T18:57:25.000Z",
      "marking": {
        "tlp": "clear"
      }
    }
  }
}
...

Entrada de archivo STIX a la salida de archivo ECS, definiendo el campo Proveedor

El campo de proveedor suele ser un GUID en el documento STIX. Para que sea más fácil de usar, puede usar el argumento -p para definir el campo threat.indicator.provider .

python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs -p "Elastic Security Labs"

cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
  "threat": {
    "indicator": {
      "file": {
        "name": "123.ps1",
        "hash": {
          "sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
        }
      },
      "type": "file",
      "description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
      "first_seen": "2023-11-21T18:57:25.000Z",
      "provider": "Elastic Security Labs",
      "modified_at": "2023-11-21T18:57:25.000Z",
      "marking": {
        "tlp": "clear"
      }
    }
  }
}
...

Entrada de directorio STIX a salidas de archivos ECS

Si tiene un directorio de documentos STIX, puede usar el argumento -r para buscar recursivamente en el directorio y escribir los documentos ECS en el directorio de salida.

python stix_to_ecs.py -ri test-inputs -o ecs

Entrada de archivo STIX a la salida de Elasticsearch

Para generar resultados en Elasticsearch, puedes usar Elastic Cloud o una instancia local. Elasticsearch local usará el puerto 9200 y Elastic Cloud usará el puerto 443. De forma predeterminada, se requiere una sesión TLS válida para Elasticsearch.

Primero, cree un índice si aún no tiene uno. En este ejemplo, estamos creando un índice llamado stix2ecs, pero el nombre del índice no es relevante.

curl -u {username} -X PUT "https://elasticsearch:port/stix2ecs?pretty"

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "stix2ecs"
}

A continuación, defina las opciones de salida de Elasticsearch.

python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -e --url https://elasticsearch:port --user username --index stix2ecs

Si almacenas los datos en Elasticsearch para usarlos en otra plataforma, puedes ver los indicadores mediante cURL.

curl -u {username} https://elasticsearch:port/stix2ecs/_search?pretty

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "stix2ecs",
        "_id" : "n2lt8IwBahlUtp0hzm9i",
        "_score" : 1.0,
        "_source" : {
          "threat" : {
            "indicator" : {
              "file" : {
                "name" : "123.ps1",
                "hash" : {
                  "sha256" : "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
                }
              },
              "type" : "file",
              "description" : "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
              "first_seen" : "2023-11-21T18:57:25.000Z",
              "provider" : "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
              "modified_at" : "2023-11-21T18:57:25.000Z",
              "marking" : {
                "tlp" : "clear"
              }
            }
          }
        }
      }
...

Si usas Kibana, puedes crear una vista de datos para tu índice stix2ecs a fin de ver los indicadores ingeridos.

Por último, puede emplearlo como fuente de indicador para las reglas de coincidencia de indicadores.

Resumen

Esperamos que este proyecto ayude a su organización a analizar y poner en práctica sus datos de amenazas. Si eres nuevo en el Elastic Common Schema, puedes obtener más información al respecto aquí.

Como siempre, no dude en abrir un problema con cualquier pregunta, comentario, inquietud o queja.

Acerca de Elastic Security Labs

Elastic Security Labs es la rama de inteligencia de amenazas de Elastic Security dedicada a crear cambios positivos en el panorama de amenazas. Elastic Security Labs proporciona investigación disponible públicamente sobre amenazas emergentes con un análisis de los objetivos estratégicos, operativos y tácticos del adversario, y luego integra esa investigación con las capacidades de detección y respuesta integradas de Elastic Security.

Sigue a Elastic Security Labs en Twitter @elasticseclabs y echa un vistazo a nuestra investigación en www.elastic.co/security-labs/.