Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon Visualizar con Grafana los eventos del IDS/IPS Suricata (Eve.json)


Desde hace ya varios años estamos utilizando el magnífico honeypot T-Pot basado en contenedores Docker, en una RaspBerry Pi 4 y la cantidad de eventos registrados es sumamente elevada. Por defecto T-Pot lleva ELK (ElasticSearch-LogStash y Kibana) para visualizar los datos registrados. En esta ocasión utilizaremos el fichero de registro de Suricata (eve.json) par mostrar gráficamente con Grafana las estadísticas fundamentales (reglas, atacantes, etc). Para ello utilizaremos Promtail y Loki, para procesar (ingerir) el fichero Json generado por Suricata.





¿Qué es un IDS?

Es la primera pieza que voy a montar en el SOC, ya que me permitirá analizar el tráfico de red para buscar datos maliciosos o sospechosos y aplicar reglas preconfiguradas. También nos puede dar datos como máquinas que se conectan a ciertas direcciones IPs, puertos específicos e incluso servidores.

Un IDS tiene dos tareas fundamentales:

  • Prevención: escuchando el tráfico de red o un PC, mediante sensores e identificar ataques aplicando reglas, mediante reconocimiento de patrones de ataque.
  • Reacción: detecta patrones de intrusión tanto en el comportamiento del sistema como en la red.

Este sistema complementa a por ejemplo un cortafuegos en el que abrimos un puerto 80 o 443 a un servidor web, ya que nos permite detectar de intrusiones en el sistema o vulnerabilidades.

Hay dos tipos de IDS por comportamiento:

  • Pasivo: Genera entradas para registrar las intrusiones y manda alertas
  • Activo: Hace lo mismo que un Pasivo, y a su vez es capaz de bloquear IPs o cerrar puertos de comunicación, por ejemplo.

A nivel funcional, también hay varios tipos de IDS según de donde recogen el dato:

  • HIDS: Sistema de detección de intrusos, que recogen datos de usuarios y servicios de una máquina determinada
  • IDPS: Sistema de detección de intrusos en red, que hacen una escucha en modo promiscuo en la red
  • SIDS: Sistema de detección de intrusos basados en firmas
  • Y los sistemas de detección de intrusos basados en anomalías

 

Suricata es más que un IDS, básicamente se trata de un motor de red de código abierto y multiplataforma de alto rendimiento que combina las tecnologías IDS (Intrusion Detection System), IPS (Intrusion Prevention System) y NSM (Network Security Monitoring), que fue lanzado en el año 2009 y es desarrollado por la comunidad OISF (Open Information Security Foundation).

Fichero configuración /etc/suricata/suricata.yaml:

outputs:
  # Extensible Event Format (nicknamed EVE) event log in JSON format
  - eve-log:
      enabled: yes
      filetype: regular #regular|syslog|unix_dgram|unix_stream|redis
      filename: eve.json



Estos cuatro archivos producidos son archivos increíblemente importantes como analista en Suricata:


  • Eve.json - es un formato de archivo de notación de objetos de java script que Suricata producirá comúnmente debido a su accesibilidad con otras herramientas de análisis de red y su facilidad de lectura.
  • Fast.log - es una salida de registro que contiene datos concisos y compactos de todas las conexiones registradas en el paquete.
  •  Stats.log - es otra salida de registro que registra otras métricas como utilización de recursos, estadísticas de paquetes/flujos y rendimiento general.
  •  Suricata.log - es el archivo de registro principal que contiene información detallada sobre una conexión registrada. Generalmente contendrá los mismos datos que un registro rápido pero en mayor profundidad.

Consulta de eventos Suricata JSON en la línea de comandos



JSON Query(jq) permite manipular el contenido de un archivo .json y formatearlo para una mejor legibilidad.

El «.» en jq representa la raíz del archivo, de forma similar a Linux que comienza su directorio en la raíz.

El comando jq . formateará el archivo json especificado e imprimirá el contenido en una estructura fácil de leer.

Cuando los datos se formatean de esta manera, por lo general no son eficientes para el procesamiento o la integración debido a todas las sangrías existentes y el espacio en blanco producido para «pretty-print» el archivo.

Después de echar un vistazo al archivo .json e identificar todos los objetos. Filtraré específicamente los datos de un conjunto específico de objetos como .timestamp, .flow_id, .alert, etc.

La -c representa salida compacta y este comando se utiliza generalmente para compactar y condensar los datos basados en los objetos proporcionados.

-c también eliminará todas las sangrías y espacios en blanco innecesarios utilizados para «imprimir bonito» el archivo .json e imprimir los datos en una versión abreviada.


El uso más básico es colorear la entrada. Para ello, basta con hacer algo como


$ tail -n100 eve.json| jq '.'


La salida se hace de la forma bonita:

JQ mostrando un evento

Para obtener una salida de una línea por evento, simplemente añade la bandera -c al comando:


Para extraer un solo campo de los eventos JSON, se puede hacer:


$ jq '.src_ip' eve.json


«58.218.211.155»


«58.218.211.155»


«58.218.211.155»


El punto a recordar es que el punto en .src_ip es un marcador de posición para la entrada actual.


Por defecto, cuando un campo no está presente se muestra null en la salida. Para solucionarlo, es posible filtrar el evento para obtener sólo el que nos interesa. Esto se hace mediante la palabra clave select. Por ejemplo, para seleccionar los eventos SSH y extraer la información sobre la parte cliente se puede hacer:


$ tail eve.json | jq -c 'select(.event_type == «ssh»)|.ssh.client'


{«proto_version»: «2.0», «software_version»: «PUTTY»}


{«proto_version»: «2.0», «software_version»: «PUTTY»}

 

Peticiones HTTP
 

cat /var/log/suricata/eve.json | jq 'select(.event_type == "http")' | less

Lista de nombres de archivo populares en peticiones HTTP:

cat /var/log/suricata/eve.json | jq 'select(.event_type == "http") | .http.url' | sort | uniq -c | sort -bgr
Encuentra Agentes de Usuario populares en peticiones HTTP:

cat /var/log/suricata/eve.json | jq 'select(.event_type == "http") | .http.http_user_agent' | sort | uniq -c | sort -bgr

 Identificar las principales direcciones IP de origen en las alertas:

cat /var/log/suricata/eve.json | jq 'select(.event_type == "alert") | .src_ip' | sort | uniq -c | sort -bgr 


Loki + Promtail

Loki es un sistema de recolección y consulta de logs diseñado por Grafana Labs. A diferencia de otras soluciones de logging, Loki no indexa el contenido completo de los logs, sino que indexa los labels (etiquetas), haciendo que sea más ligero y eficiente.

Funcionalidades Clave de Loki:

  • Recolección de logs: Integra con Promtail, Fluentd, Logstash y otros agentes de logs.
  • Consulta de logs: Utiliza el lenguaje de consultas LogQL similar a PromQL.
  • Almacenamiento eficiente: Bajo consumo de recursos gracias a la indexación de etiquetas.

Configuración de Promtail


Promtail es un agente de agregación de registros que se encarga de recopilar, procesar y reenviar a Loki los registros de diferentes fuentes, como archivos o servicios. Como agente, actúa en el origen de los registros, recopilándolos y enviándolos a Loki, y puede adjuntar etiquetas para una mejor organización de los registros.
 
Ejemplo de un evento SMB (puerto 445) del fichero eve.json
 
 {"timestamp":"2024-11-13T10:21:24.932327+0100","flow_id":2082438240307690,"in_iface":"eth0","event_type":"smb","src_ip":"103.141.208.110","src_port":63476,"dest_ip":"192.168.0.100","dest_port":445,"proto":"TCP","smb":{"id":1,"dialect":"NT LM 0.12","command":"SMB1_COMMAND_NEGOTIATE_PROTOCOL","status":"STATUS_SUCCESS","status_code":"0x0","session_id":0,"tree_id":0,"client_dialects":["NT LM 0.12","SMB 2.002","SMB 2.???"],"server_guid":"3865ff0b-7e54-426c-3ea4-d21244169711"}}
Formateado:

 {"timestamp":"2024-11-13T10:21:24.932327+0100","flow_id":2082438240307690,"in_iface":"eth0","event_type":"smb","src_ip":"103.141.208.110","src_port":63476,"dest_ip":"192.168.0.100","dest_port":445,"proto":"TCP","smb":{"id":1,"dialect":"NT LM 0.12","command":"SMB1_COMMAND_NEGOTIATE_PROTOCOL","status":"STATUS_SUCCESS","status_code":"0x0","session_id":0,"tree_id":0,"client_dialects":["NT LM 0.12","SMB 2.002","SMB 2.???"],"server_guid":"3865ff0b-7e54-426c-3ea4-d21244169711"}}{
  "timestamp": "2024-11-13T10:21:24.932327+0100",
  "flow_id": 2082438240307690,
  "in_iface": "eth0",
  "event_type": "smb",
  "src_ip": "103.141.208.110",
  "src_port": 63476,
  "dest_ip": "192.168.0.100",
  "dest_port": 445,
  "proto": "TCP",
  "smb": {
    "id": 1,
    "dialect": "NT LM 0.12",
    "command": "SMB1_COMMAND_NEGOTIATE_PROTOCOL",
    "status": "STATUS_SUCCESS",
    "status_code": "0x0",
    "session_id": 0,
    "tree_id": 0,
    "client_dialects": [
      "NT LM 0.12",
      "SMB 2.002",
      "SMB 2.???"
    ],
    "server_guid": "3865ff0b-7e54-426c-3ea4-d21244169711"
  }
}

 Podemos ver los campos que extaeremos (event_type, src_ip, proto, etc)

Fichero configuración Promtail /etc/promtail/config.yml

server:
  http_listen_port: 9080
  grpc_listen_port: 0
# Log only messages with the given severity or above. Supported values [debug,
# info, warn, error]
#  log_level: debug
positions:
  filename: /tmp/positions.yaml
clients:
  - url: http://localhost:3100/loki/api/v1/push
scrape_configs:

  - job_name: suricata
# json on eve.json
    pipeline_stages:
         - json:
             expressions:
               event_type: event_type
               src_ip: src_ip
               proto: proto
               dest_port: dest_port
               alert:
         - json:
             expressions:
               action: action
               signature_id: signature_id
               signature: signature
               category: category
               severity: severity
             source: alert
         - labels:
             event_type:
             src_ip:
             proto:
             dest_port:
             signature_id:
             signature:
             category:
             severity:
    static_configs:
      - targets:
        - localhost
        labels:
          job: suricata_logs
          __path__: /var/log/suricata/eve.json


Grafana

Grafana es una plataforma de análisis y monitoreo que permite crear paneles visuales interactivos. Soporta múltiples fuentes de datos, incluyendo Prometheus y Loki, y ofrece una interfaz amigable para explorar métricas y logs.

Funcionalidades Clave de Grafana:

  • Dashboards personalizables: Creación de paneles visuales con gráficos y alertas.
  • Alertas integradas: Configuración de alertas directamente desde los paneles.
  • Plugins: Soporte para una amplia gama de plugins y fuentes de datos.
  • Compartir y colaborar: Posibilidad de compartir dashboards y colaborar en su creación.
Acceder a Grafana:




Recuerda que debes añadir datasource de Loki en Grafana:


Plantilla JSON de Grafana




Podemos visualizar de diferentes maneras:
 





0 comentarios :

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.