Um pentester preguiçoso no bom sentido — que automatiza o repetitivo — vale por três que fazem tudo na mão. Bash é a cola que une ferramentas no Linux: com poucos laços e condicionais, você transforma tarefas tediosas (testar 254 IPs, tentar 100 subdomínios, repetir um comando sobre uma lista) em scripts que rodam sozinhos enquanto você pensa no próximo passo. Esta é sua primeira linguagem de automação ofensiva, e ela aproveita tudo que você já aprendeu de terminal na aula Linux essencial: o terminal é a sua bancada.

Shebang, permissão e variáveis

Todo script Bash começa com uma linha especial, o shebang, que diz ao sistema qual interpretador usar, e precisa de permissão de execução (lembra do chmod +x da aula Permissões, donos e privilégios: onde a escalação começa?):

#!/bin/bash
echo "Meu primeiro script ofensivo"
chmod +x script.sh    # torna executável
./script.sh           # roda

Variáveis guardam valores; você atribui sem espaços ao redor do = e lê com $:

#!/bin/bash
alvo="192.168.1.10"
porta=80
echo "Testando $alvo na porta $porta"

Um ping sweep em cinco linhas

O primeiro poder de verdade vem dos laços. Imagine que você quer descobrir quais hosts estão vivos numa rede /24 — 254 endereços. Ninguém faz isso na mão. Um for resolve, usando o ping (com -c 1, um único pacote, e -W 1, timeout de 1 segundo):

#!/bin/bash
# ping sweep: descobre hosts vivos em 192.168.1.0/24
for ip in $(seq 1 254); do
    ping -c 1 -W 1 192.168.1.$ip > /dev/null 2>&1 && echo "192.168.1.$ip está VIVO"
done

Destrinchando: seq 1 254 gera os números de 1 a 254; o laço monta cada IP; ping ... > /dev/null 2>&1 silencia a saída (só queremos saber se funcionou); e o && executa o echo somente se o ping teve sucesso. Rode isso contra sua rede de laboratório e, em segundos, você tem o mapa de máquinas vivas — um mini-scanner escrito por você em cinco linhas. É exatamente o tipo de automação que um profissional monta de improviso o tempo todo.

Condicionais e a convenção do [+]

Condicionais dão inteligência ao script — reagir conforme o resultado. A sintaxe do if em Bash é peculiar (atenção aos espaços dentro dos colchetes, que são obrigatórios):

#!/bin/bash
alvo="192.168.1.10"
if ping -c 1 -W 1 $alvo > /dev/null 2>&1; then
    echo "[+] $alvo respondeu — host ativo"
else
    echo "[-] $alvo não respondeu"
fi

Aquele prefixo [+] para sucesso e [-] para falha é convenção da cultura de segurança — você vai vê-lo na saída de quase toda ferramenta. Adotá-lo nos seus scripts é sinal de quem conhece o ambiente.

Uma ação por linha da wordlist

Agora combine laço + leitura de arquivo, o padrão mais útil do dia a dia: rodar uma ação sobre cada linha de uma lista. Suponha um arquivo subdominios.txt com candidatos a subdomínio; você quer ver quais existem de fato, resolvendo cada um com host:

#!/bin/bash
# testa quais subdomínios de uma wordlist realmente existem
dominio="exemplo.com"
while read -r sub; do
    if host "$sub.$dominio" > /dev/null 2>&1; then
        echo "[+] Encontrado: $sub.$dominio"
    fi
done < subdominios.txt

O while read -r ... done < arquivo percorre o arquivo linha a linha. Troque a wordlist e o domínio e você tem um enumerador de subdomínios funcional — a lógica por trás de ferramentas de reconhecimento que veremos no Bloco V, só que construída com suas próprias mãos, o que é justamente o princípio "o manual antes da ferramenta" do curso.

Argumentos tornam o script reutilizável

Dois recursos finais que aparecem sempre. Argumentos de linha de comando deixam o script reutilizável — $1 é o primeiro argumento, $2 o segundo, e assim por diante, tornando o script genérico em vez de ter valores fixos:

#!/bin/bash
# uso: ./sweep.sh 192.168.1
rede="$1"
for ip in $(seq 1 254); do
    ping -c 1 -W 1 $rede.$ip > /dev/null 2>&1 && echo "$rede.$ip VIVO"
done

Agora ./sweep.sh 10.0.0 varre outra rede sem editar o código. E os pipes encadeados (aula Linux essencial: o terminal é a sua bancada) muitas vezes resolvem, numa linha, o que pareceria exigir um script — extrair todos os IPs de um log e contar os únicos, por exemplo:

cat acesso.log | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort -u | wc -l
#   lê o log  | extrai padrões de IP        | ordena/unifica | conta

Onde o Bash fica desajeitado

O ponto sobre Bash é: ele é a ferramenta do "rápido e sujo". Para automações simples, encadeamento de comandos e glue entre ferramentas, é imbatível pela agilidade. Quando a lógica cresce — parsing complexo, manipulação de dados estruturados, criar pacotes de rede do zero — o Bash fica desajeitado, e é hora de subir para o Python, que é exatamente onde vamos nas próximas duas aulas. Mas não subestime o Bash: boa parte do trabalho diário de um pentester é resolvida com um for bem colocado. Do lado defensivo, vale saber que essas mesmas técnicas de automação servem ao Blue Team — varrer os próprios ativos, processar logs em massa, automatizar verificações de hardening. A automação é neutra; a intenção a direciona.

Fontes e leituras recomendadas

Exercícios

  1. O que é o shebang, e o que você precisa fazer a um script além de escrevê-lo para poder executá-lo?

    ✓ Resposta:

    O shebang (#!/bin/bash) indica qual interpretador executa o script. Além de escrevê-lo, é preciso dar permissão de execução com chmod +x script.sh.

  2. Escreva um laço for que percorra os IPs de 10.0.0.1 a 10.0.0.50 e imprima cada um.

    ✓ Resposta:

    for ip in $(seq 1 50); do echo "10.0.0.$ip"; done

  3. No comando ping -c 1 $ip > /dev/null 2>&1 && echo ativo, o que faz cada parte: -c 1, > /dev/null 2>&1 e &&?

    ✓ Resposta:

    -c 1 envia apenas um pacote de ping; > /dev/null 2>&1 descarta toda a saída e os erros (silencia o comando); && executa o echo somente se o ping foi bem-sucedido.

  4. Qual estrutura você usa para executar uma ação sobre cada linha de um arquivo, e qual a sintaxe básica?

    ✓ Resposta:

    A estrutura while read -r linha; do ... done < arquivo, que lê o arquivo linha por linha e executa o bloco para cada uma.

  5. Para que servem os argumentos $1, $2 num script, e que vantagem eles trazem?

    ✓ Resposta:

    São os argumentos passados na linha de comando ($1 o primeiro, $2 o segundo). Tornam o script reutilizável e genérico, evitando valores fixos no código e permitindo aplicá-lo a alvos diferentes sem editá-lo.