Daniel StepanicDerek DitchSeth GoodwinAndrew Pease

Extracción de configuraciones de balizas de golpe de cobalto

Parte 2 - Extracción de configuraciones de balizas de implante Cobalt Strike.

7 min de lectura
Extracción de configuraciones de balizas de golpe de cobalto

Consulte nuestra publicación anterior sobre cómo recolectar implantes de balizas Cobalt Strike. Nos basaremos en esa información para extraer las configuraciones de las balizas.

En esta publicación, analizaremos manualmente una configuración de Cobalt Strike C2 a partir de una carga útil de baliza binaria empleando el excelente Cobalt Strike Configuration Extractor (CSCE). También hablaremos sobre la habilitación de algunas características más nuevas del Elastic Stack que te permitirán hacer esto a escala en todos tus endpoints monitoreados, extrayendo las balizas de la memoria.

El equipo de Blackberry tiene un tremendo manual llamado "Finding Beacons in the Dark" (Finding Beacons in the Dark) que profundiza ampliamente en las configuraciones de balizas Cobalt Strike. Discutiremos algunos campos en las configuraciones aquí, pero si está interesado en aprender sobre cómo funcionan las balizas, le recomendamos encarecidamente que consulte ese recurso.

Extractor de configuración de cobalto

El Cobalt Strike Configuration Extractor (CSCE) de Stroz Friedberg es una "biblioteca de python y un conjunto de scripts para extraer y analizar configuraciones de las balizas de Cobalt Strike".

Para usar CSCE, crearemos un entorno virtual de Python, lo activaremos e instalaremos el paquete de Python de CSCE.

Configuración del extractor de configuración de cobalto

$ python3 -m venv csce

$ source csce/bin/activate

(csce) $ pip3 install libcsce

...truncated...
Collecting libcsce
  Using cached libcsce-0.1.0-py3-none-any.whl (24 kB)
Collecting pefile>=2019.4.18
...truncated...

A continuación, podemos ejecutar el CSCE en la carga útil de la baliza que extrajimos de la memoria para ver si hay alguna información interesante almacenada que podamos recopilar (agregaremos la bandera --pretty para que la salida sea más fácil de leer como un documento JSON).

Visualización de los indicadores atómicos de la configuración de balizas CS

(csce) $ csce --pretty beacon.exe

{
  "beacontype": [
    "HTTPS"
  ],
  "sleeptime": 45000,
  "jitter": 37,
  "maxgetsize": 1403644,
  "spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
  "license_id": 334850267,
  "cfg_caution": false,
  "kill_date": "2021-12-24",
  "server": {
    "hostname": "clevelandclinic[.]cloud",
    "port": 443,
    "publickey": "MIGfMA0GCSqGSIb3DQEBAQUAA4G...
...truncated...

Inmediatamente, podemos ver que el beacon emplea HTTPS para comunicar y que el dominio está clevelandclinic[.]cloud. Esto nos da un indicador atómico sobre el que podemos hacer algún análisis. Mirando la documentación de Comando y Control Maleable, podemos obtener una descripción de las variables de configuración.

Como ejemplo, podemos ver que el sleeptime es de 450000 milisegundos, lo que cambia el registro de baliza predeterminado de cada 60 segundos a 450 segundos, o 7 1/2 minutos. Además, vemos una fluctuación de 37 lo que significa que hay una fluctuación aleatoria del 37% de 450000 milisegundos (166,500 milisegundos), por lo que el registro de la baliza podría estar entre 283,000 y 450,000 milisegundos (4,7 - 7,5 minutos).

Además, el campo publickey es empleado por el servidor Cobalt Strike Team para cifrar las comunicaciones entre el servidor y la baliza. Esto es diferente de los certificados TLS normales que se emplean al acceder al dominio C2 con un navegador o bibliotecas de transferencia de datos, como cURL. Este campo es importante porque Team Server emplea la misma clave pública para cada baliza, por lo que este campo es valioso para agrupar balizas con su perspectiva Team Server porque los actores de amenazas suelen emplear el mismo Team Server para varias campañas, por lo que estos datos de la configuración se pueden emplear para vincular a los actores de amenazas a varias campañas e infraestructura.

Continuando con la salida de configuración, podemos ver otra sección interesante alrededor del campo anidado process-inject , stub:

Visualización del campo process-inject.stub

(csce) $ csce --pretty beacon.exe

...truncated...
  "process-inject": {
    "allocator": "NtMapViewOfSection",
    "execute": [
      "CreateThread 'ntdll!RtlUserThreadStart'",
      "CreateThread",
      "NtQueueApcThread-s",
      "CreateRemoteThread",
      "RtlCreateUserThread"
    ],
    "min_alloc": 17500,
    "startrwx": false,
    "stub": "IiuPJ9vfuo3dVZ7son6mSA==",
    "transform-x86": [
      "prepend '\\x90\\x90'"
    ],
...

El campo stub contiene el hash de archivo MD5 codificado en Base64 del archivo Java de Cobalt Strike. Para convertir esto, podemos volver a usar CyberChef, esta vez agregue las recetas "From Base64" y "To Hex", cerciorar de cambiar el "Delimitador" a "Ninguno" en la receta "To Hex".

Ahora que tenemos el valor MD5 del archivo Java (222b8f27dbdfba8ddd559eeca27ea648), podemos compararlo con bases de datos en línea como VirusTotal para obtener información adicional, específicamente, el hash SHA256 (7af9c759ac78da920395debb443b9007fdf51fa66a48f0fbdaafb30b00a8a858).

Por último, podemos verificar el hash SHA256 con CobaltStrike para identificar la versión del archivo Java yendo a https://verify.cobaltstrike.com y buscando el hash.

Ahora sabemos que esta baliza fue creada empleando una versión con licencia de Cobalt Strike 4.4.

Otro campo de la configuración que es útil en la actividad de agrupación en clústeres es el campo license_id .

Visualización de la marca de agua Cobalt Strike

...truncated
  "spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
  "license_id": 334850267,
  "cfg_caution": false,
...truncated...

Esto se conoce comúnmente como marca de agua y es un valor de 9 dígitos que es único por licencia. Aunque este valor se puede modificar, se puede emplear junto con los campos process-inject.stub y publickey (descritos anteriormente) para agrupar grupos de actividades e infraestructuras.

Estos son solo algunos campos que se pueden emplear para identificar y agrupar actividades empleando configuraciones extraídas de la baliza Cobalt Strike. Si estás interesado en un análisis muy profundo de la configuración, te recomendamos que consultes el manual Finding Beacons in the Dark Cobalt Strike del equipo de Blackberry.

Poner el análisis en acción

Para probar nuestro manual de estrategias de analistas para recopilar cargas útiles de balizas Cobalt Strike, sus configuraciones y metadatos que contienen; Podemos aplicarlos a más datos para identificar grupos de actividad.

En la ilustración anterior, podemos agrupar a los actores de amenazas en función de sus usos compartidos de la clave pública de la carga útil de la baliza, que, como describimos anteriormente, es única para Team Server. Esto nos permitiría agrupar múltiples hashes de carga útil, infraestructura y campañas de balizas en un solo actor de amenazas.

Como siempre, el uso de los indicadores atómicos extraídos de las configuraciones de carga útil de la baliza (clevelandclinic[.]cloud en nuestro ejemplo) le permite identificar la infraestructura compartida adicional, las verticales de destino y las capacidades de los actores de amenazas.

Esta vez a toda velocidad

Todos los pasos que destacamos en esta versión, así como en la versión anterior, se pueden automatizar y escribir en Elasticsearch mediante el proyecto Cobalt Strike Beacon Extraction .

Resumen

En esta publicación, destacamos las nuevas características del Elastic Stack que se pueden usar para recolectar cargas útiles de balizas C2 maleables de Cobalt Strike. Además, cubrimos los procesos para crear políticas de flota para extraer cargas útiles de balizas de la memoria y sus configuraciones.

Estas políticas y procesos de flota permiten a los analistas de seguridad recopilar cargas útiles de balizas Cobalt Strike y sus configuraciones para identificar la infraestructura controlada por los actores de amenazas y la actividad del clúster.

Artefactos

Observable | Tipo | Nota -------------------------------------------------------------------|-------------|------------------------------------------ 697fddfc5195828777622236f2b133c0a24a6d0dc539ae7da41798c4456a3f89 | SHA256 | Cobalt Strike Carga útil de baliza C2 maleable 7475a6c08fa90e7af36fd7aa76be6e06b9e887bc0a6501914688a87a43ac7ac4 | SHA256 | Cobalt Strike Carga útil de baliza C2 maleable f9b38c422a89d73ebdab7c142c8920690ee3a746fc4eea9175d745183c946fc5 | SHA256 | Cobalt Strike Maleable C2 carga útil clevelandclinic[.]cloud | nombre-de-dominio | Cobalt Strike Maleable C2 dominio 104[.]197[.]142[.]19 | IPv4-ADDR | Cobalt Strike Maleable C2 Dirección IP 192[.]64[.]119[.]19 | IPv4-ADDR | Cobalt Strike Maleable C2 Dirección IP

Artefactos

Los artefactos también están disponibles para descargar en formato ECS y STIX en un paquete zip combinado.