Iniezione SMTP: dove sbaglio?

-1

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:

  1. Utilizza Python SMTPlib che filtra i parametri (i dati imprevisti vengono rilasciati silenziosamente) proprio per prevenire tali attacchi,
  2. 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?

    
posta WhiteWinterWolf 14.05.2015 - 11:21
fonte

3 risposte

2

Il protocollo SMTP si basa su una serie di comandi e risposte.

RFC 821 (aprile 1982) si aspettava che il cliente leggesse ogni risposta prima di procedere. In questo modo, se invio una e-mail ad Alice, Bob e Carol, ci sono molti roundtip, come faccio con mut: "RCPT Alice" (attendere la risposta), "RCPT Bob" (attendere la risposta), "RCPT Carol" ( attendere la risposta),

Successivamente, RFC 1854 (ottobre 1995) ha definito l'estensione PIPELINING, consentendo al client di inviare diversi comandi in uno pezzo e garantendo che il server li elaborasse tutti in ordine (un server che non supporta PIPELINING potrebbe scartare byte prima della sua risposta).

Quindi, per un server che implementa il pipelining, posso fare: "RCPT Alice", "RCPT Bob", "RCPT Carol",

Potrei anche inviare, DATA in un blocco. Ciò semplifica la programmazione (ad esempio uno script fittizio della shell che consegna l'e-mail a un MDA), ma non è troppo intelligente per fare un MTA completo, poiché non ha molto senso inviare i contenuti della e-mail attraverso la rete se nessuno dei destinatari è disponibile, o i destinatari se MAIL è stato rifiutato.

Quello che chiami un server SMTP non protetto è semplicemente un server SMTP che supporta PIPELINING, e quello che chiami un server SMTP sicuro, uno che lo blocca attivamente (forse come un tentativo di bloccare gli spammer, che molto spesso si limitano a scaricare tutti i comandi, non preoccupandosi degli errori).

Secondo me, la protezione contro questo attacco dovrebbe essere inserita nel programma che fornisce l'email. Se pensava di aver inviato un destinatario, ma il server ne vedeva due, l'accettazione del secondo destinatario sarebbe vista come una risposta a DATA, mentre si aspettava un 354 (o un errore come 503, 554), e dovrebbe abortire in quel punto . (Questo è ciò che si riferisce a Tony Meyer quando si parla di ottenere un errore a causa di essere fuori sequenza)

    
risposta data 14.05.2015 - 23:33
fonte
4

Penso che il punto che ti manca è questo:

L'iniezione dell'intestazione SMTP non è un attacco su un server di posta.

Si tratta di un attacco su un server Web o un'altra applicazione che controlla un server di posta sul back-end.

Vedi la pagina OWASP su Test per l'iniezione IMAP / SMTP .

Nella tua domanda, la tua definizione di "server SMTP sicuro" è quella che non supporta il pipelining. Il pipelining è il luogo in cui è possibile inviare più intestazioni senza attendere una risposta a ciascuna di esse, in modo da velocizzare le comunicazioni con il server di posta.

Quindi il modo di attaccare un server di posta con header header è in realtà di attaccare l'applicazione che accede al server di posta, come un'applicazione di posta elettronica basata sul web. La vulnerabilità è che l'applicazione Web sta inviando input non pubblicitari direttamente al server di posta, quindi i caratteri come le nuove righe immesse nel campo To vengono effettivamente inseriti nella busta della posta anziché essere interpretati come una raccolta di indirizzi email.

Ecco perché l'utilizzo di qualcosa come Python SMTPlib per l'header header è sbagliato - gli sviluppatori di applicazioni sono già a conoscenza del problema di header header e hanno protetto il codice per gestire ogni nuova riga iniettata nei campi.

Pertanto lo script sopra riportato è non che verifica una vulnerabilità di iniezione SMTP, è la vulnerabilità .

    
risposta data 15.05.2015 - 11:33
fonte
0

Il processo di invio dell'email comprende la generazione della busta della posta e il corpo della posta. Tutto ciò che non fa parte del blocco dei dati è la busta della posta. Questa è la classica separazione dei messaggi di controllo e il carico utile dei dati stessi. E anche in modo simile ad altri standard, la posta risultante consegnata dall'agente di recapito locale è in tutti gli aspetti pratici, a condizione che si applichi l'RCPT TO, FROM, ecc. Alle intestazioni della posta, scartando tali occorrenze in il corpo del messaggio.

Ciò avviene di fatto come parte della progettazione, poiché la scoperta del destinatario non funzionerebbe se la crittografia fosse applicata alla busta, ma i corpi dei messaggi cifrati andrebbero bene. Questo è strettamente legato all'etica di Internet, in cui fondamentalmente tutto viene trasmesso su reti non sicure.

    
risposta data 15.05.2015 - 06:38
fonte

Leggi altre domande sui tag