Cyril FrançoisAndrew Pease

Situações STIXy: ECSaping seus dados de ameaças

Os dados estruturados de ameaças geralmente são formatados usando STIX. Para ajudar a colocar esses dados no Elasticsearch, estamos lançando um script Python que converte o STIX em um formato ECS para ser ingerido na sua pilha.

11 min de leituraFerramentas
Situações STIXy: ECSaping seus dados de ameaças

Preâmbulo

Organizações que usam indicadores de ameaças ou observáveis consomem, criam e/ou (idealmente) publicam dados de ameaças. Esses dados podem ser usados interna ou externamente como informação ou inteligência para embasar a tomada de decisões e a priorização de eventos.

Embora existam vários formatos para estruturar essas informações, o padrão de fato da indústria é o Structured Threat Information Expression (STIX). O STIX é gerenciado pelo Comitê Técnico de Inteligência de Ameaças Cibernéticas do OASIS e permite que organizações compartilhem dados de ameaças em um formato padrão e legível por máquina.

Na Elastic, desenvolvemos o Elastic Common Schema (ECS) como um recurso de normalização de dados. “[ECS] é uma especificação de código aberto, desenvolvida com o suporte da comunidade de usuários do Elastic. O ECS define um conjunto comum de campos para armazenar dados de eventos no Elasticsearch, como logs e métricas.” Em abril de 2023, a Elastic contribuiu com o ECS para as Convenções Semânticas OpenTelemetry (OTel) como um compromisso com o desenvolvimento conjunto de um esquema aberto.

A comunidade de segurança compartilha dados de ameaças no formato STIX, então para armazenar esses dados no Elasticsearch para análise e detecção de ameaças [1] [2] [3] [4], criamos uma ferramenta que converte documentos STIX em ECS e gera os dados de ameaças como um arquivo ou diretamente em índices do Elasticsearch. Se isso foi um desafio para nós, foi um desafio para outros - por isso, decidimos lançar uma versão da ferramenta.

Esta ferramenta usa a Licença Elastic 2.0 e está disponível para download aqui.

Para começar

Este projeto pegará um documento JSON formatado em STIX 2.x e criará uma versão ECS. Há três opções de saída: STDOUT como JSON, um arquivo NDJSON e/ou diretamente para um cluster do Elasticsearch.

Pré-requisitos

O projeto STIX 2 ECS requer Python 3.10+ e os módulos stix2, Elasticsearch e getpass .

Ao exportar para o Elasticsearch, você precisará das informações do host e das credenciais de autenticação. A autenticação de API ainda não foi implementada.

Configuração

Crie um ambiente virtual e instale os pré-requisitos necessários.

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

Operação

A entrada é um documento JSON STIX 2.x (ou uma pasta de documentos JSON); a saída padrão é STDOUT, com uma opção para criar um arquivo NDJSON e/ou enviar para um cluster Elasticsearch.

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

Por padrão, o arquivo ECS tem o mesmo nome da entrada do arquivo STIX, mas com .ecs.ndjson anexado.

Arguments

O script tem vários argumentos, o único campo obrigatório é -i para a entrada. Por padrão, o script emitirá o documento NDJSON para STDOUT.

OpçãoDescrição
-hexibe o menu de ajuda
-iespecifica o documento STIX de entrada (obrigatório)
-oespecifica o documento ECS de saída (opcional)
-pdefine o campo do provedor ECS (opcional)
-rmodo recursivo para converter vários documentos STIX (opcional)
-eespecifica o modo de saída do Elasticsearch (opcional)
--indexdefine o Índice Elasticsearch, requer -e (opcional)
--urldefine a URL do Elasticsearch, requer -e (opcional)
--usuáriodefine o nome de usuário do Elasticsearch, requer -e (opcional)

Exemplos

Há dois arquivos de exemplo localizados no diretório test-inputs/ . Um é da CISA (Cybersecurity & Infrastructure Security Agency) e o outro é da OpenCTI (uma plataforma de inteligência de ameaças de código aberto).

Entrada de arquivo STIX para STDOUT

Isso gerará o documento STIX em STDOUT no 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 arquivo STIX para saída de arquivo ECS

Isso criará uma pasta chamada ecs no diretório atual e gravará o arquivo ECS lá.

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 arquivo STIX para saída de arquivo ECS, definindo o campo Provedor

O campo do provedor é normalmente um GUID no documento STIX. Para torná-lo mais amigável, você pode usar o argumento -p para definir o 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 diretório STIX para saídas de arquivo ECS

Se você tiver um diretório de documentos STIX, poderá usar o argumento -r para pesquisar recursivamente no diretório e gravar os documentos ECS no diretório de saída.

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

Entrada de arquivo STIX para saída do Elasticsearch

Para enviar para o Elasticsearch, você pode usar o Elastic Cloud ou uma instância local. O Elasticsearch local usará a porta 9200 e o Elastic Cloud usará a porta 443. Por padrão, é necessária uma sessão TLS válida para o Elasticsearch.

Primeiro, crie um índice, caso ainda não tenha um. Neste exemplo, estamos criando um índice chamado stix2ecs, mas o nome do índice não é relevante.

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

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

Em seguida, defina as opções de saída do Elasticsearch.

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

Se você estiver armazenando os dados no Elasticsearch para uso em outra plataforma, poderá visualizar os indicadores usando 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"
              }
            }
          }
        }
      }
...

Se estiver usando o Kibana, você pode criar uma Visualização de Dados para seu índice stix2ecs para visualizar os indicadores ingeridos.

Por fim, você pode usar isso como uma fonte de indicadores para regras de correspondência de indicadores.

Resumo

Esperamos que este projeto ajude sua organização a analisar e operacionalizar seus dados de ameaças. Se você é novo no Elastic Common Schema, pode aprender mais sobre isso aqui.

Como sempre, sinta-se à vontade para abrir um problema com quaisquer perguntas, comentários, preocupações ou reclamações.

Sobre o Elastic Security Labs

O Elastic Security Labs é o braço de inteligência de ameaças da Elastic Security dedicado a criar mudanças positivas no cenário de ameaças. O Elastic Security Labs fornece pesquisas publicamente disponíveis sobre ameaças emergentes com uma análise dos objetivos estratégicos, operacionais e táticos do adversário e, em seguida, integra essa pesquisa com os recursos integrados de detecção e resposta do Elastic Security.

Siga o Elastic Security Labs no Twitter @elasticseclabs e confira nossa pesquisa em www.elastic.co/security-labs/.

Compartilhe este artigo