Inyección de encabezado SMTP

1

Estoy tratando de entender la inyección de encabezado SMTP. Estoy usando la biblioteca SMTPLIB de Python para prototipo de esta vulnerabilidad. Aquí está mi código:

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()

He intentado usar el servidor SMTP de Zoho y Gmail. El correo electrónico se envía con éxito a la dirección en la variable "a", pero no se envía a la dirección de correo electrónico "[email protected]". Cuando veo el mensaje en Gmail o Zoho, veo "[email protected]" en el campo CC, pero nunca se envía a la segunda dirección de correo electrónico. También he intentado inyectar el campo Asunto con los mismos resultados.

¿Puede alguien explicarme esto? ¿Se ha realizado algún filtrado en el final de Gmail / Zoho?

Gracias, Johnny_v

    
pregunta Johnny_v 13.05.2015 - 07:36
fuente

3 respuestas

3

Caso simple: no envía el correo electrónico a [email protected] .

El servidor SMTP no utiliza los encabezados del correo electrónico.

Agrega un CC: al encabezado del correo electrónico pero el servidor SMTP no lee este encabezado.

El servidor SMTP solo ve lo que transmites con tu línea smtpserver.sendmail(user, to, msg) .

Básicamente, la comunicación es la siguiente (S: servidor, C: cliente) (la TLS y la parte de autenticación se omiten) (las partes entre paréntesis [son comentarios de mi parte) según su 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

El servidor de correo solo respeta la parte RCPT TO: . Todo lo demás (entre DATA y . ) solo son datos y el servidor SMTP no los analiza / analiza.

Para enviar el correo electrónico a otra persona, debe agregar un segundo comando con RCPT TO: . Esto debe hacerse con otra llamada a smtpserver.sendmail() . Como no sé la biblioteca utilizada, no puedo decirle si tiene que crear una segunda llamada o si hay una llamada con una lista de destinatarios.

Tenga en cuenta también que puede enviar el correo electrónico a alguien sin agregar el destinatario al encabezado (por ejemplo, esto se usa para BCC ).

    
respondido por el Uwe Plonus 13.05.2015 - 09:55
fuente
3

La forma más común de inyección de encabezado SMTP es agregar un encabezado To: , CC: o BCC: para enviar el correo electrónico a un destinatario no deseado. Esto funciona con bibliotecas SMTP que toman un correo electrónico completo con encabezados y lo analizan para averiguar los destinatarios (más notablemente, la línea de comando sendmail invocada con la opción -t y algunas invocaciones de la función PHP mail() ).

SMTPLIB de Python se resiste a esto: SMTP.sendmail() requiere una lista explícita de destinatarios, por lo que cambiar los encabezados solo cambiará la lista de destinatarios aparente . Esto se debe a que el proceso de entrega de correo electrónico (aparte de posiblemente el cliente de origen) ignora los encabezados y se envía a la dirección "sobre": ( RCPT TO: en la conversación SMTP ).

    
respondido por el Mark 14.05.2015 - 03:29
fuente
-2

Como explicó Uwe Plonius, el artículo parece incorrecto en su explicación, pero para mí el concepto sigue siendo válido.

En lugar de las 20 fuentes citadas en este artículo, dependeré solo de una: RFC 821, sección 3 , definiendo el procedimiento de envío de correo.

Hay que tener en cuenta dos cosas:

  • Cada comando debe terminar con un <CRLF> , y no solo <LF> como en su documento. Por lo tanto, el final de línea correcto será "\ r \ n",
  • El servidor de correo debe aceptar al menos hasta 100 destinatarios para un solo correo (el número 100 que se impone en la sección 4.5.2 TAMAÑOS que define el tamaño del "máximo mínimo requerido" para el búfer de los destinatarios), cada uno se especificará con una comando "RCPT TO:" separado.

En un servidor vulnerable, por lo tanto, puede lograr la explotación solicitada falsificando una dirección de correo electrónico, ya sea como destinatario principal o copia, que contiene un comando "RCPT TO:" inyectado como sigue:

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

Para que esta vulnerabilidad sea efectiva, necesita al menos los dos requisitos previos:

  • La dirección de su destinatario no se filtrará antes de llegar al servidor, ya que los caracteres de retorno de carro y avance de línea no son válidos para una dirección de destino,
  • La implementación del servidor SMTP admite que ya envíe el siguiente comando "RCPT TO:" sin esperar la respuesta del servidor.
respondido por el WhiteWinterWolf 13.05.2015 - 12:10
fuente

Lea otras preguntas en las etiquetas