Como Hacerlo Web & Internet

Cómo Escribir tu Propio Script de Enumeración de Subdominios para un Mejor Reconocimiento

Hay montones de herramientas que hacen todo tipo de reconocimientos, pero puede ser difícil decidir qué usar. Una buena manera de ser más eficiente es aprovechar los scripts. Esto no tiene que significar escribir todo desde cero, sino simplemente integrar las herramientas existentes en un único y completo script. Por suerte, es fácil crear su propio script de enumeración de subdominios para un mejor reconocimiento.

1. Instalar las dependencias

Antes de empezar, hay algunas cosas que necesitamos instalar y configurar para que todo funcione correctamente. En primer lugar, asegúrese de que Go y Subfinder están instalados en el sistema. En segundo lugar, vamos a utilizar una herramienta llamada assetfinder para el reconocimiento adicional de subdominios; podemos obtener la última versión de GitHub con:

~# wget https://github.com/tomnomnom/assetfinder/releases/download/v0.1.0/assetfinder-linux-amd64-0.1.0.tgz

--2021-04-28 15:00:12-- https://github.com/tomnomnom/assetfinder/releases/download/v0.1.0/assetfinder-linux-amd64-0.1.0.tgz
Resolving github.com (github.com)... 140.82.114.4
Connecting to github.com (github.com)|140.82.114.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/193392376/6e64a200-d33f-11e9-9d79-2165e6e68bb1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210428%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210428T200012Z&X-Amz-Expires=300&X-Amz-Signature=3704ee96ec028f1ac8de3a3af870351ff434bdbd1150e3893a2cd02d43113b71&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=193392376&response-content-disposition=attachment%3B%20filename%3Dassetfinder-linux-amd64-0.1.0.tgz&response-content-type=application%2Foctet-stream [following]
--2021-04-28 15:00:12-- https://github-production-release-asset-2e65be.s3.amazonaws.com/193392376/6e64a200-d33f-11e9-9d79-2165e6e68bb1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210428%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210428T200012Z&X-Amz-Expires=300&X-Amz-Signature=3704ee96ec028f1ac8de3a3af870351ff434bdbd1150e3893a2cd02d43113b71&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=193392376&response-content-disposition=attachment%3B%20filename%3Dassetfinder-linux-amd64-0.1.0.tgz&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.217.46.132
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.217.46.132|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3739744 (3.6M) [application/octet-stream]
Saving to: ‘assetfinder-linux-amd64-0.1.0.tgz’

assetfinder-linux-amd64-0.1.0.tgz 100%[=====================================================================================>] 3.57M 1.78MB/s in 2.0s

2021-04-28 15:00:14 (1.78 MB/s) - ‘assetfinder-linux-amd64-0.1.0.tgz’ saved [3739744/3739744]

Y utilizar tar para extraer el binario:

~# tar xzf assetfinder-linux-amd64-0.1.0.tgz

Luego, mueve el assetfinder a un directorio en nuestra ruta:

~# mv assetfinder /usr/local/bin/

En tercer lugar, necesitamos una herramienta llamada httprobe, que nos permitirá filtrar los Live Hosts en nuestros resultados. Obtenga la versión de GitHub con:

~# wget https://github.com/tomnomnom/httprobe/releases/download/v0.1.2/httprobe-linux-amd64-0.1.2.tgz

--2021-04-28 15:05:40-- https://github.com/tomnomnom/httprobe/releases/download/v0.1.2/httprobe-linux-amd64-0.1.2.tgz
Resolving github.com (github.com)... 140.82.114.4
Connecting to github.com (github.com)|140.82.114.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/80510806/d4c97700-afc2-11e9-9a18-8f50cc10ac23?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210428%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210428T200541Z&X-Amz-Expires=300&X-Amz-Signature=35781254f155f3fd67a026f17035c7fa9f0124feed26e08a305266c73eff08f0&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=80510806&response-content-disposition=attachment%3B%20filename%3Dhttprobe-linux-amd64-0.1.2.tgz&response-content-type=application%2Foctet-stream [following]
--2021-04-28 15:05:41-- https://github-production-release-asset-2e65be.s3.amazonaws.com/80510806/d4c97700-afc2-11e9-9a18-8f50cc10ac23?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210428%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210428T200541Z&X-Amz-Expires=300&X-Amz-Signature=35781254f155f3fd67a026f17035c7fa9f0124feed26e08a305266c73eff08f0&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=80510806&response-content-disposition=attachment%3B%20filename%3Dhttprobe-linux-amd64-0.1.2.tgz&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.217.44.212
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.217.44.212|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3555994 (3.4M) [application/octet-stream]
Saving to: ‘httprobe-linux-amd64-0.1.2.tgz’

httprobe-linux-amd64-0.1.2.tgz 100%[=====================================================================================>] 3.39M 1.61MB/s in 2.1s

2021-04-28 15:05:43 (1.61 MB/s) - ‘httprobe-linux-amd64-0.1.2.tgz’ saved [3555994/3555994]

Descomprimir el binario:

~# tar xzf httprobe-linux-amd64-0.1.2.tgz

Y moverlo a un directorio en nuestra ruta:

~# mv httprobe /usr/local/bin/

En cuarto lugar, necesitamos configurar un par de cosas para Go. Primero, crear un directorio llamado go:

~# mkdir /usr/local/go

Utilice el siguiente comando para establecer la variable de entorno GOPATH:

~# go env -w GOPATH=/usr/local/go

Podemos confirmar que lo hemos configurado correctamente:

~# go env GOPATH

/usr/local/go

A continuación, tenemos que añadir GOPATH a nuestra ruta. Usa el siguiente comando, creando el directorio /bin si no existe ya:

~# export PATH=$PATH:$(go env GOPATH)/bin

A continuación, podemos hacer que nuestros cambios sean persistentes añadiendo la configuración a nuestro archivo .bashrc:

~# echo 'export GOPATH=/usr/local/go' >> ~/.bashrc

Utilice el siguiente comando para crear el archivo, haciéndolo persistente:

~# . ~/.bashrc

Por último, necesitamos una herramienta llamada Subjack; más adelante veremos lo que hace esta herramienta, pero por ahora, podemos instalarla con el comando go get:

~# go get github.com/haccer/subjack

Eso lo instalará automáticamente en nuestro GOPATH y lo dejará listo para ser usado. Y eso debería ser todo lo que necesitamos, así que ahora vamos a empezar nuestro script.

2. Iniciar la secuencia de comandos

Para empezar, crea un script y ábrelo con tu editor de texto favorito:

~# nano subrecon.sh

La primera línea que necesitamos, llamada shebang o hashbang, apuntará al intérprete del sistema. Esto le dice al sistema cómo ejecutar el archivo; en este caso, es un script Bash:

#!/bin/bash

A continuación, nos aseguraremos de que el usuario proporciona la entrada al script, y si no, imprime un ejemplo de uso y salida. Utiliza un bloque condicional if-then:

if [ -z $1 ]
then
echo './subrecon.sh <list of domains>'
exit 1
fi

El $1 es el argumento pasado al script, y la opción -z devuelve true si la cadena es nula. Así que básicamente, esto dice que si no se suministra ningún argumento, muestra el uso y salida. El argumento que pasaremos es una lista de dominios.

3. Enumerar subdominios

La primera acción que realizará nuestro script es enumerar los subdominios:

echo 'FINDING SUBDOMAINS...'

while read $line
do
        for var in $line
        do
                echo 'enumerating:' $var

                subfinder -silent -d $var > out1
                cat out1 >> subs1

                assetfinder -subs-only $var > out2
                cat out2 >> subs2

                rm out1 out2
        done
done < $1

Esto utilizará un bucle while para leer la entrada de nuestro archivo que contiene una lista de dominios, utilizar una variable para mostrar el dominio actual que se está enumerando, y recoger los resultados tanto de Subfinder como de assetfinder.

La siguiente sección combinará los resultados, eliminará los duplicados y guardará el resultado en un archivo llamado all_subs:

sort -u subs1 subs2 > all_subs
rm subs1 subs2
echo 'saved subdomains to all_subs'

4. Determinar los Live Hosts

La siguiente parte del script determinará qué hosts de los resultados anteriores están activos. Esto es extremadamente útil para acortar el tiempo que se tarda en revisar todo, ya que los hosts que están caídos no suelen ser de interés.

Esto tomará la lista de subdominios y usará httprobe para filtrar los live hosts, guardando los resultados en un archivo llamado live_subs:

echo 'FINDING LIVE HOSTS...'

cat all_subs | httprobe > live_subs
echo 'saved live hosts to live_subs'

5. Probar el Subdomain Takeover

Subdomain takeover es el proceso de registrar un nombre de dominio para obtener el control de otro dominio. Esto ocurre cuando un host, normalmente un subdominio, apunta a un servicio que ya no está en uso. El escenario más común es cuando un subdominio apunta a otro dominio, el registro DNS expira, y el dominio está disponible para ser registrado por alguien más. Cualquiera que pueda registrar el dominio con éxito tiene ahora el control total sobre el subdominio.

En algunos casos, este tipo de ataque no es posible debido a los métodos de verificación, pero te sorprendería saber cuántos servicios son vulnerables al Subdomain takeover. Los cubos de Amazon S3, las páginas de GitHub, Heroku, Shopify y Microsoft Azure son todos propensos a este ataque de alguna forma.

Subjack es una herramienta muy útil que probará una lista de subdominios para un potencial Takoever. Aquí, usaremos la bandera -w para un archivo de entrada y la bandera -a para enviar peticiones a cada URL:

echo 'CHECKING FOR SUBDOMAIN TAKEOVER...'

subjack -w all_subs -a

echo 'DONE'

Si algo de nuestra lista es vulnerable a subdomain takeover, los resultados se mostrarán en pantalla junto con el servicio asociado.

6. Revisar el script

El script final debería tener un aspecto similar al siguiente:

#!/bin/bash

if [ -z $1 ]
then
        echo './subrecon.sh <list of domains>'
        exit 1
fi

echo 'FINDING SUBDOMAINS...'

while read line
do
        for var in $line
        do
                echo 'enumerating:' $var

                subfinder -silent -d $var > out1
                cat out1 >> subs1

                assetfinder -subs-only $var > out2
                cat out2 >> subs2

                rm out1 out2
        done
done < $1

sort -u subs1 subs2 > all_subs
rm subs1 subs2
echo 'saved subdomains to all_subs'

echo 'FINDING LIVE HOSTS...'

cat all_subs | httprobe > live_subs
echo 'saved live hosts to live_subs'

echo 'CHECKING FOR SUBDOMAIN TAKEOVER...'

subjack -w all_subs -a

echo 'DONE'

Ahora es el momento de probarlo. Guarda el script y hazlo ejecutable:

~# chmod +x subrecon.sh

Y ejecútelo, proporcionando una lista de dominios a enumerar:

~# ./subrecon.sh domains.txt

FINDING SUBDOMAINS...
enumerating: wonderhowto.com
saved subdomains to all_subs
FINDING LIVE HOSTS...
saved live hosts to live_subs
CHECKING FOR SUBDOMAIN TAKEOVER...
DONE

Este es un buen comienzo, pero la belleza de este script es que puede ser fácilmente ampliado. Cualquier cosa útil para el reconocimiento, especialmente el reconocimiento de subdominios, puede ser añadido para hacer el proceso de enumeración único.

Para terminar

En este tutorial, hemos aprendido a escribir nuestro propio script de enumeración de subdominios en Bash. Primero, instalamos algunas dependencias y comenzamos con nuestro script. A continuación, utilizamos Subfinder y assetfinder para descubrir subdominios y combinar los resultados, y filtramos los hosts vivos con httprobe. Por último, utilizamos Subjack para comprobar un posible subdomain Takeover.

Síguenos en Facebook