No último dia 23 de janeiro, o SANS divulgou em blog sobre Penetration Testing, um mini tutorial sobre automação de varredura de aplicações web. Ao realizar um teste de invasão, algumas tarefas podem ser mundanas e repetitivas. Para torná-las um pouco mais desafiadoras, desenvolver um script de automação para esses elementos de avaliação pode ser uma solução.
Além disso, a automatização de partes de um teste de penetração ajuda a padronizar a saída, e com isso, ser mais consistente, reprodutível, rigorosa e introduzir algum controle de qualidade. Esse tutorial apresentará alguns recursos do nmap e do Nikto que suportam a automação de scripts, além de criar um script simples de automação inicial.
Antes de começarmos a escrever um script para automatizar a tarefa, devemos ter uma maneira de documentar suas informações de destino. Geralmente, um arquivo de texto simples com um alvo por linha é o suficiente. Outros formatos, como XML, podem ser úteis dependendo das ferramentas que você pretende usar nos seus scripts automatizados.
NMAP
A popular ferramenta de varredura de portas, nmap, pode ler uma lista de alvos a partir de um arquivo através da opção “-iL”. O arquivo pode especificar os destinos no mesmo formato em que eles são inseridos na linha de comandos, e várias designações de destino podem ser colocadas em linhas separadas.
O exemplo a seguir mostra a flexibilidade que o nmap oferece na formatação de arquivos que ele pode ler através da opção “-iL”:
192.168.17.34
10.23-25.0.0/24
172.16.1.1-10
O parâmetro “-oA” permite que o nmap mostre os resultados em três arquivos separados associados às primeiras três opções de saída listadas a seguir:
- Normal: A mesma saída que o nmap envia para o STDOUTXML:
- Os resultados na estrutura de dados XML
- Greppable: Saída com resultados de varredura para cada host em uma única linha
- Script Kiddie: Os resultados estão em “L33T” speak
Essas saídas de arquivo podem servir de entradas para outras ferramentas.
Colocando as opções de entrada e saída juntas, o seguinte comando do nmap lerá os alvos do arquivo “targets.txt” e gerará os resultados de saída para os três formatos de arquivos úteis.
nmap -iL targets.txt -oA $(date +%Y%m%d)_nmap_tcp
A parte “$ (date +% Y% m% d)” do nome do arquivo no comando anterior faz com que a data atual seja prefixada aos nomes de arquivo criados pelo nmap.
Nitko
Outra ferramenta comumente utilizada para realizar varreduras iniciais de aplicações web é o Nikto. Essa ferramenta tem o objetivo de procurar por vulnerabilidades comuns de aplicações web associadas a softwares desatualizados, configurações incorretas e arquivos perigosos.
O Nikto tem a opção de ler um arquivo de formato greppable do nmap, ou seja, ler um arquivo de texto com alvos listados dentro e a especificação de um destino na linha de comando torna a seleção de destino versátil. Cada uma dessas maneiras de hospedar hosts pode ser especificada usando a opção “-h”.
Existem várias condições nas quais o Nikto pode solicitar mais informações, pausando o processo de verificação até que uma resposta seja recebida. Para evitar uma situação em que o Nikto fique aguardando feedback, em vez de verificar os alvos, as opções a seguir podem ser usadas para desativar prompts.
- -ask no: desativa o prompt que pergunta se você deseja enviar novos banners para o software identificado durante a verificação.
- -nointeractive: desativa todos os outros prompts.
Muito parecido com o NMAP, o Nikto também tem a capacidade de salvar resultados em vários formatos de arquivo usando a opção “-Format”. Alguns dos formatos disponíveis incluem os da seguinte lista:
- -Formato HTM: Salva um relatório formatado em HTML.
- -Formato CSV: salva os resultados do Nikto no formato de valor separado por vírgulas.
- -Format XML: os resultados são armazenados no formato XML.
Vários tipos de arquivo podem ser especificados após a opção “-Format”, separando-os com uma vírgula. Além disso, o Nikto pode salvar um arquivo de replay associado a cada relatório, facilitando a inserção e a verificação de descobertas ou a exploração da vulnerabilidade.
O seguinte exemplo de comando do Nikto lê o arquivo “nmap_output.gnmap” para hosts para os quais o protocolo HTTP / HTTPS foi descoberto, desativa todos os prompts interativos e salva um relatório no arquivo “nikto_nmap-scans.html” usando o formato HTML.
nikto -host nmap_output.gnmap -ask no —nointeractive -Format htm -output nikto_nmap-scans.html
Bash Script Magic
Com os recursos específicos do script do nmap e Nikto, é hora de construir um script de automação básica. Ele pode ser usado para iniciar o processo de automação e expandido para incluir mais ferramentas.
Configuração de script
Para iniciar o script, é melhor definir o caminho para o interpretador de comandos que você deseja que o script use, nesse caso, apontaremos para bash. Posteriormente, a definição de algumas variáveis, “ports” e “date”, será útil para este script.
- ports : armazena a lista de portas que o Nikto irá escanear. Para este script inicial, o foco será em 80 / tcp e 443 / tcp.
- data : armazena a data a ser usada como timestamp em nomes de arquivos.
O início do script será assim:
#!/bin/bash
ports="80 443"
curdate=$(date +%Y%m%d)
O $ (date +% Y% m% d) é usado para executar o comando date com parâmetros para especificar o formato YYYYMMDD e sua saída será armazenada na variável $ curdate.
Guarde esses IPs
As ferramentas executadas pelo script precisarão dos endereços IP dos destinos a serem executados. Existem muitas táticas para fornecer os detalhes de segmentação, alguns dos quais dependem dos recursos da ferramenta. Embora o Nikto possa ler um arquivo de saída grepable nmap, para fins de demonstração, vamos ver como os endereços podem ser extraídos da saída do nmap.
Grep é uma ferramenta que pesquisa através de um arquivo e retorna a linha que corresponde a uma consulta especificada.
- O seguinte comando grep poderia retornar os resultados mostrados abaixo:
grep '80/open' $curdate\_nmap_tcp.gnmap
Host: 10.10.10.10 () Ports: 80/open/tcp//http///
O comando cut pode extrair uma seção do texto usando um delimitador.
- No exemplo a seguir, o caracter espaço será usado como delimitador e o segundo “campo” será extraído. Com base na saída anterior, isso deve isolar o endereço IP do host com a porta 80 / tcp disponível.
$grep '80/open' $curdate\_nmap_tcp.gnmap | cut —d ' ' -f2
10.10.10.10
Outra maneira de extrair o endereço IP usa a ferramenta awk.
- Esse comando procura instâncias em que a porta 80 / tcp é relatada como aberta e, em seguida, imprime o segundo campo em cada um dos resultados da pesquisa. Por padrão o awk usará espaço em branco (abas e espaços) como o delimitador de campo.
$awk '/80\/open/{print $2}' $curdate\_nmap_tcp.gnmap
10.10.10.10
Note que nos comandos anteriores a variável “$ curdate” foi usada como parte do nome do arquivo. O “\ _” no nome do arquivo usa a barra invertida para dizer ao bash que o “_” é um caractere de sublinhado literal e não parte da variável “$ curdate”. Caso contrário, o bash procuraria a variável “$ curdate_nmap_tcp.gnmap”, que não existe.
Enviando para um loop
Bash inclui a capacidade de iterar através de um conjunto de itens usando o for
loop. Um exemplo simples do for
loop é:
$for a in hello there; do echo $a; done;
hello
there
O loop acima percorreu os dois itens hello
e there
, em seguida, escreveu cada item para stdout usando o comando echo.
Existem alguns recursos de for
loops que são úteis em scripts.
- Os loops podem ser aninhados dentro um do outro para percorrer vários conjuntos de dados. Como pode ser visto no trecho de código abaixo, o script irá percorrer cada uma das portas especificadas na variável $ ports, assim como todos os endereços IP dentro da saída do nmap.
- O ponto-e-vírgula (“;”) pode ser substituído por um retorno de carro para facilitar a leitura do loop em um script.
- O conjunto de itens que o
for
loop percorrerá pode ser retornado por um comando.- Como exemplo, o comando a seguir fará um loop em cada um dos resultados no comando ls e os imprimirá na tela.
for a in $(ls -1); do echo $a; done;
Neste ponto, os detalhes sobre como extrair os endereços IP e os loops for podem ser combinados.
for testport in $ports
do for targetip in $(awk '/'$testport'\/open/{print $2}' $curdate\_nmap_tcp.gnmap)
do nikto -host $targetip -ask no —nointeractive
done
done
O script de automação inicial
Todas as peças necessárias para construir o script de automação inicial foram apresentadas. O bloco de código a seguir coloca tudo junto.
#!/bin/bash
ports="80 443"
curdate=$(date +%Y%m%d)
nmap —n -Pn -iL targets.txt -oA $curdate\_nmap_tcp —-reason
for testport in $ports
do for targetip in $(awk '/'$testport'\/open/{print $2}' $curdate\_nmap_tcp.gnmap)
do nikto -host $targetip:$testport -ask no —nointeractive -useragent "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1" -Format htm -output
$curdate\_nikto_$targetip\_$testport.html
done
done
Mude o script, adicione suas ferramentas favoritas e aproveite os ganhos de produtividade em sua metodologia de teste de invasão.
Para mais detalhes sobre o tutorial, clique aqui.