Nmap 7.99 contra un servicio HTTP real
Este laboratorio comprueba cuatro afirmaciones delimitadas:
- un TCP connect scan distingue un listener real de un puerto que rechaza la conexión
-sVidentifica el protocolo y el producto detrás de un puerto no estándarhttp-titlese ejecuta después de que la detección reconoce HTTP- 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.
Estado inicial
Sección titulada «Estado inicial»Comprueba las versiones antes de crear el contenedor:
nmap --versiondocker versionArranca la imagen fijada por tag:
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.
Caso positivo y control negativo
Sección titulada «Caso positivo y control negativo»-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:
nmap -sT -n -Pn -p 18080,18081 --reason -sV 127.0.0.1Resultado saneado reproducido:
PORT STATE SERVICE REASON VERSION18080/tcp open http syn-ack nginx 1.29.518081/tcp closed unknown conn-refusedTCP 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.
NSE y XML
Sección titulada «NSE y XML»http-title tiene sentido después de identificar HTTP. -oA genera salida normal, grepable y XML:
nmap -sT -n -Pn -p 18080,18081 --reason -sV \ --script http-title -oA ARTIFACT_DIR/nmap 127.0.0.1Resultado 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:
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.xmlLos valores reproducidos fueron open y nginx.
Cleanup y control final
Sección titulada «Cleanup y control final»Retira el contenedor y repite el puerto positivo:
docker rm -f offsec-kb-nmap-labnmap -sT -n -Pn -p 18080 --reason 127.0.0.1El control final devolvió closed con conn-refused. Elimina ARTIFACT_DIR después de conservar hashes o evidencia requerida.
Límites
Sección titulada «Límites»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.