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
Cada script NSE pode pertencer a unha ou varias destas categorías:
auth: Scripts relacionados coa autenticación e credenciais (ex: comprobar logins baleiros).broadcast: Descubrimento de hosts mediante sinais de difusión na rede local (non só directos ao host).brute: Intentos de forza bruta para adiviñar contrasinais.default: A categoría que usas con -sC. Son rápidos, fiables e útiles.discovery: Tenta aprender máis sobre a rede (buscas DNS, SNMP, rexistros, etc.).dos: (Denial of Service) Poden causar denegación de servizo. Coidado, poden tombar o servidor.exploit: Intenta explotar unha vulnerabilidade coñecida.external: Scripts que necesitan conectarse a unha fonte externa (como Google ou Virustotal) para funcionar.fuzzer: Envía datos aleatorios ou corruptos para ver como reacciona o servizo.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.intrusive: Scripts moi "ruidosos" ou arriscados, que o administrador do sistema detectará seguro ou que poden bloquear o sistema.malware: Busca infeccións ou backdoors no servidor remoto.safe: Scripts que non deberían causar danos nin bloquear servizos.version: Scripts usados especificamente pola opción -sV para detectar versións.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:
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"
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
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:
Sintaxe de argumentos
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
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