Este proyecto permite en tiempo real realizar correcciones (limpieza) en los atributos dentro de cada evento en MISP antes de ser publicado en la plataforma. Esto se lleva a cabo a través de la funcionalidad de Workflows que integra MISP.
Find a file
Felipe Luis Quezada Valenzuela fb5bd09f03 [Update_v2]
2025-03-07 15:29:49 -03:00
img_static first commit 2025-02-13 16:41:25 -03:00
cert.pem first commit 2025-02-13 16:41:25 -03:00
config.py [Update_v2] 2025-03-07 15:29:49 -03:00
fp.txt [Update_v2] 2025-03-07 15:29:49 -03:00
key.pem first commit 2025-02-13 16:41:25 -03:00
main.py [Update_v2] 2025-03-07 15:29:49 -03:00
models.py [fix_newlogic_ok] 2025-03-03 16:49:15 -03:00
README.md [Update_v2] 2025-03-07 15:29:49 -03:00
requirements.txt [Update_v2] 2025-03-07 15:29:49 -03:00
requirements_misp.txt first commit 2025-02-13 16:41:25 -03:00
start_api.sh first commit 2025-02-13 16:41:25 -03:00

Descripción

Este proyecto permite en tiempo real realizar correcciones (limpieza) en los atributos dentro de cada evento en MISP antes de ser publicado en la plataforma. Esto se lleva a cabo a través de la funcionalidad de Workflows que integra MISP.

Como resultado este proyecto implementa una API en un servidor para recibir los datos de cada evento para ser procesados.

(Se necesita el servicio gratuito de lookup de IP's, dominios, url y hashes que ofrece Kaspersky© Threat Intelligence Portal para la limpieza de falsos positivos)

Características:

  • Limpieza de falsos positivos de cada evento generado en MISP (IP, Domain, SHA256, URL)

  • Normalización de correlación y activación de tag IDS en cada atributo. Solo se activa tag IDS para el tipo de atributo que corresponde, como a su vez solo se activa la correlación para los tipos de atributos que deben ser correlacionados.

  • Normalización de tags para eventos que contengan "tlp: white" ( Se agrega tag tlp:clear en cada caso)

  • Utiliza dentro de Workflows, el trigger "event-publish"

Requisitos

Requisitos de Hardware recomendados

  • 8/16 GB RAM
  • 4 vCPU
  • 100 GB almacenamiento

Componentes

Este proyecto utiliza un BD local SQLite en modo WAL, FastAPI.

Configuración inicial

  1. En el archivo config.py se debe definir los datos de conexión a MISP, como también la API KEY asociada a Kaspersky TIP:

MISP_CONFIG = {
    "misp_url":"URL_MISP",
    "misp_authkey":"AUTHKEY_MISP"
}

# Se si quiere agregar a exclusión de MISP cada atributo al deshabilitar correlación
NO_CORRELATIVOS_EXCLUSION = False

# Config Lookup KTIP
KTIP_CONFIG = {
    "api_key":"APIKEY_KTIP",
    "url_base": "https://opentip.kaspersky.com/api/v1/search/"
}

# Rango de dias para verificar si IoC es falso positivo
RANGO_DIAS = 7

# Se debe establecer Manual
JWT_TOKEN_GEN = "BEARER_TOKEN"

# Máximo de atributos a procesar por evento (2000 es el recomendado)
MAX_ATTRS = 2000

def cargar_fp_en_set(ruta_archivo: str) -> set:
    """
    Lee un archivo de texto línea a línea y devuelve un set con cada línea limpia.
    """
    conjunto = set()
    with open(ruta_archivo, "r", encoding="utf-8") as archivo:
        for linea in archivo:
            linea_limpia = linea.strip()
            if linea_limpia:  # Evita líneas vacías
                conjunto.add(linea_limpia)
    return conjunto

# Falsos positivos comunes
# FP Comunes
FP_COMUNES = cargar_fp_en_set("fp.txt")


# Organizaciones que se puede omitir la revisión de eventos
ORG_OMITIR = []

NO_CORRELACIONES = [
    "comment",              # Comentarios descriptivos
    "email-subject",        # Asuntos de correos electrónicos
    "email-dst",            # Emails de destinatarios
    "email-src",            # Emails de remitentes
    "hostname",             # Nombres de host
    "port",                 # Puertos
    "link",                 # Enlaces
    "phone-number",         # Números de teléfono
    "user-agent",           # Agentes de usuario
    "size-in-bytes",        # Tamaños en bytes
    "vulnerability",        # Vulnerabilidades (CVE)
    "whois-registrant-email",  # Correos de registrantes WHOIS
    "whois-registrant-name",   # Nombres de registrantes WHOIS
    "regkey",               # Claves de registro de Windows
    "regkey|value",         # Claves de registro con valores
    "text",                 # Texto libre
    "datetime",             # Fechas y horas
    "campaign-name",        # Nombres de campaña
    "attachment",           # Archivos adjuntos
    "email",                # Emails de remitentes
    "email-body",           # Cuerpo de Email
    "email-attachment"      # Archivos adjuntos (variante)
]

IDS_CORRELACIONES = [
    "ip-src",              # IP de origen
    "ip-dst",              # IP de destino
    "domain",              # Dominio
    "domain|ip",           # Dominio con IP asociada
    "url",                 # URL completas
    "uri",                 # URI (fragmentos de rutas)
    "http-method",         # Métodos HTTP (GET, POST, etc.)
    "email-attachment",    # Nombres de archivos adjuntos en correos
    "filename",            # Nombres de archivo
    "filename|md5",        # Nombre de archivo con su hash MD5
    "filename|sha1",       # Nombre de archivo con su hash SHA1
    "filename|sha256",     # Nombre de archivo con su hash SHA256
    "md5",                 # Hash MD5
    "sha1",                # Hash SHA1
    "sha256",              # Hash SHA256
    "authentihash",        # Hash Authentihash
    "impfuzzy",            # Hash ImpHash (ejecutable PE)
    "tlsh",                # Hash TLSH
    "ssdeep",              # Hash SSDEEP (fuzzy hash)
    "mutex",               # Nombres de mutex
    "registry-key",        # Claves de registro (si son relevantes)
    "registry-key|value",  # Claves de registro con valores
    "ip-src|port",         # IP de origen con puerto
    "ip-dst|port",         # IP de destino con puerto
    "asn",                 # ASN (Autonomous System Number)
    "cidr",                # Rango CIDR (IPs)
    "mac-address",         # Dirección MAC
    "x509-fingerprint-md5",  # Huella de certificados X509 (MD5)
    "x509-fingerprint-sha1", # Huella de certificados X509 (SHA1)
    "x509-fingerprint-sha256", # Huella de certificados X509 (SHA256)
    "ja3-fingerprint-md5",    # Huella JA3 (TLS handshake)
    "btc",                # Dirección de Bitcoin
    "iban",               # Número de cuenta bancaria (IBAN)
    "bank-account-nr",    # Número de cuenta bancaria
    "payment-card-number" # Número de tarjeta de pago
]

CONFIG_WL = {
    "filtros_buscar": ["osint", "google", "ipv4", "1000","domains","websites","microsoft","amazon","cloudflare","tranco","cisco","azure","office"],
    "max_reg": 10000
}

En config.py puedes realizar los ajustes:

  • MISP_CONFIG: Configuración asociada a MISP

  • NO_CORRELATIVOS_EXCLUSION: Si es True, cada atributo que sea corregida su correlación, ósea que se desactive, será agregado valor a la lista de exclusión de correlaciones.

  • KTIP_CONFIG: Configuración de conexión a servicio de Lookup de Kaspersky. Se debe solo configurar "api_key".

  • RANGO_DIAS: Establece según la fecha del atributo (IoC) cuantos días tomar como rango para verificar falso positivo

  • JWT_TOKEN_GEN: Token personal generado.

  • MAX_ATTRS: Cantidad de atributos a procesar por evento. Por defecto el máximo son 2000. No se recomienda aumentar este valor mas alla de los 4000 Attrs.

  • FP_COMUNES: Falsos positivos conocidos que se obtienen de un archivo txt.

  • ORG_OMITIR: Organizaciones que se puede omitir la revisión de eventos.

  • NO_CORRELACIONES: Lista de tipos de atributos que no deben correlacionarse dentro de MISP.

  • IDS_CORRELACIONES: Lista de tipos de atributos que deberán tener el flag IDS activado dentro de MISP. Por defecto estos atributos son correlacionados dentro de MISP.

  • CONFIG_WL: Configuración de filtros para obtener falsos positivos de WarningList de MISP.

Configuración Inicial

Instalación en entorno virtual

  1. Se crea entorno virtual de Python
cd /home/user/misp-fixevent-webhook

python3 -m venv venv

source venv/bin/activate
  1. Instalar bibliotecas de Python:
pip install -r requirements.txt
  1. Se debe desactivar entorno para configurar playwright inicialmente.
deactivate
# Instala dependencias en Ubuntu
sudo venv/bin/playwright install-deps

# instala dependencias de playwright
sudo venv/bin/playwright install
  1. Se debe crear archivo .sh o editar el archivo existente (start_api.sh) y anexarlo como servicio para que inicie con el sistema operativo:
#!/bin/bash

# Activate 
source /home/user/misp-fixevent-webhook/venv/bin/activate

# Enter folder
cd /home/user/misp-fixevent-webhook/

# Actualizar bibliotecas si aplica
pip install --upgrade -r requirements.txt > /dev/null 2>&1

# Si vas a utilizar proxy reverso...
uvicorn main:app --host 0.0.0.0 --port 8000

# Si no vas a utilizar proxy reverso puedes utilizar certificados genéricos
uvicorn main:app --host 0.0.0.0 --port 8000 --ssl-keyfile key.pem --ssl-certfile cert.pem

Debe activar SSL en proyecto

Agregar como servicio

  1. Para agregar como servicio necesita crear dentro del directorio /etc/systemd/system (En caso de Ubuntu) un archivo .service(misp_webhooks.service). Podemos crearlo con nano (sudo) usando el siguiente formato:
sudo nano /etc/systemd/system/misp_webhooks.service

[Unit]
Description=MISP WebHooks Service
After=network.target

[Service]
Type=simple
ExecStart=/home/user/misp-fixevent-webhook/start_api.sh
Restart=always

[Install]
WantedBy=multi-user.target
  1. Se deben entregar permisos de ejecución a archivo .sh:
chmod +x /home/user/misp-fixevent-webhook/start_api.sh
  1. Se recargan servicios:
sudo systemctl daemon-reload
  1. Luego registramos este archivo para que se ejecute al iniciar el sistema:
sudo systemctl enable misp_webhooks.sevice

  1. Ahora podemos iniciar, detener, reiniciar servicio...
# Iniciar
sudo systemctl start misp_webhooks.sevice

# Detener
sudo systemctl stop misp_webhooks.sevice

# Reiniciar
sudo systemctl restart mmisp_webhooks.sevice

Servicios (Endpoints) de API

  • /webhoook/misp_event_fixer/

alt text

Documentación

Debes agregar Puedes acceder a la documentación:

SwaggerUI

http://URL_PROYECTO:8000/docs

Redocly

http://URL_PROYECTO:8000/redoc

Configuración en Servidor MISP

Desde MISP necesitamos configurar el Workflow para utilizar nuestra API. Debemos verificar si tenemos "misp-modules" instalados. Estos módulos corren en el puerto 6666. Podemos verificar si el puerto esta activo:

telnet localhost 6666

Si no hay respuesta, necesitamos instalar las siguientes librerías (Ubuntu):

sudo apt install git python3 python3-pip python3-dev libpq5 libjpeg-dev build-essential libssl-dev libffi-dev zlib1g-dev libmagic-dev libxml2-dev libxslt1-dev libpoppler-cpp-dev libzbar0 tesseract-ocr

Una vez instaladas, podemos instalar misp-modules en nuestro servidor MISP (como root). Desde la versión 2.5, no se incluye misp-modules (Para más información: https://misp.github.io/misp-modules/install/)

  1. Creamos directorio dentro de MISP:
sudo su
cd /var/www/MISP
mkdir misp-modules
cd /misp-modules
  1. Creamos entorno virtual y activamos:
python3 -m venv venv
source venv/bin/activate
  1. Instalamos librerías:
pip install \
    misp-modules \
    git+https://github.com/cartertemm/ODTReader.git \
    git+https://github.com/abenassi/Google-Search-API \
    git+https://github.com/SteveClement/trustar-python.git \
    git+https://github.com/sebdraven/pydnstrails.git \
    git+https://github.com/sebdraven/pyonyphe.git

  1. Creamos un .sh (run.sh) para llamar como servicio cada vez que parta el equipo:
sudo nano run.sh
  1. Dentro del archivo definimos las rutas (según sea el caso):
#!/bin/bash

# Activate 
source /var/www/MISP/misp-modules/venv/bin/activate

# Enter folder
cd /var/www/MISP/misp-modules/venv/bin/

# Ejecutar misp-modules
misp-modules

  1. Configuramos servicio:
sudo nano /etc/systemd/system/misp-modules.service
  1. Dentro del archivo definimos las rutas (según sea el caso):
[Unit]
Description=MISP Modules Service
After=network.target

[Service]
Type=simple
ExecStart=/var/www/MISP/misp-modules/run.sh
Restart=always

[Install]
WantedBy=multi-user.target
  1. Se deben entregar permisos de ejecución a archivo .sh:
chmod +x /var/www/MISP/misp-modules/run.sh
  1. Se recargan servicios:
sudo systemctl daemon-reload
  1. Luego registramos este archivo para que se ejecute al iniciar el sistema:
sudo systemctl enable misp-modules.sevice
  1. Configuramos carpeta de MISP como owner original "www-data"
sudo chown -R www-data:www-data /var/www/MISP
  1. Arrancamos APP:
sudo systemctl start misp-modules.sevice

Activando / Configurando Workflow en MISP

  1. Accedemos a MISP y nos dirigimos a "Administration"->"Server Settings & Maintenance"->"Plugin":

alt text

  1. Dentro de Plugin activamos "Enrichment":

alt text

  1. Luego "Action" y "Workflow":

alt text

alt text

  1. Para poder llamar a nuestro webhook desde MISP necesitamos modificar una propiedad de MISP desde el MISP CLI desde terminal:
sudo -u www-data /var/www/MISP/app/Console/cake Admin setSetting Security.rest_client_enable_arbitrary_urls true
  1. Iniciamos sesión en nuestro MISP y nos dirigimos a "Administration"->"Worflows" de MISP:

alt text

  1. El webhook está diseñado para llamarse en el proceso previo a publicar un evento en MISP, este trigger se llama "event-publish" y debemos activarlo yendo a "List Triggers"->"Event Publish" y presionamos el botón de play:

alt text

  1. Luego en la misma ventana, vamos a la sección de "List Modules" y activamos el módulo de "Webhook":

alt text

alt text

  1. Para agregar más control en el flujo (Para el caso de Eventos que no tengan atributos => 0) vamos a activar dentro del "List Modules" en "Logic" el módulo "IF::Count":

alt text

  1. Finalmente desde la misma ventana, en "Blocking" activamos "Stop execution":

alt text

Configuración Webhook

  1. Ahora vamos a ir a la configuración de nuestro trigger "event-publish" para configurar los datos para enviar al webhook. Nos dirigimos al símbolo "</>":

alt text

  1. Desde la lista de "Actions", Agregamos "Webhook" al plano de diseño arrastrando:

alt text

  1. Desde la lista de "Logic", Agregamos "IF :: Count" al plano de diseño arrastrando:

alt text

  1. Desde la lista de "Actions", Agregamos "Stop execution" al plano de diseño arrastrando:

alt text

  1. Conectamos "Event Publish" con "IF :: Count":

alt text

  1. En el módulo IF :: Count configuramos "Data selector to count" con el valor "All Attributes", esto quiere decir que contara todos los atributos del evento:

alt text

  1. En el mismo módulo en "Condition" seteamos como "Equals to" y en "Value" queda en 0:

alt text

  1. Si el evento no tiene atributos, se detendrá la ejecución de "publish" en el evento. Debemos conectar en el resultado afirmativo del módulo IF :: Count el módulo "Stop execution":

alt text

  1. En caso contrario, que Evento SI tenga atributos, lo conectamos al módulo "Webhook" para que procese los datos:

alt text

  1. Ahora necesitamos configurar los datos que tenemos que mandar al Webhook. Los datos son los siguientes:

  2. Vamos a puntos arriba mano derecha y editamos el módulo para agregar esta información:

alt text

  1. Ingresamos la información mencionada en el punto 10 y para finalizar presionamos el botón "Close":

alt text

alt text

  1. Guardamos el Workflow en MISP haciendo clic en "Save":

alt text

Con estos pasos realizados, desde ahora en adelante dentro de MISP, cada evento generado por la organización local o de instancias remotas, será revisado y corregido por nuestro servicio web.

Cualquier duda o consulta envíanos un correo a: misp@anci.gob.cl