Ir al contenido

Nmap 7.99 contra un servicio HTTP real

Por

Madurezvalidated
Última revisión
Validación técnica28 jul 2026 · nmap-7-99-nginx-1-29-5-loopback
Publicado
Última actualización

Este laboratorio comprueba cuatro afirmaciones delimitadas:

  1. un TCP connect scan distingue un listener real de un puerto que rechaza la conexión
  2. -sV identifica el protocolo y el producto detrás de un puerto no estándar
  3. http-title se ejecuta después de que la detección reconoce HTTP
  4. el XML conserva estado y producto para procesarlos sin analizar texto de terminal

El servicio es Nginx 1.29.5, no un simulador de protocolo. Nmap 7.99 se ejecuta sin privilegios contra loopback. Docker publica el puerto 80 del contenedor como 127.0.0.1:18080. TCP 18081 permanece sin listener como control negativo.

Comprueba las versiones antes de crear el contenedor:

Versiones revisadas
nmap --version
docker version

Arranca la imagen fijada por tag:

Publicar Nginx solo en loopback
docker run -d --name offsec-kb-nmap-lab \
-p 127.0.0.1:18080:80 nginx:1.29.5-alpine

-d desacopla el contenedor. --name aporta un identificador neutral para cleanup. -p liga únicamente loopback y traduce TCP 18080 al puerto 80 del contenedor.

-sT utiliza connect() y no necesita raw packets. -n evita reverse DNS. -Pn omite host discovery. -p delimita los dos puertos. --reason conserva la señal que justifica el estado. -sV negocia el servicio:

Comparar listener y rechazo
nmap -sT -n -Pn -p 18080,18081 --reason -sV 127.0.0.1

Resultado saneado reproducido:

PORT STATE SERVICE REASON VERSION
18080/tcp open http syn-ack nginx 1.29.5
18081/tcp closed unknown conn-refused

TCP 18080 completó la conexión y respondió a probes HTTP. TCP 18081 devolvió un rechazo local. El caso no valida estados filtrados ni pérdida de paquetes.

http-title tiene sentido después de identificar HTTP. -oA genera salida normal, grepable y XML:

Ejecutar NSE y conservar artefactos
nmap -sT -n -Pn -p 18080,18081 --reason -sV \
--script http-title -oA ARTIFACT_DIR/nmap 127.0.0.1

Resultado relevante:

18080/tcp open http syn-ack nginx 1.29.5
|_http-server-header: nginx/1.29.5
|_http-title: Welcome to nginx!

Estas consultas extraen los campos del XML:

Comprobar estado y producto en XML
xmllint --xpath \
'string(/nmaprun/host/ports/port[@portid="18080"]/state/@state)' \
ARTIFACT_DIR/nmap.xml
xmllint --xpath \
'string(/nmaprun/host/ports/port[@portid="18080"]/service/@product)' \
ARTIFACT_DIR/nmap.xml

Los valores reproducidos fueron open y nginx.

Retira el contenedor y repite el puerto positivo:

Verificar que desapareció el listener
docker rm -f offsec-kb-nmap-lab
nmap -sT -n -Pn -p 18080 --reason 127.0.0.1

El control final devolvió closed con conn-refused. Elimina ARTIFACT_DIR después de conservar hashes o evidencia requerida.

La prueba no cubre SYN scan, UDP, firewall, timing, pérdida, evasión, pivots ni detección de sistema operativo. Valida únicamente Nmap 7.99, Nginx 1.29.5 y los estados observados desde loopback.