Resumen de Nmap (ESP)

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).

Apoya a HackTricks
nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24

Parámetros

IPs a escanear

  • <ip>,<net/mask>: Indica las ips directamente
  • -iL <ips_file>: lista_IPs
  • -iR <number>: Número de IPs aleatorias, puedes excluir posibles IPs con --exclude <Ips> o --excludefile <file>.

Descubrimiento de equipos

Por defecto Nmap lanza una fase de descubrimiento consistente en: -PA80 -PS443 -PE -PP

  • -sL: No es invasivo, lista los objetivos haciendo peticiones DNS para resolver nombres. Es útil para saber si por ejemplo www.prueba.es/24 todas las IPs son nuestros objetivos.
  • -Pn: Sin ping. Esto es útil si sabes que todos están activos (si no, podrías perder mucho tiempo, pero esta opción también produce falsos negativos diciendo que no están activos), evita la fase de descubrimiento.
  • -sn : Sin escaneo de puertos. Tras completar la fase de reconocimiento, no escanea puertos. Es relativamente sigiloso y permite un escaneo pequeño de la red. Con privilegios envía un ACK (-PA) a 80, un SYN(-PS) a 443 y un echo request y un Timestamp request, sin privilegios siempre completa conexiones. Si el objetivo es la red, solo usa ARP(-PR). Si se usa con otra opción, solo se descartan los paquetes de la otra opción.
  • -PR: Ping ARP. Se usa por defecto al analizar equipos en nuestra red, es más rápido que usar pings. Si no quieres usar paquetes ARP usa --send-ip.
  • -PS <ports>: Envía paquetes SYN a los cuales si responden SYN/ACK está abierto (a los que responden con RST para no finalizar la conexión), si responde RST está cerrado y si no responde está inalcanzable. En caso de no tener privilegios, se usa automáticamente una conexión total. Si no se especifican puertos, lo lanza al 80.
  • -PA <ports>: Igual que el anterior pero con ACK, combinarlos da mejores resultados.
  • -PU <ports>: El objetivo es el contrario, se envían a puertos que se espera estén cerrados. Algunos firewalls solo comprueban conexiones TCP. Si está cerrado responde con port unreachable, si responde con otro icmp o no responde queda como destination unreachable.
  • -PE, -PP, -PM : PINGS ICMP: echo reply, timestamp y addresmask. Se lanzan para averiguar si el objetivo está activo.
  • -PY<ports>: Envía sondas SCTP INIT a 80 por defecto, puede responder INIT-ACK(open) o ABORT(closed) o nada o ICMP unreachable(inactivo).
  • -PO <protocols>: Se indica un protocolo en los encabezados, por defecto 1(ICMP), 2(IGMP) y 4(Encap IP). Para protocolos ICMP, IGMP, TCP (6) y UDP (17) se envían los encabezados de protocolo, para el resto solo el encabezado IP. La finalidad es que debido a la malformación de los encabezados, respondan Protocol unreachable o respuestas del mismo protocolo para saber si está up.
  • -n: Sin DNS
  • -R: DNS siempre
  • --system-dns: Forzar el resolvedor del OS en lugar del parallel stub resolver de Nmap. Útil cuando /etc/hosts, split-DNS, o plugins del resolvedor devuelven datos que las consultas directas de Nmap no. Es más lento, y desde Nmap 7.96 las búsquedas forward ya están paralelizadas, esto suele ser necesario solo por compatibilidad del resolvedor.
  • --dns-servers <server[,server],...>: Forzar servidores DNS específicos para reverse lookups. Útil en assessments internos para consultar resovers autoritativos o internos directamente, o para desviar el tráfico de -sL/reverse-DNS de los resolvedores por defecto del tester.

Técnicas de escaneo de puertos

  • -sS: No completa la conexión por lo que no deja rastro, muy buena si se puede usar.(privilegios) Es la que se usa por defecto.
  • -sT: Completa la conexión, por lo que sí deja rastro, pero se puede usar seguro. Por defecto sin privilegios.
  • -sU: Más lento, para UDP. Mayormente: DNS(53), SNMP(161,162), DHCP(67 y 68), (-sU53,161,162,67,68): open(reply), closed(port unreachable), filtered (otro ICMP), open/filtered (nada). En caso de open/filtered, -sV envía numerosas peticiones para detectar alguna de las versiones que nmap soporta y puede detectar el estado real. Aumenta mucho el tiempo.
  • -sY: Protocolo SCTP que intenta fallar en establecer la conexión, por lo que no hay logs, funciona como -PY
  • -sN,-sX,-sF: Null, Fin, Xmas, pueden penetrar algunos firewalls y extraer información. Se basan en que máquinas compatibles con el estándar deberían responder con RST todas las peticiones que no tengan SYN, RST o ACK activados: open/filtered(nada), closed(RST), filtered (ICMP unreachable). Poco fiables en Windows, Cisco, BSDI y OS/400. En unix sí.
  • -sM: Maimon scan: Envía banderas FIN y ACK, usado para BSD, actualmente devolverá todos como closed.
  • -sA, sW: ACK y Window, se usa para detectar firewalls, para saber si los puertos están filtrados o no. El -sW distingue entre open/closed ya que los abiertos responden con un valor de window diferente: open (RST con window distinto de 0), closed (RST window = 0), filtered (ICMP unreachable o nada). No todos los equipos funcionan así, por lo que si sale todo closed, no está funcionando, si son pocos open, funciona bien, y si hay muchos open y pocos closed, funciona al revés.
  • -sI: Idle scan. Para los casos en los que hay un firewall activo pero sabemos que no filtra hacia cierta IP (o cuando simplemente queremos anonimato) podemos usar el zombie scanner (funciona para todos los puertos), para buscar posibles zombies podemos usar el scrpit ipidseq o el exploit auxiliary/scanner/ip/ipidseq. Este scanner se basa en el número IPID de los paquetes IP.
  • --badsum: Envía el checksum incorrecto, los equipos descartarían los paquetes, pero los firewalls podrían responder algo, se usa para detectar firewalls.
  • -sZ: Escáner SCTP “Weird”, al enviar sondas con cookie echo fragments deberían ser descartadas si está open o responder con ABORT si está closed. Puede pasar por firewalls por los que init no pasa, lo malo es que no distingue entre filtered y open.
  • -sO: Escaneo de protocolos IP. Envía encabezados malos y vacíos en los que a veces ni siquiera se puede distinguir el protocolo. Si llega ICMP unreachable protocol está cerrado, si llega unreachable port está abierto, si llega otro error, filtered, si no llega nada, open|filtered.
  • -b <server>: FTPhost–> Se usa para escanear un host desde otro, esto se hace conectando al ftp de otra máquina y pidiéndole que envíe archivos a los puertos que quieres escanear desde otra máquina, según las respuestas sabremos si están abiertos o no. [<user>:<password>@]<server>[:<port>] Casi todos los ftps ya no permiten esto por lo que tiene poco uso práctico.

Análisis de enfoque (Focus Analysis)

-p: Usado para especificar puertos a escanear. Para seleccionar los 65.335 puertos: -p- o -p all. Nmap tiene una clasificación interna basada en popularidad. Por defecto usa los 1000 puertos más comunes. Con -F (fast scan) analiza los 100 principales. Con –top-ports analiza ese número de puertos más comunes (de 1 a 65.335). Revisa los puertos en orden aleatorio; para evitar esto, usa -r. También podemos seleccionar puertos específicos: 20-30,80,443,1024- (esto último significa mirar desde 1024 en adelante). También podemos agrupar puertos por protocolos: U:53,T:21-25,80,139,S:9. También podemos elegir un rango dentro de los puertos populares de Nmap: -p [-1024] analiza hasta el puerto 1024 de los incluidos en nmap-services. –port-ratio Analiza los puertos más comunes dentro de una ratio entre 0 y 1

-sV Escaneo de versiones, la intensidad puede regularse de 0 a 9, por defecto es 7.

–version-intensity Regulamos la intensidad, cuanto menor sea, solo lanzará las sondas más probables, pero no todas. Con esto podemos acortar considerablemente el tiempo de escaneo UDP

–version-light Alias de --version-intensity 2. Muy útil para una primera pasada contra rangos grandes o servicios UDP lentos.

–version-all Alias de --version-intensity 9. Fuerza todas las sondas y es útil cuando un servicio solo responde a sondas raras.

–allports Fuerza la detección de versión en puertos excluidos por nmap-service-probes (notablemente TCP/9100). Cuidado: en algunas impresoras o listeners de raw socket esto puede hacer que impriman los datos de la sonda.

-O Detección de OS

–osscan-limit Para un escaneo de host correcto, se necesita al menos un puerto abierto y uno cerrado. Si esta condición no se cumple y hemos establecido esto, no intentará predecir el OS (ahorra tiempo)

–osscan-guess Cuando la detección de OS no es perfecta, esto hace que intente más

Scripts

–script |||[,…]

Para usar scripts por defecto, usa -sC o –script=default

Los tipos disponibles son: auth, broadcast, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version, y vuln

  • Auth: ejecuta todos los scripts de autenticación disponibles
  • Default: ejecuta scripts básicos por defecto de la herramienta
  • Discovery: recupera información del target o víctima
  • External: script para usar recursos externos
  • Intrusive: usa scripts considerados intrusivos para la víctima o target
  • Malware: comprueba conexiones abiertas por código malicioso o puertas traseras
  • Safe: ejecuta scripts no intrusivos
  • Vuln: descubre las vulnerabilidades más conocidas
  • All: ejecuta absolutamente todos los scripts NSE disponibles

Para buscar scripts:

nmap –script-help=“http-*” -> Los que empiezan con http-

nmap –script-help=“not intrusive” -> Todos excepto esos

nmap –script-help=“default or safe” -> Los que estén en cualquiera de los dos

nmap –script-help=“default and safe” –> Los que estén en ambos

nmap –script-help=“(default or safe or intrusive) and not http-*”

–script-args =,={=},={,}

–script-args-file

–script-help ||||all[,…]

–script-trace —> Proporciona info de cómo progresa el script

–script-updatedb

Para usar un script, simplemente escribe: nmap –script Script_Name target –> Al usar el script, se ejecutarán tanto el script como el scanner, por lo que también se pueden añadir opciones del scanner. Podemos añadir “safe=1” para ejecutar solo los seguros.

Control de tiempo

Nmap puede modificar tiempo en segundos, minutos, ms: –host-timeout argumentos 900000ms, 900, 900s, y 15m hacen lo mismo.

Nmap divide el número total de hosts a escanear en grupos y analiza estos grupos en bloques, por lo que no pasa al siguiente bloque hasta que todos han sido analizados (y el usuario no recibe actualizaciones hasta que el bloque ha sido analizado). De esta forma, es más óptimo para Nmap usar grupos grandes. Por defecto en una clase C, usa 256.

Esto se puede cambiar con –min-hostgroup ; –max-hostgroup (Ajusta el tamaño de los grupos de escaneo paralelos)

Puedes controlar el número de scanners paralelos pero es mejor no hacerlo (Nmap ya incorpora control automático basado en el estado de la red): –min-parallelism ; –max-parallelism

Podemos modificar el timeout RTT, pero normalmente no es necesario: –min-rtt-timeout , –max-rtt-timeout , –initial-rtt-timeout

Podemos modificar el número de intentos: –max-retries

Podemos modificar el tiempo de escaneo de un host: –host-timeout

Podemos modificar el tiempo entre cada prueba para ralentizarlo: –scan-delay ; –max-scan-delay

Podemos modificar el número de paquetes por segundo: –min-rate ; –max-rate

Muchos puertos tardan mucho en responder cuando están filtrados o cerrados. Si solo nos interesan los abiertos, podemos ir más rápido con: –defeat-rst-ratelimit

Para definir cuán agresivo queremos que sea Nmap: -T paranoid|sneaky|polite|normal|aggressive|insane

-T (0-1)

-T0 –> Solo escanea 1 puerto a la vez y espera 5min hasta el siguiente

-T1 y T2 –> Muy similares pero solo esperan 15 y 0.4sec respectivamente entre cada prueba

-T3 –> Operación por defecto, incluye escaneo en paralelo

-T4 –> –max-rtt-timeout 1250ms –min-rtt-timeout 100ms –initial-rtt-timeout 500ms –max-retries 6 –max-scan-delay 10ms

-T5 –> –max-rtt-timeout 300ms –min-rtt-timeout 50ms –initial-rtt-timeout 250ms –max-retries 2 –host-timeout 15m –max-scan-delay 5ms

Firewall/IDS

No permiten acceso a puertos y analizan paquetes.

-f Para fragmentar paquetes, por defecto los fragmenta en 8bytes después del header, para especificar ese tamaño usamos ..mtu (con esto, no uses -f), el offset debe ser múltiplo de 8. Version scanners y scripts no soportan fragmentación

-D decoy1,decoy2,ME Nmap envía scanners pero con otras direcciones IP como origen, así te oculta. Si pones ME en la lista, Nmap te colocará ahí, mejor poner 5 o 6 antes que tú para enmascararte completamente. IPs aleatorias pueden generarse con RND: Para generar de IPs aleatorias. No funcionan con TCP version detectors sin conexión. Si estás dentro de una red, te interesa usar IPs activas, ya que si no será muy fácil descubrir que eres el único activo.

Para usar IPs aleatorias: nmap -D RND:10 Target_IP

-S IP Para cuando Nmap no detecta tu IP tienes que dársela con esto. También sirve para hacerles creer que otro target les está escaneando.

-e Para elegir la interfaz

Muchos administradores dejan puertos de entrada abiertos para que todo funcione correctamente y les resulta más fácil que buscar otra solución. Estos pueden ser puertos DNS o FTP… para encontrar esta vulnerabilidad Nmap incorpora: –source-port ;-g Son equivalentes

–data Para enviar texto hexadecimal: –data 0xdeadbeef and –data \xCA\xFE\x09

–data-string Para enviar texto normal: –data-string “Scan conducted by Security Ops, extension 7192”

–data-length Nmap solo envía headers, con esto conseguimos añadir un número de bytes más (que serán generados aleatoriamente)

Para configurar completamente el paquete IP usa –ip-options

Si quieres ver las opciones en los paquetes enviados y recibidos, especifica –packet-trace. Para más información y ejemplos de uso de IP options con Nmap, ver http://seclists.org/nmap-dev/2006/q3/52.

–ttl

–randomize-hosts Para hacer el ataque menos obvio

–spoof-mac <MAC address, prefix, or vendor name> Para cambiar la MAC ejemplos: Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2, and Cisco

–proxies Para usar proxies, a veces un proxy no mantiene tantas conexiones abiertas como Nmap quiere por lo que habría que modificar el paralelismo: –max-parallelism

-sP Para descubrir hosts en nuestra red por ARP

Muchos administradores crean una regla de firewall que permite pasar todos los paquetes que vengan de un puerto en particular (como 20,53 y 67), podemos decirle a Nmap que envíe nuestros paquetes desde esos puertos: nmap –source-port 53 IP

Salidas (Outputs)

-oN file Salida normal

-oX file Salida XML

-oS file Salida script kiddies

-oG file Salida Greppable. Sigue funcionando, pero está desaprobado; XML es el mejor formato para automatización porque las nuevas funcionalidades de Nmap se añaden ahí primero. Sigue usando -oN si quieres --resume, y prefiere -oX/-oA para parsing por máquina.

-oA file Todos excepto -oS

–webxml Cambia la referencia del stylesheet XML a https://nmap.org/svn/docs/nmap.xsl, haciendo el XML más fácil de abrir como HTML en otra máquina.

–stylesheet <path|url> Usar un stylesheet XSL personalizado. --webxml es solo un atajo al stylesheet oficial hospedado.

-v level verbosidad

-d level debug

–reason Motivo del estado del host

–stats-every time Cada ese tiempo nos dice cómo va

–packet-trace Para ver qué paquetes salen, se pueden especificar filtros como: –version-trace o –script-trace

–open muestra open, open|filtered y unfiltered

–resume file Reanuda un scan interrumpido desde un output normal (-oN) o grepable (-oG). En flujos de trabajo actuales es común mantener -oN para resumibilidad y -oX para parseo.

Ejemplo para flujos de trabajo de parseo/conversión a HTML:

# Send only XML to stdout for tooling
nmap -sV -oX - 10.10.10.0/24

# Portable HTML-friendly XML
nmap -sV --webxml -oX scan.xml 10.10.10.10

Miscellaneous

-6 Permite IPv6

-A equivale a -O -sV -sC –traceroute

Run time

Mientras Nmap se está ejecutando, podemos cambiar opciones:

v / V Aumentar / disminuir el nivel de verbosidad

d / D Aumentar / disminuir el nivel de depuración

p / P Activar / desactivar el seguimiento de paquetes

? Mostrar una pantalla de ayuda interactiva en tiempo de ejecución

Vulscan

Script de Nmap que busca versiones de servicios obtenidas en una base de datos offline (descargada de otras muy importantes) y devuelve posibles vulnerabilidades

Las bases de datos que utiliza son:

  1. Scipvuldb.csv | http://www.scip.ch/en/?vuldb
  2. Cve.csv | http://cve.mitre.org
  3. Osvdb.csv | http://www.osvdb.org
  4. Securityfocus.csv | http://www.securityfocus.com/bid/
  5. Securitytracker.csv | http://www.securitytracker.com
  6. Xforce.csv | http://xforce.iss.net
  7. Exploitdb.csv | http://www.exploit-db.com
  8. Openvas.csv | http://www.openvas.org

Para descargar e instalar en la carpeta de Nmap:

wget http://www.computec.ch/projekte/vulscan/download/nmap_nse_vulscan-2.0.tar.gz && tar -czvf nmap_nse_vulscan-2.0.tar.gz vulscan/ && sudo cp -r vulscan/ /usr/share/nmap/scripts/

También necesitas descargar los paquetes de bases de datos y añadirlos a /usr/share/nmap/scripts/vulscan/

Uso:

Para usar todas: sudo nmap -sV –script=vulscan HOST_TO_SCAN

Para usar una BD específica: sudo nmap -sV –script=vulscan –script-args vulscandb=cve.csv HOST_TO_SCAN

Si tienes acceso a Internet, el script NSE oficial de Nmap vulners suele ser la alternativa mantenida más rápida para el enriquecimiento basado en versiones:

nmap -sV --script vulners --script-args mincvss=7.0 <IP>

Este script pertenece a las categorías safe, external y vuln. Como depende de la precisión de -sV, valida los resultados manualmente cuando el banner del servicio sea genérico o esté proxied.

Notas prácticas recientes (7.94+)

  • Desde Nmap 7.94, el escaneo de puertos UDP (-sU) y la detección de versiones (-sV) usan la misma fuente de payloads nmap-service-probes. Una respuesta UDP de la fase de escaneo puede alimentar inmediatamente el emparejamiento de versiones, por lo que -sU -sV --version-light es ahora un buen primer paso contra rangos grandes o con pérdida.
  • Desde Nmap 7.94, -sV también puede sondear servicios UDP ocultos detrás de DTLS, lo cual es útil para equipos modernos de gestión/ICS que envuelven protocolos UDP en DTLS.
  • Nmap 7.95 añadió un gran lote de nuevas firmas de servicio, incluyendo grpc, mysqlx, remotemouse y tuya, además de nueva cobertura NSE enfocada en ICS como hartip-info y iec61850-mms. Si estás escaneando entornos OT o embebidos, actualizar Nmap importa más que añadir probes personalizados demasiado pronto.
  • Desde Nmap 7.96, también se paralelizan las búsquedas DNS directas. Las listas grandes de hostnames son mucho más rápidas ahora, por lo que --system-dns generalmente debería reservarse para problemas de compatibilidad en lugar de rendimiento.

Acelerar el escaneo de servicios de Nmap x16

Según este post puedes acelerar el análisis de servicios de nmap modificando todos los valores totalwaitms en /usr/share/nmap/nmap-service-probes a 300 y tcpwrappedms a 200.

Además, probes que no tienen un servicewaitms definido usan un valor por defecto de 5000. Por lo tanto, podemos o bien añadir valores a cada uno de los probes, o podemos compilar nmap nosotros mismos y cambiar el valor por defecto en service_scan.h.

Si no quieres cambiar los valores de totalwaitms y tcpwrappedms en el archivo /usr/share/nmap/nmap-service-probes, puedes editar el parsing code de modo que estos valores en el archivo nmap-service-probes sean completamente ignorados.

Construir un Nmap estático para entornos restringidos

En entornos Linux endurecidos o mínimos (containers, appliances), los binarios de Nmap con enlaces dinámicos a menudo fallan debido a loaders de runtime o bibliotecas compartidas faltantes (p. ej., /lib64/ld-linux-x86-64.so.2, libc.so). Compilar tu propio Nmap enlazado estáticamente y empaquetar los datos NSE permite la ejecución sin instalar paquetes del sistema.

Enfoque general

  • Usa un builder Ubuntu amd64 limpio vía Docker.
  • Compila OpenSSL y PCRE2 como librerías estáticas.
  • Compila Nmap enlazándolo estáticamente y usando el libpcap/libdnet incluidos para evitar dependencias dinámicas.
  • Empaqueta los scripts NSE y los directorios de datos con el binario.

Detectar la arquitectura objetivo (ejemplo)

uname -a
# If building from macOS/ARM/etc., pin the builder arch:
docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc 'echo ok'

Paso 1 — Preparar la cadena de herramientas

set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update && apt-get install -y --no-install-recommends \
build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \
automake autoconf libtool m4 zlib1g-dev

Paso 2 — Compilar OpenSSL estático (1.1.1w)

OSSL="1.1.1w"
curl -fsSLO "https://www.openssl.org/source/openssl-$OSSL.tar.gz"
tar xzf "openssl-$OSSL.tar.gz" && cd "openssl-$OSSL"
./Configure no-shared no-zlib linux-x86_64 -static --prefix=/opt/ossl
make -j"$(nproc)" && make install_sw
cd /tmp

Paso 3 — Compilar PCRE2 estático (10.43)

PCRE2=10.43
curl -fsSLO "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2"
tar xjf "pcre2-$PCRE2.tar.bz2" && cd "pcre2-$PCRE2"
./configure --disable-shared --enable-static --prefix=/opt/pcre2
make -j"$(nproc)" && make install
cd /tmp

Paso 4 — Compilar Nmap estático (7.98)

NMAP=7.98
curl -fsSLO "https://nmap.org/dist/nmap-$NMAP.tar.bz2"
tar xjf "nmap-$NMAP.tar.bz2" && cd "nmap-$NMAP"
export CPPFLAGS="-I/opt/ossl/include -I/opt/pcre2/include"
export LDFLAGS="-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc"
export LIBS="-lpcre2-8 -ldl -lpthread -lz"
./configure \
--with-openssl=/opt/ossl \
--with-libpcre=/opt/pcre2 \
--with-libpcap=included \
--with-libdnet=included \
--without-zenmap --without-ndiff --without-nmap-update
# Avoid building shared libpcap by accident
sed -i -e "s/^shared: /shared: #/" libpcap/Makefile || true
make -j1 V=1 nmap
strip nmap

Puntos clave

  • -static, -static-libstdc++, -static-libgcc fuerzan el enlace estático.
  • Usar –with-libpcap=included/–with-libdnet=included evita las bibliotecas compartidas del sistema.
  • Un ajuste con sed neutraliza un objetivo libpcap compartido si está presente.

Paso 5 — Empaquetar el binario y los datos NSE

mkdir -p /out/nmap-bundle/nmap-data
cp nmap /out/nmap-bundle/nmap-linux-amd64-static
cp -r scripts nselib /out/nmap-bundle/nmap-data/
cp nse_main.lua nmap-services nmap-protocols nmap-service-probes \
nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc \
/out/nmap-bundle/nmap-data/ 2>/dev/null || true

tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle

Notas de verificación y operaciones

  • Usa file en el artefacto para confirmar que está enlazado estáticamente.
  • Mantén NSE data con el binario para asegurar la paridad de scripts en hosts sin Nmap instalado.
  • Incluso con un binario estático, la ejecución puede ser bloqueada por AppArmor/seccomp/SELinux; DNS/egress debe seguir funcionando.
  • Las compilaciones deterministas reducen el riesgo de la cadena de suministro frente a descargar binarios “estáticos” opacos.

One-liner (Dockerized)

Construir, empaquetar e imprimir información del artefacto ```bash docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc ' set -euo pipefail export DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \ automake autoconf libtool m4 zlib1g-dev

OSSL=“1.1.1w”; curl -fsSLO “https://www.openssl.org/source/openssl-$OSSL.tar.gz”
&& tar xzf “openssl-$OSSL.tar.gz” && cd “openssl-$OSSL”
&& ./Configure no-shared no-zlib linux-x86_64 -static –prefix=/opt/ossl
&& make -j“$(nproc)“ && make install_sw && cd /tmp

PCRE2=10.43; curl -fsSLO “https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2”
&& tar xjf “pcre2-$PCRE2.tar.bz2” && cd “pcre2-$PCRE2”
&& ./configure –disable-shared –enable-static –prefix=/opt/pcre2
&& make -j“$(nproc)“ && make install && cd /tmp

NMAP=7.98; curl -fsSLO “https://nmap.org/dist/nmap-$NMAP.tar.bz2”
&& tar xjf “nmap-$NMAP.tar.bz2” && cd “nmap-$NMAP”
&& export CPPFLAGS=“-I/opt/ossl/include -I/opt/pcre2/include”
&& export LDFLAGS=“-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc”
&& export LIBS=“-lpcre2-8 -ldl -lpthread -lz”
&& ./configure –with-openssl=/opt/ossl –with-libpcre=/opt/pcre2 –with-libpcap=included –with-libdnet=included –without-zenmap –without-ndiff –without-nmap-update
&& sed -i -e “s/^shared: /shared: #/” libpcap/Makefile || true
&& make -j1 V=1 nmap && strip nmap

mkdir -p /out/nmap-bundle/nmap-data
&& cp nmap /out/nmap-bundle/nmap-linux-amd64-static
&& cp -r scripts nselib /out/nmap-bundle/nmap-data/
&& cp nse_main.lua nmap-services nmap-protocols nmap-service-probes nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc /out/nmap-bundle/nmap-data/ 2>/dev/null || true
&& tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle
&& echo “===== OUTPUT =====”; ls -lah /out; echo “===== FILE TYPE =====”; file /out/nmap-bundle/nmap-linux-amd64-static || true ’

</details>

## Referencias

- [Compiling static Nmap binary for jobs in restricted environments](https://www.pentestpartners.com/security-blog/compiling-static-nmap-binary-for-jobs-in-restricted-environments/)
- [Static Nmap Binary Generator (helper tool)](https://github.com/0x5ubt13/static_nmap_binary_generator)
- [OpenSSL sources](https://www.openssl.org/source/)
- [PCRE2 releases](https://github.com/PCRE2Project/pcre2/releases)
- [Nmap source tarballs](https://nmap.org/dist/)
- [Nmap Change Log](https://nmap.org/changelog.html)
- [Nmap Output Formats](https://nmap.org/book/man-output.html)


> [!TIP]
> Aprende y practica AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Aprende y practica GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Aprende y practica Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Revisa el [**catálogo completo de HackTricks Training**](https://hacktricks-training.com/courses/) para las rutas de evaluación (**ARTA/GRTA/AzRTA**) y [**Linux Hacking Expert (LHE)**](https://hacktricks-training.com/courses/lhe/).
>
> <details>
>
> <summary>Apoya a HackTricks</summary>
>
> - Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
> - **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f), al [**grupo de telegram**](https://t.me/peass), **sigue** [**@hacktricks_live**](https://twitter.com/hacktricks_live) en **X/Twitter**, o revisa la [**página de LinkedIn**](https://www.linkedin.com/company/hacktricks/) y el [**canal de YouTube**](https://www.youtube.com/@hacktricks_LIVE).
> - **Comparte hacking tricks enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
>
> </details>