SMTP Header Injection

1

Sto cercando di capire l'iniezione di intestazione SMTP. Sto usando la libreria SMTPLIB di Python per proto-digitare questa vulnerabilità. Ecco il mio codice:

import smtplib

# create variables
server = 'smtp.zoho.com'
port = 587
to = '[email protected]'
user = '[email protected]'
passwd = 'pwd'
smtpserver = smtplib.SMTP(server, port)


def mail():
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(user, passwd)
    header = 'To:' + to + '\n' + 'From: ' + user + '\ncc:[email protected]\n' + 'Subject:testing \n'
    msg = header + '\n test 5 \n\n'
    smtpserver.sendmail(user, to, msg)
    print header + 'done!'
    smtpserver.close()

# call mail method
mail()

Ho provato a utilizzare il server SMTP Zoho e Gmail. L'email viene inviata correttamente all'indirizzo nella variabile "a", ma non viene inviata all'indirizzo email "[email protected]". Quando visualizzo il messaggio in Gmail o Zoho, visualizzo "[email protected]" nel campo CC, ma non viene mai inviato al secondo indirizzo email. Ho anche provato a iniettare il campo Oggetto con gli stessi risultati.

Qualcuno può spiegarmelo? Questo è un po 'di filtraggio fatto su Gmail / Zoho alla fine?

Grazie, Johnny_v

    
posta Johnny_v 13.05.2015 - 07:36
fonte

3 risposte

3

Caso semplice: non invii l'e-mail a [email protected] .

Le intestazioni dell'e-mail non vengono utilizzate dal server SMTP.

aggiungi un CC: all'intestazione dell'e-mail, ma il server SMTP non legge questa intestazione.

Il server SMTP vede solo ciò che trasmetti con la tua linea smtpserver.sendmail(user, to, msg) .

Fondamentalmente la comunicazione è la seguente (S: server, C: client) (il TLS e la parte di autenticazione sono lasciati fuori) (le parti tra parentesi [] sono commenti di me) in base al tuo script:

C: EHLO
S: 220 smtp.zoho.com
C: MAIL FROM: <[email protected]> [the address user]
S: 250 OK
C: RCPT TO: <[email protected]> [the address to]
S: 250 OK
C: DATA [your msg follows]
   To: [email protected]
   From: [email protected]
   cc:[email protected]
   Subject:testing 
    test 5 


   .
S: 250 OK
C: QUIT
S: 221 Good Bye

Il server di posta rispetta solo la parte RCPT TO: . Tutto il resto (tra DATA e . ) è solo dati e non scansionato / analizzato dal server SMTP.

Per inviare l'e-mail a qualcun altro devi aggiungere un secondo comando con RCPT TO: . Questo deve essere fatto con un'altra chiamata a smtpserver.sendmail() . Poiché non conosco la libreria utilizzata, non posso dirti se devi creare una seconda chiamata o se c'è una chiamata con un elenco di destinatari.

Nota anche che puoi inviare l'email a qualcuno senza aggiungere il destinatario all'intestazione (questo è usato per BCC per esempio).

    
risposta data 13.05.2015 - 09:55
fonte
3

La forma più comune di iniezione di intestazione SMTP è l'aggiunta di un'intestazione To: , CC: o BCC: per inviare l'e-mail a un destinatario non voluto. Questo funziona con le librerie SMTP che prendono un'e-mail completa con le intestazioni e le analizzano per capire i destinatari (in particolare, la riga di comando sendmail richiamata con l'opzione -t e alcune invocazioni della funzione% di% di% di PHP).

SMTPLIB di Python è resistente a questo: mail() richiede un elenco esplicito di destinatari, quindi la modifica delle intestazioni cambierà solo l'elenco apparente dei destinatari. Questo perché il processo di consegna delle email (a parte il possibile client di origine) ignora le intestazioni e recapita all'indirizzo "busta A:" ( SMTP.sendmail() nel Conversazione SMTP ).

    
risposta data 14.05.2015 - 03:29
fonte
-2

Come ha spiegato Uwe Plonius, l'articolo sembra sbagliato nella sua spiegazione, tuttavia per me il concetto rimane valido.

Invece delle 20 fonti citate in questo articolo, mi baserò solo su una: RFC 821, sezione 3 , che definisce la procedura di invio della posta.

Qui devono essere annotate due cose:

  • Ogni comando deve terminare con <CRLF> e non solo <LF> come nel tuo documento. La corretta fine della linea sarà quindi "\ r \ n",
  • Il server di posta deve accettare almeno un massimo di 100 destinatari per una singola posta (il numero 100 imposto nella sezione 4.5.2 SIZES definisce la dimensione "maximum minimum maximum" per il buffer dei destinatari), ognuno sarà specificato utilizzando un comando "RCPT TO:" separato.

Su un server vulnerabile, è possibile conseguire l'exploit richiesto forgiando un indirizzo email, come destinatario principale o copia, contenente un comando "RCPT TO:" iniettato come segue:

to = "[email protected]>\r\nRCPT TO:<[email protected]"

Affinché questa vulnerabilità sia efficace, è necessario almeno i due prerequisiti:

  • L'indirizzo del destinatario non verrà filtrato prima di raggiungere il server, il ritorno a capo e i caratteri di avanzamento riga non sono validi per un indirizzo di destinazione,
  • L'implementazione del server SMTP tollera che si invii già il successivo comando "RCPT TO:" senza attendere il feedback del server.
risposta data 13.05.2015 - 12:10
fonte

Leggi altre domande sui tag