Utilizando o Nmap Scripting Engine (NSE) – Funcionalidade do Nmap que permite executar scripts do usuário (via @ClavisSecurity)

O artigo a seguir (Utilizando o Nmap Scripting Engine (NSE) – Funcionalidade do Nmap que permite executar scripts do usuário) está publicado no Blog Clavis e foi desenvolvido por Henrique Soares e Rafael Soares.

Utilizando o Nmap Scripting Engine (NSE) – Funcionalidade do Nmap que permite executar scripts do usuário

Introdução

Este artigo faz parte de uma série de artigos redigidos sobre a ferramenta livre e de código aberto Nmap (reduzido de “Network Mapper”). No primeiro artigo “Mapeamento de Redes com Nmap”[1], foram discutidas as funcionalidades mais comuns da ferramenta, abrangendo suas principais técnicas de descoberta de hosts, de varredura de portas, de detecção de versões de serviços e de identificação de sistema operacional. Neste artigo, o foco é no Nmap Scripting Engine (NSE), uma funcionalidade poderosa e flexível do Nmap, que permite a execução de scripts a fim de automatizar tarefas variadas.

O NSE é distribuído com o Nmap, junto com um conjunto de scripts maior a cada nova versão, e pode ser obtido através do site oficial [2]. Informações adicionais às apresentadas neste artigo podem  ser encontradas na documentação oficial do Nmap [3] e do NSE [4], no Portal NSEDoc de Referência do NSE [5] ou no livro de autoria do próprio Fyodor dedicado à ferramenta [6], que inclusive tem uma versão traduzida em português (pt-BR) [7]. Parte deste livro está disponível gratuitamente na Internet para leitura e consulta [8]. Vale mencionar que o capítulo do livro referente ao NSE faz parte do conteúdo disponibilizado.

Nos exemplos de alvo apresentados neste artigo, são utilizados apenas faixas de endereços IP privados definidos na RFC 1918 [9], a saber 10.0.0.0/8, 172.16.0.0/12 e 192.168.0.0/16, e o endereço scanme.nmap.org, que é um host preparado pelos próprios desenvolvedores da ferramenta para receber este tipo de varredura. Os leitores são encorajados a não executar varreduras sobre qualquer ativo que não seja de sua propriedade ou que se tenha autorização formal para isso.

Cursos Relacionados:

banner-2-certificacao-clavis-formacao-aduitoria-teste-de-invasao-pentest
CEH-2-Clavis-Certified-Ethical-Hacker2

Sobre o Nmap Scripting Engine

Como descrito anteriormente, o NSE é uma funcionalidade do Nmap poderosa, versátil e flexível, que permite a seus usuários desenvolver e compartilhar scripts simples e integrá-los às varreduras tradicionais do Nmap, a fim de automatizar tarefas variadas. Os usuários podem somente utilizar os scripts disponibilizados junto com o Nmap, modificar scripts existentes ou ainda desenvolver seus próprios scripts personalizados que atendam suas necessidades.

O NSE foi desenvolvido inicialmente com o objetivo de melhorar a descoberta de rede, incluir métodos mais sofisticados de detecção de versões e permitir a identificação de vulnerabilidades. Em sua versão atual, além destas funções, o NSE é capaz de detectar backdoors, explorar vulnerabilidades, realizar ataques de dicionário e de negação de serviço, detectar malwares remotamente, entre outros. Por se tratar de uma ferramenta tão versátil, é possível que surjam ainda scripts aplicáveis em novas situações não previstas pelos desenvolvedores e mantenedores do Nmap.

Os scripts executados pelo NSE são escritos na linguagem de script Lua [10]. A linguagem Lua foi Criada em 1993 no Laboratório de Tecnologia em Computação Gráfica da Pontifícia Universidade Católica do Rio de Janeiro (TecGraf/PUC-Rio) [11] e continua em desenvolvimento ativo ainda hoje. Lua é uma linguagem extensível, segura e portável, muito usada e já bastante depurada, além disto é considerada uma linguagem fácil de aprender (principalmente se já se conhece outras linguagens de script como perl, python ou outras linguagens como C/C++, Java, etc) e pequena para embutir (segundo a documentação da linguagem, uma distribuição completa, com código fonte, manual e binários para algumas plataformas cabem confortavelmente em um disquete). Atualmente, Lua é bastante usada no desenvolvimento de jogo, figurando em títulos como “World of Warcraft” e “Crysis”, e, mais recentemente, em ferramentas de segurança, como o Nmap, naturalmente, o Wireshark e o Snort 3.0.

O manual de referência oficial da linguagem Lua são os livros “Programming in Lua”, no momento da redação deste artigo, na segunda edição [12], e “Lua 5.1 Reference Manual” [13]. A primeira edição do livro “Programming in Lua” está disponível gratuitamente na Internet [14], bem como a edição atual do “Lua 5.1 Reference Manual” [15], que inclusive tem uma versão em português [16].

É importante frisar que não é necessário nenhum conhecimento de programação para executar os scripts prontos, distribuídos com o Nmap. Entretanto, caso se deseje desenvolver ou modificar scripts, além das bibliotecas padrão do Lua, o Nmap fornece diversas outras prontas para tratar requisições de diversos protocolos, módulos para ataques de dicionário e manipulação de wordlists, suporte para tratar transações SSL, entre muitas outras facilidades. Estas facilidades auxiliam os desenvolvedores, de forma que, mesmo que este se considere um programador mediano, seja possível desenvolver scripts para o NSE.

Outro adendo importante é que os scripts executados pelo NSE não são isolados em sandboxes de nenhuma espécie. Então evite utilizar scripts cuja procedência não pode ser atestada. Ainda assim, caso se queira executar scripts desenvolvidos pela comunidade, sem a auditoria da equipe do Nmap, audite-o você mesmo, pois este script pode, potencialmente, executar código arbitrário em seu sistema operacional.

Em 2010, o próprio Fyodor, juntamente com o desenvolvedor de scripts David Fifield, apresentaram palestras no DEFCON 18 e no BlackHat 10 sobre o NSE. Os vídeos destas palestras se encontram disponíveis na página oficial do Nmap [17]. Estas palestras tiveram como título “Mastering the Nmap Scripting Engine” e mostraram uma introdução ao uso do NSE e ao desenvolvimento de scripts e também estudos de caso onde ao NSE foi utilizado.

Quickstart

A forma mais simplista de executar uma varredura utilizando o Nmap e o NSE é executar a ferramenta somente com o parâmetros referente ao NSE, a saber “-sC”, sobre o alvo especificado. Esta varredura utiliza as opções padrão tanto para a descoberta de hosts quanto para a varredura de portas.

Esta varredura verifica se o alvo está ativo na rede utilizando o método de descoberta padrão, faz a varredura de portas utilizando o método de varredura padrão e executa os scripts classificados na categoria padrão. O resultado esperado de uma varredura como esta é:

  1. Verificação de atividade do alvo na rede;
  2. Listagem de portas abertas, fechadas e filtradas associadas ao nome do serviço que tradicionalmente utiliza cada porta, caso o alvo esteja ativo; e
  3. Saídas dos scripts que tiveram suas condições de execução satisfeitas e, por isto, foram executados pelo NSE.

Isto quer dizer que se um determinado serviço estiver sendo provido em uma porta diferente da que tradicionalmente é utilizada, o nmap fornecerá uma resposta incorreta sobre o serviço. Isto quer dizer que, por exemplo, se um servidor ssh, que tradicionalmente utiliza a porta 22, for configurado para prover o serviço na porta 80, tradicionalmente utilizada por servidores http, nesta varredura o nmap detectará um servidor http e não um ssh, como esperado. Para resolver este problema, é necessário incluir na varredura a detecção de versões de serviços.

Na seção, “Classificação dos Scripts” é discutido do que consiste a categoria padrão e quais são as categorias de scripts e como eles são classificados nas mesmas. As questões referentes ao método de descoberta de hosts, de varredura de portas e de detecção de versões de serviços foram tratadas no primeiro artigo da série, “Mapeamento de Redes com Nmap” [1].

Classificação dos Scripts

Os scripts disponibilizados pelo NSE são classificados quanto às categorias e ao tipo. As categorias dizem respeito à natureza da funcionalidade desempenhada e os tipos, à fase da varredura em que devem ser executados, isto é, as categorias classificam os scripts pelo que eles fazem e os tipo, pelo momento em que o mesmo são executados durante uma varredura. Vale frisar que um scripts pode ser classificado em mais de uma categoria e mais de um tipo, inclusive operando de maneira distinta nos diferentes momentos de execução. A listagem abaixo descreve cada categoria especificada no Portal NSEDoc de Referência do NSE [5].

  • auth: relacionados a mecanismos de autenticação e credenciais de acesso;
  • broadcast: fazem descoberta de hosts não listados como alvos através do envio de pacotes broadcast;
  • brute: visam descobrir credenciais de acesso através de ataques de dicionário;
  • default: é a categoria padrão, em que os scripts devem fornecer respostas rápidas, concisas e confiáveis, além de serem pouco intrusivos, de fornecerem informações úteis para a maior parte dos usuários e de não estressarem o alvo a ponto de ser detectado por seus administradores como um ataque;
  • discovery: visam descobrir ativamente mais informações sobre o alvo;
  • dos: tentam causar indisponibilidade do alvo, ao provocar erros no lado do servidor;
  • exploit: exploram uma dada vulnerabilidade conhecida;
  • external: fazem consultas legítimas a recursos de terceiros, não listados como alvos;
  • fuzzer: enviam pacotes contendo aleatórios ou inesperados pela aplicação servidor visando descobrir bugs e vulnerabilidades;
  • intrusive: representam considerável risco de provocar erros no lado do servidor, utilizar uma quantidade significativa de recursos ou estressar o alvo a ponto de ser detectado por seus administradores como um ataque;
  • malware: detectam remotamente se o alvo está infectado com um dado malware;
  • safe: representam pouco risco e não devem causar erros no lado do servidor, utilizar muitos recursos ou explorar brechas de segurança;
  • version: extendem a funcionalidade de detecção de versão do Nmap; e
  • vuln: verificam se há uma dada vulnerabilidade conhecida no alvo.

O NSE somente seleciona um script para execução sobre o alvo da varredura, caso certas condições pré-determinadas sejam atendidas. Estas condições são especificadas por regras que estão vinculadas ao tipo de script. A listagem abaixo descreve cada uma destas regras que definem os tipos de script, conforme especificado na documentação oficial do Nmap Scripting Engine [5].

  • prerule: são executados apenas uma vez, antes de todas as fases de varredura do Nmap, quando ainda não há informações a respeito dos alvos, e realizam tarefas que não dependem da especificação de alvos, como o envio de pacotes broadcast, por exemplo;
  • hostrule: são executados durante as fases de varredura do Nmap e são invocados apenas uma vez para cada um dos alvos especificados que forem detectados como ativos;
  • portrule: são executados durante as fases de varredura do Nmap e são invocados uma vez para cada instância detectada de um dado serviço encontrado em alvos detectados como ativos; e
  • postrule: são executados apenas uma vez, depois de todas as fases de varredura do Nmap e da execução de todos os outros scripts do NSE e são usados, principalmente, para formatar a saída do Nmap segundo uma regra pré-definida.

O que define se o script será executado é o tipo da regra e o conteúdo da regra em si. A regra é definida pelo desenvolvedor do script e pode estipular casos em que o script não deve ser executado, como a ausência da definição de determinados parâmetros, nível de privilégios do usuário que executou a varredura, até o resultado de outros scripts.

Dependências de Scripts

O NSE oferece também um esquema de dependências de scripts que é utilizando para estabelecer a ordem em que os scripts serão executados. Este esquema é útil em situações em que um script pode se beneficiar em utilizar a saída de um outro script. Entretanto, apesar do que o nome sugere, caso a dependência de um script não seja executada, este script poderá ser executado mesmo assim.

Um exemplo claro do funcionamento deste esquema são os scripts da categoria “brute”. Muitos scripts têm como dependência scripts da categoria brute, pois, se alguma credencial for obtida por um scripts desta categoria, esta credencial certamente será útil para outros scripts. Assim, ao relacioná-lo como dependência, fica garantido que o script de dependência será executado antes e a sua saída será repassada, melhorando ainda mais os resultados obtidos na execução do segundo script.

Sintaxe de Uso do Nmap Scripting Engine

Existem diversas maneiras distintas de executar o NSE. Duas delas, “-sC” e “-A”, executam somente os scripts da categoria padrão, que agora sabemos que se chama “default”. A opção “-A” representa a varredura agressiva do Nmap e equivale às opções “-sC -sV -O –traceroute”. Neste caso, o NSE também executa a categoria de scripts padrão e o Nmap ativa também a detecção de versões de serviços e a identificação de sistema operacional, que foram tratadas no primeiro artigo da série, “Mapeamento de Redes com Nmap” [1], e também a opção que traça a rota de transmissão dos pacotes.

Além destas, o NSE também pode ser executado a partir da opção “–script”, sendo esta a opção que pode ser configurada para executar scripts de outras categorias além da padrão. Esta opção é usada obedecendo a seguinte sintaxe:

  • –script script|categoria|diretório|expressão|all[,script|categoria|diretório|expressão]

Se a opção “–script” for usada com a categoria “default”, o NSE se comporta da mesma maneira que com as opções “-sC” e “-A”. Assim, os comandos abaixo são equivalentes e o NSE executa somente os scripts da categoria padrão:

A opção “–script” pode ser usada com nomes de scripts completos, nomes de categorias, nomes de diretórios, expressões ou a string “all”. O NSE busca por scripts identificados pela extensão “.nse”, que atendam as condições passadas no subdiretório “scripts” dos seguintes diretórios: o parâmetro da opção “–datadir”, o conteúdo das variáveis “$NMAPDIR” e “NMAPDATADIR”, aquele que contém o binário do nmap, aquele que contém o binário do nmap seguido de “../share/nmap”, “~/.nmap” e o atual.

Quando o NSE é executado com nomes de scripts completos, seguido ou não da extensão “.nse”, o NSE busca por script com o nome de arquivo passado e o executa se suas condições execução forem safisteitas. Seguem abaixo exemplos de varreduras que chamam um único script:

Quando o NSE é executado com nomes de categorias, o NSE busca todos os scripts pertencentes àquela categoria e os executa se suas condições execução forem safisteitas. Seguem abaixo exemplos de varreduras que chamam categorias:

  • nmap –script “default” scanme.nmap.org
  • nmap –script “auth,discovery,safe” 10.0.0.0/24

Quando o NSE é executado com nomes de diretórios, o NSE busca todos os scripts armazenados no diretório referido e os executa se suas condições execução forem safisteitas. Seguem abaixo exemplos de varreduras que chamam scripts armazenados em um diretório:

  • nmap –script “./custom_scripts” 172.16.0.0/28
  • nmap –script “/tmp/scripts,/usr/share/nmap/scripts” 10.0.0.0/24

Quando o NSE é executado com a string “all”, o NSE executa todos os scripts que encontrar se suas condições execução forem safisteitas. Segue abaixo um exemplo de varredura que chama todos os scripts:

  • nmap –script “all” 10.0.0.1

Quando o NSE é executado com uma expressão, o NSE busca todos os scripts referenciados pela expressão e os executa se suas condições execução forem safisteitas. Expressões podem conter caracteres coringas (“wildcards”) no estilo de scripts bash, parênteses que definem escopos e os operadores lógicos “and”, “or” e “not”.

  • nmap –script “http-* and ssh-* and not intrusive” scanme.nmap.org
  • nmap –script “intrusive and (brute or dos or exploit) and not (default or safe)” 178.16.0.1

Banner-CompTIA-Security+-Curso-Online-Oficial

Passando Parâmetros para Scripts

É possível passar argumentos para os scripts executados com o NSE através da opção “–script-args”. Os argumentos são passados em uma lista separada por vírgulas no formato “chave=valor”. A listagem de argumentos aceitos por cada script pode ser acessada diretamente na documentação de cada script no Portal NSEDoc de Referência do NSE [5].

Os argumentos pode afetar a apenas um ou todos os scripts executados. Quando um argumento deve afetar apenas um script, este deve ser passado usando a sintaxe “nome_script.chave=valor” ou, para passar mais de um argumento “nome_script={ chave1=valor1,chave2=valor2}”. Quando o argumento deve afetar todos os scripts executados, basta passar “chave=valor” que todos os scripts que aceitam o argumento “chave” o utilizarão. Seguem abaixo exemplos de varredura utilizando o NSE com passagem de parâmetros:

  • nmap –script ‘brute’ –script-args ‘user=”foo”,pass=”bar”‘ 10.0.0.0/24
  • nmap –script ‘safe’ –script-args ‘domain=”alvo.com”, smtp.domain= “alvomail.com”‘ 192.168.0.1
  • nmap –script ‘brute’ –script-args ‘smtp-brute={userdb=user2.txt,passdb=pass2.txt}, userdb=user1.txt,passdb=pass1.txt’ 172.16.0.1

Também é possível passar parâmetros em um arquivo texto através da opção “–script-args-file”. Para utilizar esta opção, os parâmetros devem ser escritos da mesma forma que seriam na modalidade passada na linha de comando e estar separados por vírgulas ou quebras de linha.

Conclusão

O Nmap Scripting Engine é uma funcionalidade do Nmap que inclui à varredura tradicional do Nmap diversas funcionalidades que permitem interrogar hosts na rede de maneira mais flexível e versátil. Este artigo discutiu as funcionalidades principais oferecidas pelo NSE, no entanto ainda há muitas outras funcionalidades do Nmap que não foram, se quer, mencionadas, como: opções de controle de desempenho, opções de evasão de firewalls/IDS/IPS, opções de spoofing, e muitas outras. O leitor é encorajado a buscar mais informações na documentação oficial do Nmap [3] e do NSE [4,5], no livro oficial [6,7,8] e outras fontes, como os webinars “NMAP – Software Livre para Exploração de Rede e Auditorias de Segurança”[18] e “Teste de Invasão com o Nmap Scripting Engine”[19], da Clavis.

Vale mencionar que, apesar de não haver legislação especifica que tipifique como crime o ato de executar varreduras de qualquer tipo em redes de qualquer espécie, o objetivo deste artigo não é incentivar os leitores a fazer varreduras aleatórias em redes que não são de sua propriedade ou que não se tenha autorização para fazê-lo, mas informar quanto a que tipo de informação relevante pode ser extraída destas varreduras e como estas podem ajudar em auditorias teste de invasão, depuração de firewalls ou administração de servidores, etc.

Referências

[1] Mapeamento de Redes com Nmap – Ferramenta de código aberto com diversas funcionalidades, http://www.blog.clavis.com.br/materia-sobre-mapeamento-de-redes-com-nmap-na-revista-seguranca-digital/

[2] Nmap – Free Security Scanner For Network Exploration & Security Audits, http://nmap.org/

[3] Nmap Official Documentation, http://nmap.org/docs.html

[4] Nmap Scripting Engine (NSE) Documentation, http://nmap.org/book/man-nse.html

[5] NSEDoc Reference Portal, http://nmap.org/nsedoc/

[6] Nmap Network Scanning. Gordon “Fyodor” Lyon, Insecure.com LCC Publishings. ISBN: 978-0979958717

[7] Exame de Redes com NMAP. Gordon “Fyodor” Lyon, Editora Ciência Moderna. ISBN: 978-8573938654

[8] Nmap Network Scanning, Gordon “Fyodor” Lyon, http://nmap.org/book/toc.html

[9] RFC 1918 – Address Allocation for Private Internets: http://tools.ietf.org/html/rfc1918

[10] The Programming Language Lua, http://www.lua.org/

[11] Laboratório de Tecnologia em Computação Gráfica – Pontifícia Universidade Católica do Rio de Janeiro, http://www.tecgraf.puc-rio.br/

[12] Programming in Lua, Second Edition. Roberto Ierusalimschy. Lua.org Publishing. ISBN: 978-8590379829

[13] Lua 5.1 Reference Manual. Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes, Lua.org Publishing. ISBN: 978-8590379836

[14] Programming in Lua, First Edition. Roberto Ierusalimschy, http://www.lua.org/pil/

[15] Lua 5.1 Reference Manual. Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes, http://www.lua.org/manual/5.1/

[16] Manual de Referência de Lua 5.1. Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes, http://www.lua.org/manual/5.1/pt/

[17] Mastering the Nmap Scripting Engine. Gordon “Fyodor” Lyon e David Fifield, DEFCON 18 e BlackHat 10, http://nmap.org/presentations/BHDC10/

[18] Webinar #4 – NMAP – Software Livre para Exploração de Rede e Auditorias de Segurança, http://www.blog.clavis.com.br/webinar-4-software-livre-para-exploracao-de-rede-e-auditorias-de-seguranca/

[19] Webinar #14 – Teste de Invasão com o Nmap Scripting Engine, http://www.blog.clavis.com.br/webinar-14-teste-de-invasao-com-o-nmap-scripting-engine/

Cursos Relacionados:

banner-2-certificacao-clavis-formacao-aduitoria-teste-de-invasao-pentest
CEH-2-Clavis-Certified-Ethical-Hacker2