Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →Headless Browsers
Explotar bots, crawlers y screenshots server-side
Respuesta rápida
¿Qué es Headless Browsers?
Las aplicaciones que usan headless browsers (Chrome, Firefox) para screenshots, crawling, o previews tienen un modelo de seguridad diferente al navegador normal: cache no particionado, file:// accesible, DevTools Protocol expuesto.
Severidad
Crítico
Frecuencia
Menos común
Payloads
7
Pasos
5
Severidad
Crítico
Frecuencia
Menos común
Payloads
7
Los headless browsers server-side no tienen las protecciones de un browser normal: no bloquean popups, no particionan cache entre orígenes, y pueden tener el Chrome DevTools Protocol (CDP) expuesto en el puerto 9222. Si puedes controlar la URL que visitan, tienes SSRF con capacidades de browser completo.
Dónde buscar
Screenshot services
Funcionalidades de 'captura de pantalla' de una URL. El bot visita la URL y genera una imagen.
Link preview
Previews automáticos cuando pegas un link (Slack, Discord, etc.). El bot fetch la URL.
Web crawlers
Spiders que indexan contenido. Si controlas la URL, controlas qué visitan.
PDF exporters
Puppeteer/Chrome como motor de PDF (mismo contexto que HTML to PDF pero con más capacidades).
Metodología
Identificar headless browser
Envía una URL tuya y analiza el User-Agent del request entrante. HeadlessChrome, PhantomJS, etc.
Probar file://
Envía file:///etc/passwd como URL. Si el screenshot lo muestra → LFI completo.
Probar SSRF
http://127.0.0.1:9222 (CDP), http://127.0.0.1:8080, http://169.254.169.254
Probar JavaScript execution
Envía una página con JS que haga fetch a servicios internos y exfiltre vía <img src>.
Buscar CDP expuesto
Si el puerto 9222 está abierto, puedes conectarte al DevTools Protocol → RCE.
Caso real
Headless Chrome screenshot → CDP expuesto → RCE
Screenshot service
La app permite capturar screenshots de URLs arbitrarias usando Headless Chrome.
Port scan vía timing
Enviar URLs a http://127.0.0.1:PORT. Puertos abiertos responden más rápido que cerrados.
CDP en puerto 9222
El Chrome DevTools Protocol está escuchando en localhost:9222 sin autenticación.
RCE vía CDP
Conectarse al CDP permite ejecutar JavaScript arbitrario → Runtime.evaluate → child_process.exec.
Lección: Los headless browsers deben estar en sandboxes aislados. El CDP nunca debe estar expuesto. Si controlas la URL que visita el bot, tienes SSRF con capacidades de browser completo.
Payloads
file:// LFI
file:///etc/passwd
SSRF localhost
http://127.0.0.1:9222/json (Chrome DevTools)
JavaScript exfil
<script>fetch("http://169.254.169.254/latest/meta-data/").then(r=>r.text()).then(d=>document.title=d)</script>Payloads avanzados(requiere cuenta)
CDP RCE
ws://127.0.0.1:9222/devtools/page/xxx → Runtime.evaluate({expression: 'require("child_process").execSync("id").toString()'})Firefox file URI bypass
security.fileuri.strict_origin_policy=false → cross-origin file read
Cache poisoning
Headless browsers no particionan cache → poison response para cross-origin read
XXE via XSLT (CVE-2023-4357)
Chrome ≤115: XSLT parser lee archivos via XML external entities
Contenido exclusivo
Crea tu cuenta gratis para acceder a payloads avanzados, scripts y técnicas de bypass
Crear cuenta gratisHerramientas
Chrome CDP client
Conectarse al Chrome DevTools Protocol para ejecutar JS remoto.
wscat -c ws://target:9222/devtools/page/ID
Nmap port scan
Verificar si el puerto CDP está expuesto.
nmap -p 9222 localhost
Tips
User-Agent revela el motor
HeadlessChrome, PhantomJS, wkhtmltopdf — cada uno tiene vulnerabilidades diferentes.
file:// = full read
Si el bot acepta file:// URLs, puedes leer cualquier archivo del servidor.
CDP = game over
Chrome DevTools Protocol sin auth permite ejecutar código arbitrario en el servidor.
Practica Headless Browsers con labs reales
Aplica estas técnicas en entornos seguros basados en reportes reales de bug bounty.