Cuando estamos trabajando en un recon, nos interesa obtener la mayor superficie de ataque para nuestro cliente. En este post voy a hablar de una pequeña tool que he desarrollado para conseguir extraer dominios y subdominios de un objetivo gracias a su ID de Google Analytics (en ocasiones lo llamaré UA).
Esto es posible, gracias a que muchas compañías usan el mismo código identificador de Google en sus diferentes sitios.
La herramienta está en mi GitHub: AnalyticsRelationships. Tiene 2 versiones (una en GO y otra en Python).
Su funcionalidad es muy simple, dada una URL, el código se encarga de buscar un patrón para detectar:
- El enlace al googletagmanager, que nos va a dar un identificador de Google (o varios) , tiene una pinta como la que sigue: www.googletagmanager.com/gtm.js?id=GTM-XXXXXX (donde las X son letras mayúsculas o dígitos). Al hacer peticiones automatizadas con la tool veíamos ligeros cambios por ello se busca:
- www.googletagmanager.com/ns.html?id=GTM-XXXXXX y se reconstruye la URL.
- El código GTM.
- Directamente el código de Goole Analytics UA-YYYYYYYY-Y (donde las Y son dígitos, solo nos interesa hasta el último dígito antes del último guión).
- Una vez se tiene el resultado, si tenemos la URL del tagmanager, se hace una petición y se extraen los códigos UA (puede haber más de 1, pero algunos pueden diferir en el último dígito después del guión, en ese caso solo es uno para nosotros). Si el paso anterior nos da uno o varios UA, este paso lo saltaríamos.
- Consulta las webs builtwith.com y api.hackertarget.com para cada código UA, se combina el resultado y se muestra.
Este es el flujo no "recursivo", existe una rama llamada "DevSomeRecursion", que hace este proceso para cada nuevo dominio o subdominio que se va encontrando (evitando duplicados, con una lista de UAs y URLs consultadas.
A continuación se deja un ejemplo de ejecución en GO (salida ofuscada):
![]() |
Figura 1: AnalyticsRelationships en GO |
Los resultados se pintan en la salida estándar, el resto de información va a la salida del error, por ello se puede volcar en un fichero solo la información útil, un ejemplo en Python:
Y hasta aquí llega el post, como siempre, directo y al grano. ¡Hasta pronto!
No hay comentarios:
Publicar un comentario