viernes, 19 de mayo de 2023

Yaset - Enumeración de subdominios

¡Bienvenidos a una nueva entrada! Hoy os presento una herramienta que he programado en Go, Yaset, especializada en la enumeración pasiva de subdominios, para hacer recon.

Para realizar comparaciones, recopilar fuentes, hacer pruebas y apoyarme en el desarrollo, me he basado en una publicación de hace un año escrita por six2dez en el blog de YesWeHack, llamada Subdomains Tool Review, en la cuál compara distintas herramientas de enumeración pasiva, de DNS resolution/DNS bruteforcing y de alterations/permutations, por lo que agradezco mucho su trabajo :)

 

¿Por qué hacer Yaset?

Todo empezó porque estaba desarrollando un programa completo de autorecon en Go para monitorización de dominios 24/7 para hacer Bug Bounty, cuando dí con el post que he mencionado anteriormente y empecé a madurar esta idea. 

Al leer la comparación y pensar en los resultados y la diferencia entre unas herramientas y otras, pensé en cómo gestionan las fuentes cada una, que al final es lo que hace que una de mejores resultados que otra, y mirando los repositorios de las distintas tools pensé que podría ser interesante hacer algo que fuese muy fácil de ampliar para evitar este incoveniente, dando lugar a Yaset.

Como quería que la herramienta fuese por un lado y las fuentes por otro, tenía que crear un "motor" que tratase archivos externos al código de la propia herramienta, evitando tener que recompilar o modificar el código para añadir fuentes, por lo que pensé en crear plantillas, de forma que cada usuario pueda añadir fuentes creando simplemente archivos YAML donde se definen las llamadas a las APIs o webs. Estas plantillas se guardarán en el repositorio de yaset-templates y la herramienta en sí, en el de yaset.

La idea de las plantillas se originó pensando en las de nuclei, pero adaptadas a esta situación. Esto puede hacer que cuando yo con el tiempo según descubra o use fuentes distintas, o la comunidad, si la gente usa la herramienta, mejore el set de plantillas y el número de fuentes crezca, dando mejores resultados que ahora.


La herramienta

La principal función de la herramienta es la enumeración pasiva de subdominios, como he dicho, y para especificar el modo de enumeración pasiva se usa -p al ejecutar la herramienta. Estos dominios se pueden filtrar para mostrar sólo los que la herramienta puede resolver si se usa también un -r en la ejecución.

El otro modo de enumeración existente es -w y se usa dando como argumento un diccionario. Este modo es para realizar DNS brute forcing sobre el dominio que se le pasa a la herramienta. Este modo no está muy avanzado, ya que lo saqué de la otra herramienta que estaba desarrollando sin pensar muy bien cómo de óptimo es, por lo que quizás con el tiempo cambie su funcionamiento o la elimine si los resultados a la larga no me convencen.

Hay que elegir mínimo uno de los dos modos y pasar un dominio como argumento usando -d y el dominio a analizar.

En cuanto a la configuración de API keys para las fuentes, las plantillas se almacenan en un directorio llamado yaset-templates en el directorio personal del usuario y las API keys se almacenan en un archivo config.ini que por defecto la herramienta busca en ~/.config/yaset/config,ini, aunque se puede especificar uno diferente.

Para dar a la herramienta un archivo de configuración distinto al que viene por defecto, se usa -config junto a la ruta del archivo, y para realizar una comprobación del número de plantillas que están en uso y los problemas que tienen las que no, se usa -c.

Finalmente, para guardar los resultados, se puede usar -o y la ruta al archivo a escribir, o se puede usar tee o cualquier otra utilidad para redireccionar la salida a un fichero o a otra herramienta, a gusto o necesidad de lo que tengáis que hacer.


Las plantillas y configuración

Actualmente, hay un total de 31 plantillas escritas y son las que van a estar públicas en el repositorio de templates, pero espero que con el tiempo aumenten.

He añadido todas las fuentes compatibles con las actuales características de la herramienta, pero hay alguna que conozco y no he añadido porque hay limitantes al haber alguna lógica a seguir, que se necesiten varias peticiones, o algo parecido, pero tengo varias ideas para ampliar las funciones de la herramienta y que sea posible añadir estas fuentes con plantillas igual de simples que las de ahora.

El otro limitante encontrado ha sido que herramientas como amass tienen muchas fuentes de pago, pero como yo no tengo ahora mismo ningún servicio de este tipo, no encontraréis muchas plantillas que reciban API keys, sólo algunas que ofrecen una versión gratis o limitada. Aún así, si alguien quiere añadir una fuente puede escribir su propia plantilla y hacer un pull request o contactarme por telegram o twitter (@wh0issecure en telegram y @whoissecure en twitter), para enviarme una petición de ejemplo y una respuesta, y yo hago la plantilla para hacerla pública.

El formato de las plantillas es muy sencillo:

Está explicado en el README del repo, pero a modo de resumen: las plantillas definen una petición HTTP y el parseo de la respuesta mediante los parámetros que se indican ahí. La única complejidad que podéis encontrar si queréis añadir fuentes puede ser con la sintaxis de GJSON y aún así, no es algo muy complejo, además, se puede evitar en muchas ocasiones si se usa regexUse.

El uso de variables en las plantillas es sencillo, ahora mismo hay dos tipos: engine.target se sustituye por el dominio introducido para ser enumerado y las del tipo engine.config.service.key, que sería sustituida por el valor del campo key de la sección service del fichero de configuración usado, si lo hubiese.

Para añadir API keys, basta con editar el archivo de configuración que se quiera usar, ya sea uno que se deje en el directorio que coge la herramienta por defecto o uno personalizado, y añadir las API keys que tengas. En el repositorio de Yaset hay un archivo que viene preparado para meter las keys de las templates que voy a subir, pero si se añaden posteriormente más al repo o si tú añades tus propias templates, basta con añadirlas de la misma forma que las otras y con los valores que se referencien en la plantilla a usar.


Conclusión

La herramienta no es algo muy complejo y quizás los resultados que ofrezca ahora no sean los mejores por falta de fuentes, pero como veis, ampliarla es muy sencillo y a futuro, creo que puede tener potencial si añado fuentes de pago, que suelen ser las que mejores resultados dan y las que suele usar gente que se dedica a tiempo completo al bug bounty, ya que aumenta significativamente el alcance que tienen.

Yaset puede ser muy útil para pentesters, red teamers o bug hunters, aunque personalmente creo que la mayor utilidad está en el bug bounty, ya que ahora mismo, lo que se suele hacer para abarcar la mayor cantidad de fuentes posibles es tirar varias herramientas, lo que suele hacer que muchas peticiones se repitan, porque usan las mismas fuentes, cambiando sólo algunas entre tool y tool, haciendo ruido innecesario, perdiendo tiempo y consumiciones de las APIs.

Espero que os haya gustado Yaset, que le deis una oportunidad y que si os surgen ideas, problemas o cualquier cosa que queráis decir, lo hagáis, tanto por Github, donde podéis abrir issues o pull requests, como por mensajes de Twitter o Telegram. Muchas gracias por leerme una vez más. Os mantendré actualizados si Yaset va recibiendo características nuevas :)

No hay comentarios:

Publicar un comentario