Bash Script Basics

Estrutura Inicial

A primeira linha sempre deve ser a shebang line:

#!/bin/bash

Exemplo básico de comandos em um script:

#!/bin/bash
nmap scanme.nmap.org
/PATH/TO/dirsearch.py -u scanme.nmap.org -e php

Argumentos de Código

Para tornar o script dinâmico e escolher qual site escanear, utilizamos argumentos:

  • $1, $2, etc.: Representam os argumentos passados na ordem.
  • $@: Representa todos os argumentos que foram passados.
  • $#: Representa o total de argumentos passados.

Exemplo com argumento:

#!/bin/bash
nmap $1
/PATH/TO/dirsearch.py -u $1 -e php

Variável de Ambiente PATH

  • O PATH especifica onde os binários executáveis estão no sistema Unix.
  • Para evitar digitar o caminho completo de uma ferramenta, podemos adicioná-la ao PATH: export PATH="PATH_TO_DIRSEARCH:$PATH"
  • Persistência: Para não perder a configuração ao reiniciar o terminal, o comando export deve ser colocado no arquivo ~/.bash_profile.

Execução e Boas Práticas

  • Salve o arquivo com a extensão .sh (boa prática em terminais Linux).
  • Forneça permissão de execução: chmod +x nome_do_script.sh ou chmod 700 nome_do_script.sh
  • Execute o script: ./nome_do_script.sh scanme.nmap.org

Variáveis e Condicionais

  • É possível definir variáveis como TODAY=$(date) ou DOMAIN=$1.
  • O Bash permite o uso de condicionais como if e case para controlar o fluxo do código.

Funções Você pode agrupar comandos em funções para reutilização:

nmap_scan() {
  nmap $1 > $DIRECTORY/nmap
  echo "The results of nmap scan are stored in $DIRECTORY/nmap."
}
nmap_scan # Chama a função

Parsing de Dados

  • grep: Usado para filtrar informações (ex: grep 80 TARGET_DIRECTORY/nmap).
  • Regular Expressions (Regex): Mais flexível para filtragem.
    • ^: Match no começo da string.
    • $: Match no final da string.
    • \S: Qualquer coisa que não seja espaço.
    • \s: Qualquer espaço.
    • Argumento -E: Indica o uso de regex estendida.

Agendando Scripts (Crontab)

Para economizar tempo e rodar comandos automaticamente, utiliza-se o Crontab -e.

  • Exemplo de agendamento: 12 30 * * * /home/kali/scan.sh (Roda o script scan.sh todos os dias às 12:30 PM).

Exemplo de Script Completo (Report)

#!/bin/bash
PATH_TO_DIRSEARCH="gobuster"
DOMAIN=$1
DIRECTORY=${DOMAIN}_recon
echo "Creating directory $DIRECTORY."
mkdir $DIRECTORY
 
nmap_scan() {
  nmap $DOMAIN > $DIRECTORY/nmap
  echo "The results of nmap scan are stored in $DIRECTORY/nmap."
}
 
dirsearch_scan() {
  $PATH_TO_DIRSEARCH -v -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -u $DOMAIN dir
  echo "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."
}
 
crt_scan() {
  curl "[https://crt.sh/?q=$DOMAIN&output=json](https://crt.sh/?q=$DOMAIN&output=json)" -o $DIRECTORY/crt
  echo "The results of cert parsing is stored in $DIRECTORY/crt."
}
 
case $2 in
  nmap-only) nmap_scan ;;
  dirsearch-only) dirsearch_scan ;;
  crt-only) crt_scan ;;
  *) nmap_scan; dirsearch_scan; crt_scan ;;
esac
 
echo "Generating recon report from output files..."
TODAY=$(date)
echo "This scan was created on $TODAY" > $DIRECTORY/report
echo "Results for Nmap:" >> $DIRECTORY/report
grep -E "^\s*\S+\s+\S+\s+\S+\s*$" $DIRECTORY/nmap >> $DIRECTORY/report
echo "Results for Dirsearch:" >> $DIRECTORY/report
cat $DIRECTORY/dirsearch >> $DIRECTORY/report
echo "Results for crt.sh:" >> $DIRECTORY/report
jq -r ".[] | .name_value" $DIRECTORY/crt >> $DIRECTORY/report

.