Aprendiendo a enumerar subdominios - BoomerNiX

jueves, 9 de diciembre de 2021

Aprendiendo a enumerar subdominios

Cualquier paso previo a un pentest externo, un programa de bug bounty, etc. es conocer los recursos para luego proceder a lanzar los ataques y conseguir el premio. Me refiero a la etapa de reconocimiento, donde una de las tareas más importante es la enumeración de subdominio, cuantos más subdominios se tengan, más posibilidades de encontrar algo, vamos a ver en este post distintas técnicas, no se entrará a detalle técnico.

Todo lo que veremos aquí, es lo que he aprendido todo este tiempo trabajando con mi gran amigo Alexis Fernández (@six2dez1), y que será el encargado de revisar este post. Antes de empezar, aclarar algunos conceptos:


  • Subdomino != web. Me explico, el subdominio test.ejemplo.com puede ser válido, sin embargo la web https://test.ejemplo.com no existe, puede que este dominio corra otros servicios distintos y no HTTP. He visto ocasiones a autores de contenido recomendar pasar el httprobe o httpx a los subdominios encontrados para saber si están vivos, error, ese no es el concepto, solo detecta servicios HTTP y HTTPS.
  • Para enumerar subdominios haremos uso del protocolo DNS.


Una vez comentado estos 2 puntos, imaginemos que tenemos 2 subdominos (ftp.ejemplo.com y mysql.ejemplo.com) y queremos comprobar si están “vivos”, veamos cómo se hace y cómo no:


  • echo ftp.ejemplo.com  | httpx -silent > Ejemplo erróneo, solo estamos comprobando si es un servicio web.
  • resolveDomain -d domains.txt > Correcto, trabaja con DNS
  • puredns resolve domains.txt -r resolvers.txt  > Correcto


Viendo el último ejemplo, se añade el concepto de resolver, que no es otra cosa que un servicio encargado de traducir el nombre de dominio a su dirección IP, gracias a esto sabremos si un domino está vivo. Arriba se pasa un listado de resolvers, ¿por qué? Con las técnicas de enumeración se hacen muchísimas peticiones, cada resolver podrá tener un límite de peticiones por segundo, por lo que aprovisionando una lista, nos permitirá trabajar más rápido y sin problemas. ¿Y cómo se consigue tener un listado de resolvers válidos? ¿Sirve el mismo listado para todos?


Para conseguir esta lista se hace uso de una herramienta, llamada dnsvalidator. Y el listado no vale para todos, según la localización nos  dará un listado de resolvers considerados de confianza, es decir una persona que vive en México, no tiene el mismo listado que otra en España. Un ejemplo de resolver de confianza, 8.8.8.8, seguro que os suena.


Otro concepto a tener en cuenta, enumeración horizontal y vertical, es fácil de ver:


  • Horizontal: encontrar todos los recursos que pertenecen a una compañía (esta web te puede resultar interesante: https://domainbigdata.com).
  • Vertical: encontrar los subdominios pertenecientes a un dominio raíz (aquí nos vamos a centrar).


Enumerando subdominios


Se pueden diferenciar 2 técnicas, pasiva y activa. Sin entrar en mucho detalle, empezamos por la primera.


Enumeración pasiva


En esta enumeración no se va a interactuar en ningún momento con el objetivo, se pueden encontrar diferentes vías:


Fuentes Pasivas

Utilizar servicios como Shodan, Censys Virus Total. Si se quiere sacar el mayor provecho a la información obtenida en esta sección, se necesitaran API Keys de los distintos servicios, sin ellas la información será limitada. Algunas herramientas existentes: AmassFindomain, Subfinder.


Certificados

Usar el log de transparencia de los certificados SSL, a través de la web https://crt.sh/ o haciendo uso de una de las tools disponibles en GitHub: ctfr.


ID Analytics

A través de los ID de analytics, las páginas usan IDs para identificar el tráfico, normalmente si tienen más de un dominio/subdominio comparten estos códigos, por ejemplo Google Analytics. Se puede hacer uso de https://builtwith.com/ o https://hackertarget.com/ y consultando el histórico guardado. Además, con la tool que desarrollé (en Python y GO) AnalyticsRelationships, teniendo en cuenta que esta tool hace peticiones y estarías en modo “activo”, pero conceptualmente sería una técnica pasiva.


Enumeración activa


En este tipo de enumeración ya empezamos a interactuar con el objetivo, existen distintas técnicas aquí: fuerza bruta, permutaciones o scraping.


Fuerza Bruta

Esta técnica resultará familiar, ya que seguro que antes has oído hablar de los ataques de diccionario, aquí se va a pasar un dominio objetivo y un listado de posibles subdominios, por ejemplo:


  • Objetivo: ejemplo.com
  • Listado de subdominios: test, demo, api1.dev


Con estos datos se procedería a resolver los subdominios en búsqueda de los “vivos”, el listado a comprobar sería:


test.ejemplo.com, demo.ejemplo.com, api1.dev.ejemplo.com


 Para ello se puede hacer uso de puredns o shuffledns, me gusta más la primera.


Permutaciones


Las permutaciones están explicadas en el siguiente post, haciendo uso de la herramienta gotator o altdns . Da muy buenos resultados, ya que se suelen encontrar subdominios interesantes, pero requiere de buena capacidad de disco y tiempo para generar listados. Aquí se deja un ejemplo sencillo de que se trata esta técnica, se recibe un listado de dominios y/o subdominios y un listados de palabras a permutar, aquí:


  • Dominios: dev.ejemplo.com
  • Listado: api, test


Obteniendo la siguiente salida:


dev.ejemplo.com

api.dev.ejemplo.com

api-dev.ejemplo.com

apidev.ejemplo.com

test.dev.ejemplo.com

test-dev.ejemplo.com

testdev.ejemplo.com


Hay un muchas opciones, entre otras destacar aquellas que van a permitir ampliar profundidad (es decir agregar niveles de subdominios, por defecto solo hay un nivel de permutación), iterar números o reducir duplicados. 


Scraping


Esta técnica consiste en extraer subdominios de los archivos de código de las páginas web. La manera más ágil de hacer esta tarea, es partiendo de un listado de subdominios vivos, comprobar aquellos que tienen servicios HTTP/S corriendo (usar httptobe o httpx) y el listado pasarlo a una herramienta que haga el scraping y nos de la información que queremos. Se puede usar gospider o crawlergo, hasta ahora prefiero la primera.


Hasta aquí llega el post, existen más técnicas de enumeración, como aquellas que tienen que ver con hosts virtuales o a través de los tenants en los dominios que usen AzureAD.

Para finalizar, si estáis interesados en profundizar y ver ejemplos, os dejo la charla de Alexis en la H@cktivityCon, que lo explica muy bien. Y si quieres un artículo extenso que entra en detalle en los tipos de enumeración echa un vistazo al siguiente: subdomain enumeration guide,  de @sidxparab (está en inglés).


Y por supuesto la mejor herramienta que se ha creado en 2021, que no solo sirve para enumerar subdominios (opción -s), si no que automatiza todo el proceso de recon y facilita mucho el trabajo, y si no la conocías, ya estás tardando: reconftw.


reconftw - recon tool


No hay comentarios:

Publicar un comentario