En esta publicación, voy a hablaros sobre una vulnerabilidad conocida como «Toma de control de subdominios» (subdomain takeover), explicaré en qué consiste y como podemos detectarla. Es posible que pueda ir actualizando esta entrada con nuevas herramientas o técnicas de descubrimiento, así que, te sugiero que la guardes en tus favoritos. 😉
¿En qué consiste la vulnerabilidad?
La vulnerabilidad de toma de control de subdominio, ocurre cuando un registro DNS (principalmente CNAME) habilita la delegación de zona a un servicio de terceros (Amazon S3, Azure, GitHub, Heroku, etc) y, pasado un tiempo, este servicio puede dejar de ser utilizado o borrado y reclamado por un usuario malintencionado, un ejemplo de un caso real sería el siguiente:
- El departamento de desarrollo de la empresa Hackpuntes, está trabajando en una aplicación web en pruebas, y solicita al departamento de infraestructuras que apunte el dominio test.hackpuntes.com a un servicio alojado en Amazon S3 dónde se encuentra la aplicación que están desarrollando.
- El departamento de infraestructura, añade un registro (CNAME o A) en el panel de configuración DNS del dominio hackpuntes.com para que el dominio test.hackpuntes.com apunte a hackpuntesenpruebas.amazonaws.com
- Después de 2 largos años, la aplicación está lista, y el departamento de desarrollo borra la aplicación de hackpuntesenpruebas.amazonaws.com pero se olvida de notificarlo al departamento de infraestructuras.
- Un usuario malintencionado, ahora tendrá la oportunidad de crear una aplicación maliciosa en hackpuntesenpruebas.amazonaws.com y aprovecharse que el dominio test.hackpuntes.com apunta a ella.
Aquí puedes ver una lista de servicios que pueden ser vulnerables.
Riesgos
Las grandes empresas, generalmente, no auditan su configuración DNS de forma periódica, esto hace que la toma de control de subdominio, sea un vector de ataque bastante jugoso para cualquier usuario malintencionado.
Este tipo de vulnerabilidades, en la mayoría de los casos, se consideran de gravedad alta ya que pueden llegar a comprometer el dominio principal o varios subdominios.
Para un atacante, es un escenario perfecto para realizar una campaña de phising que se aproveche de la reputación de una marca conocida (con la correspondiente mala reputación que conlleva), además, puede llevar asociado otros ataques de mayor severidad, dado que es bastante frecuente que las aplicaciones expongan las cookies de sesión a un dominio «comodín» (*.dominio.com), por lo que, desde cualquier subdominio se podría acceder a ellas (incluso aquellas que se marquen como seguras).
Mitigación
Mitigar esta vulnerabilidad es bastante sencillo, bastaría con crear un proceso estandarizado (o llevar un control) para agregar, modificar o eliminar las entradas en los registros DNS.
Por otra parte, los proveedores de servicios en la nube deberían de verificar la propiedad de un dominio (aunque la responsabilidad sea del usuario), como por ejemplo, la de GitLab.
Herramientas
Una de las herramientas para la enumeración de subdominios más populares, aunque hace uso de un proyecto independiente llamado subbrute (para fuerza bruta), mayormente realiza la enumeración de forma pasiva.
python sublist3r.py -d example.com
Nos permite obtener una vista previa de las tecnologías utilizadas a partir de una lista de subdominios, muy interesante herramienta para visualizar de manera rápida nuestra superficie de ataque.
./aquatone | targets.txt
Si disponemos de tiempo suficiente y contemplamos la fuerza bruta como una opción, esta herramienta de OWASP contiene buenos diccionarios y hace un excelente scraping en fuentes públicas, esta desarrollada en Go, por lo que te recomiendo que leas antes esta entrada.
amass -brute -d domain.com
Una de mis favoritas, podemos comprobar de manera rápida si la lista de subdominios son potencialmente vulnerables a la toma de control.
./subjack -w subdomains.txt -t 100 -timeout 30 -o results.txt -ssl
Encuentra las direcciones de correo electrónico, así como subdominios y los hosts virtuales. Sin embargo, en comparación con Sublist3r, proporciona menos resultados.
python theHarvester.py -d domain.com -b all
Otras técnicas
A parte del uso de herramientas, podemos utilizar otras técnicas, basadas en buscadores o en consultas a transferencias de zona para intentar completar la lista de subdominios, algunas técnicas son:
Transferencia de zona
La técnica más sencilla y básica es probar una solicitud AXFR directamente en el servidor DNS.
dig @ns.domain.com domain=.com AXFR
Google Dorking
Google hacking no puede faltar, podemos usar el operador site: para encontrar todos los subdominios que Google ha indexado.
site:dominio.com
Rapid7 DNS Dataset
Rapid7 proporciona de forma pública su repositorio con el objetivo de descubrir todos los subdominios que se encuentran en Internet, aunque hace muy bien su trabajo, la lista definitiva puede no estar completa, puedes leer más sobre ella aquí.
zcat snapshop.json.gz |
jq -r 'if (.name | test("\.domain\.com$")) then .name else empty end'
Censys.io
Buscador muy similar a Shodan, permite buscar palabras clave en certificados, y por lo tanto, descubrir nuevos subdominios.
https://censys.io/certificates?q=.domain
Crt.sh
Servicio en línea para la búsqueda de certificados emitidos por COMODO. Utiliza un conjunto de datos diferente al de Censys.
https://crt.sh/?q=%25.domain.com
Ejemplos de toma de control
Amazon
- Ve al panel S3
- Haz click en Crear.
- Configura el nombre del bucket como nombre de dominio de origen (es decir, el dominio que desea asumir)
- Haz click en Siguiente varias veces hasta terminar.
- Abre el bucket creado.
- Haz click en Cargar.
- Selecciona el archivo que se utilizará para la PoC (archivo HTML o TXT). Recomiendo nombrarlo de manera diferente a index.html
- En la pestaña Permisos, selecciona «Otorgar acceso de lectura público a este objeto».
- Después de cargar, selecciona el archivo y haga clic en Más -> Cambiar metadatos.
- Haz click en Agregar metadatos, seleccione Tipo de contenido y el valor debe reflejar el tipo de documento. Si es HTML, elija text/html.
- (Opcional) Si el bucket fue configurado como un sitio web.
- Cambia a pestaña Propiedades.
- Haz click en alojamiento web estático.
- Selecciona «Usar este bucket para alojar un sitio web».
- Como índice, elige el archivo que subiste.
- Haz click en Guardar.
Si todo fue bien, la toma de control está completa. Los archivos estarán presentes en la ruta URL apropiada. Si subiste el archivo poc.html, entonces será http://sub.example.com/poc.html.
GitHub
- Ve a la página del nuevo repositorio
- Establece el nombre del repositorio en el nombre de dominio canónico (es decir, {algo} .github.io del registro CNAME)
- Haz click en Crear repositorio.
- Sube el contenido usando git al repositorio creado.
- Cambia a la pestaña Configuración.
- En la sección de páginas de GitHub , elige la rama maestra como fuente
- Haz click en Guardar.
- Después de guardar, establece el dominio personalizado en el nombre de dominio de origen (es decir, el nombre de dominio que desea asumir)
- Haz click en Guardar
Heroku
- Abre la nueva aplicación Heroku .
- Elige el nombre y la región.
- Sube la PoC usando git a Heroku. El proceso se describe en la pestaña Implementar .
- Cambia a la pestaña Configuración .
- Desplázate hasta Dominios y certificados .
- Haz click en Agregar dominio.
- Proporciona el nombre de dominio que desea tomar, haz click en Guardar cambios .
- Puede tomar algún tiempo para que la configuración se propague.
Readme.io
- Ve al panel de control .
- Establece el nombre del proyecto y su subdominio . El subdominio no necesita coincidir con el dominio que está intentando tomar.
- En la barra lateral izquierda, ve a Configuración general -> Dominio personalizado .
- Establece el dominio personalizado en el dominio que desea adquirir.
- Haz click en Guardar .
Si has encontrado alguna vulnerabilidad de toma de control de subdominio, ¡Enhorabuena! Puede que hayas ganado $5000.
Hasta aquí la entrada, espero sacar tiempo para ir actualizándola!!!