No todo en la vida es XSOAR. Por muy refinado y automatizado que tengamos el proceso , en muchos puntos tendremos que darle un toque "humano" a nuestros análisis de ciberseguridad. Pero si que es cierto que con una buena automatización y un poquito de magia creativa como la que vamos a ver , podemos llegar a optimizar los tiempos , bajar la fatiga por alertas y hacer unos análisis más rigurosos.

En este proceso, he metido tres pequeños actores. El Splunk, actor principal , sobre el que podemos realizar gran parte del trabajo de nuestro actor secundario si quisiésemos. Microsoft Power Automate , como actor secundario y el cual nos ayudara a extandarizar el proceso. Y el Teams , como actor debutante , que tal vez no asociemos a nuestros procesos de monitorización , pero que tras este trabajo post , vais a empezar a verlo con otros ojos, después de que hablemos de las Adaptive Cards.

Empecemos esta película ..

Alertas de Splunk a Teams

Aqui es donde empieza la magia . Podemos enviar alertas de Splunk a Microsoft Teams creando un webhook en Teams y luego configurando Splunk para enviar solicitudes de webhook a esa URL.

Disponemos de multiples plugins para ello. En mi opinión uno de los que mas me gusta es este que permite el envío de cabeceras , lo que nos dará flexibilidad más allá de Teams, pero aqui al gusto. En este caso, remitirá el JSON de la alerta via Webhook y ya será Teams y Power Automate , quien procese cómo lo vamos a pintar.

  • Cramos un webhook en Microsoft Teams yendo a la aplicación Teams. Posicionándonos en el canal que queramos remitir las alertas, hacemos clic en el botón "..." (botón de menú) y selecionamos "Manage Channel".
Opciones de canal de Microsoft Teams

Una vez dentro, tenemos que buscar los conectores . Donde posteriormente crearemos un webhooks :

Conectores Canal de Teams

Ya estamos en disposición de crear un conector de Webhook:

Configurar Webhook en Microsoft Teams
  • Ya tenemos nuestros webhook generado. Copia la url , ya que la necesitaremos más adelante.
  • Crea una nueva alerta en Splunk usando el Administrador de Alertas. En la pestaña Acciones, seleccione Webhook como tipo de acción.
Crear Alerta Webhook Splunk
  • En el campo URL de Webhook, necesitaremos la URL anterior generada en Splunk.
  • Si no nos manejamos con algunas app de Webhook, podemos crear un script de Python que formatee los datos de alerta de Splunk y los envíe al webhook de Teams. El formato con el que recibe Microsoft Teams la alerta es esencial. Y sobre lo que más hemos sufrido hasta llegar al final del post.
importar json
solicitudes de importación

def send_alert_to_teams(alert_payload):
teams_webhook_url = "https://outlook.office.com/webhook/our_webhook_url"
datos = {
        "título": "Alerta de splunk",
        "texto": json.dumps(alert_payload, indent=4)
}
requests.post(teams_webhook_url, json=data)
  • En el campo Script de la acción Webhook, introduzca la ruta de acceso a nuestro script Python y el nombre de la función como script:send_alert_to_teams
  • Guardemos nuestra alerta y la probemos para asegurarnos de que funciona correctamente y enviando alertas al canal correcto en Teams.

Como podeis ver en el curl, tenemos que hacer un formateo especifico para poder mandar mensajes a Teams. Algo super, super potente , que nos hará vitaminar nuestras alertas, creando Adaptatives Cards que nos facilitaran mucho el análisis y nos pintaran la información de una forma mejor que directamente de la alerta de Splunk.

Una cosa que no entrare pero que tenéis que tener en cuenta , es si tenéis Proxy en vuestra organización, no os preocupéis , disponéis de mucha información al respecto.

Podemos por ejemplo , probar el webhook sin pasar por Splunk de esta forma ( Cambiar por vuestro Webhook ) :

curl -X POST "https://XXXXXXXXX.webhook.office.com/webhookb2/4c639d40-35ff-XXXXXXX-78b8aa407b77@9744600e-XXXXXX-baa1-25ec245c6f10/IncomingWebhook/7df201726eabXXXXXXXX48c0/620dc992-6313-4f1f-a6bd-146a30dXXXXXX" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
  "type": "message",
  "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
        "type": "AdaptiveCard",
        "body": [
          {
            "type": "TextBlock",
            "text": "CIBERSEGURIDAD .blog .... Probando 1,2,.. "
          }
        ],
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "version": "1.0"
      }
    }
  ]
}'

Vitaminando las alertas de Splunk que llegan a Teams

La idea, es poner mucho más fácil el análisis a nuestros N2 , ya que como decíamos , nos vamos a encargar de todo el trabajo que hacían los N1 , y pondremos la información de una forma mucho mejor y más visual.

No todas las organizaciones disponen de un XSOAR, que en este caso podría hacer el trabajo que nos va ha hacer nuestro power automate , o no todas tampoco pueden permitirse pagarse un API de Virustotal con el que podamos traernos el Score de la url o ip directamente.

Mi objetivo es adaptar a las distintas organizaciones en la busqueda de procesos refinados de ciberseguridad, y estoy seguro que este proceso puede ser muy útil, incluso en organizaciones on una alta automatización, XSOAR, etc ...

Si nosotros remitimos directamente la alerta a Teams , nos vamos a encontrar en nuestro canal de alertas , algo así :

Alerta de Splunk en Teams sin modificar

Una alerta via tarjeta , que nos dará la opción de buscar en Splunk , y donde para ver el detalle completo del JSON en bruto, tendremos que darle a "Mostrar más" , disponiendo de información en bruto de la alerta:

Alerta en bruto de Splunk

Pero no es esto lo que queremos , por lo que vamos a procesar este JSON en bruto que nos manda Splunk, pasándolo por Power Automate , con el fin de "poner más bonito" nuestro proceso, donde , tras recibir el mensaje ( tampoco queremos perdernos información ) , contestaremos con otro mensaje procesando la información.

Vitaminando la alerta de Splunk en Teams con Power Automate

Empezaremos con el primero de los pasos en Power Automate. Ya estamos recibiendo via Webhook los mensajes en nuestro grupo de Teams. Por lo que ahora lo que nos interesa es potenciar lo que ya tenemos .

Para ello, empezaremos en Power Automate , leyendo los mensajes que nos llegan al canal:

Leer mensajes nuevos en Teams via Power Automate

La flecha no me quedo muy fina ;) , pero funcionara como un Trigger ( Gatillo ) , empezara cuando reciba un nuevo mensaje , en el que le indicaremos de donde debe "beber" la información:

Análisis de mensaje en el canal

Indicando que debe coger el cuerpo del mensaje , si no estáis familiarizados con Power Automate, podréis observar que en un mismo mensaje , recibimos mucha información, que nos servirá desde crear un nuevo mensaje con información que nos traemos del inicial, como es nuestro caso, hasta contestar sobre este ( trayéndonos por ejemplo el ID de mensaje ).

Por ello, en a segunda caja , debemos traer el cuerpo del mensaje , y pasear el JSON, con el fin de obtener la información que nos interese:

Obtención del cuerpo mensaje en el Análisis del archivo JSON

Hablaremos más tarde del recueadro que pone abajo ( Schema ) , pero para ello, tenemos que entender , que información en concreto nos llega a un mensaje de la alerta, y para ello, el JSON literal de la alerta de SPLUNK que estamos tratando :

{
    "lastrow": true,
    "preview": false,
    "result": {
        "cdu": "TIP-001: Comunicación+Permitida+saliente+IOC+hacia+IP",
        "_time": "2024-01-07T17:19:58.000+01:00",
        "agent_type_id": "splunk",
        "alarm_category": "SIEMcategory",
        "Day": "07-01-2024",
        "event_type_id": "TIP-001: Comunicación permitida saliente IOC hacia IP",
        "events": [
            "{\"src_ip\":\"31.170.121.238\",\"dst_ip\":\"10.100.4.98\",\"timestamp\":1709800054000}",
            "{\"src_ip\":\"31.170.121.238\",\"dst_ip\":\"10.100.4.98\",\"timestamp\":1709800058000}"
        ],
        "extensions": "{\"ambit\":\"Global\",\"country\":\"España\",\"mon_soc\":\"False\",\"tactic\":\"Credential Access\",\"techniques\":\"T1110.001\",\"technology\":\"Palo Alto\"}",
        "dst_ip": "31.170.121.238",
        "src_ip": "10.100.4.98",
        "Hour": "14",
        "Minute": "19",
        "name": "TIP-001: Comunicación permitida saliente IOC hacia IP '31.170.121.238'",
        "native_alarm_id": "naid81336088",
        "num_events": "12",
        "product": "Security",
        "product_category": "Windows",
        "risk": "9",
        "sc": "rubenramiro.splunkcloud.com",
        "security-alarm": "{\"src_ip\":\"31.170.121.238\",\"dst_ip\":\"10.100.4.98\",\"timestamp\":1709800054000}",
        "severity": "Critical",
        "siem_id": "ES_RUBEN.RAMIRO_SPLUNK",
        "siem_type_id": "splunk",
        "Time": "1709828398",
        "timestamp": "1709828398000",
        "vendor": "Palo Alto",
        "WeekDay": "4"
    }
}

Podríamos desgranar la información mas detalladamente, pero para entenderlo, es más que valido. Esta es la alerta real que recibimos , y sobre la cual, nuestro paseador de JSON de Power Automate debe entender. Es aqui donde entra este recuadro que os indico, con el fin de que Power Automate y el paseador entiendan que es lo que se le esta pasando.

Para ello, con una alerta real como esta, simplemente la pegamos , con el fin de que se genere el Schema:

Generador de Schema JSON

Esto nos generara el Schema de forma automática.

{
    "type": "object",
    "properties": {
        "lastrow": {
            "type": "boolean"
        },
        "preview": {
            "type": "boolean"
        },
        "result": {
            "type": "object",
            "properties": {
                "cdu": {
                    "type": "string"
                },
                "_time": {
                    "type": "string"
                },
                "agent_type_id": {
                    "type": "string"
                },
                "alarm_category": {
                    "type": "string"
                },
                "Day": {
                    "type": "string"
                },
                "event_type_id": {
                    "type": "string"
                },
                "events": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "extensions": {
                    "type": "string"
                },
                "dst_ip": {
                    "type": "string"
                },
                "src_ip": {
                    "type": "string"
                },
                "Hour": {
                    "type": "string"
                },
                "Minute": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                },
                "native_alarm_id": {
                    "type": "string"
                },
                "num_events": {
                    "type": "string"
                },
                "product": {
                    "type": "string"
                },
                "product_category": {
                    "type": "string"
                },
                "risk": {
                    "type": "string"
                },
                "sc": {
                    "type": "string"
                },
                "security-alarm": {
                    "type": "string"
                },
                "severity": {
                    "type": "string"
                },
                "siem_id": {
                    "type": "string"
                },
                "siem_type_id": {
                    "type": "string"
                },
                "Time": {
                    "type": "string"
                },
                "timestamp": {
                    "type": "string"
                },
                "vendor": {
                    "type": "string"
                },
                "WeekDay": {
                    "type": "string"
                }
            }
        }
    }
}

Con ello, y puesto que ta tenemos desgranado la información que vamos a recibir , podemos proseguir.

En nuestro caso, ya que tenemos multiples casos de uso en nuestro SIEM, vamos a tratar cada uno de una forma, por lo que controlamos con una condición nuestro CDU ( Caso De Uso) , en caso de que no se cumpla , no ejecuta nada. De esta forma, saltara el Power Automate concreto. Teniendo N automatismos por cada CDU.

En este caso TIP-001 , se trata de una detección de tráfico saliente permitido hacia una IP categorizada como maliciosa.
Condición caso de uso

Por ello:

Nos gustaría , extraer dichas direcciones de origen y fin , analizarlas en distintas herramientas y ejecutar manualmente en caso de ser positiva lo más rápido posible.

Recordamos que abrá casos que estemos 100% seguros del bloqueo y podamos automatizar el bloqueo de forma automática , y otros en los que no lo estemos tanto, como puede ser este caso, y necesitemos hacer un triaje anterior.

Os mostrar el resultado que vamos a obtener, con el fin de sea más fácil hacernos una idea:

Magia entre Splunk y Microsoft Teams

Como podéis ver, esto ya esta más en lenguaje humano.

  1. Traemos la información esencial
  2. Los enlaces del Análisis, llevan directamente al propio análisis de la IP. ( Somos pobres y no tenemos API de pago )
  3. En el resultado , muestro un curl de bloqueo directamente sobre un feed de Minemeld, con comentarios personalizados de la alerta ( Copiar y pegar ).
Solo con esto, podemos reducir los tiempos de análisis de nuestros analistas al 50%

De Splunk a tarjetas Adaptadas del Teams

El resultado, como veis , es muy chulo, aunque llegar hasta aquí sin saber cómo , me llevo bastante tiempo, por la inexperiencia de trabajar con las tarjetas Adaptativas o Adaptative Cards .

Pero todo cambio cuando descubrí el Diseñador de Tarjetas , ya no sólo para Teams ;) ... voy a estudiar algo para el correo.

Diseñador tarjetas Microsoft Teams

El diseñador de tarjetas, nos dará de forma sencilla, un JSON de nuestro formato ( En este caso , 212 lineas de JSON ) , que ignorante de mi, me empece a picar a mano en un principio, y que nos dejará poner en nuestra tarjeta de Microsoft Teams:

Tarjeta Adaptativa para Microsoft Teams

De esta forma , y puesto que tenemos todos los datos parseados del JSON de forma individual, podemos poner la información , o podemos generar los botones como el de VirusTotal, por su estructura de URL mediante contenido dinámico:

https://www.virustotal.com/gui/ip-address/31.170.121.238
Insertar contenido dinámico de Splink en JSON de Teams

Disponiendo de dicho campo en dst_ip ( esta estructura se cumple en todos los sites indicados ):

Campo dst_ip para formar la URL a consultar

Cómo resultado, ya lo hemos visto, somos capaces de ver de una forma ágil la información , y ejecutar muy rápidamente en caso de que esta sea positiva una acción:

Clickar en los propios enlaces nos llevara directamente a la información , ahorrando tiempo.

Y como todos sabemos , el tiempo es dinero : Generando eficiencias mientras somos más seguros

Espero que disfrutaseis el post , tanto como lo disfruto yo trayéndoos cosas nuevas que os pueden ser muy útiles .