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.com2.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.txt2.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