Demostración en vídeo de este post
Covenant es uno de los C2 más potentes que se encuentran disponibles actualmente, está desarrollado en C# y se caracteriza por contar con una interfaz web que permite aprovechar sus características de una forma fácil y rápida. Sigue un modelo muy parecido a otros C2, es decir, está completamente enfocado a las labores de post-explotación en sistemas Windows, no obstante su parecido con Empire Framework es innegable y de hecho, en varias secciones de la documentación de ambos proyectos se hacen referencias mutuas. Evidentemente son herramientas distintas, pero aprovechan las características la una de la otra. En el caso de Covenant, sigue el mismo modelo operacional de Empire Framework: Iniciar un listener, generar un stager y obtener un agente (en terminología de Covenant se le llama Grunt en lugar de Agent). En el caso de Empire Framework, se utiliza el compilador Roslyn para generar agentes C# y aprovechar la potencia de las herramientas disponibles en GhostPack y SharpSploit. La sinergia que existe entre ambos proyectos es evidente, tanto en la documentación como en sus funcionalidades. No obstante, es probable que Covenant resulte más amigable para algunas operaciones básicas como la generación de “Stagers” y gestión de “Grunts” la cual se lleva a cabo íntegramente desde la interfaz web.
El proceso de instalación de la herramienta es simple. Hay dos métodos disponibles, o bien instalando DotNet en el sistema donde se va a ejecutar la herramienta y posteriormente, ejecutando el comando “dotnet run” o ejecutando un contenedor Docker que ya tendrá todo configurado. Ambos mecanismos son sencillos y no suelen presentar dificultades, sin embargo es importante tener en cuenta que tal como se indica en la documentación del proyecto, es necesario utilizar la versión 3.1 del SDK de DotNet si se selecciona el primer método.
Si se opta por utilizar Docker, la gestión es muy simple y se puede crear un contenedor que utilice la imagen previamente creada con el comando “docker build“. En el vídeo de YouTube que se puede ver un poco más arriba se aprecia el proceso de instalación con Docker y se puede ver lo fácil que es crear la imagen y posteriormente el contenedor.
Una vez instalado el proyecto, se puede interactuar con él desde la interfaz web, es necesario acceder al puerto 7443 y crear el primer usuario, que será el administrador.
A continuación, es necesario empezar creando un Listener, algo que se puede hacer muy fácilmente pinchando en “Listeners” e introduciendo los datos básicos. Es importante tener en cuenta que la IP y puerto que se seleccionen deben ser accesibles para la víctima. Si se utiliza una instalación basada en Docker, por defecto pondrá la IP del contenedor y evidentemente, la víctima no sabrá cómo establecer la conexión. Por ese motivo cuando se ha creado el contenedor se han especificado varios puertos que estarán disponibles tanto en el host como en el contenedor, concretamente los puertos 80:80, 443:443 y 7443:7443. De esta forma, si se especifica la IP del host y el puerto 80, el proceso funcionará correctamente.
Se pueden crear tantos Listeners como sea necesario y gestionarlos desde la interfaz web. Estos componentes serán utilizados posteriormente por los “Launches” que apuntarán a ellos.
Representan simplemente las muestras o comandos que se deben ejecutar en el sistema comprometido para recibir una conexión y poder controlarlo remotamente. Hay algunos varios tipos disponibles en la herramienta, sin embargo algunos de ellos no funcionan correctamente en sistemas basados en Windows 10 o las últimas versiones de Windows Server. Por este motivo puede ser recomendable utilizar un Launcher basado en Powershell o un binario generado por la herramienta. Una de las ventajas que tiene Covenant y que recuerda mucho a Sliver, es que los binarios se compilan y generan “al vuelo” con el compilador integrado en Covenant, cada binario es completamente diferente, no hay payloads estáticos, lo que ayuda en la evasión de las soluciones de AV que se encuentren implantadas en el objetivo.
La herramienta enseña un listado de alternativas y como se puede ver, en algunas de ellas se indica que podría no funcionar como se espera en sistemas Windows recientes. Sin embargo, se cuenta con otras alternativas interesantes como Powershell, ShellCode (utilizando la técnica Donut) y Binary.
En cuanto se selecciona uno de estos componentes, hay que configurar el listener al que se conectará el launcher. Normalmente es suficiente con configurar todo en la pestaña de “Generate” y descargar la muestra en el caso de que sea un binario o copiar el comando que se genera y que se debe ejecutar en el sistema comprometido. En la pestaña de “host” se puede indicar una ruta para que dicha muestra sea descargada en la máquina comprometida utilizando HTTP, algo que en algunos casos puede resultar cómodo.
En cuanto se ejecuta el Stager/Launcher en la máquina comprometida, dicha instrucción se encargará de establecer una conexión al listener que se haya indicado durante su creación y si todo va bien, se obtendrá un nuevo “Grunt”, que no es más que un componente que permite controlar remotamente el sistema comprometido, es equivalente a los “Agents” que se encuentran disponibles en Empire Framework.
Cada “grunt” que aparece en la interfaz web está identificado con un nombre único y además aparecen los detalles básicos correspondientes al sistema comprometido y el nivel de integridad obtenido.
Para interactuar con Covenant y llevar a cabo procesos de post-explotación es necesario conocer los comandos que se encuentran disponibles y ejecutarlos. Una de las ventajas que aporta Covenant frente a Empire Framework es que también se ejecutan los comandos de forma asíncrona, pero en la opción de “Taskings” se puede ver exactamente el estado de cada tarea y es posible interrumpirla si hace falta, en el caso de Empire Framework es necesario esperar hasta que la tarea termine y devuelva resultados (o no).
Cuando se selecciona un “Grunt” se pueden ver las pestañas “info”, “Interact”, “Task” y “Tasking”. Es una interfaz intuitiva y no requiere demasiadas explicaciones, en la pestaña de “Interact” se pueden ejecutar comandos y en “Tasking” se puede ver el estado de dichos comandos, que se ejecutan de forma asíncrona tal como se ha mencionado antes.
Una vez entendido en funcionamiento básico de la herramienta, es necesario conocer los principales comandos y cómo usarlos adecuadamente. Esto se verá en el siguiente post.
Un Saludo y Happy Hack!
Adastra.