Ir ao contido

NSE (Nmap Scripting Engine)

NSE permite estender a funcionalidade de nmap mediante scripts escritos en Lua. Hai centos de scripts dispoñibles.


Localización dos Scripts NSE

Directorio principal de scripts

# Directorio estándar en sistemas Linux
ls /usr/share/nmap/scripts/

# Ver cantos scripts hai
ls /usr/share/nmap/scripts/ | wc -l
# Resultado típico: 600+ scripts

Base de datos de scripts

# Ver a base de datos de scripts
cat /usr/share/nmap/scripts/script.db | head -20

Cada script NSE pode pertencer a unha ou varias destas categorías:

  1. auth: Scripts relacionados coa autenticación e credenciais (ex: comprobar logins baleiros).
  2. broadcast: Descubrimento de hosts mediante sinais de difusión na rede local (non só directos ao host).
  3. brute: Intentos de forza bruta para adiviñar contrasinais.
  4. default: A categoría que usas con -sC. Son rápidos, fiables e útiles.
  5. discovery: Tenta aprender máis sobre a rede (buscas DNS, SNMP, rexistros, etc.).
  6. dos: (Denial of Service) Poden causar denegación de servizo. Coidado, poden tombar o servidor.
  7. exploit: Intenta explotar unha vulnerabilidade coñecida.
  8. external: Scripts que necesitan conectarse a unha fonte externa (como Google ou Virustotal) para funcionar.
  9. fuzzer: Envía datos aleatorios ou corruptos para ver como reacciona o servizo.
  10. info: Extrae datos estendidos ou de configuración do servizo (ex: data do sistema, cabeceiras HTTP ou configuración RPC) que non son estritamente versións nin vulnerabilidades.
  11. intrusive: Scripts moi "ruidosos" ou arriscados, que o administrador do sistema detectará seguro ou que poden bloquear o sistema.
  12. malware: Busca infeccións ou backdoors no servidor remoto.
  13. safe: Scripts que non deberían causar danos nin bloquear servizos.
  14. version: Scripts usados especificamente pola opción -sV para detectar versións.
  15. vuln: Comproba se existen vulnerabilidades específicas (pero non necesariamente as explota).

2. Como listar scripts por categoría (Comando práctico)

Se queres ver que scripts hai dentro dunha categoría específica, usa a axuda de nmap:

# Listar todos os scripts da categoría "vuln"
nmap --script-help vuln

3. Como ver as categorías "en bruto" desde o terminal

Se queres sacarlle a información directamente á base de datos de Nmap (o ficheiro script.db que vimos antes), podes usar este "truco" de terminal para ver todas as categorías que aparecen nos teus scripts instalados:

grep -r "categories" /usr/share/nmap/scripts/*.nse | cut -d '{' -f 2 | cut -d '}' -f 1 | tr ',' '\n' | tr -d ' "' | sort | uniq | grep -Ev "'|share|fixedcategories"  
(Este comando le todos os scripts, extrae o campo "categories", límpao e ordénao alfabeticamente).

Resumo de uso habitual

A maioría das veces non necesitas listar as categorías, senón combinalas. Por exemplo:

  • Escaneo seguro: nmap --script "safe"
  • Buscar vulnerabilidades: nmap --script "vuln and safe" (Busca vulnerabilidades pero sen usar scripts que poidan tombar o servidor). https://nmap.org/nsedoc/categories/

Buscar Scripts para un Servizo Específico

Método 1: Buscar por nome de ficheiro

# Buscar scripts relacionados con HTTP
ls /usr/share/nmap/scripts/ | grep http

# Buscar scripts relacionados con SSH
ls /usr/share/nmap/scripts/ | grep ssh

# Buscar scripts relacionados con SMB
ls /usr/share/nmap/scripts/ | grep smb

# Buscar scripts relacionados con MySQL
ls /usr/share/nmap/scripts/ | grep mysql

# Buscar scripts relacionados con FTP
ls /usr/share/nmap/scripts/ | grep ftp

Exemplo de saída (HTTP):

http-apache-negotiation.nse
http-apache-server-status.nse
http-auth-finder.nse
http-auth.nse
http-backup-finder.nse
http-brute.nse
http-cookie-flags.nse
http-cross-domain-policy.nse
http-csrf.nse
http-default-accounts.nse
http-enum.nse
http-errors.nse
http-favicon.nse
http-fileupload-exploiter.nse
http-form-brute.nse
http-git.nse
http-headers.nse
http-methods.nse
http-passwd.nse
http-php-version.nse
http-robots.txt.nse
http-shellshock.nse
http-sql-injection.nse
http-title.nse
http-vuln-cve2017-5638.nse
http-wordpress-enum.nse
http-wordpress-users.nse
...


Método 2: Buscar con nmap --script-help

# Buscar e ver información de scripts HTTP
nmap --script-help "http-*"

# Buscar scripts SSH
nmap --script-help "ssh-*"

# Buscar un script específico
nmap --script-help http-enum

# Ver scripts dunha categoría
nmap --script-help default

Exemplo de saída:

Starting Nmap 7.94

http-enum
Categories: discovery safe
https://nmap.org/nsedoc/scripts/http-enum.html
  Enumerates directories used by popular web applications and servers.
  
  This parses a fingerprint file that contains basic traversal info...


Método 3: Buscar na documentación online

NSE Documentation: - https://nmap.org/nsedoc/ - https://nmap.org/nsedoc/scripts/

Busca por servizo: - HTTP: https://nmap.org/nsedoc/categories/http.html - SMB: https://nmap.org/nsedoc/categories/smb.html - SSH: https://nmap.org/nsedoc/categories/ssh.html


Ver Información dun Script Específico

Ver o código fonte

# Ver o código dun script
cat /usr/share/nmap/scripts/http-enum.nse | less

# Ver as primeiras liñas (descripción)
head -50 /usr/share/nmap/scripts/http-enum.nse

Ver documentación incrustada

# Ver axuda dun script específico
nmap --script-help http-enum

# Ver múltiples scripts
nmap --script-help "http-enum,http-title,http-methods"

Executar Scripts NSE

Sintaxe básica

nmap --script <nome-script> <opción> <IP>

Exemplos de Uso por Servizo

HTTP/HTTPS (Porto 80/443)

Scripts básicos

# Obter título da páxina
sudo nmap -p 80 --script http-title 192.168.56.100

# Detectar métodos HTTP permitidos
sudo nmap -p 80 --script http-methods 192.168.56.100

# Enumerar directorios comúns
sudo nmap -p 80 --script http-enum 192.168.56.100

# Buscar vulnerabilidade Shellshock
sudo nmap -p 80 --script http-shellshock --script-args uri=/cgi-bin/test.sh 192.168.56.100

# Detectar WordPress e enumerar usuarios
sudo nmap -p 80 --script http-wordpress-enum 192.168.56.100
sudo nmap -p 80 --script http-wordpress-users 192.168.56.100

# Buscar ficheiros de backup
sudo nmap -p 80 --script http-backup-finder 192.168.56.100

# Ver robots.txt
sudo nmap -p 80 --script http-robots.txt 192.168.56.100

# Detectar vulnerabilidades web comúns
sudo nmap -p 80 --script http-vuln-* 192.168.56.100

# Probar credenciais por defecto
sudo nmap -p 80 --script http-default-accounts 192.168.56.100

Executar múltiples scripts HTTP

# Todos os scripts HTTP safe
sudo nmap -p 80 --script "http-* and safe" 192.168.56.100

# Scripts HTTP de enumeración
sudo nmap -p 80 --script "http-enum,http-title,http-headers" 192.168.56.100

SSH (Porto 22)

# Obter chaves SSH do host
sudo nmap -p 22 --script ssh-hostkey 192.168.56.100

# Detectar algoritmos de cifrado soportados
sudo nmap -p 22 --script ssh2-enum-algos 192.168.56.100

# Detectar versión precisa de SSH
sudo nmap -p 22 --script ssh-auth-methods 192.168.56.100

# Brute force SSH (coidado!)
sudo nmap -p 22 --script ssh-brute --script-args userdb=users.txt,passdb=pass.txt 192.168.56.100

SMB/CIFS (Portos 139/445)

# Enumerar recursos compartidos
sudo nmap -p 445 --script smb-enum-shares 192.168.56.100

# Enumerar usuarios
sudo nmap -p 445 --script smb-enum-users 192.168.56.100

# Detectar sistema operativo via SMB
sudo nmap -p 445 --script smb-os-discovery 192.168.56.100

# Detectar vulnerabilidade EternalBlue (MS17-010)
sudo nmap -p 445 --script smb-vuln-ms17-010 192.168.56.100

# Enumerar directorios compartidos
sudo nmap -p 445 --script smb-enum-domains,smb-enum-groups,smb-enum-sessions 192.168.56.100

# Executar todos os scripts SMB de vulnerabilidades
sudo nmap -p 445 --script smb-vuln-* 192.168.56.100

MySQL (Porto 3306)

# Obter información do servidor MySQL
sudo nmap -p 3306 --script mysql-info 192.168.56.100

# Enumerar bases de datos
sudo nmap -p 3306 --script mysql-databases --script-args mysqluser=root,mysqlpass=toor 192.168.56.100

# Enumerar usuarios MySQL
sudo nmap -p 3306 --script mysql-users --script-args mysqluser=root,mysqlpass=toor 192.168.56.100

# Brute force MySQL
sudo nmap -p 3306 --script mysql-brute 192.168.56.100

# Detectar contas sen contrasinal
sudo nmap -p 3306 --script mysql-empty-password 192.168.56.100

# Executar query SQL
sudo nmap -p 3306 --script mysql-query --script-args query="SELECT user,host FROM mysql.user",username=root,password=toor 192.168.56.100

FTP (Porto 21)

# Detectar FTP anónimo
sudo nmap -p 21 --script ftp-anon 192.168.56.100

# Brute force FTP
sudo nmap -p 21 --script ftp-brute --script-args userdb=users.txt,passdb=pass.txt 192.168.56.100

# Detectar vulnerabilidade vsftpd backdoor
sudo nmap -p 21 --script ftp-vsftpd-backdoor 192.168.56.100

# Listar contido FTP anónimo
sudo nmap -p 21 --script ftp-anon --script-args ftp-anon.maxlist=100 192.168.56.100

DNS (Porto 53)

# Transferencia de zona DNS
sudo nmap -p 53 --script dns-zone-transfer --script-args dns-zone-transfer.domain=example.com 192.168.56.100

# Brute force de subdominios
sudo nmap --script dns-brute --script-args dns-brute.domain=example.com,dns-brute.threads=6 192.168.56.100

# Enumerar rexistros DNS
sudo nmap -p 53 --script dns-nsid 192.168.56.100

SMTP (Porto 25)

# Enumerar usuarios SMTP
sudo nmap -p 25 --script smtp-enum-users --script-args smtp-enum-users.methods={VRFY,EXPN,RCPT} 192.168.56.100

# Detectar comandos SMTP dispoñibles
sudo nmap -p 25 --script smtp-commands 192.168.56.100

# Detectar open relay
sudo nmap -p 25 --script smtp-open-relay 192.168.56.100

NFS (Porto 2049)

# Enumerar exportacións NFS
sudo nmap -p 2049 --script nfs-ls 192.168.56.100

# Listar exportacións NFS
sudo nmap -p 2049 --script nfs-showmount 192.168.56.100

# Estatísticas NFS
sudo nmap -p 2049 --script nfs-statfs 192.168.56.100

Redis (Porto 6379)

# Obter información do servidor Redis
sudo nmap -p 6379 --script redis-info 192.168.56.100

# Brute force Redis
sudo nmap -p 6379 --script redis-brute 192.168.56.100

MongoDB (Porto 27017)

# Obter información do servidor MongoDB
sudo nmap -p 27017 --script mongodb-info 192.168.56.100

# Enumerar bases de datos
sudo nmap -p 27017 --script mongodb-databases 192.168.56.100

# Brute force MongoDB
sudo nmap -p 27017 --script mongodb-brute 192.168.56.100

Executar Scripts por Categoría

NSE organiza scripts en categorías:

Categoría Descrición
auth Autenticación
broadcast Descubrimento por broadcast
brute Ataques de forza bruta
default Scripts por defecto (-sC)
discovery Descubrimento de info
dos Denegación de servizo
exploit Exploits activos
external Usa recursos externos
fuzzer Fuzzing
intrusive Scripts intrusivos
malware Detección de malware
safe Scripts seguros
version Detección de versións
vuln Detección de vulnerabilidades

Executar por categoría

# Scripts por defecto (equivalente a -sC)
sudo nmap -p 80 --script default 192.168.56.100

# Scripts seguros
sudo nmap -p 80 --script safe 192.168.56.100

# Scripts de vulnerabilidades
sudo nmap -p 80 --script vuln 192.168.56.100

# Scripts de brute force
sudo nmap -p 21,22 --script brute 192.168.56.100

# Scripts de descubrimento
sudo nmap --script discovery 192.168.56.100

# Scripts intrusivos (coidado!)
sudo nmap -p 80 --script intrusive 192.168.56.100

Combinacións e Operadores Lóxicos

Operadores dispoñibles

# AND: Ambas condicións
--script "http-* and safe"

# OR: Calquera condición
--script "http-enum or ftp-anon"

# NOT: Excluír
--script "http-* and not intrusive"

Exemplos de combinacións

# Todos os scripts HTTP seguros
sudo nmap -p 80 --script "http-* and safe" 192.168.56.100

# Scripts de vulnerabilidades HTTP e SMB
sudo nmap -p 80,445 --script "http-vuln-* or smb-vuln-*" 192.168.56.100

# Scripts default excepto os intrusivos
sudo nmap --script "default and not intrusive" 192.168.56.100

# Scripts de brute force para HTTP, FTP, SSH
sudo nmap -p 21,22,80 --script "brute" 192.168.56.100

Pasar Argumentos aos Scripts

Moitos scripts aceptan argumentos:

# Ver argumentos dun script
nmap --script-help http-enum

Sintaxe de argumentos

--script-args <argumento>=<valor>
--script-args <arg1>=<val1>,<arg2>=<val2>

Exemplos con argumentos

# HTTP enum con path personalizado
sudo nmap -p 80 --script http-enum --script-args http-enum.basepath=/admin/ 192.168.56.100

# Brute force SSH con listas personalizadas
sudo nmap -p 22 --script ssh-brute --script-args userdb=/tmp/users.txt,passdb=/tmp/pass.txt 192.168.56.100

# MySQL con credenciais
sudo nmap -p 3306 --script mysql-databases --script-args mysqluser=admin,mysqlpass=secret 192.168.56.100

# HTTP form brute force
sudo nmap -p 80 --script http-form-brute --script-args http-form-brute.path=/login,uservar=username,passvar=password 192.168.56.100

# Establecer timeout
sudo nmap --script http-enum --script-args http.max-cache-size=5000000 192.168.56.100

Actualizar Base de Datos de Scripts

# Actualizar nmap e scripts NSE
sudo apt update && sudo apt upgrade nmap

# Actualizar só a base de datos de scripts
sudo nmap --script-updatedb

Crear Scripts Personalizados (Avanzado)

Podes crear os teus propios scripts NSE en Lua:

Exemplo básico

# Crear un script simple
sudo nano /usr/share/nmap/scripts/my-custom-script.nse
description = [[
Script de exemplo que imprime info básica.
]]

categories = {"safe", "discovery"}

portrule = function(host, port)
  return port.number == 80
end

action = function(host, port)
  return "Este é un script personalizado!"
end
# Actualizar base de datos
sudo nmap --script-updatedb

# Executar o teu script
sudo nmap -p 80 --script my-custom-script 192.168.56.100

Resumo de Comandos Principais

# Buscar scripts
ls /usr/share/nmap/scripts/ | grep <servizo>
nmap --script-help "<patrón>"

# Ver info dun script
nmap --script-help <nome-script>
cat /usr/share/nmap/scripts/<script>.nse

# Executar un script
nmap --script <nome-script> <IP>

# Executar múltiples scripts
nmap --script <script1>,<script2>,<script3> <IP>

# Executar por categoría
nmap --script <categoría> <IP>

# Con argumentos
nmap --script <script> --script-args <arg>=<val> <IP>

# Combinacións
nmap --script "<patrón> and/or/not <patrón>" <IP>

Exemplo Práctico Completo para as Prácticas Taller

# Paso 1: Descubrir portos
sudo nmap -sS -p- --min-rate 5000 192.168.56.100
# Resultado: 21,22,80,445,3306

# Paso 2: Identificar servizos
sudo nmap -sCV -p 21,22,80,445,3306 192.168.56.100

# Paso 3: Scripts específicos por servizo

# FTP
sudo nmap -p 21 --script "ftp-anon,ftp-bounce,ftp-vsftpd-backdoor" 192.168.56.100

# SSH
sudo nmap -p 22 --script "ssh-hostkey,ssh2-enum-algos,ssh-auth-methods" 192.168.56.100

# HTTP
sudo nmap -p 80 --script "http-enum,http-shellshock,http-vuln-*" --script-args uri=/cgi-bin/ 192.168.56.100

# SMB
sudo nmap -p 445 --script "smb-enum-*,smb-vuln-*" 192.168.56.100

# MySQL
sudo nmap -p 3306 --script "mysql-info,mysql-empty-password,mysql-users" 192.168.56.100