Вы находитесь на странице: 1из 56

Capítulo 9.

Nmap Scripting Engine


Índice analítico
Introdução
Exemplos de uso e
Categorias de script
Tipos de script e fases
Argumentos de linha de comando
Script Seleção
Argumentos para Scripts
Exemplos completos
Formato Script
description Campo
categories Campo
author Campo
license Campo
dependencies Campo
Regras
Ação
Variáveis de ambiente
Linguagem de script
Lua Idioma Base
Scripts NSE
Bibliotecas NSE
Lista de todas as bibliotecas
Hacking Bibliotecas NSE
Adicionando módulos C para Nselib
Nmap API
Informações passadas para um script
Rede I / O API
Conecte-estilo de rede I / O
Raw pacote de rede I / O
Saída estruturados e não estruturados
Tratamento de Exceções
O Registro
Tutorial Escrevendo roteiro
O Chefe
A Regra
A Ação
Documentação Script escrito (NSEDoc)
Documentação Tag NSE
Paralelismo script em NSE
Threads de trabalho
Mutexes
Variáveis Condição
Multithreading colaborativo
O fio de base
Detecção A utilização NSE
Script exemplo: finger
Detalhes de implementação
Fase de Inicialização
Digitalização Script

Introdução
O Nmap Scripting Engine (NSE) é um dos recursos mais poderosos e flexíveis do Nmap. Ele
permite aos usuários escrever (e ação) simples scripts para automatizar uma grande variedade de
tarefas de rede. Esses scripts são executadas em paralelo com a velocidade e eficiência que se
espera de Nmap. Os usuários podem contar com o conjunto crescente e diversificada de scripts
distribuído com o Nmap, ou escrever seus próprios para atender às necessidades personalizadas.
Nós projetamos NSE de ser versátil, com as seguintes tarefas em mente:
A descoberta de rede

Este é o pão do Nmap e manteiga. Exemplos incluem olhando dados whois baseada no
domínio de destino, consultando ARIN, RIPE, APNIC ou para o IP de destino para determinar
a propriedade, realizando pesquisas sobre a ident portas abertas, as consultas SNMP, e
listagem disponíveis NFS / SMB / RPC partes e serviços.

Detecção versão mais sofisticada

O Nmap sistema de detecção de versão ( Capítulo 7, Serviço e Detecção de versão do


aplicativo ) é capaz de reconhecer milhares de diferentes serviços por meio de sua sonda e
assinatura de expressão regular baseado sistema de correspondência, mas não pode
reconhecer tudo. Por exemplo, identificando o serviço v2 Skype requer duas sondas
independentes, que a detecção de versão não é flexível o suficiente para lidar. Nmap também
pode reconhecer os serviços mais SNMP se ele tentou algumas centenas de nomes de
comunidades diferentes por força bruta. Nenhuma destas tarefas são bem adequados para a
detecção de versão tradicional Nmap, mas ambos são facilmente realizados com NSE. Por
estas razões, a detecção de versão agora chama NSE por padrão para lidar com alguns
serviços complicadas. Isso é descrito na seção chamada "Detecção de versão usando NSE" .

Detecção de vulnerabilidades

Quando uma nova vulnerabilidade é descoberta, muitas vezes você quer digitalizar suas redes
rapidamente para identificar sistemas vulneráveis antes de os bandidos fazem. Embora o
Nmap não é um abrangente scanner de vulnerabilidade , NSE é poderoso o suficiente para
lidar com verificações de vulnerabilidade mesmo exigentes. Muitos scripts de detecção de
vulnerabilidades já estão disponíveis e que pretende distribuir mais como eles são escritos.

Detecção Backdoor

Muitos atacantes e alguns worms automatizados deixar backdoors para permitir mais tarde a
reentrada. Alguns destes podem ser detectados por detecção normal do Nmap versão
expressão baseado. Por exemplo, dentro de horas após o verme MyDoom bater a Internet, Jay
Moran postou uma sonda de detecção de versão do Nmap e assinatura para que outros
pudessem rapidamente digitalizar suas redes para infecções MyDoom. NSE é necessário para
detectar com segurança vermes mais complexos e backdoors.

Exploração de vulnerabilidades

Como uma linguagem de script geral, NSE pode até ser usado para explorar vulnerabilidades
em vez de apenas encontrá-las. A capacidade de adicionar scripts personalizados exploit pode
ser valiosa para algumas pessoas (especialmente os testadores de penetração), embora não
estamos planejando transformar Nmap em um quadro de exploração tais como Metasploit .

Esses itens listados foram os nossos objetivos iniciais, e esperamos que os usuários do Nmap para
chegar com ainda mais usos criativos para NSE.
Os scripts são escritos na embutido linguagem de programação Lua , versão 5.2. A linguagem em si
é bem documentado nos livros de programação em Lua, Segunda Edição e Manual de Referência
Lua 5.1 . O manual de referência, atualizado para Lua 5.2, também disponível gratuitamente
online , como é o primeira edição da programação em Lua . Dada a disponibilidade destes
excelentes referências gerais de programação Lua, este documento abrange apenas aspectos e
extensões específicas para o motor do Nmap script.
NSE é ativada com o -sC opção (ou --script , se você desejar especificar um conjunto
personalizado de scripts) e os resultados são integrados Nmap normais e saída XML.
Uma varredura script típico é mostrado na Exemplo 9.1 . Scripts de serviço que produzem saída
deste exemplo são ssh-hostkey , que proporciona o sistema de RSA e DSA chaves SSH, e
rpcinfo , que consulta portmapper para enumerar os serviços disponíveis. O script host apenas
produzir saída deste exemplo é smb-os-discovery , que coleta uma série de informações de
servidores SMB. Nmap descobriu todas essas informações em um terço de um segundo.
Exemplo 9.1. Saída NSE típico
# nmap -sC -p22,111,139 -T4 localhost

Nmap partida (http://nmap.org)


Nmap relatório de verificação para flog (127.0.0.1)
PORT STATE SERVICE
22/tcp aberto ssh
| Ssh-hostkey: 1024 b1: 36:0 d: 3f: 50: dc: 13:96: b2: 6e: 34:39:0 d: 9b: 1a:
38 (DSA)
| _2048 77: d0: 20:01 c: 44:1 f: 87: a0: 30: aa: 85: cf: e8: ca: 4c: 11 (RSA)
111/tcp aberto rpcbind
| Rpcinfo:
| 100000 2,3,4 111/udp rpcbind
| 100024 estado 56454/udp 1
| _100000 2,3,4 111/tcp rpcbind
139/tcp netbios-ssn aberto

Hospedar resultados de script:


| Smb-os-descoberta: Unix
| LAN Manager: Samba 3.0.31-0.fc8
| _name: WORKGROUP

Nmap feito: um endereço IP (1 host up) verificados em 0,33 segundo

A introdução em vídeo de 38 minutos para NSE está disponível em


http://nmap.org/presentations/BHDC10/ . Esta apresentação foi feita pelo Fyodor e Fifield David na
Defcon e os Black Hat Briefings, em 2010.
Guia de
Intro Livro Guia de instalação
Referência
Baixar Mudanças Zenmap GUI Docs
Relatórios de Projetos
OS Detecção Propaganda
Bugs relacionados
Nos filmes Na Mídia

Patrocinadores

Remediate...Like a Boss (with Nmap and Risk


I/O)
Risk I/O aggregates vulnerabilities into one centralized location and
enables you to collaborate on all tasks, from detection to close. It uses
big data analysis to provide insight into what is happening within
your organization. Go. Be like a Boss.

Nmap Digitalização em Rede


Exemplos de uso e

Capítulo 9. Nmap Scripting Engine

Exemplos de uso e
Enquanto NSE tem uma aplicação complexa para a eficiência, que é notavelmente fácil de usar.
Basta especificar -sC para permitir que os scripts mais comuns. Ou especificar o --script
opção de escolher os seus próprios scripts para executar por categorias proporcionando, nomes de
arquivos de script, ou o nome de diretórios cheios de scripts que você deseja executar. Você pode
personalizar alguns scripts, fornecendo argumentos para eles através da --script-args e
--script-args-file opções. A --script-help mostra uma descrição do que cada roteiro
selecionado faz. As duas opções restantes, --script-trace e --script-updatedb ,
geralmente são utilizados apenas para a depuração de script e desenvolvimento. Varredura de script
também está incluído como parte do -A opção (scan agressivo).
Análise de scripts é feito normalmente em combinação com uma varredura de portas, pois os scripts
podem ser executados ou não funcionar, dependendo do estados porta encontrada pela verificação.
Com a -sn opção é possível executar uma varredura script sem uma varredura de portas, apenas a
descoberta de hosts. Neste caso, somente scripts de acolhimento serão elegíveis para ser executado.
Para executar uma verificação script com nem um anfitrião descoberta nem uma varredura de
portas, use o -Pn -sn opções em conjunto com -sC ou --script . Cada host será assumido se
e scripts de acolhimento ainda somente será executado. Esta técnica é útil para scripts como whois
que apenas usar o endereço do sistema remoto e não requerem que seja para cima.
Os scripts não são executados em uma caixa de areia e, assim, poderia acidentalmente ou
maliciosamente danificar o seu sistema ou invadir sua privacidade. Nunca executar scripts de
terceiros, a menos que você confiar os autores ou que auditar cuidadosamente os scripts de si
mesmo.

Categorias de script
Os scripts NSE definir uma lista de categorias a que pertencem. Categorias definidas atualmente e
vuln . Os nomes de categoria não são sensíveis. A lista a seguir descreve cada categoria.
auth

Esses scripts lidar com as credenciais de autenticação (ou ignorando-os) no sistema de


destino. Exemplos incluem x11-access , ftp-anon e oracle-enum-users . Scripts
que usam ataques de força bruta para determinar credenciais são colocados no brute
categoria.

broadcast

Scripts nesta categoria costuma fazer a descoberta de hosts não listados na linha de comando
de transmissão na rede local. Use as newtargets argumento de script para permitir que
esses scripts para adicionar automaticamente os anfitriões eles descobrem que a fila de
digitalização Nmap.

brute

Esses scripts usam ataques de força bruta para adivinhar credenciais de autenticação de um
servidor remoto. Nmap contém scripts para dezenas forçando bruta de protocolos, incluindo
http-brute , oracle-brute , snmp-brute , etc

default

Esses scripts são o conjunto padrão e são executados quando se utiliza a -sC ou -A opções
em vez de listar os scripts com --script . Esta categoria também pode ser especificado
explicitamente como qualquer outro uso --script=default . Muitos fatores são
considerados para decidir se um script deve ser executado por padrão:

Acelerar

Uma varredura padrão deve terminar rapidamente, o que exclui os biscoitos de força
bruta de autenticação web, aranhas, e quaisquer outros scripts que podem levar minutos
ou horas para digitalizar um único serviço.

Utilidade

Varreduras padrão necessita para produzir informações valiosas e acionável. Se até


mesmo o autor do script tem dificuldade em explicar por que uma rede de segurança
média ou profissional iria encontrar a saída valioso, o script não deve ser executado por
padrão. O script ainda pode valer a pena inclusive em Nmap para que os
administradores podem executar para aquelas ocasiões quando eles precisam da
informação extra.

Verbosidade

Nmap saída é usado para uma grande variedade de propósitos e precisa ser legível e
conciso. Um script que freqüentemente produz páginas cheias de saída não deve ser
adicionado ao default da categoria. Quando não há informação importante
denunciar, scripts NSE (sobretudo padrão) deve retornar nada. Verificação de uma
vulnerabilidade obscura pode ser OK, por padrão, desde que ele só produz saída quando
descobriu que a vulnerabilidade.

Confiança

Muitos scripts usar heurísticas e assinatura difusa de correspondência para chegar a


conclusões sobre o host de destino ou serviço. Exemplos incluem sniffer-detect
e sql-injection . Se o script é muitas vezes errado, não pertencem ao default
da categoria onde se pode confundir ou enganar os usuários casuais. Os usuários que
especificam um script ou diretamente categoria são geralmente mais avançado e
provavelmente sabe como o script funciona, ou pelo menos onde encontrar sua
documentação.

Intromissão

Alguns scripts são muito intrusivas, porque eles usam recursos significativos no sistema
remoto, são susceptíveis de travar o sistema ou serviço, ou sejam susceptíveis de ser
percebido como um ataque dos administradores remotos. O mais intrusivo script é, o
menos adequado é para o default da categoria. Scripts padrão são quase sempre no
safe categoria também, embora, ocasionalmente, permitir intrusive os scripts por
padrão, quando eles são apenas levemente intrusivo e marcar bem nos outros fatores.

Privacidade

Alguns scripts, em particular os da external categoria descrita posteriormente,


divulgar informações a terceiros por sua própria natureza. Por exemplo, o whois script
deve divulgar o endereço IP de destino para registros regionais whois. Temos também
considerado (e decidiu contra) adicionar scripts que verificam alvo SSH e SSL
impressões digitais chave contra Internet fracos dados-chave. O mais privacidade
invasiva script é, o menos adequado é por default inclusão categoria.

Não temos limites exactos para cada um destes critérios, e muitos deles são subjectivas. Todos
esses fatores são consideradas em conjunto para tomar uma decisão se a promover um script
para o default da categoria. A scripts padrão poucos identd-owners (o nome de
usuário determina a execução de serviços remotos usando identd), http-auth (obtém
esquema de autenticação e domínio de sites que exigem autenticação) e ftp-anon (testa se
um servidor FTP permite o acesso anônimo).

discovery
Esses scripts tentar ativamente descobrir mais sobre a rede, consultando registros públicos,
SNMP dispositivos habilitados, serviços de diretório e similares. Exemplos incluem html-
title (obtém o título de o caminho da raiz de web sites), smb-enum-shares (partes
enumera do Windows), e snmp-sysdescr (detalhes extratos do sistema via SNMP).

dos

Scripts nessa categoria podem causar negação de serviço, geralmente porque falhar um
serviço como um efeito colateral de testá-lo para uma vulnerabilidade.

exploit

Esses scripts visam ativamente explorar alguma vulnerabilidade.

external

Scripts nessa categoria podem enviar dados para um banco de dados de terceiros ou outro
recurso de rede. Um exemplo disto é whois , que faz a ligação ao whois servidores para
aprender sobre o endereço do destino. Há sempre a possibilidade de que operadores do banco
de dados de terceiros irá gravar qualquer coisa que você enviar para eles, o que em muitos
casos, inclui o seu endereço IP, o endereço do destino. A maioria dos scripts envolvem tráfego
estritamente entre o computador de digitalização eo cliente, qualquer que não o fazem são
colocados nesta categoria.

fuzzer

Esta categoria contém os scripts que são projetados para enviar campos de servidor de
software inesperados ou ao acaso, em cada pacote. Ainda que esta técnica pode ser útil para
encontrar bugs e vulnerabilidades desconhecidas em software, que é simultaneamente um
processo lento e largura de banda intensiva. Um exemplo de um script nesta categoria é dns-
fuzz , que bombardeia um servidor DNS com pedidos de domínio ligeiramente falhos até
que a falha do servidor ou decorrido um limite de tempo especificado pelo usuário.

intrusive

Estes são os scripts que não podem ser classificados na safe da categoria, pois os riscos são
muito altos que eles vão travar o sistema alvo, utilizar-se de recursos significativos no host de
destino (como a largura de banda ou tempo de CPU), ou ser percebido como maliciosos pela
administradores alvo do sistema. Exemplos são http-open-proxy (que tenta usar o
servidor de destino como um proxy HTTP) e snmp-brute (que tenta adivinhar corda de um
dispositivo comunidade SNMP enviando valores comuns, como public , private e
cisco ). A menos que um script está no especial version categoria, deve ser categorizada
como safe ou intrusive .

malware

Esses scripts de teste se a plataforma alvo está infectado por malware ou backdoors.
Exemplos incluem smtp-strangeport , que vigia os servidores SMTP rodando em
números de porta incomuns, e auth-spoof , que detecta daemons spoofing Identd que
fornecem uma resposta falsa antes mesmo de receber uma consulta. Ambos os
comportamentos são comumente associados com infecções por malware.
safe

Scripts que não foram projetados para falhar serviços, usam grandes quantidades de largura de
banda de rede ou de outros recursos, ou explorar falhas de segurança são classificadas como
safe . Estes são menos susceptíveis de ofender os administradores remotos, embora (como
acontece com todas as outras características do Nmap), não podemos garantir que eles não
vão nunca causar reações adversas. A maioria destes executar a descoberta de rede geral.
Exemplos são ssh-hostkey (recupera uma chave de host SSH) e html-title (agarra o
título de uma página web). Scripts na version categoria não são categorizados por
segurança, mas quaisquer outros scripts que não estão em safe deve ser colocado em
intrusive .

version

Os scripts nesta categoria especial são uma extensão para o recurso de detecção de versão e
não pode ser selecionado de forma explícita. Eles são selecionados para executar somente se a
detecção de versão ( -sV ) foi solicitado. Sua saída não pode ser distinguida da saída de
detecção de versão e eles não produzem resultados script de serviços ou de acolhimento.
Exemplos são skypev2-version , pptp-version , e iax2-version .

vuln

Esses scripts específicos para verificar vulnerabilidades conhecidas e geralmente só reportar


os resultados, se eles forem encontrados. Exemplos incluem realvnc-auth-bypass e
afp-path-vuln .

Tipos de script e fases


NSE suporta quatro tipos de scripts, que se distinguem pelo tipo de metas que tomam e da fase de
digitalização em que eles são executados. Scripts individuais pode suportar múltiplos tipos de
operação.
Os scripts Prerule

Esses scripts são executados antes de qualquer das fases do Nmap de digitalização, de modo
Nmap não coleta qualquer informação sobre suas metas ainda. Eles podem ser úteis para
tarefas que não dependem de metas de digitalização específicos, tais como realização de
pedidos de difusão de rede para consulta DHCP e servidores de DNS SD. Alguns desses
scripts podem gerar novas metas para o Nmap para digitalizar (somente se você especificar o
newtargets argumento NSE). Por exemplo, dns-zona-transferência pode obter uma lista de IPs
em um domínio usando uma solicitação de transferência de zona e, em seguida, adicioná-los
automaticamente para a lista do Nmap alvo da análise. Prerule os scripts podem ser
identificados por contendo um prerule função (ver a seção chamada "Regras" ).

Os scripts de acolhimento

Scripts nesta fase são executados durante o processo de digitalização Nmap normal após
Nmap realizou a descoberta de hosts, escaneamento de portas, detecção de versão, e OS
detecção contra o host de destino. Este tipo de script é invocado uma vez contra cada host de
destino que corresponde ao seu hostrule função. Exemplos são whois , que olha para
informações de propriedade para um IP de destino e caminho mtu- que tenta determinar o
tamanho máximo do pacote IP que pode atingir o alvo sem a necessidade de fragmentação.

Scripts de serviço

Esses scripts são executados contra os serviços específicos de escuta em um host de destino.
Por exemplo, o Nmap inclui mais de 15 scripts de serviço HTTP para executar contra
servidores web. Se um host tem servidores web rodando em várias portas, os scripts podem
executar várias vezes (uma para cada porta). Estes são o tipo de script mais commong Nmap,
e eles se distinguem por contendo um portrule função para decidir que detectou um script
serviços devem ser executados contra.

Os scripts Postrule

Esses scripts são executados após Nmap ter digitalizado todos os seus alvos. Eles podem ser
úteis para formatar e apresentar saída Nmap. Por exemplo, ssh-hostkey é mais conhecido por
seu serviço de script (portrule) que se conecta a servidores SSH, descobre suas chaves
públicas, e os imprime. Mas também inclui um postrule que verifica chaves duplicadas entre
todos os hosts digitalizados, em seguida, imprime os que são encontrados. Outro uso potencial
para um script postrule está imprimindo um reverso índice do Nmap saída mostrando-que
abriga executar um serviço específico, em vez de apenas listar os serviços em cada host. Os
scripts Postrule são identificados por um contendo postrule função.

Muitos scripts poderia executado como um script ou prerule postrule. Nesses casos,
recomendamos o uso de um prerule para a consistência.

Argumentos de linha de comando


Estes são os cinco linha de comando argumentos específicos para a digitalização de script:
-sC

Realiza uma varredura de script usando o conjunto padrão de scripts. É equivalente a


--script=default . Alguns dos scripts neste default categoria são considerados
invasivos e não deve ser executado contra uma rede de destino sem permissão.

--script <filename> | <category> | <directory> | <expression>


[ ,... ]

Executa uma varredura script usando a lista separada por vírgulas de nomes de arquivos,
categorias de script e diretórios. Cada elemento da lista pode ser também uma expressão
booleana que descreve um conjunto mais complexo de scripts. Cada elemento é interpretado
primeiro como uma expressão, então, como uma categoria, e, finalmente, como um nome de
arquivo ou diretório. O argumento especial all faz com que cada script no banco de dados
do Nmap roteiro elegíveis para ser executado. A all argumento deve ser usado com cautela,
NSE pode conter scripts perigosos, incluindo exploits, crackers autenticação força bruta e
ataques de negação de serviço.

Cada elemento da lista de expressão script pode ser prefixado com um + personagem para
forçar o script determinado (s) para executar independentemente das condições em seu
portrule ou hostrule funções. Isso geralmente é feito apenas por usuários avançados
em casos especiais. Por exemplo, você pode querer fazer uma revisão de configuração em um
monte de MS SQL servidores, alguns dos quais estão em execução em portos fora do padrão.
Em vez de lento a digitalização Nmap executando a detecção de versão extensa ( -sV
--version-all ) para que o Nmap irá reconhecer o serviço MS-SQL, você pode forçar o
script ms-sql-config para funcionar contra todas as hostes targetted e portos especificando
--script +ms-sql-config .

Nomes de arquivos e diretórios pode ser relativa ou absoluta. Nomes absolutos são usados
diretamente. Os caminhos relativos são procurados nos scripts subdiretório de cada um
dos seguintes locais até que encontrou:

--datadir
$NMAPDIR
~/.nmap (não procurou no Windows)
o diretório contendo o nmap executável
o diretório contendo o nmap executável, seguido por ../share/nmap
NMAPDATADIR
o diretório atual.
Quando um nome de diretório é dada, o Nmap carrega todos os arquivos no diretório cujo
nome termina com .nse . Todos os outros arquivos são ignorados e diretórios não são
pesquisados recursivamente. Quando um nome de ficheiro é dado, ele não tem de ter a .nse
extensão, que irá ser adicionado automaticamente, se necessário.

Consulte a seção chamada "Seleção Script" para exemplos e uma explicação completa do
--script opção.

Os scripts Nmap são armazenados em um scripts subdiretório do diretório de dados, por


padrão, o Nmap (ver Capítulo 14, Entendendo e Personalizando arquivos de dados do
Nmap ). Para maior eficiência, os scripts são indexadas em um banco de dados armazenados
em scripts/script.db , que indica a categoria ou categorias em que cada script
pertence. O argumento all irá executar todos os scripts do banco de dados roteiro Nmap,
mas deve ser usado com cautela uma vez que o Nmap pode conter exploits, ataques de
negação de serviço, e outros scripts perigosos.

--script-args <args>

Fornece argumentos para os scripts. Consulte a seção chamada "Argumentos para Scripts"
para uma explicação detalhada.

--script-args-file <filename>

Essa opção é a mesma --script-args exceto que você passar os argumentos em um


arquivo, em vez de na linha de comando. Consulte a seção chamada "Argumentos para
Scripts" para uma explicação detalhada.

--script-help <filename> | <category> | <directory> | <expression>


|all[ ,... ]

Shows ajuda sobre scripts. Para cada roteiro correspondente a especificação dada, o Nmap
imprime o nome do script, suas categorias, e sua descrição. As especificações são as mesmas
que as aceite por --script , assim por exemplo, se você quiser ajudar sobre o ftp-anon
script, você deve executar o nmap - script-ajuda ftp-anon. Uma amostra de ajuda script é
mostrado na Exemplo 9.2, "Script ajuda" .

Exemplo 9.2. Ajuda Script


$ Nmap - script-ajuda "afp * e descoberta"

Começando Nmap 5.36TEST4 (http://nmap.org) em 2011/01/27 13:04 PST

afp-serverinfo
Categorias: descoberta seguros
http://nmap.org/nsedoc/scripts/afp-serverinfo.html
AFP mostra informações do servidor. Esta informação inclui o servidor
Tipo de hostname, IPv4 e IPv6 endereços, e de hardware (por exemplo
Macmini ou MacBookPro ).

afp-showmount
Categorias: descoberta seguros
http://nmap.org/nsedoc/scripts/afp-showmount.html
Mostra partes AFP e ACLs.

Se o -oX opção é usada, uma representação XML da ajuda roteiro será escrito para o arquivo
fornecido.

--script-trace

Esta opção é similar a --packet-trace , mas trabalha no nível do aplicativo, em vez de


pacote por pacote. Se esta opção for especificada, toda a comunicação de entrada e saída
realizada por scripts é impresso. A informação exibida inclui o protocolo de comunicação de
origem e de destino de endereços, e os dados transmitidos. Se mais do que 5% dos dados
transmitidos é não imprimível, dumps hexadecimais são dados em vez disso. Especificando
--packet-trace permite roteiro traçado também.

--script-updatedb

Esta opção atualiza o banco de dados de script encontrado em scripts/script.db que é


usado pelo nmap para determinar os scripts padrão disponíveis e categorias. Só é necessário
para atualizar o banco de dados se você tiver adicionado ou removido os scripts NSE do
padrão scripts diretório ou se você tiver alterado as categorias de qualquer script. Esta
opção é usada por si só, sem argumentos: nmap - script-updatedb.

Algumas outras opções Nmap ter efeitos sobre exames de script. A mais proeminente delas é -sV .
Uma varredura versão automaticamente executa os scripts na version categoria. Os scripts nesta
categoria são ligeiramente diferentes dos outros scripts, porque sua produção se mistura com os
resultados da verificação de versão e eles não produzem qualquer saída de digitalização script.
Outra opção que afeta o mecanismo de script é -A . O modo implica a Nmap agressivo -sC opção.

Script Seleção
A --script opção recebe uma lista separada por vírgula de categorias, nomes de arquivos e
nomes de diretórios. Alguns exemplos simples de sua utilização:
nmap - script padrão, seguro

Carrega todos os scripts no default e safe categorias.

nmap - script smb-os-descoberta

Carrega apenas o smb-os-discovery script. Note-se que o .nse extensão é opcional.

nmap - script padrão, bandeira, / home / user / customscripts

Carrega o script no default da categoria, a banner script, e todos .nse arquivos no


diretório /home/user/customscripts .

Ao se referir a scripts de script.db por nome, você pode usar um shell-style ' * 'curinga.
nmap - script "http-*"

Carrega todos os scripts cujo nome começa com http- , como http-auth e http-
open-proxy . O argumento para --script teve que ser entre aspas para proteger o
curinga do reservatório.

Seleção script mais complicado pode ser feito usando o and , or , e not operadores para construir
expressões booleanas. Os operadores têm a mesma precedência como na Lua: not é o mais
elevado, seguido por and e or . Você pode alterar a precedência usando parênteses. Como as
expressões contêm caracteres de espaço é necessário citá-los.
nmap - script "não intrusiva"

Carrega todos os scripts, exceto para aqueles que a intrusive categoria.

nmap - script "padrão ou seguro"

Este é funcionalmente equivalente a nmap - script "padrão, seguro". Ele carrega todos os
scripts que estão no default da categoria ou o safe categoria ou ambos.

nmap - "padrão e seguro" script

Carrega os scripts que estão em ambos os default e safe categorias.

nmap - script "(padrão ou seguro ou intruso) e não-http *"

Carrega os scripts em default , safe , ou intrusive categorias, exceto para aqueles


cujos nomes começam com http- .

Nomes em uma expressão booleana pode ser uma categoria, um nome de arquivo script.db , ou
all . Um nome é uma sequência de caracteres que não contenham " ',' , ',' ( ',' ) ', ou' ; ', exceto
para as seqüências and , or , e not , que são operadores.

Argumentos para Scripts


Argumentos podem ser passados para os scripts usando o NSE --script-args opção. Os
argumentos descrever uma tabela de pares chave-valor e valores possivelmente matriz. Os
argumentos são fornecidos para os scripts como uma tabela no registro chamados
nmap.registry.args , embora eles normalmente são acessados através do
stdnse.get_script_args função.
A sintaxe para argumentos do script é semelhante ao construtor de Lua tabela de sintaxe.
Argumentos são uma lista separada por vírgula de name=value pares. Os nomes e valores podem
ser strings que não contenham espaços em branco ou os caracteres ' { ',' } ',' = ', ou' , '. Para incluir
um destes caracteres em uma cadeia, coloque a cadeia entre aspas simples ou duplas. Dentro de uma
string, ' \ 'escapa de uma citação. Uma barra invertida é usada apenas para escapar aspas neste caso
especial, em todos os outros casos, a contrabarra é interpretado literalmente.
Os valores também podem ser incluídas em tabelas {} , assim como em Lua. A tabela pode conter
valores de cadeia simples, por exemplo, uma lista de hosts de proxy, ou mais pares nome-valor,
incluindo tabelas aninhadas. Subtabelas aninhados são comumente usados para passar argumentos
específicos para um script, em uma tabela chamada após o script. Isso é o que está acontecendo com
o whois tabela no exemplo abaixo.
Argumentos do script são muitas vezes qualificados com o nome do script relevantes para que um
usuário não unintentially afetar vários scripts com um único nome genérico. Por exemplo, você
pode definir o tempo limite para as respostas à broadcast-ping script (roteiro e só isso)
definindo broadcast-ping.timeout se ao número de milissegundos que você está disposto a
esperar. Às vezes, porém, você quer um argumento de script mais amplamente aplicadas. Se você
remover a qualificação e especificar apenas timeout=250 , você será definir o valor para mais de
uma dúzia os scripts, além de broadcast-ping . Você pode até combinar argumentos
qualificados e não qualificados, e a correspondência mais específica prevalece. Por exemplo, você
pode especificar rlogin-brute.timeout=20000,timeout=250 . Nesse caso, o tempo
limite será 20 mil para os rlogin-brute scripts, e 250 para todos os outros scripts que suportam
esta variável ( broadcast-ping , lltd-discovery , etc)
Ao invés de passar os argumentos na linha de comando com --script-args , você pode
armazená-los em um arquivo (separados por vírgulas ou novas linhas) e especificar apenas o nome
do arquivo com --script-args-file . Opções especificadas com --script-args na linha
de comando têm precedência sobre os dados em um arquivo. O nome do arquivo pode ser dada
como um caminho absoluto ou relativo ao caminho do Nmap pesquisa usual (NMAPDIR, etc)
Aqui está uma invocação Nmap típico com argumentos do script:
nmap-SC - script-args "user = foo, passe =", {} = bar ", whois = {whodb = nofollow +
maduro}, xmpp-info.server_name = localhost"
Observe que os argumentos do script são cercados por aspas simples. Para o shell Bash, isso impede
que o shell de interpretar as aspas duplas e fazendo concatenação automática. Naturalmente,
conchas diferentes podem exigir-lhe escapar aspas ou usar aspas diferentes. Consulte o manual
relevante. Os resultados do comando desta tabela Lua:
nmap.registry.args = {
user = "foo",
passar = ", {} = bar",
whois = {
whodb = "nofollow + maduro"
}
xmpp-info.server_name = "localhost"
}

Embora você possa acessar os valores diretamente do nmap.registry.args , normalmente é


melhor usar o stdnse.get_script_args função como esta:
server_name local = stdnse.get_script_args ("xmpp-info.server_name")
Todos os argumentos do script partilhar um espaço global, o nmap.registry.args mesa. Por
esta razão, os nomes abreviados ou ambíguas como user não são recomendados. Alguns scripts
prefixo seus argumentos com o seu nome script, como smtp-open-relay.domain . Outros,
como o whois no exemplo acima, dê seus argumentos em uma tabela chamada após o script.
Argumentos utilizados por bibliotecas, o que pode afetar muitos scripts, geralmente têm nomes que
começam com o nome da biblioteca, como smbuser e snmpcommunity .
O Portal de Documentação on-line NSE em http://nmap.org/nsedoc/ lista os argumentos que cada
script aceita.

Exemplos completos
nmap-SC example.com

Uma varredura de script simples, usando o conjunto padrão de scripts.

nmap-sn-SC example.com

Uma varredura de script sem uma varredura de portas, os scripts de acolhimento apenas são
elegíveis para ser executado.

nmap-Pn-sn-sC example.com

Uma varredura de script sem a descoberta de hosts ou uma varredura de portas. Todos os
hosts são assumidos se e somente scripts de acolhimento são elegíveis para ser executado.

nmap - script smb-os-discovery - script-traço example.com

Executar um script específico com roteiro traçado.

nmap - script snmp-sysDescr - script-args snmpcommunity = admin example.com

Executar um script individual que leva um argumento de script.

nmap - mycustomscripts script, example.com seguro

Executar todos os scripts no mycustomscripts diretório, bem como todos os scripts no


safe categoria.

Formato Script
Os scripts NSE consistem de um punhado de campos descritivos, uma regra que define quando o
script deve ser executado, e uma action função que contém as instruções de script reais. Os
valores podem ser atribuídos aos campos descritivos, assim como você poderia atribuir quaisquer
outras variáveis Lua. Seus nomes devem ser minúsculas, como mostrado nesta seção.
description Campo
A description de campo descreve o que um script é testar por e notas importantes, o usuário
deve estar ciente. Dependendo da complexidade do roteiro, descrições podem variar em
comprimento de algumas frases para alguns parágrafos. O primeiro parágrafo deve ser um breve
resumo da função de script adequado para autônomo apresentação para o usuário. Parágrafos
adicionais podem fornecer detalhes roteiro muito mais.

categories Campo
O categories campo define uma ou mais categorias a que pertence um script (ver a seção
chamada "Categorias roteiro" ). As categorias são maiúsculas de minúsculas e podem ser
especificadas em qualquer ordem. Eles estão listados em uma tabela Lua matriz de estilo, como
neste exemplo:
Categorias = {"default", "descoberta", "seguro"}

author Campo
O author campo contém os nomes dos autores de script 'e pode também conter informações de
contato (como URLs home page). Nós já não recomendo incluindo endereços de e-mail porque os
spammers podem raspar-los no site da NSEDoc. Este campo opcional não é usado por NSE, mas dá
aos autores de script seu devido crédito ou culpa.

license Campo
Nmap é um projeto da comunidade e congratulamo-nos com todos os tipos de contribuições de
código, incluindo scripts NSE. Então, se você escrever um roteiro valioso, não guarde para si! O
opcional license de campo ajuda a garantir que temos permissão legal para distribuir todos os
scripts que vêm com o Nmap. Todos esses scripts atualmente usam o padrão Nmap licença (descrito
na seção chamada "Copyright Nmap e Licenciamento" ). Elas incluem a seguinte linha:
licença = "Mesmo que o Nmap - Veja http://nmap.org/book/man-legal.html"

A licença Nmap é semelhante à GNU GPL. Autores de script pode usar uma licença BSD (sem
cláusula de publicidade) em vez, se preferir. Para uma licença BSD, inclua esta linha:
licença = "simplificado (2-clause) licença BSD - Veja
http://nmap.org/svn/docs/licenses/BSD-simplified"

dependencies Campo
O dependencies campo é um array contendo os nomes dos scripts que devem ser executados
antes de o script, se eles também serão selecionados. Isto é usado quando um script pode fazer uso
dos resultados de um outro. Por exemplo, a maioria dos smb-* os scripts dependem smb-brute ,
porque as contas encontradas por smb-brute pode permitir que os outros scripts para obter mais
informações. Listando um script em dependencies não causa esse script para ser executado, que
ainda tem de ser selecionado através do --script opção ou não. dependencies apenas força
uma ordenação entre os scripts que estão selecionadas. Este é um exemplo de uma
dependencies de mesa, a partir de smb-os-discovery :
dependências = {"smb-bruta"}

A tabela dependências é opcional. NSE vai assumir o roteiro não tem dependências, se o campo for
omitido.
Dependências estabelecer um ordenamento interno de scripts, atribuindo a cada uma um número
chamado de "nível de execução" [ 9 ]. Ao executar seus scripts, você verá o nível de execução (junto
com o número total de níveis de execução) de cada agrupamento de scripts executados na saída de
NSE:
NSE: Script varredura 127.0.0.1.
NSE: Iniciando runlevel 1 (de 3) digitalização.
Iniciando NSE às 17:38
Concluído NSE às 17:38, 0.00s decorrido
NSE: Iniciando runlevel 2 (de 3) digitalização.
Iniciando NSE às 17:38
Concluído NSE às 17:38, 0.00s decorrido
NSE: Iniciando runlevel 3 (de 3) digitalização.
Iniciando NSE às 17:38
Concluído NSE às 17:38, 0.00s decorrido
NSE: Digitalização Script concluído.

Regras
Nmap usa as regras de script para determinar se um script deve ser executado contra um alvo. Uma
regra é uma função Lua que retorna true ou false . O script action função só é realizada se a
regra avaliada como true .
Um script deve conter uma ou mais das seguintes funções que determinam quando o script será
executado:
prerule()
hostrule(host)
portrule(host, port)
postrule()
prerule scripts executados uma vez, antes de qualquer anfitriões são verificados, durante o script
fase de pré-digitalização. hostrule e portrule scripts executados depois de cada lote dos
Exércitos é digitalizado. postrule scripts executados uma vez depois de todos os anfitriões
foram digitalizados, no script fase pós-digitalização. Um script pode ser executado em mais de uma
fase, se ele tem várias regras.
prerule e postrule não aceitam argumentos. hostrule aceita uma tabela de host e pode
testar, por exemplo, o endereço IP ou o nome do alvo. portrule aceita a tabela de um host e uma
tabela de porta para qualquer porto do open , open|filtered , Ou unfiltered Estado do
porto. Porta regras geralmente fatores de teste, tais como o número de porta, porta de estado, ou
nome do serviço de escuta em decidir se a correr contra uma porta. Regras de exemplo são
mostrados na seção chamada "A Regra" .
Usuários avançados podem forçar um script para ser executado independentemente dos resultados
destas funções regra prefixando o nome do script (ou categoria ou outra expressão) com um + no
--script argumento.
O padrão atual de escolher entre um prerule ou um postrule é esta: se o script está fazendo
anfitrião descoberta ou qualquer operação de outra rede, então o prerule deve ser usado.
postrule é reservado para a comunicação de dados e estatísticas que foram recolhidos durante a
varredura.
Ação
A ação é o coração de um script de NSE. Ele contém todas as instruções para ser executado quando
prerule do script, portrule, triggers hostrule ou postrule. É uma função Lua que aceita os mesmos
argumentos que a regra. O valor de retorno do valor da ação pode ser uma tabela de pares nome-
valor, uma string, ou nil . Para um exemplo de uma ação NSE consulte a seção chamada "ação" .
Se a saída da ação é uma tabela, ele é automaticamente formatados de uma forma estruturada para
inclusão no normal ( -oN ) e XML ( -oX ) formatos de saída. Se uma seqüência, o texto é exibido
diretamente na produção normal, e escrito como um atributo XML na saída XML, nenhuma saída é
produzido se o script retorna nil . Consulte a seção chamada "saída estruturada e não estruturada"
para detalhes de como diferentes valores de retorno são manipulados.

Variáveis de ambiente
Cada roteiro tem seu próprio conjunto de variáveis de ambiente:
SCRIPT_PATH

O caminho do script.

SCRIPT_NAME

O nome do script. Esta variável pode ser usado na produção de depuração.

SCRIPT_TYPE

Uma vez que um script pode ter funções múltiplas de regra, esta variável de ambiente irá
mostrar qual regra ativou o script, isso seria útil se o script quer compartilhar algum código
entre as fases de análise diferente Script. Vai levar um destes valores de quatro cordas:
"prerule" , "hostrule" , "portrule" ou "postrule" . Esta variável só está
disponível durante e após a avaliação das funções de regras.

Este é um exemplo de um código de depuração que utiliza as variáveis do ambiente anteriores,


seguido da mensagem de saída, a partir da zona-dns transferência:
stdnse.print_debug (3, "Skipping '% s'% s, argumento 'dnszonetransfer.server'
está faltando.", SCRIPT_NAME, SCRIPT_TYPE)

Iniciando NSE às 15:31


NSE: Ignorando prerule 'dns-zona-transferência ", argumento'
dnszonetransfer.server 'está faltando.

[ 9 ] Até
através Nmap 5.10BETA2 versão, as dependências não existia e os autores de script teve
que definir um runlevel de campo manualmente.
ipt
O núcleo do mecanismo de script Nmap é um interpretador Lua embutido. Lua é uma linguagem
leve projetado para extensibilidade. Ele oferece uma API poderosa e bem documentado para
interface com outros softwares como o Nmap.
A segunda parte do mecanismo de script Nmap é a Biblioteca NSE, que liga Lua e Nmap. Esta
camada lida com questões como a inicialização do interpretador Lua, agendamento de execução de
script paralelo, a recuperação script e mais. É também o coração da rede NSE I / O quadro eo
mecanismo de tratamento de exceção. Ele também inclui bibliotecas de utilitários para fazer scripts
mais poderoso e conveniente. Os módulos de serviços públicos de biblioteca e extensões são
descritas na seção chamada "Bibliotecas NSE" .

Lua Idioma Base


O Nmap linguagem de script é um incorporado Lua intérprete que é estendido com bibliotecas para
interface com o Nmap. A API Nmap está no namespace Lua nmap . Isto significa que todas as
chamadas para os recursos fornecidos pelo Nmap ter um nmap prefixo. nmap.new_socket() ,
por exemplo, retorna um objeto wrapper novo soquete. O Nmap camada biblioteca também cuida
de inicializar o contexto de Lua, agendar os scripts paralelas e recolher a saída produzida por scripts
concluídas.
Durante as fases de planejamento, consideramos várias linguagens de programação como a base
para o Nmap script. Outra opção foi implementar uma linguagem de programação totalmente novo.
Os nossos critérios eram rigorosos: NSE tinha que ser fácil de usar, pequeno no tamanho,
compatível com a licença do Nmap, escalável, rápido e paralelizável. Vários esforços anteriores
(por outros projetos) para projetar a sua linguagem própria auditoria de segurança a partir do zero
resultaram em soluções difíceis, por isso decidimos cedo para não seguir esse caminho. Primeiro o
interpretador Scheme Guile foi considerado, mas a preferência derivou para o intérprete Elk devido
a sua licença mais favorável. Mas os scripts de paralelização Elk teria sido difícil. Além disso,
espera-se que a maioria dos usuários preferem Nmap programação procedural sobre linguagens
funcionais, como Scheme. Intérpretes maiores, como Perl, Python e Ruby são bem conhecidas e
amadas, mas são difíceis de incorporar de forma eficiente. No final, a Lua se destacou em todos os
nossos critérios. É pequeno, distribuído sob a licença de código liberal MIT aberto, tem co-rotinas
para a execução do script paralelo eficiente, foi concebido com embeddability em mente, tem
excelente documentação, e está ativamente desenvolvido por uma comunidade grande e
comprometida. Lua está agora ainda incorporado em outros populares ferramentas de código aberto
de segurança, incluindo o sniffer Wireshark e IDS Snort.

Bibliotecas NSE
Além das significativas capacidades embutidas de Lua, nós escrevemos ou integrado bibliotecas de
extensão muitos que fazem roteiro escrito mais poderoso e conveniente. Essas bibliotecas (às vezes
chamados de módulos) são compilados, se necessário, e instalado junto com o Nmap. Eles têm seu
próprio diretório, nselib , que é instalado no diretório de dados configurado Nmap. Scripts
precisa apenas require as bibliotecas padrão, a fim de usá-los.

Lista de todas as bibliotecas


Esta lista é apenas uma visão geral para dar uma idéia do que bibliotecas estão disponíveis.
Desenvolvedores vai querer consultar a documentação completa no http://nmap.org/nsedoc/ .
afp

Esta biblioteca foi escrito por Patrik Karlsson <patrik@cqure.net> para facilitar a
comunicação com o serviço de AFP Apple. Ele não é completa e apresentam ainda em falta
várias funções.

ajp

A base AJP 1,3 implementação baseada em documentação disponível Apache


mod_proxy_ajp; http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html

amqp

A biblioteca AMQP fornece algumas funcionalidades básicas para recuperar informações


sobre as propriedades de um servidor de AMQP.

asn1

ASN.1 funções.

base32

Base32 codificação e decodificação. Segue RFC 4648.

base64

Base64 codificação e decodificação. Segue RFC 4648.

bin

Pacote e dados binários de descompactação.

bit

Operações bit a bit em inteiros.

bitcoin

Esta biblioteca implementa um subconjunto mínimo de protocolo BitCoin Ele suporta


atualmente o aperto de mão versão e respostas processamento addr.

bittorrent

Bittorrent e DHT biblioteca do protocolo que permite aos usuários ler informações de um
arquivo torrent, bittorrent decodificar bencoded (codificado) buffers, encontrar pares
associados com uma torrente certo e recuperar os nós descobertos durante a busca por pares.

bjnp

Uma implementação da BJNP Canon protocolo usado para descobrir e consultar as


impressoras de rede Canon e dispositivos de scanner.
brute

A biblioteca bruta é uma tentativa de criar um quadro comum para a realização de


adivinhação de senha contra serviços remotos.

cassandra

Métodos de biblioteca para manipulação de comunicação Thrift Cassandra como cliente

citrixxml

Este módulo foi escrito por Patrik Karlsson e facilita a comunicação com o Serviço XML
Citrix. Não é característica completa e está ausente várias funções e parâmetros.

comm

Comuns funções de comunicação para tarefas de descoberta de rede como bandeira agarrando
e troca de dados.

creds

As lojas de classe de credenciais credenciais encontrado no Registro Nmap

cvs

A CVS mínimos (Concurrent Versions System) pserver implementação do protocolo que


atualmente só suporta autenticação.

datafiles

Ler e analisar alguns dos arquivos de dados do Nmap: nmap-protocols , nmap-rpc ,


nmap-services , e nmap-mac-prefixes .

dhcp

Implementar um Dynamic Host Configuration Protocol cliente (DHCP).

dhcp6

Minimalista implementação (Dynamic Host Configuration Protocol para IPv6) dhcp6 apoio
básico dhcp6 Solicitar pedidos A biblioteca é estruturada em torno das seguintes classes:

 DHCP6.Option - dhcp6 codificadores de opções (de pedidos) e decodificadores

(Para respostas)

 DHCP6.Request - dhcp6 codificador eo decodificador pedido


 DHCP6.Response - dhcp6 codificador eo decodificador resposta
 Ajudante - A classe auxiliar, interface script primário

dns
Biblioteca DNS simples apoio à criação de pacotes, codificação, decodificação e realizar a
consulta.

dnsbl

Um minimalista DNS biblioteca BlackList implementadas para facilitar a consulta de vários


serviços DNSBL. A lista atual de serviços foi implementado com base nos seguintes
compilações de serviços:

 http://en.wikipedia.org/wiki/Comparison_of_DNS_blacklists
 http://www.robtex.com
 http://www.sdsc.edu/ ~ jeff / spam / cbc.html

dnssd

Biblioteca para apoiar DNS Service Discovery

drda

DRDA Biblioteca de suporte um subconjunto limitado de operações.

eap

EAP biblioteca (Extensible Authentication Protocol) apoiar um número limitado de recursos.

eigrp

Uma biblioteca de apoio de análise e geração de um número limitado de pacotes EIGRP da


Cisco.

ftp

FTP funções.

giop

GIOP Biblioteca de suporte um subconjunto limitado de operações

gps

Um módulo de análise smallish gps. Atualmente faz GPRMC NMEA decodificação

http

Implementa o protocolo HTTP cliente em um formulário padrão que os scripts Nmap pode
aproveitar.

httpspider

Uma biblioteca httpspider smallish fornecendo capacidades básicas spidering Ele consiste das
seguintes classes:
iax2

Um Asterisk minimalista IAX2 (Inter-Asterisk eXchange v2) VoIP implementação do


protocolo. A biblioteca implementa o mínimo necessário para realizar adivinhação de senha
de força bruta.

imap

Uma biblioteca de implementação de um subconjunto menor do protocolo IMAP, atualmente


a capacidade, LOGIN e autenticar funções. A biblioteca foi inicialmente escrito por Brandon
Enright e, posteriormente, ampliado e convertido para OO forma por Patrik Karlsson
<patrik@cqure.net>

informix

Biblioteca Informix apoiar um subgrupo limitado de operações Informix

ipOps

Utilitário de funções para manipular e comparando endereços IP.

ipp

Um pequeno CUPS ipp implementação da biblioteca (Internet Printing Protocol)

iscsi

Uma biblioteca iSCSI da concretização escrito por Patrik Karlsson <patrik@cqure.net> A


biblioteca atualmente suporta a descoberta de destino e login.

isns

Um mínimo de armazenamento Internet Name Service implementação (iSNS)

jdwp

JDWP biblioteca (Java Debug Wire Protocol) a implementação de um conjunto de comandos


necessários para usar a porta depuração remota e injetar bytecode Java.

json

Métodos de biblioteca para manipulação de dados JSON. Ele lida com JSON codificação e
decodificação de acordo com a RFC 4627.

ldap

Métodos de biblioteca para lidar com LDAP.

lfs

Retorna um iterador diretório listando o conteúdo do caminho dado Cada vez que o iterador é
chamado com dir_obj ele retorna o nome de uma entrada de diretório como uma string, ou
nulo se houver entradas não mais.

listop

Funcional de estilo operações de lista.

match

Tamponado funções de rede I / O auxiliares.

membase

A aplicação do protocolo smallish TAP Couchbase Membase Com base na documentação


escassa do Wiki Couchbase: x
http://www.couchbase.org/wiki/display/membase/SASL+Authentication+Example

mobileme

Um cliente do serviço MobileMe web que permite a descoberta de dispositivos da Apple


usando o "Find My iPhone" funcionalidade.

mongodb

Métodos de biblioteca para manipulação MongoDB, criar e analisar pacotes.

msrpc

Ao fazer uso pesado da smb biblioteca, esta biblioteca vai chamar várias funções MSRPC. As
funções usadas aqui podem ser acessados através de portas TCP 445 e 139, com uma sessão
estabelecida. Uma sessão de NULL (o padrão) irá trabalhar para algumas funções e sistemas
operacionais (ou configurações), mas não para outros.

msrpcperformance

Este módulo foi projetado para analisar o PERF_DATA_BLOCK estrutura, que é armazenado
no Registro em HKEY_PERFORMANCE_DATA. Ao consultar essa estrutura, você pode
obter uma série de informações sobre o que está acontecendo.

msrpctypes

Este módulo foi escrito para os parâmetros Marshall para a Microsoft RPC (MSRPC)
chamadas. Os valores passados dentro e fora são baseados em estruturas definidas pelo
protocolo, e documentados pelos desenvolvedores do Samba. Para informação detalhada
sobre os tipos, dê uma olhada no Samba 4,0 's .idl arquivos.

mssql

Biblioteca MSSQL apoiar um subgrupo limitado de operações.

mysql
Biblioteca MySQL simples apoio a um subconjunto muito limitado de operações.

natpmp

Esta biblioteca implementa o básico do NAT-PMP, como descrito no Porto Mapeamento NAT
Protocol (NAT-PMP) projecto: o http://tools.ietf.org/html/draft-cheshire-nat-pmp-03

ncp

Uma aplicação minúscula do Núcleo Netware Protocol (NCP). Enquanto NCP era
originalmente um protocolo Netware só que agora está presente em ambos plataformas Linux
e Windows rodando Novell eDirectory.

ndmp

Um minimalista NDMP biblioteca (Network Data Management Protocol)

netbios

Cria e analisa o tráfego NetBIOS. O uso principal para isso é enviar os pedidos de nomes
NetBIOS.

nmap

Interface com internals Nmap.

nrpc

Uma biblioteca minimalista para suportar Domino RPC

nsedebug

Depuração de funções para os scripts Nmap.

omp2

Esta biblioteca foi escrito para facilitar a interação com os servidores usando Gerenciador
OpenVAS OMP (OpenVAS Management Protocol) versão 2.

openssl

Ligações OpenSSL.

ospf

Um minimalista OSPF (Open Shortest Path First protocolo de roteamento) biblioteca,


actualmente a apoiar IPv4 e os seguintes tipos de mensagens OSPF: HELLO

packet

Instalações para a manipulação de pacotes.


pcre

Expressões Regulares Compatível com Perl.

pgsql

Biblioteca PostgreSQL apoiar tanto a versão 2 e versão 3 do protocolo. A biblioteca


atualmente contém o mínimo necessário para realizar a autenticação. A autenticação é
suportado com ou sem SSL habilitado e usando os mecanismos de autenticação de texto
simples ou MD5.

pop3

Funções POP3.

pppoe

Um minimalista PPPoE (Point-to-Point Protocol over Ethernet) biblioteca, a implementação


de suporte básico para PPPoE Discovery e solicitações de configuração. O protocolo PPPoE é
ethernet com base e, portanto, não usa nenhum IPs ou números de porta.

proxy

Funções para teste de proxy.

rdp

A mínima RDP biblioteca (Remote Desktop Protocol). Atualmente tem funcionalidade para
determinar criptografia e suporte cifra.

redis

A Redis minimalista (em memória de valor-chave armazenamento de dados) biblioteca.

rmi

Método de biblioteca para comunicar através de RMI (serialização JRMP + java)

rpc

RPC Biblioteca de suporte um subconjunto limitado de operações.

rpcap

Esta biblioteca implementa os fundamentos necessários para se comunicar com o Deamon


Captura WinPcap remoto. Ele atualmente suporta autenticação para o serviço usando a
autenticação NULL, ou com base em senha. Além disso, tem a capacidade de listar as
interfaces que podem ser usados para farejar.

rsync
Um minimalista RSYNC (sincronização de arquivos remotos) biblioteca

rtsp

Este Real Time Streaming Protocol biblioteca (RTSP) implementa apenas um subconjunto
mínimo de o protocolo necessário para os scripts atuais.

sasl

Autenticação simples e Layer Security (SASL).

shortport

Funções para a construção de portrules curtas.

sip

Uma biblioteca SIP apoiar um subconjunto limitado de comandos SIP e métodos

smb

Implementa a funcionalidade relacionada à Server Message Block (SMB, uma extensão do


CIFS) de tráfego, que é um protocolo Windows.

smbauth

Este módulo cuida da autenticação usado no SMB (LM, NTLM, LMv2, NTLMv2).

smtp

Simple Mail Transfer Protocol (SMTP) operações.

snmp

SNMP funções.

socks

A smallish SOCKS versão 5 implementação do protocolo de proxy

srvloc

Uma implementação relativamente pequena do Serviço Local protocolo. Ele foi inicialmente
concebida para suportar pedidos para descobrir servidores Novell NCP, mas deve funcionar
para qualquer outro serviço também.

ssh1

Funções para o protocolo SSH-1. Este módulo também contém funções para formatação de
impressões digitais-chave.
ssh2

Funções para o protocolo SSH-2.

sslcert

Uma biblioteca de fornecer funções de recolha de certificados SSL e armazená-los no


Registro baseada em host.

stdnse

Motor padrão Nmap funções de script. Este módulo contém várias funções úteis que são
muito pequenas para justificar módulos próprios.

strbuf

Tampão instalações de cordas.

strict

Estrita declarou biblioteca global. Cheques para não declaradas variáveis globais durante a
execução do tempo de execução.

stun

Uma biblioteca que implementa o básico do protocolo STUN (Session Traversal Utilities para
NAT) por RFC3489 e RFC5389. Uma visão geral do protocolo está disponível em
http://en.wikipedia.org/wiki/STUN .

tab

Organizar saída em tabelas.

target

Funções utilitárias para adicionar novos alvos descobertos para o Nmap fila de verificação.

tftp

Biblioteca implementação de um servidor TFTP mínimo

tns

TNS Biblioteca apoiar um subconjunto muito limitado de operações da Oracle

unpwdb

Nome de usuário / senha do banco de dados da biblioteca.

upnp
Uma biblioteca UPNP baseado no código de upnp-info inicialmente escrito por Thomas
Buchanan. O código foi fatorado de info-upnp e parcialmente re-escrito por Patrik Karlsson
<patrik@cqure.net>, a fim de apoiar os pedidos de multicast.

url

URI análise, composição e resolução URL relativa.

versant

Uma pequena biblioteca permitindo que alguns enumeração informações básicas de software
de banco de dados objeto Versant (ver http://en.wikipedia.org/wiki/Versant_Corporation ). O
código é inteiramente baseado em lixões pacote capturados ao utilizar o aplicativo de
administração Versant Gestão Center.

vnc

A biblioteca VNC fornece algumas funcionalidades básicas necessárias para se comunicar


com servidores VNC, e derivados, como Tight-ou Ultra-VNC.

vulns

Funções para gerenciamento de vulnerabilidades.

vuzedht

A Vuze implementação do protocolo DHT com base na documentação seguinte: o


http://wiki.vuze.com/w/Distributed_hash_table

wsdd

Uma biblioteca que permite que os scripts para enviar sondas Web Service descoberta
dinâmica e realizar alguma decodificação muito básico de respostas. A biblioteca não é de
forma plena implementação WSDD é sim o resultado de algumas capturas de pacotes e alguns
codificação criativas.

xdmcp

Implementação do XDMCP (X Display Manager Control Protocol) com base em: x


http://www.xfree86.org/current/xdmcp.pdf

xmpp

A biblioteca XMPP (Jabber), a implementação de um subconjunto mínimo do protocolo o


suficiente para fazer a autenticação de força bruta.

Hacking Bibliotecas NSE


Um erro comum ao editar bibliotecas é acidentalmente utilizar uma variável global em vez de um
local. Bibliotecas diferentes usando a mesma variável global pode ser a causa de bugs misteriosos.
Atribuição de Lua alcance é global, por padrão, de modo que este erro é fácil de fazer.
Para ajudar a corrigir este problema, NSE usa uma biblioteca adaptada da distribuição Lua padrão
chamado strict.lua . A biblioteca irá aumentar um erro de execução em qualquer acesso ou
modificação de uma variável global que foi declarado no escopo do arquivo. Uma variável global é
considerada declarada se a biblioteca faz uma atribuição para o nome global (mesmo nil ), no
âmbito de arquivo.

Adicionando módulos C para Nselib


Alguns dos módulos incluídos na nselib são escritos em C ou C + +, em vez de Lua. Dois exemplos
são bit e pcre . Recomendamos que os módulos de ser escrito em Lua se possível, mas C e C + +
pode ser mais apropriado se o desempenho é crítico ou (como com o pcre e openssl módulos)
que você está ligando a uma biblioteca C existente. Esta seção descreve como escrever suas
próprias extensões compiladas para nselib.
A Lua C API é descrito em detalhes no Programação em Lua, Segunda Edição , então este é um
pequeno resumo. Módulos C consistem em funções que se seguem o protocolo do lua_CFunction
tipo. As funções são registradas com Lua e montada em uma biblioteca chamando o
luaL_newlib função. A função de inicialização especial proporciona a interface entre o módulo e
o resto do código de NSE. Por convenção a função de inicialização é nomeado na forma
luaopen_ <module> .
O menor módulo compilado que vem com NSE é bit , e um dos mais simples é openssl . Estes
módulos servem como bons exemplos para um escritor módulo início. O código fonte para bit é
encontrado em nse_bit.cc e nse_bit.h , enquanto o openssl fonte está no
nse_openssl.cc e nse_openssl.h . A maioria dos outros módulos compilados seguir este
nse_ <module name> .cc convenção de nomenclatura.
Revendo o openssl módulo mostra que uma das funções em nse_openssl.cc é l_md5 , que
calcula um MD5. O protótipo da função é:
static int l_md5 (lua_State * L);

O protótipo mostra que l_md5 corresponde ao tipo lua_CFunction. A função é estática porque não
tem de ser visível a outros códigos compilados. Apenas um endereço é obrigado a registrá-lo com
Lua. Mais tarde, no arquivo, l_md5 é inserido em uma matriz de luaL_Reg tipo e associada ao
nome md5 :
static const struct luaL_Reg openssllib [] = {
{"Md5", l_md5}
{NULL, NULL}
};

Esta função será agora conhecido como md5 para NSE. Em seguida, a biblioteca é registrado com
uma chamada para luaL_newlib dentro da função de inicialização luaopen_openssl , como
mostrado a seguir. Algumas linhas relacionadas com o registo de tipos OpenSSL Bignum foram
omitidos:
LUALIB_API int luaopen_openssl (lua_State * L) {
luaL_newlib (L, openssllib);
retornar 1;
}

A função luaopen_openssl é a única função no arquivo que está exposta em


nse_openssl.h . OPENSSLLIBNAME é simplesmente a string "openssl" .
Depois de um módulo compilado é escrito, ele deve ser adicionado ao NSE, incluindo-o na lista de
bibliotecas padrão em nse_main.cc . Em seguida, os nomes do módulo da origem deve ser
adicionado ao Makefile.in nos lugares apropriados. Para ambas as tarefas que você pode
simplesmente seguir o exemplo dos outros módulos C. Para a criação do Windows, os arquiv

Nmap API
Os scripts NSE têm acesso a diversas facilidades para escrever os scripts Nmap flexíveis e elegante.
A API fornece detalhes alvo de acolhimento, como porta de estados e resultados de detecção de
versão. Ele também oferece uma interface para o Nsock biblioteca para rede eficiente de I / O.

Informações passadas para um script


Um efetivo Nmap mecanismo de script requer mais do que apenas um interpretador Lua. Os
usuários precisam de acesso fácil à informação Nmap aprendeu sobre os anfitriões do alvo. Estes
dados são passados como argumentos para o script NSE action método. Os argumentos, host e
port , são tabelas Lua que contêm informações sobre o alvo contra o qual o script é executado. Se
um script combinado um hostrule, fica apenas o host , mesa e se correspondesse um portrule fica
tanto host e port . A lista a seguir descreve cada variável nessas duas tabelas.
host

Esta tabela é passado como um parâmetro para a regra e funções de ação. Ele contém
informações sobre o sistema operacional executado pelo host (se o -O interruptor foi
fornecido), o endereço IP eo nome do host da meta digitalizada.

host.os

Um conjunto de tabelas de correspondência OS. Uma correspondência OS consiste em um


nome legível e uma série de aulas de OS. Cada classe OS consiste em um fornecedor, OS
familiar, geração de sistema operacional, tipo de dispositivo, e uma série de CPE entradas
para a classe. (Veja a seção chamada "Decodificando o formato da impressão digital de
referência" para uma descrição de campos de correspondência OS.) Campos pode ser nil se
eles não estão definidos. O host.os tabela tem esta estrutura geral:

host.os = {
{
= nome <string> ,
aulas = {
{
vendor = <string> ,
= osfamily <string> ,
osgen = <string> ,
type = <string> ,
cpe = {
"Cpe :/ <...> ",
[Mais CPE]
}
}
[Mais aulas]
}
}
[Mais jogos OS]
}

Por exemplo, um sistema operacional jogo neste nmap-os-db entrada:

Fingerprint Linux 2.6.32 - 3.2


Classe Linux | Linux | 2.6.x | propósito geral
CPE cpe :/ o: linux: linux_kernel: 2,6
Classe Linux | Linux | 3.X | propósito geral
CPE cpe :/ o: linux: linux_kernel: 3

irá resultar neste host.os tabela:

host.os = {
{
name = "Linux 2.6.32 - 3.2",
aulas = {
{
vendor = "Linux",
osfamily = "Linux",
osgen = "2.6.x",
type = "uso geral",
cpe = {"cpe :/ o: linux: linux_kernel: 2.6"}
}
{
vendor = "Linux",
osfamily = "Linux",
osgen = "3.X",
type = "uso geral",
cpe = {"cpe :/ o: linux: linux_kernel: 3"}
}
}
}
}

Somente as entradas correspondentes aos jogos perfeitos OS são colocados no host.os


mesa. Se o Nmap foi executado sem o -O opção, então host.os é nil .

host.ip

Contém uma representação de string do endereço IP do host de destino. Se a verificação foi


executado em um nome de host e seus DNS pesquisa retornou mais de um endereço IP, o
endereço IP é utilizado o mesmo como o escolhido para a verificação.

host.name

Contém a entrada de DNS reverso do host de destino digitalizada representado como uma
string. Se o host não tem entrada de DNS reverso, o valor do campo é uma string vazia.

host.targetname

Contém o nome do hospedeiro, como especificado na linha de comando. Se o destino


especificado na linha de comando contém uma máscara de rede ou um endereço de IP é o
valor do campo é nil .

host.directly_connected
Um valor booleano que indica se o host de destino está diretamente ligado a (ou seja, no
mesmo segmento de rede) o host executando o Nmap.

host.mac_addr

Endereço MAC do host de destino (seis-byte-longa seqüência binária), se disponível, caso


contrário, nil . O endereço MAC é geralmente disponíveis apenas para os anfitriões
diretamente conectados em uma LAN e só se Nmap está fazendo uma varredura pacote-
primas, como o scan SYN.

host.mac_addr_next_hop

Endereço MAC do primeiro hop na rota para o host, ou nil se não disponível.

host.mac_addr_src

Nosso próprio endereço MAC, que foi utilizado para se conectar ao host (ou o nosso placa de
rede, ou (com --spoof-mac ) o endereço falsificado).

host.interface

Um string contendo o nome da interface (dnet-style) através do qual os pacotes para o host
são enviados.

host.interface_mtu

A MTU (unidade máxima de transmissão) para host.interface , ou 0 se não for


conhecido.

host.bin_ip

Endereço IP do host de destino como um 4-byte (IPv4) ou de 16 bytes de cadeia (IPv6).

host.bin_ip_src

Nosso anfitrião (executando o Nmap) endereço IP de origem como um 4-byte (IPv4) ou de 16


bytes de cadeia (IPv6).

host.times

Esta tabela contém os dados do Nmap de tempo para o host (ver a seção chamada "Estimativa
tempo de retorno" ). Suas teclas são srtt (tempo de viagem alisou e volta), rttvar
(variação de tempo de ida e volta), e timeout (o tempo limite de sonda), todos os dados em
ponto flutuante segundos.

host.traceroute

Esta é uma série de saltos traceroute, presentes quando a --traceroute opção foi usada.
Cada entrada é uma tabela de host com campos de name , ip e times.srtt (tempo de ida
e volta). O TTL para uma entrada está implícita devido à sua posição na tabela. Uma mesa
vazia representa um salto timed-out.
port

A mesa porta é passado para um serviço de NSE script (isto é, apenas aqueles com um
portrule em vez de um hostrule) da mesma forma que a tabela de acolhimento. Ele contém
informações sobre a porta contra a qual o script é executado. Enquanto este quadro não é
passado para os scripts de acolhimento, os Estados portuários no alvo ainda pode ser
solicitada através do Nmap nmap.get_port_state() e nmap.get_ports()
chamadas.

port.number

Contém o número da porta do porta-alvo.

port.protocol

Define o protocolo da porta de destino. Os valores válidos são "tcp" e "udp" .

port.service

Contém uma representação de string do serviço executado em port.number detectado pelo


serviço de detecção Nmap. Se o port.version campo é nil , o Nmap adivinhou o
serviço com base no número de porta. Caso contrário, a detecção de versão foi capaz de
determinar o serviço de escuta e este campo é igual a port.version.name .

port.version

Esse post é uma tabela que contém informações recuperadas pelo mecanismo de verificação
de versão do Nmap. Alguns dos valores (por exemplo, nome de serviço, a confiança do tipo
de serviço, bem como os valores RPC-relacionados) podem ser recuperados por Nmap mesmo
se uma verificação versão não foi realizada. Valores que não foram determinados padrão para
nil . O significado de cada valor é dado na tabela seguinte:

Tabela 9.1. port.version valores


Nome Descrição
name Contém o nome do serviço Nmap decidido para a porta.
Avalia como confiável Nmap é sobre a precisão de name ,
name_confidence
de 1 (menos confiável) a 10.
product , version , Estas cinco variáveis são as mesmas que as descritas no
extrainfo , hostname , <versioninfo> na seção chamada " match directiva "
ostype , devicetype .
Contém a seqüência de "none" ou "ssl" com base em
service_tunnel se ou não Nmap utilizado SSL tunneling para detectar o
serviço.
A impressão digital de serviços, se for o caso, é fornecido
service_fp neste valor. Isso é descrito na seção chamada
"Contribuição Comunitária" .
Lista dos códigos de CPE para o serviço detectado.
cpe Conforme descrito na especificação oficial CPE essas
seqüências todos começam com a cpe:/ prefixo.
port.state

Contém informações sobre o estado do porto. Scripts de serviços são executados somente em
portos no open ou open|filtered estados, assim port.state geralmente contém um
desses valores. Outros valores podem aparecer se a tabela de porta é um resultado das
get_port_state ou get_ports funções. Você pode ajustar o estado da porta usando o
nmap.set_port_state() chamada. Isso normalmente é feito quando uma open|
filtered porta está determinado a ser open .

Rede I / O API
Para permitir a rede eficiente e paralelizável I / O, NSE fornece uma interface para Nsock, o Nmap
biblioteca socket. O Nsock mecanismo inteligente de retorno de chamada usa é totalmente
transparente para os scripts NSE. O principal benefício de soquetes NSE é que eles nunca bloquear
as operações de E / S, permitindo que muitos scripts para serem executados em paralelo. O
paralelismo de E / S é totalmente transparente para os autores de scripts NSE. Em NSE você pode
programar como se você estivesse usando um soquete sem bloqueio simples ou você pode
programar como se a sua conexão está bloqueando. Mesmo bloqueio I / O chamadas retornar uma
vez um tempo limite especificado foi ultrapassado. Existem dois tipos de rede de E / S são
suportados: pacote de conexão de estilo e cru.

Conecte-estilo de rede I / O
Esta parte da rede API deve ser adequado para usuários de rede mais clássicos: os usuários criar um
socket, conectá-lo a um endereço remoto, enviar e receber dados e, finalmente, fechar o socket.
Tudo até a camada de transporte (que é o TCP, UDP ou SSL) é tratado pela biblioteca.
Uma tomada de NSE é criado chamando nmap.new_socket , que retorna um objeto de socket.
O objeto de socket suporta o costume connect , send , receive , e close métodos. Além
disso, as funções receive_bytes , receive_lines e receive_buf permitir um maior
controlo sobre a recepção de dados. Exemplo 9.3 mostra a utilização de operações de ligação de
rede de estilo. A try função é usada para o tratamento de erros, como descrito na seção chamada
"manipulação de exceção" .
Exemplo 9.3. Conecte-style I / O
require ("nmap")

locais socket = nmap.new_socket ()


socket: set_timeout (1000)
tentar = nmap.new_try (socket function (): close () end)
tentar (socket: connect (host.ip, port.number))
tentar (socket: enviar ("login"))
resposta = tentar (socket: receber ())
socket: close ()

Raw pacote de rede I / O


Para os casos em que a abordagem orientada a conexão é muito alto nível, NSE fornece aos
desenvolvedores de script com a opção de rede de pacotes-prima I / O.
Recepção de pacotes-prima é feito através de um Libpcap invólucro dentro da biblioteca Nsock. Os
passos são para abrir um dispositivo de captura, registrar ouvintes com o dispositivo, e depois
processar os pacotes que são recebidos.
O pcap_open método cria uma alça para socket lê a partir de um objeto tomada comum. Este
método tem uma função de callback, que calcula um hash pacote de um pacote (incluindo seus
cabeçalhos). Este hash pode retornar qualquer seqüência binária, que é posteriormente comparadas
com as seqüências registradas no pcap_register função. O retorno de chamada de hash pacote
normalmente extrair uma parte do pacote, como seu endereço de origem.
O leitor pcap é instruído para ouvir certos pacotes usando o pcap_register função. A função
tem uma seqüência binária, que é comparado com o valor de hash de cada pacote recebido. Esses
pacotes cujos hashes encontrou nenhum cordas registrados serão devolvidos pelo pcap_receive
método. Registre-se a cadeia vazia para receber todos os pacotes.
Um script recebe todos os pacotes para que um ouvinte tem sido registrados chamando o
pcap_receive método. Os blocos de método até que um pacote é recebido ou um tempo limite
ocorre.
Quanto mais geral o pacote função computação hash é mantido, os scripts mais pode receber o
pacote e prosseguir com sua execução. Para lidar com a captura de pacotes dentro de seu script
primeiro você tem que criar um soquete com nmap.new_socket e depois fechar o soquete com
socket_object:close -assim como com a rede de conexão à base de I / O.
Durante a recepção de pacotes é importante, enviando-os certamente é uma característica
fundamental também. Para conseguir isso, dá acesso a NSE envio nas camadas IP e Ethernet.
Pacote Bruto grava não use o objeto de socket mesmo pacote prima lê, de modo que o
nmap.new_dnet função é chamado para criar o objeto necessário para o envio. Após isso, uma
tomada de cru ou Ethernet pega interface pode ser aberto para uso.
Uma vez que o objeto é criado dnet, a função ip_open pode ser chamado para inicializar o objeto
para o envio de IP. ip_send envia o pacote real-prima, que deve começar com o cabeçalho IP. O
objeto dnet não impõe restrições sobre quais hosts IP podem ser enviadas para, assim que o mesmo
objeto pode ser usado para enviar a vários hospedeiros diferentes, enquanto ele estiver aberto. Para
fechar o socket, ligue ip_close .
Para enviar a um nível inferior do que o IP, NSE oferece funções para escrever quadros Ethernet.
ethernet_open inicializa o objeto para o envio de dnet abrindo uma interface Ethernet. O
quadro-prima é enviada com ethernet_send . Para fechar o punho, chamar
ethernet_close .
Às vezes, as maneiras mais fáceis de entender APIs complexo é pelo exemplo. O ipidseq script
incluído com o Nmap utiliza pacotes IP-primas para testar anfitriões para adequação para
Verificação em Inactividade do Nmap ( -sI ). O sniffer-detect script também incluído com
o Nmap usa quadros primas Ethernet em uma tentativa de detectar promíscuo de modo máquinas na
rede (os sniffers em execução).

Saída estruturados e não estruturados


Os scripts NSE geralmente deve retornar uma tabela que representa sua produção, que é bem
organizado e tem cuidadosamente escolhido chaves. Tal tabela será automaticamente formatado
para saída de tela e será armazenado como elementos aninhados em saída XML. Tendo saída XML
dividido logicamente em chaves e valores torna mais fácil para outras ferramentas para fazer uso de
saída de script. É possível que um script para retornar apenas uma corda, mas isso é obsoleto. No
passado, os scripts só poderia retornar uma string, e sua saída foi simplesmente copiado para o
XML como uma bolha de texto presente é agora conhecido como "saída desestruturado".
Suponha que um script chamado user-list retorna uma tabela como mostra este exemplo de
código. Os parágrafos a seguir mostram como ele aparece na saída normal e XML.
produção local = stdnse.output_table ()
output.hostname = "Slimer"
output.users = {}
output.users [# output.users + 1] = "root"
output.users [# output.users + 1] = "foo"
output.users [# output.users + 1] = "bar"
retornar a saída

A tabela Lua é convertido para uma string para a saída normal. A maneira como isso funciona é:
cada tabela aninhada recebe um novo nível de recuo. Entradas da tabela com chaves de string são
precedidos pela chave e dois pontos; entradas com chaves inteiras simplesmente aparecem em
ordem. Ao contrário de tabelas normais de Lua, que são não ordenadas, uma tabela que vem de
stdnse.output_table manterá suas chaves na ordem em que foram inseridos. Exemplo 9.4,
"Formatação automática de NSE saída estruturada" mostra como o exemplo da tabela aparece na
saída normal.
Exemplo 9.4. Formatação automática de NSE saída estruturada
PORT STATE SERVICE
1123/tcp desconhecido aberto
| User-list:
| Hostname: Slimer
| Usuários:
| Raiz
| Foo
| _ Bar

A representação XML de uma tabela Lua é construído como segue. Tabela aninhada tornou table
elementos. As entradas de tabelas que não são eles próprios tabelas se tornam elem elementos.
Entradas (se table ou elem ) com chaves de string obter uma key atributo (por exemplo <elem
key="username">foo</elem> ); entradas com chaves inteiras não têm key elemento e sua
chave está implícito na ordem em que eles aparecer.
Para além do referido, o que quer normal, a saída do script produz (mesmo se automaticamente
gerada) é copiado para a output atributo do script elemento. Newlines e outros caracteres
especiais serão codificados como entidades de caráter XML, por exemplo &#xa; Exemplo 9.5,
"NSE saída em XML" mostra como o exemplo da tabela aparece em XML.
Exemplo 9.5. NSE saída em XML
<script id="t" output=" hostname: Slimer users: raiz foo bar">
<elem key="hostname"> Slimer </ elem>
<table key="users">
<elem> raiz </ elem>
<elem> foo </ elem>
<elem> bar </ elem>
</ Table>
</ Script>

Alguns scripts precisam de mais controlar sua produção normal. Este é o caso, por exemplo, com os
scripts que devem exibir tabelas complexas. Para o controle completo sobre a saída, estes scripts
podem fazer qualquer uma destas coisas:
retornar uma string como valor de retorno segundo, ou
definir o __tostring metamétodo na tabela retornada.
A cadeia de caracteres resultante será utilizada na produção normal, ea tabela será usada em XML,
como de costume. A cadeia de caracteres formatada pode conter caracteres de nova linha para
aparecer como várias linhas.
Se o exemplo de código acima foram modificados dessa forma para retornar uma seqüência de
caracteres formatada
produção local = stdnse.output_table ()
output.hostname = "Slimer"
output.users = {}
output.users [# output.users + 1] = "root"
output.users [# output.users + 1] = "foo"
output.users [# output.users + 1] = "bar"
locais output_str = String.Format ("host:% s \ n", output.hostname)
output_str = output_str .. "\ N" .. stdnse.strjoin (",", output.users)
saída de retorno, output_str

em seguida, a saída normal parece como se segue:


PORT STATE SERVICE
1123/tcp desconhecido aberto
| User-list:
| Hostname: Slimer
| _ Usuários: raiz, foo, bar

Há convenções sobre a formatação de certos tipos de dados na saída estruturada. Usuários do NSE
benefício de saída por ser capaz de assumir que alguns tipos de dados, por exemplo, datas e
horários, são formatados da mesma maneira, mesmo em scripts diferentes.
Os endereços de rede, por exemplo, IPv4, IPv6 e MAC, são representados como strings.
Longas seqüências de caracteres hexadecimais, tais como impressões digitais públicos essenciais
devem ser escritos com caracteres alfabéticos minúsculas e sem separadores, como vírgulas.
Datas e horários são formatados de acordo com a RFC 3339 . Se a diferença de fuso horário é
conhecido, eles devem aparecer como nestes exemplos:
2012-09-07T23: 37:42 +00:00
2012-09-07T23: 37:42 +02:00

Se a diferença de fuso horário não é conhecido (representando algum tempo indeterminado local),
deixar de fora a parte compensado:
2012-09-07T23: 37:42

A biblioteca padrão função stdnse.format_timestamp código existe para formatar vezes


para saída estruturada. É preciso uma zona horária opcional deslocamento em segundos e
automaticamente muda a data para ser correto dentro desse deslocamento.
stdnse.format_timestamp (os.time (), 0) -> "2012-09-07T23: 37:42 +00:00"

Tratamento de Exceções
NSE fornece um mecanismo de tratamento de excepção, que não está presente na linguagem Lua
base. Ele é adaptado especificamente para a rede de operações I / O, e segue um paradigma de
programação funcional ao invés de uma orientada a objetos. O nmap.new_try método API é
usada para criar um manipulador de exceção. Este método retorna uma função que recebe um
número variável de argumentos que são assumidos como os valores de retorno de outra função. Se
uma exceção é detectada nos valores de retorno (o valor de retorno primeira é falsa), então a
execução do script é abortado e nenhuma saída é produzida. Opcionalmente, você pode passar uma
função para new_try que será chamado se uma exceção é detectada. A função, em geral, realizar
quaisquer operações de limpeza necessárias.
Exemplo 9,6 mostra exceção limpeza lidar no trabalho. Uma nova função chamada catch é
definido simplesmente fechar o soquete recém-criado, no caso de um erro. Ele é usado para
proteger as tentativas de conexão e comunicação sobre esse soquete. Se nenhuma função de captura
é especificado, a execução das aborta script sem mais delongas abertos soquetes permanecerá aberta
até a próxima corrida de coletor de Lua de lixo. Se as mensagens de saída é pelo menos uma ou, se
a verificação é executada no modo de depuração, uma descrição da condição de erro não detectado
é impresso na saída padrão. Note-se que de momento não é facilmente possível agrupar instruções
diversas em um bloco try.
Exemplo 9.6. Exemplo de manipulação de exceção
resultado local, soquete, try, catch

resultado = ""
socket = nmap.new_socket ()
pegar = function ()
socket: close ()
final
tentar = nmap.new_try (captura)

tentar (socket: connect (host.ip, port.number))


resultado = tentar (socket: receive_lines (1))
tentar (socket: enviar (resultado))

Escrever uma função que é tratada corretamente pelo mecanismo de try / catch é simples. A função
deve retornar vários valores. O primeiro valor deve ser um booleano que é true após a conclusão
da função e false (ou nil ) caso contrário. Se a função concluída com êxito, a construção
tentativa consome o valor do indicador e retorna os valores restantes. Se a função falhou, então o
segundo valor deve ser devolvido uma string descrevendo a condição de erro. Note que, se o valor
não é nil ou false ela é tratada como true para que você possa retornar o seu valor no caso
normal e voltar nil, <error description> se ocorrer um erro.

O Registro
Os scripts podem compartilhar informações por stroring valores num registo, que é uma tabela
especial que pode ser acessado por todos os scripts. Há um registro global com o nome
nmap.registry , compartilhada por todos os scripts. Cada host ainda tem seu próprio registro
chamado host.registry , onde host é a tabela host passado para um script. Informações nos
registos não é armazenado entre as execuções do Nmap.
O registro global persistir ao longo de uma sessão de digitalização inteiro. Os scripts podem usá-lo,
por exemplo, para armazenar valores que serão posteriormente apresentadas por um script postrule.
Os registros por host, por outro lado, só existem quando um anfitrião está sendo digitalizado. Eles
podem ser usados para enviar informações de um script para outro que corre contra o mesmo
acolhimento. Quando possível, use o registro per-host, o que não só lhe poupa de ter que fazer
principais nomes únicos em hosts, mas também permite que a memória usada pelo Registro para ser
recuperado quando não for mais necessário.
Aqui estão alguns exemplos do uso de ambos os registros:
O portrule do ssh-hostkey script coleta impressões digitais SSH-chave e os armazena no global
nmap.registry para que eles possam ser impressos mais tarde pelo postrule.
O ssl-cert script coleta certificados SSL e os armazena no registro per-host para que o ssl-
google-cert-catalog script pode usá-los sem ter que fazer outra conexão com o servidor.
Porque cada script pode escrever para a tabela de registro global, é importante fazer as teclas
utilizadas única, para evitar a substituição das chaves de outros scripts (ou o mesmo script
executado em paralelo).
Scripts que usam os resultados de outro script deve declará-lo usando a dependencies variável
para se certificar de que o script anterior é executado primeiro.

Free As in Beer! (Nmap and Risk I/O make a tasty


brew)
They say the best things in life are free. Well, Risk I/O provides a
version of its vulnerability intelligence platform, giving you full
access to the tools you need to manage and monitor all your
vulnerability data generated by Nmap and 20 other security tools. Tip
back a glass and create a free account today.

Nmap Digitalização em Rede


Tutorial Escrevendo roteiro

Capítulo 9. Nmap Scripting Engine

Tutorial Escrevendo roteiro


Suponha que você está convencido do poder da NSE. Como é que você vai escrever o seu próprio
roteiro? Vamos dizer que você quer extrair informações de um servidor identificação para
determinar o proprietário do processo de escuta em uma porta TCP. Isto não é realmente o propósito
de identd (que se destina para consultar o proprietário de conexões de saída, não ouvir daemons),
mas muitos servidores Identd permitir que ele de qualquer maneira. Nmap costumava ter essa
funcionalidade (chamada ident scan), mas ele foi removido durante a transição para uma nova
arquitetura de digitalização motor. O protocolo identd usa é muito simples, mas ainda é muito
complicado lidar com a detecção do Nmap versão de idioma. Primeiro, você se conectar ao servidor
de identificação e enviar uma consulta do formulário <port-on-server> , <port-on-
client> e terminado com um caractere de nova linha. O servidor deverá então responder com
uma cadeia de caracteres contendo a porta do servidor, porta do cliente, tipo de resposta, e
informações de endereço. As informações de endereço é omitido se houver um erro. Mais detalhes
estão disponíveis no RFC 1413 , mas esta descrição é suficiente para nossos propósitos. O protocolo
não pode ser modelado na detecção do Nmap versão por duas razões. O primeiro é que você precisa
saber tanto o local e porta remota de uma conexão. Detecção de versão não fornece esses dados. O
obstáculo, segundo mais grave, é que você precisa de duas conexões abertas para o alvo e um para o
servidor de identificação e um para a porta de escuta que deseja consultar. Ambos os obstáculos são
facilmente superadas com NSE.
A anatomia de um script é descrito na seção chamada "Formato de Script" . Nesta seção vamos
mostrar como a estrutura descrita é utilizada.

O Chefe
O chefe do script é essencialmente a sua meta-informação. Isso inclui os campos: description ,
categories , dependencies , author , e license , bem como informações NSEDoc
inicial, tais como o uso, args, e tags de saída (ver a seção chamada "Documentação Script Escrita
(NSEDoc)" ).
O campo de descrição deve conter um parágrafo ou mais descrevendo o que o script faz. Se nada
sobre os resultados de script pode confundir ou enganar os usuários, e você não pode eliminar o
problema melhorando o script ou texto de resultados, deve ser documentado na description .
Se existirem vários parágrafos, o primeiro é utilizado como um breve resumo, quando necessário.
Certifique-se de que o primeiro parágrafo pode servir como um autônomo abstrato. Esta descrição é
curta, porque é um roteiro tão simples:
Descrição = [[
As tentativas de encontrar o proprietário de uma porta TCP aberta consultando
um auth
(Identd - port 113) daemon que também deve ser aberto no sistema de destino.
]]

Em seguida, vem a informação NSEDoc. Este script está faltando o comum @usage e @args
marcas, uma vez que é tão simples, mas tem um NSEDoc @output tag:
---
- Saída @
- 21/tcp ftp aberto ProFTPD 1.3.1
- | _ Autorida-proprietários: ninguém
- 22/tcp aberto ssh OpenSSH 4.3p2 Debian 9etch2 (protocolo 2,0)
- | _ Autorida-proprietários: raiz
- 25/tcp smtp Postfix smtpd aberto
- | _ Autorida-proprietários: postfix
- 80/tcp aberto http Apache httpd 2.0.61 ((Unix) PHP/4.4.7 ...)
- | _ Autorida-proprietários: dhapache
- Auth 113/tcp aberta?
- | _ Autorida-proprietários: ninguém
- 587/tcp submissão aberta Postfix smtpd
- | _ Autorida-proprietários: postfix
- Desconhecido 5666/tcp aberto
- | _ Autorida-proprietários: raiz

Em seguida, vêm o author , license e categories tags. Este script pertence ao safe
porque não estamos usando o serviço para qualquer coisa que não estava destinado. Porque esse
script é um que deve ser executado por padrão, ele também está no default categoria. Aqui estão
as variáveis de contexto:
author = "Diman Todorov"

licença = "Mesmo que o Nmap - Veja http://nmap.org/book/man-legal.html"


Categorias = {"default", "seguro"}

A Regra
A seção de regra é um método Lua que decide se a saltar ou executar a ação do script. Esta decisão
baseia-se normalmente o tipo de regra e de acolhimento e informação portuária passado para ele. A
prerule ou um postrule sempre avaliar a verdade. No caso de o certificado de identificação, é
um pouco mais complicado do que isso. Para decidir se a executar o script de identificação contra
uma determinada porta que precisa de saber se há um servidor de autenticação em execução na
máquina de destino. Em outras palavras, o script deve ser executado somente se o momento
digitalizado TCP porta está aberta ea porta TCP 113 também está aberta. Por agora, vamos confiar
no fato de que os servidores de identificação ouvir na porta TCP 113. Infelizmente NSE só nos dá
informações sobre a porta atualmente digitalizado.
Para descobrir se a porta 113 está aberta, usamos o nmap.get_port_state função. Se a porta
de autenticação não foi digitalizado, o get_port_state função retorna nil . Então, vamos
verificar que a tabela não é nil . Nós também verificar que ambas as portas estão no open do
estado. Se este for o caso, a ação é executada, caso contrário, vamos pular a ação.
portrule função = (host, porta)
locais auth_port = {= número 113, protocol = "tcp"}
identd locais = nmap.get_port_state (host, auth_port)

voltar identd ~ = nil


e identd.state == "aberto"
e port.protocol == "tcp"
e port.state == "aberto"
final

A Ação
Na última vez que implementar a funcionalidade real! O primeiro script se conecta à porta na qual
esperamos encontrar o servidor de identificação, então ele vai se conectar à porta que deseja obter
informações. Isso envolve primeiro criar duas opções de socket chamando nmap.new_socket .
Em seguida, definimos um erro de manipulação de catch função que fecha os soquetes se a falha
é detectada. Neste ponto, pode usar com segurança os métodos de objetos, tais como open ,
close , send e receive a operar no soquete de rede. Neste caso chamamos connect para
fazer as ligações. Mecanismo de NSE manipulação de exceção é utilizado para evitar o código de
tratamento de erros em excesso. Nós simplesmente enrolar a rede chama de uma try de chamada
que por sua vez chama a nossa catch função, se alguma coisa der errado.
Se as duas conexões de sucesso, construímos uma seqüência de consulta e analisar a resposta. Se
recebemos uma resposta satisfatória, voltamos a informação recuperada.
action = função (host, porta)
locais proprietário = ""

locais client_ident = nmap.new_socket ()


client_service locais nmap.new_socket = ()

captura locais = function ()


client_ident: close ()
client_service: close ()
final

local de tentar = nmap.new_try (captura)


tentar (client_ident: connect (host.ip, 113))
tentar (client_service: connect (host.ip, port.number))

LocalIP local, localport, remoteip, RemotePort =


tentar (client_service: get_info ())

solicitação local port.number = .. "" .. localport .. "\ R \ n"

tentar (client_ident: enviar (request))

proprietário = tentar (client_ident: receive_lines (1))

se String.match (proprietário, "ERRO"), então


proprietário = nil
outro
proprietário = String.match (proprietário,
"% D * +% s,% s% * d * +% s:% s *% USERID s:% s * +%
s:. (. +)?% S * \ r \ n")
final

tentar (client_ident: fechar ())


tentar (client_service: fechar ())

voltar proprietário
final

Observe que, como sabemos que a porta remota é armazenado em port.number , poderíamos ter
ignorado os dois últimos valores de retorno de client_service:get_info() assim:
LocalIP local, localport = tentar (client_service: get_info ())

Neste exemplo, vamos sair discretamente se o serviço responde com um erro. Isto é feito através da
atribuição de nil para o owner variável que vão ser devolvidos. Os scripts NSE geralmente só
retornar mensagens quando eles tiverem sucesso, para que eles não inundar o usuário com alertas
inúteis.

Documentação Script escrito (NSEDoc)


Scripts são usados por mais do que apenas os seus autores, para que eles exigem uma boa
documentação. NSE módulos precisam de documentação para os desenvolvedores podem usá-los
em seus scripts. Sistema NSE documentação, descrita nesta seção, visa atender ambas as
necessidades. Enquanto estiver lendo esta seção, você pode querer procurar documentação online
NSE, que é gerada usando este sistema. É no http://nmap.org/nsedoc/ .
NSE usa uma versão personalizada do LuaDoc sistema de documentação chamado NSEDoc. A
documentação para os scripts e módulos está contida em seu código fonte, como comentários com
uma forma especial. Exemplo 9,7 é um comentário NSEDoc retirado do
stdnse.print_debug() função.
Exemplo 9.7. Um comentário NSEDoc para uma função
---
- Imprime uma mensagem de depuração formatada se o nível de detalhamento atual
é maior
- Igual ou superior a um determinado nível.
-
- Este é um invólucro em torno de conveniência
- <code> Nmap.log_write </ code>. A primeira numérico opcional
- Argumento, <code> nível </ code>, é usado como o nível necessário de
depuração
- Para imprimir a mensagem (o padrão é 1 se omitido). Todos os argumentos
restantes
- São tratados com <code> de Lua string.format </ code> função.
- @ Param nível nível de depuração opcional.
- @ Param formato de string fmt.
- @ Param ... Argumentos para o formato.

Os comentários de documentação começar com três traços: --- . O corpo do comentário é a


descrição do código a seguir. O primeiro parágrafo da descrição deve ser um breve resumo, com os
parágrafos seguintes fornecendo mais detalhes. Tags especiais, começando com @ marcar outras
partes da documentação. No exemplo acima, ver @param , o qual é usado para descrever cada
parâmetro de uma função. Uma lista completa das marcas de documentação é encontrada em seção
chamada "Tags Documentação NSE" .
Texto incluído no HTML-como <code> e </code> tags será processado em uma fonte
monoespaçada. Isto deve ser utilizado para a função de variáveis e nomes, bem como exemplos de
várias linhas de código. Quando uma seqüência de linhas começam com os caracteres " * ", que
será processado como uma lista com marcadores. Cada item da lista deve ser inteiramente de uma
linha física.
É uma boa prática para documentar toda função pública e tabela em um script ou módulo. Além
disso cada roteiro e módulo deve ter sua documentação em nível de arquivo próprio. Um
comentário de documentação no início de um arquivo (que não é seguida por uma definição de
função ou tabela) aplica-se a todo o arquivo. Nível de arquivo de documentação pode e deve ser
vários parágrafos de comprimento, com todas as informações de alto nível útil para um
desenvolvedor usando um módulo ou um usuário executar um script. Exemplo 9,8 documentação
mostra para o comm módulo (com alguns parágrafos removidos para economizar espaço ).
Exemplo 9.8. Um comentário NSEDoc para um módulo
---
- Funções comuns de comunicação para tarefas de descoberta de rede como
- Troca da bandeira agarrando e dados.
-
- Estas funções podem ser passadas de uma mesa de opções, mas não é necessário.
O
- Chaves para a tabela de opções são <code> "bytes" </ code>, <code> "linhas"
</ code>,
- <code> "Proto" </ code>, e <code> "timeout" </ code>. <code> "bytes" </
code> conjuntos
- Um número mínimo de bytes para ler. <code> "linhas" </ code> faz o mesmo
para
- Linhas. <code> "proto" </ code> define o protocolo para se comunicar com,
- Inadimplente para <code> "tcp" </ code> se não for fornecido. <code>
"timeout" </ code>
- Define o tempo limite de soquete (veja o soquete função <code> set_timeout </
code>
- Para mais detalhes).
-
- Autor @ Kris Katterjohn 04/2008
- Copyright @ Mesmo que o Nmap - Veja http://nmap.org/book/man-legal.html

Há algumas considerações especiais para documentar os scripts em vez de funções e módulos. Em


particular, os scripts têm variáveis especiais para algumas informações que de outra forma pertence
@ tag-comentários (variáveis de script são descritos na seção chamada "Formato de Script" ). Em
particular, a descrição de um script pertence na description variável em vez de um comentário
de documentação, e as informações que iria no @author e @copyright pertencem ao variáveis
author e license vez. NSEDoc sabe sobre essas variáveis e irá utilizá-los em detrimento de
campos nos comentários. Scripts também deve ter @output e @xmloutput marcas que mostram
a saída de amostra, bem como @args e @usage quando necessário. Exemplo 9,9 mostra boa
forma para o script de nível de documentação, usando uma combinação de comentários de
documentação e variáveis NSE.
Exemplo 9.9. Um comentário NSEDoc para um script
Descrição = [[
Mapeia endereços IP para Sistema Autônomo (AS) números.

O roteiro funciona através do envio de consultas DNS TXT para um servidor de


DNS que em
transformar consultas a serviço de terceiros fornecida pelo Team Cymru
(Equipe cymru.org) usando um estilo zona in-addr.arpa criado especialmente para
usar pelo Nmap. As respostas a essas consultas conter Origem e Peer
ASN e suas descrições, apresentado juntamente com o prefixo BGP e
Código do país. O script armazena resultados para reduzir o número de
consultas
e deve realizar uma única consulta para todos os alvos digitalizados em BGP
Prefixo presente no banco de dados do Team Cymru.

Esteja ciente de que todos os alvos contra os quais esse script é executado
será enviado
para e potencialmente gravado por um ou mais servidores DNS e Cymru Team.
Além disso o seu endereço de IP será enviado junto com a ASN em um DNS
servidor (o servidor DNS padrão, ou qualquer um que você especificado com o
<code> dns </ code> argumento de script).
]]

---
- Utilização @
- Nmap - script asn-consulta [- script-args dns = DNS> server>] <target>
- @ Args DNS do endereço de um servidor de nomes recursivo para usar
(opcional).
- Saída @
- Resultados de script de host:
- | Asn-consulta:
- | BGP: 64.13.128.0/21 | País: EUA
- | Origem AS: 10565 SVCOLO-AS - Silicon Valley Colocation, Inc.
- | Intercâmbio AS: 3561 6461
- | BGP: 64.13.128.0/18 | País: EUA
- | Origem AS: 10565 SVCOLO-AS - Silicon Valley Colocation, Inc.
- | Intercâmbio _ AS: 174 2914 6461

author = "jah, Michael"


licença = "Mesmo que o Nmap - Veja http://nmap.org/book/man-legal.html"
Categorias = {"descoberta", "externo", "seguro"}

Módulos compilados NSE também estão documentadas com NSEDoc, mesmo que eles não têm o
código fonte Lua. Cada módulo tem um arquivo compilado <modulename> .luadoc que é
mantida no nselib directório ao lado dos módulos Lua. Este listas de arquivos e documentos das
funções e tabelas no módulo compilado como se eles foram escritos em Lua. Apenas o nome de
cada função é necessária, e não a sua definição (nem mesmo end ). Você deve usar o @name e
@class marcas ao documentar uma tabela para ajudar o analisador documentação em identificá-la.
Há vários exemplos deste método de documentação na distribuição fonte do Nmap (incluindo
nmap.luadoc , bit.luadoc , e pcre.luadoc ).

Documentação Tag NSE


As seguintes tags são compreendidas por NSEDoc:
@param

Descreve um parâmetro de função. A primeira palavra na sequência de @param é o nome do


parâmetro que está sendo descrito. A marca deve aparecer uma vez para cada parâmetro de
uma função.

@see

Adiciona uma referência cruzada para outra função ou tabela.

@return

Descreve um valor de retorno de uma função. @return pode ser usado várias vezes para
valores de retorno múltiplas.

@usage

Fornece um exemplo de uso de uma função, módulo de script, ou. No caso de uma função, o
exemplo é o código Lua, por um roteiro é uma linha de comando do Nmap, e para um módulo
que é usualmente uma amostra de código. @usage pode ser administrada mais do que uma
vez. Se for omitido em um script, NSEDoc gera um padrão exemplo de uso padronizado.

@name

Define um nome para a função ou tabela que está sendo documentado. Esta etiqueta não é
normalmente necessária porque NSEDoc infere nomes por meio da análise de código.

@class

Define a "classe" do objeto a ser documentado: function , table , ou module . Como


@name , este é normalmente inferida automaticamente.

@field

Na documentação de uma tabela, @field descreve o valor de um campo nomeado.

@args

Descreve um argumento de roteiro, como usado com o --script-args opção (ver a seção
chamada "Argumentos para Scripts" ). A primeira palavra após @args é o nome do
argumento, e tudo o que se segue é a descrição. Esta tag é especial para o script de nível de
comentários.

@output
Esta marca, que é exclusivo para o script de nível de comentários, mostra a saída de amostra
de um script.

@xmloutput

Mostra o que o roteiro é a seção chamada "saída estruturada e não estruturada" parece que
quando escrito em XML. A amostra XML não deve incluir o delimitador <script> e
</script> tags e deve ser recuado para mostrar hierarquia.

@author

Esta marca, que pode ser administrada várias vezes, lista os autores de um módulo de NSE.
Para scripts, use o author variável em vez.

@copyright

Esta etiqueta descreve o status de direitos autorais de um módulo. Para scripts, use a
license variável em vez.

Paralelismo script em NSE


Na seção chamada "Rede de I / O API" , foi mencionado que NSE automaticamente paraleliza
operações de rede. Normalmente, este processo é transparente para o autor do script, mas existem
algumas técnicas avançadas que exigem conhecimento de como funciona. As técnicas apresentadas
nesta seção são controlar como vários scripts interagem em uma biblioteca, utilizando múltiplas
threads em paralelo, paralelismo e incapacitante para casos especiais.
O mecanismo padrão para a execução paralela é uma discussão. Um fio encapsula o fluxo de
execução e dados de um script. Fio Lua pode ser cedeu em locais arbitrários para continuar o
trabalho em outro script. Normalmente, esses locais de rendimento estão a bloquear operações de
socket no nmap biblioteca. O rendimento de volta para o roteiro é também transparente, um efeito
lateral da operação de encaixe.
Vamos passar por cima de alguma terminologia comum. Um script é análogo a um binário
executável, que detém as informações necessárias para executar um script. Um fio (uma co-rotina
Lua) é análogo a um processo, que é executado um script em um host e talvez a porta. Às vezes,
abusamos terminologia e referem-se a um segmento em execução como uma execução "script", mas
o que isso realmente significa é uma instância de um script, da mesma forma que um processo é a
instanciação de um executável.
NSE fornece o essencial de ossos necessários para expandir modelo de paralelismo básico de uma
discussão por script: novas linhas independentes, mutexes e variáveis de condição.

Threads de trabalho
Há vários casos em que um script necessita maior controle com relação a execução paralela para
além do que é oferecido por padrão com um script genérico. Uma necessidade comum é a leitura de
múltiplos soquetes simultaneamente. Por exemplo, um script spidering HTTP pode querer ter
múltiplas threads Lua consultando os recursos do servidor web em paralelo. Para responder a esta
necessidade, NSE oferece a função stdnse.new_thread para criar segmentos de trabalho.
Estes segmentos de trabalho tem todo o poder de scripts independentes, com a única restrição que
não pode reportar saída do script.
Cada segmento de trabalho lançado por um script é dada uma função principal e um número
variável de argumentos a serem passados para a função principal de NSE:
worker_thread, status_function = stdnse.new_thread(main, ...)
stdnse.new_thread retorna dois valores: o fio Lua (co-rotina) que identifica exclusivamente o
seu segmento de trabalho, e uma função de consulta de status que consulta o status do seu novo
trabalhador. A função de consulta de status retorna dois valores:
status, error_object = status_function()
O valor de retorno primeira é simplesmente o valor de retorno de coroutine.status corrida
sobre a co-rotina segmento de trabalho. (Mais precisamente, a base co-rotina. Leia mais sobre
base co-rotina na seção chamada "A linha da base" .) O valor de retorno segundo contém um
objeto de erro que causou o término do segmento de trabalho, ou nil se nenhum erro foi acionada.
Este objeto é tipicamente uma corda, como a maioria dos erros de Lua. No entanto, qualquer tipo de
Lua pode ser um objeto de erro, mesmo nil . Portanto inspecionar o objeto de erro, o valor de
retorno segundo, apenas se o estatuto do trabalhador é "dead" .
NSE descarta todos os valores de retorno da função principal quando o segmento de trabalho
termina a execução. Você deve se comunicar com o trabalhador através do uso de main parâmetros
da função, upvalues, ou ambientes de função. Veja Exemplo 9,10 para um exemplo.
Finalmente, quando usando segmentos de trabalho que você sempre deve usar as variáveis de
condição ou semáforos para coordená-los. Nmap é single-threaded para que não haja problemas de
memória de sincronização para se preocupar, mas não há contenção de recursos. Esses recursos
incluem a largura de banda de rede normalmente e soquetes. Variáveis de condição também são
úteis se o trabalho para qualquer único segmento é dinâmico. Por exemplo, um script web aranha
servidor com um conjunto de trabalhadores terá inicialmente uma única raiz do documento HTML.
Após a recuperação do documento de raiz, o conjunto de recursos a serem recuperados (trabalho do
trabalhador) pode tornar-se muito grande como cada novo documento acrescenta novas URLs para
buscar.
Exemplo 9.10. Segmentos de trabalho
solicitações locais = {"/", "/ index.html", - [[longa lista de objetos]]}

função thread_main (host, porta, respostas, ...)


locais condvar = nmap.condvar (respostas);
local o que = {n = select ("#", ...), ...};
allReqs locais = nil;
para i = 1, what.n fazer
allReqs = http.pGet (host, porta, o que [i], nulo, nulo, allReqs);
final
locais p = assert (http.pipeline (host, porta, allReqs));
para i, resposta em ipairs (p) fazer respostas [# respostas +1] final de
resposta =
condvar "sinal";
final

many_requests função (host, porta)


threads locais = {};
respostas locais = {};
locais condvar = nmap.condvar (respostas);
local i = 1;
repetir
local, j = Math.min (i 10, # pedidos);
co locais stdnse.new_thread = (thread_main, host, porta, respostas,
unpack (pedidos, I, J));
tópicos [co] = true;
i = j +1;
até que eu pedidos> #;
repetir
para rosca em pares (threads) fazer
se coroutine.status (thread) == "mortos" e depois tópicos [thread] = fim
nil
final
if (próxima (threads)) então
condvar "esperar"
final
até a próxima (threads) == nil;
retornar respostas;
final

Para resumir, este exemplo omite o comportamento típico de uma teia de aranha tradicional. A
tabela de pedidos é assumido para conter objetos suficientes para justificar o uso de segmentos de
trabalho. O código neste exemplo despacha um novo segmento com até 11 URLs relativos.
Segmentos de trabalho são baratos, então não tenha medo de criar um monte deles. Depois de
despachar todos esses tópicos, o código de espera em uma variável de condição até que cada
segmento tem terminado, então, finalmente, retornar a tabela de respostas.
Você deve ter notado que nós não utilizar a função de status retornado por stdnse.new_thread
. Você vai utilizar isto para depuração ou se o programa deve parar com base no erro lançada por
um dos tópicos seus trabalhadores. Nosso exemplo simples não requerem maio deste, mas uma
biblioteca de mais tolerante a falhas.

Mutexes
Lembre-se, desde o início desta seção que cada thread de execução de script (por exemplo, ftp-
anon correndo contra um servidor de FTP em um host de destino) cede a outros scripts sempre que
faz uma chamada em objetos de rede (enviando ou recebendo dados). Alguns scripts requerem um
controle mais preciso sobre a simultaneidade execução de segmento. Um exemplo é o whois script
que consulta whois servidores para cada endereço IP de destino. Porque muitas consultas
simultâneas pode obter o seu IP banido por abuso, e por uma única consulta pode retornar a mesma
informação outra instância do script está prestes a pedido, é útil ter uma pausa tópicos outro,
enquanto uma thread executa uma consulta.
Para resolver este problema, NSE inclui um mutex função que fornece um mutex utilizável (objeto
de exclusão mútua) por scripts. O mutex permite apenas um segmento de estar trabalhando em um
objeto de cada vez. Segmentos concorrentes à espera de trabalhar neste objeto são colocados na fila
de espera até que eles podem obter um "bloqueio" na mutex. Uma solução para o whois problema
acima é que cada bloco de rosca em um mutex usando uma corda comum, garantindo que apenas
um segmento em um tempo é consultar um servidor. Quando terminar consultar os servidores
remotos, o segmento pode armazenar os resultados no Registro NSE e destravar o mutex. Outros
scripts de espera para consultar o servidor remoto pode então obter um bloqueio, para verificar o
cache de um resultado útil de uma consulta anterior, fazer as suas próprias consultas, e destravar o
mutex. Este é um bom exemplo de serialização de acesso a um recurso remoto.
O primeiro passo para usar um mutex é criar um com uma chamada para nmap.mutex .
mutexfn = nmap.mutex (objeto)

O mutexfn retornado é uma função que funciona como um mutex para o object passou dentro
Este objeto pode ser qualquer tipo de dados Lua , exceto nil , Boolean, eo número. A nova função
permite bloquear, tentar bloquear e liberar o mutex. O seu único argumento deve ser um dos
seguintes:
"lock"

Faz um bloqueio no mutex. Se o mutex está ocupado (outro segmento tem um bloqueio sobre
ele), então o segmento irá render e esperar. A função retorna com o mutex bloqueado.

"trylock"

Faz um bloqueio sem bloqueio no mutex. Se o mutex está ocupado, então ele retorna
imediatamente com um valor de retorno false . Caso contrário, bloqueia o mutex e retorna
true .

"done"

Libera o mutex e permite que outro segmento para o bloquear. Se a linha não tem um
bloqueio no mutex, um erro será gerado.

"running"

Retorna a linha bloqueada no mutex ou nil se o mutex não está bloqueado. Isso só deve ser
usado para depuração, uma vez que interfere com a coleta de lixo de fios acabados.

NSE mantém uma referência fraca para o mutex para outras chamadas para nmap.mutex com o
mesmo objeto retornará a função mesmo mutex. No entanto, se você descartar a sua referência para
o mutex, então ele pode ser recolhida e as chamadas subseqüentes para nmap.mutex com o objeto
irá retornar uma função diferente. Portanto salvar sua mutex a uma variável (local) que persiste
desde que você precisar.
Um exemplo simples de usar o API é fornecida no Exemplo 9,11 . Para exemplos da vida real, leia a
asn-query e whois scripts na distribuição Nmap.
Exemplo 9.11. Manipulação Mutex
locais mutex = nmap.mutex ("Unique ID Meu script");
ação da função (host, porta)
mutex "bloqueio";
- Do trabalho seção crítica - apenas um segmento por vez executa isso.
mutex "feito";
voltar script_output;
final

Variáveis Condição
Variáveis de condição surgiu de uma necessidade de coordenar com segmentos de trabalho criados
pela stdnse.new_thread função. Uma variável de condição permite que várias threads para
esperar em um objeto, e um ou todos eles para ser despertada quando alguma condição é satisfeita.
Dito de outra forma, vários segmentos podem incondicionalmente block a variável de condição de
espera. Outros tópicos podem usar a variável de condição para acordar os tópicos de espera.
Por exemplo, considere o mais cedo Exemplo 9.10, "segmentos de trabalho" . Até que todos os
trabalhadores acabamento, a linha mestre deve dormir. Note-se que não podemos poll para
resultados como em um segmento tradicional do sistema operacional porque NSE não antecipar
tópicos Lua. Em vez disso, usamos uma variável de condição de que a linha mestre espera até
despertada por um trabalhador. O mestre continuamente esperar até que todos os trabalhadores
tenham terminado.
O primeiro passo na utilização de uma variável de estado é o de criar um com uma chamada para
nmap.condvar .
condvarfn = nmap.condvar(object)
A semântica para as variáveis de condição são semelhantes aos de semáforos. O condvarfn
retornado é uma função que funciona como uma variável de condição para o object passou
dentro Este objeto pode ser qualquer tipo de dados Lua , exceto nil , Boolean, eo número. A nova
função permite que você espera, sinal, e transmitido pela variável de condição. O seu único
argumento deve ser um dos seguintes:
"wait"

Espera no variável de condição. Isso adiciona a linha atual para a fila de espera para a variável
de condição. Ele vai continuar a execução quando outros sinais de rosca ou transmissões
sobre a variável de condição.

"signal"

Sinalizar a variável de condição. Um dos tópicos em fila de espera, a variável de condição


será retomada.

"broadcast"

Retomar todos os tópicos em fila de espera, a variável de condição de.

Como com mutexes, NSE mantém uma referência fraca para a variável de condição para outras
chamadas para nmap.condvar com o mesmo objeto voltará a mesma função. No entanto, se você
descartar a sua referência para a variável de condição, então ele pode ser recolhida e as chamadas
subseqüentes para nmap.condvar com o objeto irá retornar uma função diferente. Portanto
salvar sua variável de condição para uma variável (local) que persiste desde que você precisar.
Ao usar as variáveis de condição, é importante verificar o predicado antes e depois de esperar. Um
predicado é um teste sobre a possibilidade de continuar a fazer o trabalho dentro de um trabalhador
ou de fios de mestre. Por segmentos de trabalho, esta vontade no mínimo incluir um teste para ver
se o segmento mestre ainda está vivo. Você não quer continuar fazendo o trabalho quando não há
linha para usar seus resultados. Um teste típico antes de espera pode ser: Verifique se o mestre ainda
está em execução, se não, saia. Verifique se é um trabalho a ser feito, se não, aguarde.
Um segmento em espera em uma variável de condição pode ser reiniciado sem qualquer outro
segmento ter chamado "signal" ou "broadcast" sobre a variável de condição (a wakeup
espúria). A razão, mas não só, sempre que isso pode acontecer é o encerramento de um dos
segmentos usando a variável de condição. Esta é uma garantia importante NSE faz que lhe permite
evitar impasse em que um trabalhador ou mestre espera por um fio para acordá-los, que terminou
sem sinalização a variável de condição.

Multithreading colaborativo
Uma das características menos conhecidas Lua é multithreading colaborativo através do co-rotinas.
Uma função fornece uma pilha de execução independente que pode ser produzida e retomada. O
padrão coroutine tabela fornece acesso à criação e manipulação de co-rotinas. Edição online de
Lua primeiro de Programação em Lua contém uma excelente introdução à co-rotinas. O que se
segue é uma visão geral do uso de co-rotinas aqui para ser completo, mas isso não é substituto para
a referência definitiva.
Temos mencionado co-rotinas em toda esta seção, como tópicos. Este é o tipo ( "thread" ) de
uma co-rotina em Lua. Eles não são os tópicos de preferência que os programadores podem estar
esperando. Tópicos de Lua oferecem a base para a criação de scripts paralelo, mas apenas um
segmento está sempre correndo de uma vez.
A função Lua executa em cima de um fio Lua. O fio mantém uma pilha de funções ativas, variáveis
locais, eo ponteiro de instrução atual. Podemos alternar entre co-rotinas explicitamente produzindo
o fio condutor. A co-rotina que retomou o fio cedeu retoma a operação. Exemplo 9,12 mostra uma
utilização breve de co-rotinas para imprimir números.
Exemplo 9.12. Uso co-rotina básica
local de função main ()
coroutine.yield (1)
coroutine.yield (2)
coroutine.yield (3)
final
local co coroutine.create = (principal)
para i = 1, 3 fazer
print (coroutine.resume (co))
final
-> True 1
-> True 2
-> 3 verdade

Co-rotinas são a facilidade que permite NSE para executar scripts em paralelo. Todos os scripts são
executados como co-rotinas que produzem sempre que fazer uma chamada de função de bloqueio
socket. Isto permite NSE para executar outros scripts e mais tarde retomar o script bloqueado
quando sua operação I / O foi concluída.
Às vezes, co-rotinas são a melhor ferramenta para um trabalho em um único script. Um uso comum
na programação tomada é a filtragem de dados. Você pode escrever uma função que gera todos os
links de um documento HTML. Um iterador usando string.gmatch pode pega só um padrão
único. Porque alguns jogos complexos podem levar muitos padrões diferentes de Lua, é mais
apropriado usar uma co-rotina. Exemplo 9,13 mostra como fazer isso.
Exemplo 9.13. Gerador de link
ligações de função (html_document)
função local gerar ()
para m em string.gmatch (html_document, "% url ((-).%)") do
coroutine.yield (m) - url css
final
para m em string.gmatch (html_document, "href% s * =% s * \" (-). \ "") do
coroutine.yield (m) - link de âncora
final
para m em string.gmatch (html_document, "src% s * =% s * \" (-). \ "") do
coroutine.yield (m) - fonte img
final
final
voltar coroutine.wrap (gerar)
final

ação da função (host, porta)


- ... obter documento HTML e armazenar em locais html_document
para link em links (html_document) fazer
links [# links 1] link =; - armazená-lo
final
- ...
final

O fio de base
Como os scripts podem utilizar co-rotinas para a sua própria multithreading, é importante ser capaz
de identificar o proprietário de um recurso ou para estabelecer se o script ainda está viva. NSE
fornece a função stdnse.base para esta finalidade.
Particularmente, ao escrever uma biblioteca que atribui a propriedade de um cache ou soquete para
um script, você pode usar o fio de base para estabelecer se o script ainda está em execução.
coroutine.status no segmento de base vai dar o estado atual do script. Nos casos em que o
script é "dead" , que você vai querer liberar o recurso. Tenha cuidado com a manutenção de
referências a esses tópicos; NSE pode descartar um script, mesmo que não tenha concluído a
execução. O fio ainda irá relatar um status de "suspended" . Você deve manter uma referência
fraca para o segmento, nestes casos, de modo que possa ser coletado.

ção A utilização NSE


O sistema de detecção de versão incorporado Nmap foi concebida para reconhecer eficientemente a
grande maioria dos protocolos com uma sonda simples e sintaxe de correspondência de padrões.
Alguns protocolos exigem uma comunicação mais complexa do que a detecção de versão pode
manipular. Uma linguagem de script generalizado, tal como previsto pela NSE é perfeita para esses
casos mais difíceis.
NSE version categoria contém scripts que melhoram a detecção de versão standard. Scripts nesta
categoria são executados sempre que você solicitar a detecção de versão com -sV , você não
precisa usar -sC para executar estes. Isso corta o outro lado também: se você usa -sC , você não
vai ter version os scripts, a menos que você também usar -sV .
Um protocolo que não foi possível detectar, com a detecção de versão normal é Skype versão 2. O
protocolo foi provavelmente concebido para frustrar a detecção de um medo que a Telecom filiados
prestadores de serviços de Internet pode considerar competição Skype e interferir com o tráfego. No
entanto, nós encontramos uma forma de detectá-lo. Se o Skype recebe uma solicitação HTTP GET,
que pretende ser um servidor web e retorna um erro 404. Mas para outros pedidos, envia de volta
um pedaço de aleatório com aparência de dados. Identificação adequada requer o envio de duas
sondas e comparando as duas respostas-uma tarefa ideal para NSE. O script NSE simples que faz
isso é mostrado no Exemplo 9,14 .
Exemplo 9.14. Um script de detecção típico versão (Skype versão 2 detecção)
Descrição = [[
Detecta a versão do Skype 2 serviço.
]]

---
- Saída @
- ESTADO DO PORTO versão de serviço
- 80/tcp aberto skype2 Skype

author = "Brandon Enright"


licença = "Mesmo que o Nmap - Veja http://nmap.org/book/man-legal.html"
Categorias = {"versão"}

exigir "comm"
exigir "shortport"

portrule função = (host, porta)


return (port.number == 80 ou 443 ou port.number ==
port.service == nil ou port.service == "" ou
port.service == "desconhecido")
e port.protocol == "tcp" e port.state == "aberto"
e port.service ~ = "http" e port.service ~ = "ssl / http"
e não (shortport.port_is_excluded (port.number, port.protocol))
final

action = função (host, porta)


local de status do resultado, comm.exchange = (host, porta
"GET / HTTP/1.0 \ r \ n \ r \ n", {bytes = 26, proto =
port.protocol})
if (não status) então
voltar
final
if (resultado ~ = "HTTP/1.0 404 Not Found \ r \ n \ r \ n"), então
voltar
final
- Até aqui tudo bem, agora ver se temos dados aleatórios para outro
pedido
status, resultado comm.exchange = (host, porta
"Dados aleatórios \ r \ n \ r \ n", {bytes = 15, proto =
port.protocol})

if (não status) então


voltar
final
se String.match (resultado, "[^% s -! ~] *. [^% s -! ~] *. [^% s -!
~]"), então
- Detectado
port.version.name = "skype2"
port.version.product = "Skype"
nmap.set_port_version (host, porta)
voltar
final
voltar
final

Se o script detecta Skype, ele aumenta sua port tabela com agora conhecido name e product
campos. Em seguida, envia esta nova informação para o Nmap chamando
nmap.set_port_version . Vários campos de versão estão disponíveis para ser definida, se
forem conhecidos, mas, neste caso, só tem o nome e produto. Para a lista completa dos campos de
versão, consulte o nmap.set_port_version documentação .
Note que este script não faz nada a não ser que detecta o protocolo. Um script não deve produzir a
saída (que não seja a saída de depuração) apenas para dizer que não aprendi nada.
Script exemplo: finger
O finger script é um exemplo perfeito de um roteiro NSE curto e simples.
Primeiro os campos de informação são atribuídos. Uma descrição detalhada do que o script faz
realmente vai na description do campo.
Descrição = [[
As tentativas para obter uma lista de nomes de usuários através do serviço de
dedo.
]]

author = "Eddie Bell"

licença = "Mesmo que o Nmap - Veja http://nmap.org/book/man-legal.html"

O categories campo é uma tabela contendo todas as categorias o script pertence. Estes são
utilizados para a seleção de script com o --script opção:
Categorias = {"default", "descoberta", "seguro"}

Todo bom roteiro vem com uma amostra de sua produção em um comentário NSEDoc.
---
- Saída @
- SERVIÇO DE ESTADO DO PORTO
- 79/tcp dedo aberto
- | Dedo:
- | Bem-vindo ao Linux versão 2.6.31.12-0.2-default em linux-pb94.site!
- | 01:14 até 18:54, 4 users, load average: 0,14, 0,08, 0,01
- |
- | Login Nome Tty Tempo ocioso Onde Entrar
- | Gutek Ange Gutek *: 0 - Qua 06:19 consola
- | Gutek Ange Gutek pts / 1 18:54 Qua 06:20
- | Gutek Ange Gutek * pts / 0 - Qui 00:41
- | _Gutek Ange Gutek * pts / 4 3 qui 01:06

Você pode usar as facilidades oferecidas pelo nselib ( a seção chamada "Bibliotecas" NSE ) com
require . Aqui nós queremos usar funções de comunicação e regras comuns curtos porta:
exigir "comm"
exigir "shortport"

Queremos executar o script contra o serviço de dedo. Assim, testar se ele está usando a porta dedo
bem conhecido ( 79/tcp ), ou se o serviço é chamado de "dedo" com base em resultados de
detecção de versão ou na lista do número de porta em nmap-services :
portrule = shortport.port_or_service (79, "dedo")

Primeiro, o script usa nmap.new_try para criar um manipulador de exceção que sairá do script
no caso de um erro. Em seguida, ele passa o controle para comm.exchange , que lida com a
transação rede. Aqui temos pediu para esperar na troca de comunicação até que receber pelo menos
100 linhas, aguarde pelo menos 5 segundos, ou até que o lado remoto fecha a conexão. Quaisquer
erros são tratados pela try manipulador de exceção. O script retorna um string se a chamada para
comm.exchange() foi bem sucedida.
action = função (host, porta)
local de tentar = nmap.new_try ()

voltar tentar (comm.exchange (host, porta, "\ r \ n",


{Linhas = 100, proto = port.protocol, timeout = 5000}))
final

Detalhes de implementação
Agora é hora de explorar os detalhes de implementação NSE em profundidade. Entender como
funciona NSE é útil para projetar os scripts eficientes e bibliotecas. A referência canônica para a
implementação NSE é o código-fonte, mas esta seção fornece uma visão geral dos detalhes
importantes. Deve ser valiosos para as pessoas que tentam compreender e estender o código fonte
de NSE, bem como para os autores de script que querem compreender melhor como os scripts são
executados.

Fase de Inicialização
NSE é inicializado antes de qualquer verificação quando o Nmap primeiro começa, pela
open_nse função. open_nse cria um estado Lua fresco que vai persistir em todos os grupos de
acolhimento, até a saída do programa. Em seguida, ele carrega as bibliotecas padrões e compilados
bibliotecas NSE. As bibliotecas padrões são documentados no Manual de Referência Lua . As
bibliotecas padrões disponíveis para NSE são debug , io , math , os , package , string , e
table . Bibliotecas compiladas NSE são aqueles que são definidos em um arquivo C + + em vez
de um arquivo Lua. Eles incluem nmap , pcre , bin , bit , e openssl (se disponível).
Depois de carregar as bibliotecas básicas, open_nse carrega o arquivo nse_main.lua . O
núcleo NSE é neste código arquivo Lua gerencia os scripts e configura o ambiente adequado. Nesta
situação Lua realmente brilha como uma linguagem de cola. C + + é utilizado para fornecer a
estrutura de rede e de baixo nível de bibliotecas. Lua é usada para dados de estrutura, determinar
que os scripts para carregar, e programar e executar scripts.
nse_main.lua configura o ambiente Lua para estar pronto para a verificação do script mais
tarde. Ele carrega todos os scripts que o usuário tenha escolhido e retorna uma função que faz o
script real digitalização para open_nse .
O nselib directório é adicionado ao caminho Lua para dar os scripts acesso à biblioteca NSE
padrão. Substituições NSE cargas para as funções de co-rotina padrão para que os rendimentos
iniciadas por NSE são capturados e propagadas de volta para o programador NSE.
nse_main.lua seguinte define classes e funções para ser usado durante a instalação. Os
argumentos de script ( --script-args ) são carregados em nmap.registry.args . Um
banco de dados script é criado se não existir ou se esta foi solicitada com --script-updatedb .
Finalmente, os scripts listados na linha de comando são carregados. O get_chosen_scripts
função trabalha para encontrar os scripts escolhidos por categorias, nomes de arquivos, comparando
e nomes de diretórios. Os scripts são carregados na memória para uso posterior.
get_chosen_scripts funciona transformando o argumento para --script em um bloco de
código Lua e depois executá-lo. (Isto é como o and , or , e not operadores são suportados.)
Quaisquer especificações que não correspondem diretamente uma categoria ou um nome de arquivo
script.db são verificados contra nomes de arquivos e diretórios. Se a especificação é um
arquivo regular, que é carregada. Se um diretório, todos os *.nse arquivos dentro dela são
carregados. Caso contrário, o motor gera um erro.
get_chosen_scripts termina por organizar os roteiros selecionados de acordo com suas
dependências (ver a seção chamada " dependencies Campo " ). Scripts que não têm
dependências estão em nível de execução 1. Scripts que dependem directamente estes estão em
runlevel 2, e assim por diante. Quando uma verificação script é executado, cada nível de execução é
executado separadamente e em ordem.
nse_main.lua define duas classes: Script e Thread . Essas classes são os objetos que
representam os scripts NSE e fios dos seus scripts. Quando um script é carregado, Script.new
cria um objeto novo script. O arquivo de script é carregado na Lua e guardados para uso posterior.
Essas classes e seus métodos são destinados para encapsular os dados necessários para cada roteiro
e seus segmentos. Script.new também contém checagens para garantir que o script campos
obrigatórios, como a action da função.

Digitalização Script
Quando NSE executa uma varredura script, script_scan é chamado em nse_main.cc .
Desde que há três fases de verificação de script, script_scan aceita dois argumentos, um tipo de
varredura de script que pode ser um destes valores: SCRIPT_PRE_SCAN (Script fase de pré-
digitalização) ou SCRIPT_SCAN (Script fase de digitalização) ou SCRIPT_POST_SCAN (Script
fase pós-digitalização), e um segundo argumento que é uma lista de alvos para verificar se a fase de
varredura do roteiro é SCRIPT_SCAN . Essas metas serão passados para o nse_main.lua
principal função para a digitalização.
A principal função de uma varredura de script gera uma série de tópicos de script baseado em se a
rule função retornará verdadeiro. Os tópicos gerados são armazenados em uma lista de listas de
runlevel. Cada lista o nível de execução de threads é passado separadamente ao run da função. A
run é a função do trabalhador principal para NSE, onde toda a magia acontece.
A run propósito função é executar todos os tópicos em um nível de execução até que terminem
todos. Antes de fazer isso no entanto, run redefine alguns valores de registro de Lua que ajudam C
função de código. Uma tal função, _R[WAITING_TO_RUNNING] , permite a ligação biblioteca
de rede escrito em C para mover um segmento a partir da fila de espera para a fila de execução.
Scripts são executados até que as filas de espera em execução e são ambos vazios. Tópicos que o
rendimento são movidos para a fila de espera; segmentos que estão prontos para continuar se
mudou de volta para a fila de execução. O ciclo continua até que o fio sai ou termina em erro.
Juntamente com as filas de espera em funcionamento, há uma fila de pendente. Ele serve como um
local temporário para tópicos que se deslocam de fila de espera para a fila de execução antes de uma
nova iteração da fila de execução começa.

Вам также может понравиться