Covenant: Un Command and Control un tanto vacilón (Parte I)

¡Muy buenas a todos!

En esta serie de tres artículos os vengo a hablar de Covenant, un sencillo Command & Control, desarrollado por Ryan Cobb, con el que llevo trabajando varias semanas y para el que solo tengo buenas palabras... aunque a veces sea un poco cabroncete. ¡Comencemos!

Tras sufrirlo y disfrutarlo durante tantas horas, me gustaría compartir una serie de "trucos" para resolver determinadas situaciones que pueden llegar a convertir la experiencia con Covenant en una auténtica pesadilla.
Descripción gráfica de mi persona trabajando con Covenant.

Problema 1: Si impersonamos un usuario mediante el comando MakeToken e intentamos ejecutar un comando con ShellCmd, podremos comprobar que no se ejecuta correctamente, devolviendo por pantalla el siguiente error.

Fig 1: El usuario Ruperto es Administrador del equipo DC-01, sin embargo, el comando no funciona.

Solución: En la versión actual, no hay solución todavía (v0.4). No obstante, como parche temporal, podemos emplear los comandos ShellRunAs y ShellCmdRunAs que nos permiten incluir el usuario y la contraseña como parámetros. Otra opción factible es lanzar los comandos mediante Powershell. Podéis indagar más en detalle en el issue abierto por Attl4s en GitHub.

Fig 2: Empleando ShellCmdRunAs o ls sí funciona.

Problema 2: Covenant no dispone de mecanismos de Port Forwarding por defecto, por lo que es necesario que empleemos alguna técnica externa para poder realizar esta técnica.

Fig 3: Estamos trabajando en ello.


Solución: Aunque existen infinidad de mecanismos, la manera "más nativa" de realizarlo es mediante la carga en memoria de una Meterpreter empleando el comando Shellcode.

Fig 4: Donde Hex es la Meterpreter en hexadecimal.


Problema 3: El proceso de Covenant empieza a ser inestable, e incluso, se llega a cerrar solo, impidiendo su reinicio.

Fig 5: Si empiezan a salir errores de este estilo... temeos lo peor.


Solución: La base de datos de Covenant es muy inestable, por lo que es probable que tras varias horas funcionando empiecen a aparecer diversos errores en el log del proceso llegando incluso a cerrarse solo. Aunque algunos recomiendan eliminar los SMB Grunts en los que hayamos perdido la sesión mediante el uso de un navegador SQL (SQLite, por ejemplo), en mi caso, la única solución que ha funcionado siempre ha sido borrar la base de datos de Covenant (Covenant.db) y desplegar todo de nuevo desde cero.

Fig 6: Localización del fichero covenant.db. Al buen sudo fire.


Fig 7: Localización de los Grunts en el fichero Covenant.db usando SQLite.

Y hasta aquí este primer artículo de la serie. !Nos vemos en el próximo!

Happy Juancking!