Práctica 4: Correlación de eventos y detección de amenazas

Centro Universitario UAEM Nezahualcóyotl - Ingeniería en Sistemas Inteligentes

Proyecto: Mini SIEM en MATLAB

1. Contexto

Una vez que los eventos han sido recolectados, normalizados y analizados, el siguiente paso en un sistema SIEM es la correlación. La correlación permite identificar patrones complejos que no son visibles en eventos individuales.

En esta práctica se implementarán reglas de correlación para detectar comportamientos sospechosos como ataques de fuerza bruta y credential stuffing.

Idea clave: Un SIEM no detecta amenazas por eventos individuales, sino por patrones de comportamiento.
---

2. Objetivo

Implementar reglas de correlación en MATLAB que permitan detectar patrones de ataque basados en múltiples eventos relacionados.

---

3. Precondiciones

---

4. Conceptos clave

---

5. Escenarios a detectar

Brute Force

Un mismo usuario desde una misma IP genera múltiples intentos fallidos.

Credential Stuffing

Una misma IP intenta autenticarse con múltiples usuarios diferentes.

---

6. Desarrollo paso a paso

Paso 1: Filtrar eventos fallidos

fallidos = tabla(strcmp(tabla.Resultado, 'failure'), :);
---

Paso 2: Detectar brute force

grupo_brute = groupcounts(fallidos, {'IP','Usuario'});

% Umbral de detección
umbral = 5;

brute_force = grupo_brute(grupo_brute.GroupCount >= umbral, :);

disp('Posibles ataques de brute force:');
disp(brute_force);
---

Paso 3: Detectar credential stuffing

grupo_ip = groupcounts(fallidos, 'IP');

umbral_ips = 10;

ips_sospechosas = grupo_ip(grupo_ip.GroupCount >= umbral_ips, :);

disp('IPs sospechosas de credential stuffing:');
disp(ips_sospechosas);
---

Paso 4: Refinar credential stuffing

resultado = [];

for i = 1:height(ips_sospechosas)

    ip_actual = ips_sospechosas.IP(i);

    subset = fallidos(strcmp(fallidos.IP, ip_actual), :);

    usuarios_unicos = unique(subset.Usuario);

    if length(usuarios_unicos) > 5
        resultado = [resultado; {ip_actual, length(usuarios_unicos)}];
    end

end

resultado = cell2table(resultado, 'VariableNames', {'IP','UsuariosDistintos'});

disp('Credential stuffing detectado:');
disp(resultado);
---

Paso 5: Generar alertas

alertas = [];

for i = 1:height(brute_force)

    alertas = [alertas; { ...
        brute_force.IP(i), ...
        brute_force.Usuario(i), ...
        'Brute Force'}];

end

for i = 1:height(resultado)

    alertas = [alertas; { ...
        resultado.IP(i), ...
        'Multiple Users', ...
        'Credential Stuffing'}];

end

alertas = cell2table(alertas, ...
    'VariableNames', {'IP','Usuario','TipoAlerta'});

disp('Alertas generadas:');
disp(alertas);
---

7. Resultado esperado

---

8. Validación

---

9. Preguntas de reflexión

  1. ¿Por qué un solo evento no es suficiente para detectar un ataque?
  2. ¿Qué diferencia hay entre brute force y credential stuffing?
  3. ¿Qué pasaría si el umbral es muy bajo?
  4. ¿Qué pasaría si el umbral es muy alto?
  5. ¿Cómo reducir falsos positivos?
---

10. Tarea (Teams)

Subir un PDF con:

---

11. Cierre

En esta práctica se ha implementado un motor básico de correlación, equivalente a las reglas utilizadas en sistemas SIEM reales.

En la siguiente práctica se desarrollará la visualización de eventos y alertas para representar la información de forma gráfica.