SANS Lança Tutorial Sobre Automação de Varredura de Aplicações Web

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 forloop. Um exemplo simples do forloop é:

$for a in hello there; do echo $a; done;
hello
there

O loop acima percorreu os dois itens hellothere, em seguida, escreveu cada item para stdout usando o comando echo.

Existem alguns recursos de forloops 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 forloop 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.