Covenant C2 Framework: El tutorial completo
Dec 16, 2022
Covenant is one of the latest and greatest command and control (C2) post-exploitation frameworks. This post will walk you through the process of configuring Covenant and using it to execute payloads on compromised hosts.
Nota: Este artículo demuestra las capacidades de Covenant a mediados de septiembre de 2019.
1. Instalar Covenant
Primero, necesitamos instalar Covenant en una máquina anfitriona que funcionará tanto como la base de datos de Covenant como la aplicación de gestión que controla a los agentes de la aplicación, conocidos como grunts.
Requisitos previos
Para esta entrada de blog, instalé Covenant en una estación de trabajo Windows 10, pero cualquier sistema operativo de servidor Windows reciente o distribución de Linux que soporte .NET Core también debería funcionar perfectamente.
Las siguientes aplicaciones deben estar instaladas en la máquina que aloja Covenant:
Contenido relacionado seleccionado:
Proceso de instalación
Dada la arquitectura moderna y multiplataforma de Covenant, no proporciona un ejecutable de instalación anticuado. En su lugar, necesitamos clonar el repositorio git del proyecto y luego construir y ejecutar la aplicación utilizando los siguientes comandos:
git clone --recurse-submodules https://github.com/cobbr/Covenant
cd Covenant/Covenant
dotnet build
dotnet run
Alternativamente, podríamos ejecutar Covenant en un contenedor Docker.
2. Cree una cuenta.
Con el servicio Covenant en funcionamiento, podemos navegar a la interfaz de la aplicación Covenant en su puerto web predeterminado de 7443. Se nos solicitará configurar una cuenta de usuario:
Después de completar el proceso de registro, seremos redirigidos a la página de User Management:
El menú de la izquierda nos permite navegar por las diversas capacidades de Covenant.
3. Configure un listener.
Los listeners permiten que los grunts se comuniquen con la aplicación Covenant. No hay listeners configurados por defecto, por lo que necesitamos configurar uno. Haga clic en Listeners en el menú de la izquierda para abrir la página de Listener:
Luego haga clic en el botón Create para abrir la página de Crear HTTP Listener:
Necesitaremos actualizar algunos de los valores proporcionados:
- Nombre — Por defecto, Covenant proporciona un nombre simple de tipo “GUID”. Siéntase libre de cambiarlo por algo más legible.
- BindAddress y ConnectAddress — Asegúrese de que ambos especifiquen una dirección que sea accesible por los grunts.
- UseSSL — Si desea utilizar SLL, necesitará especificar un archivo de certificado SSL y una contraseña.
Una vez que la configuración esté completa, haga clic en el botón Create para crear y habilitar el oyente.
4. Cree un lanzador.
A continuación, necesitamos crear un lanzador. Los lanzadores se utilizan para convertir hosts remotos en subordinados y conectarlos a la aplicación Covenant. Por lo general, toman la forma de un paquete de carga útil que se ejecuta en un host remoto. Cada lanzador se empareja con un oyente.
Desde el menú izquierdo de la página de User Management, haga clic en Launchers. Verá una lista de tipos de launchers. El launcher Binary, que se utiliza para generar binarios personalizados, es uno de los launchers más fáciles de usar, así que seleccionemos Binary como nuestro primer launcher.
La página de configuración se abrirá:
Especifique las siguientes opciones de configuración:
- Listener — Especifique el listener que utilizará el nuevo lanzador. Usemos el listener HTTP que creamos anteriormente:
- Plantilla — Usemos la plantilla predeterminada GruntHTTP:
- Retardo y Jitter — Estos ajustes controlan la frecuencia con la que un grunt se comunica con Covenant. Podemos dejar los valores predeterminados.
- ConnectAttempts y KillDate — Estos ajustes controlan cuándo un grunt dejará de intentar comunicarse con Covenant. Nuevamente, podemos dejar los valores predeterminados.
Una vez que la configuración esté completa, haga clic en el botón Generate para crear el nuevo lanzador y volver a la página de configuración.
5. Cree un grunt ejecutando el lanzador.
A continuación, necesitamos guardar la carga útil del lanzador: Haciendo clic en Download y luego en Save File.
A continuación, copie el archivo guardado al host deseado y ejecútelo.
El nuevo grunt registrado aparecerá en nuestro tablero de Covenant:
6. Asigne tareas al subordinado.
Desde el menú izquierdo de la página de User Management, haga clic en Grunts y luego abra el grunt que acabamos de registrar. La pestaña Info proporciona detalles sobre su estado de conexión y funcionalidad:
Para asignar una tarea a nuestro peón, necesitamos hacer clic en la pestaña de Task.
Ejemplo 1: Tome una captura de pantalla.
Primero, supongamos que queremos que el grunt tome una captura de pantalla del escritorio del usuario activo. Seleccionamos Screenshot del menú desplegable de Tarea y luego hacemos clic en el botón Task debajo para ejecutar inmediatamente esta acción en el grunt:
Actualice la página para ver el estado actualizado de la tarea. Mostrará que la tarea se ha completado y proporcionará su resultado, que en este caso es simplemente una captura de pantalla. Tenga en cuenta que el resultado de una tarea depende del tipo de tarea.
Ejemplo 2: Ejecute Mimikatz.
Hagamos que el subordinado realice otra tarea: Ejecutar Mimikatz.
Necesitamos volver a la pestaña de Tareas en la página de detalles de nuestro grunt. Luego seleccionaremos Mimikatz del menú desplegable de Tareas.
Muchas tareas tienen un conjunto de parámetros de entrada personalizables. Las tareas de Mimikatz tienen un parámetro de entrada “Command” que nos permite especificar qué comando de Mimikatz queremos ejecutar. Convenientemente, viene pre-poblado con el comando sekurlsa::logonPasswords, que descubre contraseñas almacenadas en la memoria. Asignemos esta tarea a nuestro grunt y veamos qué sucede.
Resulta que una cuenta de Domain Admin estaba registrada en este host secundario — así que en la salida de la tarea, podemos ver la contraseña del Domain Admin en texto claro.
Ejecutar Mimikatz usando Covenant ayuda a los adversarios a evitar la detección porque Covenant no almacena tareas directamente en el host grunt. En cambio, compila y despliega dinámicamente la carga útil de la tarea a través de su conexión con el cliente en el momento de asignar la tarea. Además, cada vez que se crea un nuevo grunt o se asigna una nueva tarea a un grunt, el código relevante se recompila y se ofusca con ConfuserEx, lo que evita cargas útiles estáticas que serían más fáciles de detectar. De hecho, al realizar los pasos aquí en mi máquina, Windows Defender estaba habilitado y actualizado, sin embargo, las tareas de Mimikatz del grunt se ejecutaron sin problemas.
Revisando el historial de tareas y su salida.
Covenant proporciona un historial claro de las tareas que ha ejecutado. Desde el menú izquierdo de la página de User Management, haga clic en Taskings:
Puede ver tanto la tarea de captura de pantalla como la tarea de mimikatz que ejecutamos anteriormente. Haga clic en cualquier fila para ver los parámetros de la tarea y la salida completa.
Tenga en cuenta que muchas tareas también guardan elementos de su salida en la página de Data. Haga clic en las diferentes pestañas para ver credenciales, indicadores, artefactos descargados y capturas de pantalla. Por ejemplo, aquí están las credenciales descubiertas por nuestra tarea Mimikatz:
Y aquí está la captura de pantalla realizada por nuestra otra tarea:
Ejemplo 3: Descargue un archivo.
Ahora, ejecutemos una tarea más en nuestro grunt para descargar un archivo para que podamos verlo en la pestaña de Downloads.
Supongamos que hemos descubierto que hay un archivo en nuestro host grunt llamado MySecretDocument.txt. ¡Utilicemos la tarea Download para obtener una copia de este archivo para nosotros mismos!
Ejecutar esta tarea recuperará una copia del archivo y lo hará disponible inmediatamente en la pestaña de Descargas:
Esta tarea es simple en sí misma, pero presenta algunos casos de uso fascinantes dado el hecho de que podemos ejecutar esta tarea utilizando los derechos del usuario que ejecutó el lanzador grunt o las credenciales que obtuvimos a través de otras tareas.
Conclusión
Covenant ya ofrece una amplia variedad de tareas, y la lista crece cada día gracias a la participación de la comunidad de código abierto. ¡Este proyecto probablemente tendrá un futuro emocionante y sin duda vale la pena echarle un vistazo!
Compartir en
Aprende más
Acerca del autor
Joe Dibley
Investigador de seguridad
Investigador de seguridad en Netwrix y miembro del Equipo de Investigación de Seguridad de Netwrix. Joe es un experto en Active Directory, Windows y una amplia variedad de plataformas y tecnologías de software empresarial, Joe investiga nuevos riesgos de seguridad, técnicas de ataque complejas y las mitigaciones y detecciones asociadas.
Aprende más sobre este tema
Ejemplo de Análisis de Riesgos: Cómo Evaluar los Riesgos
El Triángulo de la CIA y su Aplicación en el Mundo Real
Crear usuarios de AD en masa y enviar sus credenciales por correo electrónico usando PowerShell
Cómo agregar y eliminar grupos de AD y objetos en grupos con PowerShell
Atributos de Active Directory: Último inicio de sesión