Stored XSS to Domain Takeover
Plataforma de hosting cloud con feature de impersonacion de cuentas (Access Manager). Un Stored XSS en el nombre de las plantillas de email se activa al duplicarlas ("Copy of: PAYLOAD"). El XSS ejecuta en la sesion real de la victima (no impersonada), bypaseando las restricciones de permisos para modificar DNS records y lograr domain takeover.
Learn to find this bug
This bug paid $1,200 on HackerOne.
Create your account and practice real bugs that got paid. Download the environment, find it and learn the exact technique — your path to your first bounty.
- hunters training
- 650
- labs from real reports
- 50
- completions
- 380
- in bounties practiced
- $200,000
hunters training
labs from real reports
completions
in bounties practiced
Access to all labs · no commitment · cancel anytime
Hunters who solved it· 7
Objectives
Achievement you'll earn
Solve this lab to unlock this shareable achievement
Stored XSS to Domain Takeover
Community writeups
La aplicacion
NexusHost es una plataforma de hosting cloud donde los usuarios gestionan servidores, dominios con DNS, y plantillas de email. La app incluye:
- Gestion de Servidores — Ver servidores con specs, estado, region y coste
- Gestion de Dominios — Dominios con registros DNS editables (A/CNAME), SSL, auto-renovacion
- Plantillas de Email — Crear, editar, duplicar y eliminar plantillas de correo
- Access Manager — Invitar a otros usuarios a impersonar tu cuenta con permisos limitados
- Panel Admin — Estadisticas de la plataforma, gestion de usuarios, log de actividad
La vulnerabilidad
La pagina de plantillas renderiza los nombres con dangerouslySetInnerHTML (para soportar "nombres ricos"). Al duplicar una plantilla, el nombre se genera como Copy of: ${original.name} sin sanitizar.
Si el nombre original contiene HTML/JavaScript, al duplicar se crea una plantilla con XSS persistente que se ejecuta cada vez que alguien ve la lista de plantillas.
La restriccion de permisos
Los usuarios que impersonan una cuenta tienen permisos limitados:
- Pueden ver servidores, dominios, y gestionar plantillas
- NO pueden modificar DNS — el endpoint devuelve 403 "DNS modifications not permitted in impersonation mode"
El bypass via XSS
El XSS se ejecuta en el contexto del navegador de la victima (sarah_wilson), que revisa sus plantillas cada 15 segundos. Como la victima NO esta impersonando (es su propia sesion), el XSS puede hacer fetch PUT /api/domains/:id/dns con exito, cambiando el destino DNS del dominio.
El health check de DNS
Cada 10 segundos, el servidor verifica los dominios enviando un POST con la flag al dns_target configurado. Cuando el atacante cambia el DNS a su propio servidor, recibe la flag.
Cadena de ataque completa
1. Registrarse como atacante
2. Access Manager → Solicitar acceso a sarah_wilson → Auto-aceptado
3. Impersonar sarah_wilson
4. Intentar cambiar DNS directamente → 403 (bloqueado)
5. Crear plantilla con XSS en el nombre
6. Duplicar plantilla → "Copy of: <img src=x onerror=fetch(...)>"
7. Dejar de impersonar → Bot renderiza plantillas cada 15s
8. XSS ejecuta en sesion de sarah → cambia DNS a host.docker.internal:9999
9. Montar servidor HTTP en puerto 9999
10. DNS health check (10s) → POST /health-check con flag
Payload XSS de ejemplo
SCREEEETTTTT
Recibir la flag
# Opcion 1: Python
python3 -m http.server 9999
# Opcion 2: Netcat
nc -lp 9999
# Recibiras un POST a /health-check con body:
Solucion interactiva
Accede a /writeup dentro de la aplicacion para una guia paso a paso con botones que ejecutan cada peticion automaticamente.
Remediacion
- Sanitizar todo input antes de renderizar — usar textContent en vez de innerHTML
- Nunca usar dangerouslySetInnerHTML con datos de usuario sin sanitizar
- Implementar Content Security Policy que bloquee scripts inline
- Requerir re-autenticacion para cambios criticos como DNS
- Auditar y alertar sobre modificaciones de DNS en tiempo real