Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
cuddlephish — Navegador en el Medio (BitM) Armado para Probadores de Penetración | Kitploit
Herramientas/GitHubGitHub/fkasler/cuddlephish
Herramientas de PhishingExplotación de Aplicaciones WebPhishingPruebas de PenetraciónIngeniería SocialRed Teaming
GitHubfkasler/cuddlephish

cuddlephish

Navegador en el Medio (BitM) Armado para Probadores de Penetración

Ver Repositorio
67380hace 4 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CuddlePhish

phishy

Browser-in-the-middle (BitM) multi-usuario armado para probadores de penetración. Este ataque puede usarse para eludir la autenticación multifactor en muchas aplicaciones web de alto valor. Incluso funciona para aplicaciones que no usan tokens de sesión y, por lo tanto, no serían explotables mediante ataques tradicionales de robo de tokens. Esta es una herramienta de ingeniería social y no explota ninguna falla técnica en el servicio objetivo.

Inicio rápido

Esta herramienta es un servidor web especializado. Está diseñada para ejecutarse en un servidor Linux Debian 11 (Bullseye) y depende de información de IP pública para proteger la funcionalidad de administración. No esperes poder probar localmente sin saltar algunos obstáculos serios.

Advertencia: Chromium no es compatible con ARM. Aunque técnicamente es posible forzar el uso de un binario ARM de Chromium, perderás todas las funciones/protecciones adicionales de puppeteer-extra.

Esta configuración de ejemplo utiliza Caddy para manejar TLS, SNI y agregar un par de encabezados personalizados como 'X-Real-IP' a cada solicitud. No tienes que usar Caddy con Cuddlephish, ya que el mismo proxy inverso se puede configurar usando Nginx, Apache, etc. Simplemente me gusta Caddy porque es fácil de instalar con Docker y tiene complementos para administrar certificados de Letsencrypt para la mayoría de los registradores de dominios. El Caddyfile de ejemplo muestra cómo lo configurarías para Gandi. Consulta la documentación de tu registrador.

Instala Docker, Node, XVFB y algunas otras dependencias:

root@kitploit:~
git clone https://github.com/fkasler/cuddlephish
cd cuddlephish
sudo bash install_deps.sh

Luego puedes usar Docker para construir Caddy con un complemento de certificado comodín para tu registrador. El ejemplo es para Gandi. Consulta la documentación aquí y la lista de módulos de proveedores DNS aquí. Puedes modificar el Dockerfile para tu registrador antes de construir:

root@kitploit:~
sudo docker build -t caddy .

Ahora modifica el Caddyfile para cambiar tu dominio y la clave API de Gandi (u otro registrador), e inicia Caddy. Recomiendo iniciar esto en una ventana de screen o tmux para que puedas ejecutar el servidor Node en otra ventana en un momento:

root@kitploit:~
sudo docker run -p 80:80 -p 443:443 -p 2019:2019 -v $PWD/Caddyfile:/etc/caddy/Caddyfile --network=host caddy:latest

Con Caddy manejando el tráfico por nosotros en los puertos 80 y 443, ¡finalmente podemos ejecutar la herramienta!

Instala las dependencias de Node:

root@kitploit:~
npm install

Algunos ajustes de configuración: PASO CRÍTICO: Asegúrate de modificar el config.json de ejemplo para agregar tus IP(s) públicas aprobadas para acceso de administrador. Esta lista blanca de IPs es lo que dicta el acceso a la interfaz web "/admin". También deberías cambiar la clave de socket predeterminada por algo más seguro.

La herramienta no está configurada para apuntar a ningún inicio de sesión de forma predeterminada, por lo que deberás agregar algunos. Hay un script 'add_target.js' para facilitar este paso. Simplemente ejecuta el script y pega la URL del portal de inicio de sesión que deseas apuntar cuando se te solicite:

root@kitploit:~
node add_target.js

Esto obtendrá el nombre del servicio, el título de la pestaña y el favicon por ti y agregará una entrada a 'targets.json'. Puedes ejecutar este script varias veces y añadirá tus nuevos objetivos. El script nombrará cada servicio según el dominio, sin el nivel superior. Entonces, para 'https://www.example.com/login.php', el servicio sería solo 'example' al especificar tu objetivo cuando tú...

¡Ejecútalo!

root@kitploit:~
node index.js example

Después de unos segundos, deberías ver un mensaje en la consola cuando tu primera instancia automatizada de Chrome se registre a través de websockets. Ahora los visitantes de tu sitio de phishing deberían ver lo que parece ser la página de inicio de sesión objetivo, pero en realidad es una transmisión de video de tu instancia de navegador automatizada. También pueden interactuar con tu instancia de navegador e iniciar sesión por ti.

Si configuraste correctamente tus IP(s) de administrador en config.json, deberías poder ver una interfaz web especial '/admin' para rastrear usuarios, ver registros clave, tomar el control de instancias de navegador conectadas, robar cookies y eliminar instancias de navegador no deseadas.

Nota: No verás nada en la página de administración hasta que tengas algunas víctimas. Una vez que tengas una víctima, su instancia de navegador debería aparecer en la interfaz de administración.

Solución de problemas ("Solo veo una página en blanco")

He tenido varias personas que abren problemas sobre una "Página Blanca en Blanco", que es más un síntoma de muchos problemas posibles, y no un problema en sí mismo. No abras problemas bajo nombres de síntomas vagos. En su lugar, si tienes una página en blanco en el lado del usuario, primero intenta revisar lo siguiente:

  • Verifica que el título de la pestaña del servicio objetivo no tenga caracteres especiales. Usamos "--auto-select-desktop-capture-source" para indicarle a nuestro navegador automatizado qué pestaña transmitir. Esta opción falla para títulos con caracteres especiales. Sin embargo, no necesitas que coincida el título completo de la pestaña, solo necesitas suficiente subcadena para una coincidencia única.
  • En la misma línea, si tu servicio objetivo envía una redirección 302 o similar a tu navegador automatizado, y el título de la pestaña cambia antes de que comencemos la transmisión WebRTC a una víctima, entonces "--auto-select-desktop-capture-source" fallará. Puedes ver cómo add_target.js obtiene esta información y replicarla en index.js junto con una declaración console.log() para ver si el título ha cambiado antes de negociar WebRTC.
  • Verifica que el HTML de cuddlephish se esté cargando y que no haya errores evidentes de JavaScript en la consola del desarrollador en el front-end. La configuración de ejemplo de Caddy tiene algunos bloqueos básicos en cadenas de user-agent como curl. Como mínimo, deberías ver que el título de la pestaña y el favicon se están falsificando.
  • Asegúrate de que puedas interactuar con el servicio y puerto STUN de ejemplo (stun.l.google.com:19302) desde tu servidor.
  • Asegúrate de que la red desde la que trabajas permita STUN. STUN solo funciona con "NAT de cono completo", "NAT de cono restringido (dirección)" y "NAT de cono restringido por puerto". NO funciona con "NAT simétrica".
  • Asegúrate de que puedas interactuar con el servicio y puerto STUN de ejemplo (stun.l.google.com:19302) desde el navegador de tu víctima de prueba. Prueba usando https://icetest.info/.
  • Si tu red no puede alcanzar el servidor STUN de ejemplo, cámbialo por uno al que puedas acceder. Si tu red no permite STUN, entonces hay una configuración de ejemplo para un servidor TURN en las páginas HTML de cuddlephish y broadcast. Tendrás que configurar o pagar por tu propio servidor TURN. NOTA: Un servidor TURN tiene la mejor oportunidad de conectar a las víctimas de phishing con tus instancias de navegador.

A alto nivel, si solo ves una página en blanco en el front-end, significa que hay una interrupción en la cadena de flujo de datos desde "Iniciar WebRTC" > "Seleccionar pestaña para transmitir" > "Negociar ICE con el navegador de la víctima" > "Transmitir video". Los pasos de solución de problemas anteriores están destinados a ayudarte a seguir los datos a través de este proceso. Cuando funcione correctamente, deberías ver un flujo de registros en el servidor similar al siguiente:

troubleshoot

Espero que esto ayude con cualquier problema, y como siempre, tener suficiente información para replicar un problema de manera consistente es un requisito previo para enviar problemas para una investigación adicional.

Funciones de administración

Enviar payload

Activa manualmente un payload para descargar en el sistema de la víctima a través de JavaScript. Cada objetivo comienza con 'payload.txt' como payload de prueba. Simplemente intercambia la ubicación del archivo en targets.json para enviar un payload personalizado.

Expulsar usuario

Envía un cambio de window.location a la víctima para enviarla al portal de inicio de sesión real. Parecerá que simplemente están siendo obligados a reautenticarse y evitará que te vean tomar los controles. Si modificas el código, podrías hacer otras cosas elegantes con esta técnica general ;)

Tomar control

Te permite intervenir y tomar el control de una instancia de navegador directamente desde el portal de administración. Para dejar de controlar la instancia, presiona la tecla ESCAPE. Nota: esto quitará los controles a la víctima de phishing y podrá ver tus movimientos si no la expulsas primero. Has sido advertido.

Devolver control

Te permite devolver manualmente el control al usuario de la instancia de navegador automatizada. Esto podría ser útil para algunos escenarios de ingeniería social al hacerse pasar por TI. Puedes decirle al usuario que estás iniciando una sesión de ayuda, tomar el control y navegar al servicio objetivo, devolver el control y hacer que inicien sesión, tomar los controles nuevamente, etc.

Obtener cookies

Extrae todos los elementos de cookies y almacenamiento local de la instancia del navegador y lo descarga como un archivo JSON. Para inyectar este material de credenciales de nuevo en una instancia de navegador que se ejecuta en tu sistema local, hay un script en el proyecto llamado 'stealer.js'. Está diseñado para ejecutarse desde tu máquina, no desde el servidor, por lo que para usarlo también necesitarás instalar los componentes Node del proyecto en tu sistema.

root@kitploit:~
node stealer.js ~/Downloads/cuddle_asdf1234.json

Eliminar instancia

Mata una instancia de navegador cuando no la necesitas. A veces los usuarios no te inician sesión completamente. A veces la conexión WebRTC falla. A veces una sesión expira antes de que puedas usarla. En estos casos, este botón puede ayudarte a limpiar instancias de navegador inútiles a través del portal de administración.

Una nota sobre keylogs y datos de usuario

Cada navegador se genera con su propio "browser id" aleatorio y un directorio de datos de usuario correspondiente en la carpeta "user_data" del proyecto. En algunos casos donde 'stealer.js' no funciona, es posible que también necesites replicar los datos de usuario para esa instancia. Esto puede ser útil en casos que apuntan a servicios con una función "recordar este navegador" dependiendo de cómo se implemente esa función.

También hay un keylog.txt en cada directorio de datos de usuario con un keylog completo del usuario víctima. El keylog general en el portal de administración intenta tener en cuenta cosas como las teclas de retroceso, mientras que este keylog.txt tendrá todas las pulsaciones de teclas registradas.

Integración con Phishmonger

Ejemplo pm.json:

root@kitploit:~
{
  "tacking_id": "id",
  "logging_endpoint": "https://www.phishmongerserver.com/create_event",
  "admin_cookie": "admin_cookie=s3cret",
  "post_url_search": "ppsecure"
}

Bajo el capó

Esta herramienta funciona emparejando a los visitantes del sitio de phishing con un navegador Chrome automatizado, que se ejecuta en el servidor de phishing. Luego, una transmisión de video de la instancia de Chrome controlada por el atacante se transmite a la víctima de phishing a través de WebRTC, y todos los movimientos del mouse y las entradas del teclado proporcionados por el usuario se reenvían desde el navegador de la víctima a su instancia de Chrome asociada. El servidor utiliza websockets para rastrear víctimas, emparejarlas con navegadores, intermediar transmisiones de video WebRTC y actuar como hombre en el medio en las entradas del usuario. Por cada nuevo visitante, el servidor genera una nueva instancia de Chrome. Debido a que usamos Chrome Devtools Protocol (CDP) para controlar cada instancia de Chrome, podemos usar APIs como "Storage.getCookie" para extraer cookies de sesión de los sitios objetivo una vez que el usuario ha iniciado sesión por nosotros. También podemos intervenir en cualquier momento y controlar directamente cada instancia de Chrome, aprovechando el mismo método que usamos para dar a las víctimas control remoto en primer lugar.

El servidor Node realiza lo siguiente:

  • Inicia un nuevo navegador ("empty phishbowl") con una instancia de xvfb como pantalla virtual y navega una pestaña a la página de inicio de sesión objetivo
  • carga una página web personalizada, broadcast.html, con un script de configuración WebRTC en una nueva pestaña del navegador automatizado
  • el navegador se registra a través de websockets
  • la víctima visita el sitio y se registra a través de websockets
  • emparejar a la víctima con el navegador, intermediar la transmisión de video WebRTC a través de websockets y generar un nuevo navegador para la siguiente víctima
  • Los navegadores se rastrean mediante un ID aleatorio para permitir que los administradores "tomen el control" de una instancia de navegador o extraigan material de credenciales de una instancia.

Preguntas y respuestas

¿Por qué publicarías algo tan peligroso? (También conocido como, la pregunta que mi mamá me hace cada vez que hablo en Black Hat)

Tengo entendido que esta técnica se ha teorizado e incluso armado durante varios años (ver agradecimientos). Por lo tanto, mientras que los actores de amenazas pueden aprovechar esta técnica, y probablemente lo han hecho durante algún tiempo, los profesionales de seguridad ofensiva no han tenido una forma fácil de replicar esta técnica y pueden incluso desconocer su existencia. Mi intención al publicar la herramienta es permitir que los probadores de penetración y los equipos rojos usen BitM en operaciones para mostrar su impacto potencial y ayudar a los defensores de la red a prepararse para amenazas reales.

¿Cómo defiendo mi servicio de este tipo de ataque?

Primero, entiende que este ataque depende de la ingeniería social para que un usuario visite un sitio web malicioso. La lista blanca de dominios sería de gran ayuda para prevenir este y otros tipos de ingeniería social. Si confiamos en que los usuarios gestionen el 100% de los datos de credenciales (contraseña, OTP, SMS, PhoneFactor, notificación push, etc.) para un servicio web, entonces somos potencialmente vulnerables a este ataque. Por lo tanto, para frustrar este ataque, necesitamos aprovechar datos de credenciales que los usuarios no gestionen. Por ejemplo, se pueden emitir certificados TLS de cliente a los dispositivos del cliente, y solo serán válidos para el servicio web real. El certificado es gestionado por el navegador y el sistema operativo, y no hay forma de que el servidor de un atacante obtenga una copia del certificado TLS de la víctima. Otra opción es usar U2F o FIDO2 con hardware como un YubiKey para gestionar algunos de los datos de credenciales requeridos. No hay forma de que el sitio web de un hacker interactúe con un YubiKey conectado a la computadora de una víctima.

Usas Docker para Caddy pero no para el servidor Node. ¿Por qué?

No soy un experto en Docker (todavía). Si puedes idear una configuración simple con Docker, me encantaría recibir un pull request.

¿Qué pasa con el nombre tonto?

Es un juego de palabras con Cuttlefish (sepia), una criatura marina increíble que puede mimetizarse con su entorno, Phishing, porque requiere ingeniería social para realizar el ataque, y mal escrito intencionalmente para ser único, divertido y tonto. Me alegra pensar que este nombre de herramienta divertido se mencionará junto con hallazgos de riesgo crítico en informes de pentesting.

Agradecimientos

Aunque llegué a esta técnica e implementación de forma independiente, desde entonces he sabido que un par de otros investigadores me ganaron en el descubrimiento. Cada uno tomó un enfoque de usar clientes VNC basados en web para lograr un resultado similar. Es un enfoque intuitivo y podría ser aplicable para realizar ataques MitM contra otro software, no solo navegadores (¿VPN en el navegador tal vez?). Definitivamente vale la pena echarle un vistazo:

Franco Tommasi, Christian Catalano & Ivan Taurino https://link.springer.com/article/10.1007/s10207-021-00548-5

@mrd0x https://mrd0x.com/bypass-2fa-using-novnc/

También:

Agradecimiento a Daniel Aaron @majordmg por ayudar en las primeras etapas de la prueba de concepto de WebRTC.

Un enorme agradecimiento a RJ Stallkamp @Z3rO-C00L por arreglar y dar estilo a la interfaz de administración, y el nuevo logotipo genial.

Descargar herramienta