Ir al contenido

Herramientas, automatización y NSE para SMTP

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

Esta página amplía el workflow SMTP con herramientas que responden preguntas ya formuladas allí. La automatización acelera una comprobación, pero no convierte una respuesta aislada en una conclusión.

Pregunta Primera opción Alternativa Validación
¿qué anuncia la sesión ESMTP? swaks Ncat u OpenSSL diálogo EHLO manual
¿cambia después de STARTTLS? swaks --tls openssl s_client -starttls smtp comparar ambas respuestas
¿distingue destinatarios? smtp-user-enum con lista acotada swaks --to repetir candidatos y controles
¿acepta relay? swaks diálogo manual completar la transacción sin enviar datos
¿qué scripts NSE encajan? scripts concretos prueba manual equivalente conservar comandos y códigos SMTP

En openssl s_client, -crlf convierte los saltos de línea interactivos a CRLF, como exige SMTP. -quiet reduce el diagnóstico de OpenSSL después del handshake para que el diálogo SMTP sea legible. Ninguna de las dos opciones cambia la política del servidor:

Dialogar después de STARTTLS
openssl s_client -connect FQDN:25 \
-starttls smtp -servername FQDN -crlf -quiet

Swaks construye transacciones SMTP y permite fijar por separado servidor, puerto, identidad del envelope, destinatario, TLS y autenticación. --server elige el endpoint. --port evita depender del puerto predeterminado. --ehlo controla el nombre enviado por el cliente:

Comparar capacidades antes y después de STARTTLS
swaks --server FQDN --port 25 --ehlo CLIENT_FQDN --quit-after EHLO
swaks --server FQDN --port 25 --ehlo CLIENT_FQDN --tls --quit-after EHLO

--quit-after EHLO detiene la sesión tras leer capacidades. No prueba autenticación ni entrega. Conserva el código, las extensiones y el certificado de la segunda ejecución.

--from y --to fijan las identidades del envelope. --quit-after RCPT detiene la sesión antes de DATA:

Comprobar una decisión de relay sin transmitir contenido
swaks --server FQDN --port 25 \
--from SENDER@SOURCE_DOMAIN --to RECIPIENT@DESTINATION_DOMAIN \
--quit-after RCPT

Un 250 en RCPT TO demuestra aceptación en esa fase. La entrega final todavía puede fallar por filtros posteriores. Repite la matriz desde el origen previsto y con destinos locales y externos.

--timeout 10s limita la transacción completa. En TLS implícito, --tls-on-connect inicia el handshake desde el primer byte y cambia el puerto predeterminado a 465, aunque --port sigue teniendo prioridad:

Comparar el endpoint de TLS implícito
swaks --server FQDN \
--port 465 \
--tls-on-connect \
--ehlo CLIENT_FQDN \
--timeout 10s \
--quit-after EHLO

--auth TYPE exige autenticación con el mecanismo indicado. --auth-user fija la identidad. Si --auth-password se proporciona sin valor, Swaks intenta .netrc y después solicita la contraseña:

Validar autenticación después de STARTTLS
swaks --server FQDN \
--port 587 \
--tls \
--auth PLAIN \
--auth-user USERNAME \
--auth-password \
--timeout 10s \
--quit-after AUTH

El mecanismo PLAIN protege la credencial únicamente cuando la sesión TLS ya es válida. Conserva la respuesta a EHLO, la negociación TLS y el resultado de AUTH como fases distintas.

--dump procesa las opciones y muestra la configuración sin enviar correo. La salida incluye contraseñas sin enmascarar. Se usa antes de una transacción compleja y se almacena solo si el resultado puede protegerse:

Revisar una transacción sin conectarse
swaks --server FQDN \
--port 587 \
--tls \
--from SENDER@SOURCE_DOMAIN \
--to RECIPIENT@DESTINATION_DOMAIN \
--dump

smtp-user-enum automatiza VRFY, EXPN o RCPT TO. -M selecciona el método, -U la lista de candidatos, -t el servidor y -D el dominio cuando el método construye direcciones:

Comparar destinatarios mediante RCPT TO
smtp-user-enum -M RCPT -U candidates.txt -t TARGET_IP -D DOMAIN

Primero valida manualmente un candidato esperado, uno inexistente y varias cadenas aleatorias. Si todos reciben la misma respuesta, el resultado automatizado no distingue usuarios. La concurrencia puede activar greylisting o límites por origen. Empieza con una lista pequeña y registra el orden de las pruebas.

Nmap 7.99 distribuye nueve scripts con prefijo smtp-. No forman un paquete homogéneo. El glob incluye descubrimiento, fuerza bruta, consultas externas y checks que pueden terminar un proceso SMTP vulnerable.

Consulta la instalación efectiva:

Inventariar scripts SMTP
nmap --script-help 'smtp-*'
Script Categorías en 7.99 Prerrequisito Interacción e interpretación
smtp-commands default, discovery, safe diálogo SMTP envía EHLO y HELP, devuelve extensiones
smtp-ntlm-info default, discovery, safe AUTH NTLM solicita challenge sin credenciales y puede revelar nombres y build
smtp-strangeport malware, safe -sV identifica SMTP fuera de puertos habituales etiqueta puerto no estándar, no demuestra malware
smtp-enum-users auth, external, intrusive lista de usuarios y método prueba RCPT, VRFY o EXPN y necesita controles contra catch-all
smtp-open-relay discovery, intrusive, external dominios y destinatario controlado prueba combinaciones de envelope, un éxito requiere validación
smtp-brute brute, intrusive AUTH, listas, política de bloqueo intenta LOGIN, PLAIN, CRAM-MD5, DIGEST-MD5 o NTLM
smtp-vuln-cve2010-4344 exploit, intrusive, vuln Exim antiguo y configuración compatible el modo exploit envía más de 50 MB y un fallo puede matar el child
smtp-vuln-cve2011-1720 intrusive, vuln Postfix con Cyrus SASL afectado prueba corrupción de memoria, con riesgo de DoS
smtp-vuln-cve2011-1764 intrusive, vuln Exim 4.70–4.75 con DKIM y capacidad de enviar prueba format string mediante contenido DKIM

Este mapa describe el catálogo revisado, no recomienda ejecutarlo completo.

smtp-commands acepta smtp-commands.domain. Usa un FQDN controlado para EHLO:

Consultar extensiones
sudo nmap -sV -n -Pn -p 25 \
--script smtp-commands \
--script-args smtp-commands.domain=operator.example.test \
TARGET_IP

Repite manualmente EHLO antes y después de STARTTLS. El script puede mostrar HELP y extensiones, pero una capacidad anunciada puede seguir condicionada por origen o autenticación.

smtp-ntlm-info actúa cuando detecta NTLM y acepta smtp-ntlm-info.domain:

Solicitar metadatos NTLM
sudo nmap -sV -n -Pn -p 25,587 \
--script smtp-ntlm-info \
--script-args smtp-ntlm-info.domain=example.test \
TARGET_IP

Registra si la negociación ocurre antes o después de TLS. Nombres NetBIOS, DNS y build son datos proporcionados por el challenge. Pueden identificar un backend, pero no prueban que el banner visible y el host final sean la misma máquina.

smtp-enum-users usa userdb, smtp-enum-users.domain y smtp-enum-users.methods. Por defecto intenta RCPT, VRFY y EXPN según la implementación:

Acotar RCPT a una lista
sudo nmap -sV -n -Pn -p 25 \
--script smtp-enum-users \
--script-args 'userdb=users.txt,smtp-enum-users.domain=example.test,smtp-enum-users.methods={RCPT}' \
TARGET_IP

El script es external porque algunos métodos o valores pueden involucrar dominios externos según la configuración. Revisa el código y define todos los dominios. Añade usuarios aleatorios de control. Si el servidor acepta todos, retrasa respuestas o converge después de varios intentos, el resultado no enumera cuentas.

Argumentos relevantes de smtp-open-relay:

  • smtp-open-relay.domain
  • smtp-open-relay.from
  • smtp-open-relay.to
  • smtp-open-relay.ip

Sin valores, el script construye datos predeterminados. Usa un dominio y destinatario controlados:

Probar relay con valores explícitos
sudo nmap -sV -n -Pn -p 25 \
--script smtp-open-relay \
--script-args 'smtp-open-relay.domain=example.test,smtp-open-relay.from=sender@example.test,smtp-open-relay.to=recipient@external.example.test' \
TARGET_IP

Activa -v si necesitas ver combinaciones aceptadas. Después reproduce la secuencia con swaks --quit-after RCPT. Si la prueba exige confirmar entrega, conserva cabeceras y limita el mensaje al buzón controlado.

smtp-brute.auth prioriza mecanismos. Las librerías brute aceptan listas y controles de concurrencia comunes. Antes de ejecutar, consulta la ayuda de esa versión y caracteriza bloqueo:

Revisar argumentos antes de autenticar
nmap --script-help smtp-brute

No mezcles descubrimiento y fuerza bruta en una misma ejecución. Separa output, rate, credenciales y criterio de parada. Una respuesta temporal, throttling o MFA puede aparecer como fallo de contraseña.

Los tres scripts smtp-vuln-* apuntan a productos y condiciones antiguas. La presencia del archivo no hace relevante el CVE. Antes:

  1. identifica producto y versión con varias señales
  2. confirma configuración necesaria
  3. lee el script y el advisory del fabricante
  4. prepara una comprobación de estado y un procedimiento de recuperación
  5. ejecuta el modo menos modificador que responda la pregunta

En smtp-vuln-cve2010-4344, el argumento de explotación cambia radicalmente el impacto. La propia documentación indica más de 50 MB y posible terminación del proceso hijo si falla.

Los scripts usan puertos 25, 465 y 587 o servicios smtp, smtps y submission. La librería puede negociar TLS según puerto y detección. Confirma el flujo con:

Trazar un script SMTP
sudo nmap -sV -n -Pn -p PORT \
--script SCRIPT_NAME --script-trace TARGET_IP

El trace puede contener challenges, identidades y credenciales. Trátalo como evidencia sensible.

Todo resultado relevante vuelve al protocolo:

  • EHLO y HELP mediante OpenSSL o Swaks
  • recipient validation con controles válidos e inventados
  • relay con envelope explícito y, si hace falta, buzón controlado
  • NTLM con comparación del challenge
  • vulnerabilidad con advisory, versión, configuración y respuesta específica