Automação da enumeração passiva de subdomínios utilizando Bash

1. O script

No decorrer da minha jornada como pesquisador em plataformas de bug bunty encontrei diversas tarefas repetitivas que poderiam ser automatizadas com scripts simples. O script abaixo busca em fontes publicas subdomínios, sendo mais especifico O primeiro argumento recebe um arquivo texto contendo os domínios em escopo, enquanto o segundo argumento define o arquivo onde serão gravados os subdomínios válidos encontrados, após ter executado o amass, subfinder e assetfinder em modo passivo sem realizar qualquer consulta DNS. O script valida se todos os subdominios são validos comparando-os com o input do primeiro argumento da linha, pois essas três ferramentas podem retornar subdomínios fora do escopo do programa. Após a verificação todos os subdominios são validados por meio do comando ping, alguns subdomínios não existem mais e essa etapa é essencial. O script foi testado apenas no Arch Linux.

#!/bin/bash
input=$1
output=$2
tmpfile="$(mktemp /tmp/meuoutput.XXXXXXXX)" || exit 1
tmpfile2="$(mktemp /tmp/meuoutput.XXXXXXXX)" || exit 1
tmpfile3="$(mktemp /tmp/meuoutput.XXXXXXXX)" || exit 1
tmpfile4="$(mktemp /tmp/meuoutput.XXXXXXxx)" || exit 1

sub_domains_finder() {
  for sub in $(cat "$input"); do
    echo "amass sub: $sub"
    amass enum -passive -d "$sub" -o "$tmpfile"
    awk 'NF' "$tmpfile" >> "$tmpfile2"
    > "$tmpfile"
    echo "subfinder sub: $sub"
    subfinder -d "$sub" -o "$tmpfile"
    awk 'NF' "$tmpfile" >> "$tmpfile2"
    > "$tmpfile"
    echo "assetfinder sub: $sub"
    assetfinder --subs-only "$sub" -o "$tmpfile"
    awk 'NF' "$tmpfile" >> "$tmpfile2"
    > "$tmpfile"
  done
}

remove_out_scope() {
  subs_finded=$(cat "$tmpfile2")
  compare=$(cat "$input")
  for subs in $subs_finded; do
    for wildcard in $compare; do
      if [[ $subs == $wildcard ]]; then
        echo "$subs" >> "$tmpfile3"
      else
	echo "$subs "fora do escopo""
      fi
    done
  done
  cat "$tmpfile3" | awk '!seen[$0]++' > "$tmpfile4"
}

ping_test () {
echo "Iniciando teste ping"
PING_COUNT=3                      # Quantos pings enviar para teste
TIMEOUT=2                      # Timeout em segundos por ping
  for target in $(cat "$tmpfile4"); do
    if ping -l 3 -c "$PING_COUNT" -W "$TIMEOUT" "$target" &> /dev/null; then
        echo "[ OK ] $target"
        echo "$target" >> "$output"
    else
        echo "[ FAIL ] $target"
    fi
  done
  # Espera só no final
  echo "[+] Teste concluído. Subdomínios ativos salvos em: $output"
}
sub_domains_finder
remove_out_scope
ping_test

2. Como usar.

2.1 Instale o amass, subfinder e assetfinder

2.1 copie o script e salve como texto com o nome script.sh

2.2 use o comando chmod +x script.sh

2.3 Insira os domínios em wildcard no formato texto. Exemplo:

*.exemplo1.com
*.exemplo2.com
*.exemplo3.com

2.4 Execute o script inserindo os dominios como primeiro argumento da linha e inserindo no segundo argumento a saída do script.

./script.sh dominios.txt subdominios.txt

2.6. Após toda a execução você terá todos os subdominio nesse 

dev.exemplo1.com
dev.game.exemplo1.com
hr.exemplo2.com
api.exemplo3.com
email.exemplo3.com