CobaltBus: tráfico C2 de Cobalt Strike vía Azure Servicebus

Azure Service Bus es una plataforma en la nube de mensajería asincrónica que le permite enviar datos entre sistemas desacoplados. Microsoft ofrece esta característica como un servicio, lo que significa que el usuario no tendrá que hospedar su propio hardware para poder utilizarlo. ¿Y si además lo usamos para llevar el tráfico de nuestro C2 de Cobalt?

Melvin Langvik aka Flangvik tiene un proyecto bastante interesante que lo integra.... CobaltBus.

Instalación 

  • Crear un bus de servicio de Azure 
  • Crear una política de acceso compartido (cadena de conexión) que solo pueda enviar y escuchar 
  • Editar la variable estática connectionString en los proyectos del Beacon en C# para que coincida con el valor de "Cadena de conexión principal" para la política de acceso compartido creada en el paso 2. 
  • Se deben actualizar las mismas variables para el proyecto CobaltBus, pero se debe usar la "Cadena de conexión principal" para la política de acceso compartido "RootManageSharedAccessKey". (Necesitaremos permisos de admin) 
  • Configurar Cobalt e iniciar un listener C2 externo en el puerto 4444, 127.0.0.1 (se puede cambiar editando las variables ExternalC2Port ExternalC2Ip en el proyecto de C#) 

Demo

Funcionamiento 

El binario CobaltBus DotNetCore que se integra con CobaltStrike ExternalC2, creará un base de datos local Sqlite para realizar un seguimiento de múltiples beacons. 

Los mensajes entrantes a CobaltBus serán capturados y escritos en la base de datos. Los nombres de las base de datos son "CobaltBus.db" y "CobaltBus-log.db" y se crearán en el directorio desde el que se ejecuta CobaltBus.dll. 

Una vez que se ejecuta un binario de un beacon, enviará un mensaje "INITIALIZE" a la cola baseQueueName, con un BeaconId y Pipename generados aleatoriamente. 

El controlador de CobaltBus luego capturará esto, creará y pasará a las dos nuevas colas según el BeaconId enviado, solicitará el shellcode del stager de CobaltStrike y lo llevará a una nueva nueva cola como un mensaje "INJECT". 

A partir de ahí, el beacon inyecta el shellcode capturado en la memoria y establece una conexión con el beacon de CobaltStrike sobre el nombre del pipe generado. 

Cuando se emite un comando desde CobaltBus, se pushea en la cola respectiva del beacon y en el nombre del pipe correspondiente.

Comentarios