Recuperación de archivos de correo python

Resuelto
Lou -  
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   -

¡Hola! :)

He recuperado un script de código abierto que permite obtener los datos de los correos a partir de un filtro de etiqueta para luego enviarlos a una herramienta de respuesta a incidentes (llamada thehive).

El enlace del script: https://github.com/xme/dockers/blob/master/imap2thehive/imap2thehive.py

Funciona muy bien, excepto que tengo miedo al recuperar los archivos adjuntos :/ No me doy cuenta del riesgo posible si el correo contiene un archivo malicioso que este script va a descargar.

Creo que hay que mirar en este lugar específicamente:

# Extracción de partes MIME filename = part.get_filename() mimetype = part.get_content_type() if filename and mimetype: if mimetype in config['caseFiles'] or not config['caseFiles']: log.info("Se encontró un adjunto: %s (%s)" % (filename, mimetype)) # Decodificar el adjunto y guardarlo en un archivo temporal charset = part.get_content_charset() if charset is None: charset = chardet.detect(bytes(part))['encoding'] # Obtener la extensión del nombre de archivo para no romper los analizadores de TheHive (ver Github #11) fname, fextension = os.path.splitext(filename) fd, path = tempfile.mkstemp(prefix=slugify(fname) + "_", suffix=fextension) try: with os.fdopen(fd, 'w+b') as tmp: tmp.write(part.get_payload(decode=1)) attachments.append(path) except OSerror as e: log.error("No se puede volcar el adjunto a %s: %s" % (path,e.errno)) return False

Según entiendo, crea un archivo temporal, lo abre y coloca el archivo del correo.

¿Alguien puede orientarme?

¡Gracias! :)

2 respuestas

mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940
 

Hola,

Varias cosas:

  • En caso de recibir un correo electrónico malicioso, quizás sea más al servidor de correo (más que a tu script) al que le corresponde controlar si es spam o no (típicamente con un anti spam y antivirus). El destinatario del correo (incluido el cliente de correo) debería tener sus propios antivirus y anti spam como complemento.
  • No hay nada que impida realizar controles básicos (sobre el tipo mime, por ejemplo) para tener una doble protección.
    • Esto sigue siendo fácilmente eludible cambiando la extensión. La extensión no cambia el contenido del archivo, pero determina con qué aplicación el sistema querrá leer el archivo.
    • Si un software (digamos tu lector de pdf) tiene una vulnerabilidad de seguridad, y este tipo mime está permitido, y el lector de pdf tiene una falla que permite ejecutar código incrustado en un archivo pdf, entonces un archivo pdf puede efectivamente contener código malicioso y comenzar a contaminar tu máquina (con los derechos del usuario que ha iniciado el lector pdf).
  • Si descargas localmente un archivo adjunto malicioso, como dice yg_be, mientras no sea ejecutado ni leído por un software del que explote una vulnerabilidad de seguridad, no podrá contaminar tu máquina de forma espontánea. Esto significa que si el usuario no ejecuta ni abre un archivo malicioso, no hay riesgo. Si lo abre, debe ser capaz de explotar una posible vulnerabilidad del software utilizado para abrirlo, lo cual no es sistemático.
  • En tu mensaje #6, dices "mi servidor de correo (Thunderbird)", pero Thunderbird es un cliente de correo. Un cliente permite interrogar a un servidor de correo, típicamente un servidor IMAP o POP3 (por ejemplo imap.gmail.com). Por tanto, se trata de otra máquina.

Buena suerte

1
Lou
 

Hola,

"En tu mensaje #6, dices "mi servidor de correo (Thunderbird)", pero Thunderbird es un cliente de correo. Un cliente permite interrogar un servidor de correo, típicamente un servidor IMAP o POP3, (por ejemplo imap.gmail.com). Así que se trata de una máquina diferente."

Sí, lo siento, no utilicé los términos correctos :( ... para mi servidor de correo.

"Si descargas localmente un adjunto malicioso, como dice yg_be, mientras no se ejecute ni se lea mediante un software que explote una vulnerabilidad de seguridad, no puede contaminar tu máquina de forma espontánea. Esto significa que si el usuario no ejecuta o abre un elemento malicioso, no hay riesgo. Si lo abre, el elemento malicioso debe ser capaz de explotar una posible vulnerabilidad del software utilizado para abrirlo, lo cual no es sistemático."

De acuerdo. No sé por qué, pero para mí representar un riesgo descargar un archivo malicioso, ¿no hay casos (seguramente raros) donde la descarga de un archivo malicioso pueda ser peligrosa? (sin necesidad de tocarlo después).

Gracias :)

0
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940 > Lou
 

No, no es posible.

Sea cual sea el sistema operativo, una descarga es simplemente una copia bit a bit de un contenido a un espacio de almacenamiento, sin buscar entender lo que significan esos bits. Por lo tanto, no puede haber ejecución de código (malicioso o no) en esta etapa, incluso si el contenido descargado es un ejecutable.

Es después de que una tarea es realizada por el sistema, necesita que un programa lo ejecute. A partir de ahí, hay dos posibilidades:

  • o el archivo es ejecutable (posiblemente a través de un intérprete), y a menos que el usuario lo solicite explícitamente, no tiene ninguna razón para ser ejecutado por el sistema
    • la única ejecución espontánea que se me ocurre no lo es
      • el sistema está configurado para lanzar automáticamente código contenido: este es el caso, por ejemplo, del autorun de CD/DVD para ejecutar automáticamente un programa en el CD (pero esto se puede desactivar) y es mejor desactivarlo; el programa en cuestión no se ejecuta espontáneamente, es el sistema operativo en ejecución el que está configurado para lanzar el autorun.
      • ningún proceso se ejecuta espontáneamente excepto el que se lanza al arrancar el sistema
  • o el código malicioso está en el archivo adjunto. Para ser ejecutado,
    • o el programa que lo está leyendo está configurado para ejecutar una parte de él. Ejemplos
      • las macros de Excel (pero hoy en día, LibreOffice no ejecuta macros de Excel sin el consentimiento del usuario (y si es necesario, eso se configura). Imagino que lo mismo aplica para Excel.)
      • las celdas de inicialización en Jupyter. (pero en Jupyter, el usuario debe certificar primero el notebook para que las celdas de inicialización se ejecuten al abrir el notebook.)
    • o explota una vulnerabilidad de seguridad del software que va a leerlo. El código en cuestión es, por lo tanto, ejecutado por el programa que está leyendo el archivo adjunto. Pero esto supone que el software que está leyendo el archivo adjunto ha sido él mismo explícitamente lanzado por el usuario (o el sistema, cf primer ítem).

Como puedes ver, no hay ejecución espontánea al momento de descargar un archivo.

1
Lou > mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención  
 

¡Hola! Gracias por estas explicaciones :)

Ahora me parece lógico que me lo digas.

Así que voy a mantener mi idea de recuperar únicamente el SHA256, que será suficiente para saber si el archivo está referenciado en algunas bases de datos como VirusTotal. Prefiero evitar recuperar el archivo completo, eso evitará que alguien lo abra después de la descarga desde la herramienta de respuesta a incidentes.

¡Que tengas un buen día!

0
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940 > Lou
 

Como tú lo sientas, gracias por tu respuesta y buena continuación :-)

0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Ambassadeur 1 588
 

hola,

Creo que has entendido bien.
Tal vez podrías examinar la extensión del archivo y rechazarlo si esta extensión te parece peligrosa.

0
voji
 

Hola, esto ya es posible en este script ya que config['caseFiles'] es una lista blanca de tipos de archivos permitidos.

0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > voji
 

No es fácil hacer pasar un .exe asociándole una descripción mime inofensiva.

0
Lou > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
 

¡De acuerdo, gracias! :)

Efectivamente, en config['caseFiles'] tengo una lista blanca que contiene, por ejemplo:

application/pdf application/octet-stream image/png

Así que voy a ver cómo añadir un análisis adicional para verificar lo que dice @yg_be.

0
voji > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
 

Buenas noches, no tengo idea, no soy un especialista en ataques relacionados con Windows ^^

Al observar lo que se hace en PHP, creo que la lista blanca + renombrar archivos y extensiones debería ayudar a paliar los problemas de extensiones ocultas por Windows... (No sé si eso sigue siendo así en las versiones recientes).

0
Lou > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
 

Hola,

Finalmente, prefiero evitar el riesgo de transmitir el archivo a la herramienta de respuesta a incidentes.

De hecho, lo que me molesta es que si hago un análisis sobre la extensión, siempre habrá formas de hacerlo que no podré detectar. Por ejemplo, un pdf que contenga código ejecutable dentro (digo cualquier cosa, pero esa es la idea).

Pensé que quizás podría calcular el SHA256 de los archivos, recuperar ese hash y transmitirlo junto con el nombre del archivo a la herramienta, que luego podría hacer una consulta a VirusTotal para verificar la integridad del archivo.

Sin embargo, todavía me hago una pregunta, tal vez boba. Siguiendo con el mismo bloque de código, estamos de acuerdo en que debo descargar siempre el archivo del correo y ponerlo en el archivo temporal para permitir el cálculo del SHA256? Por lo tanto, siempre plantea un riesgo durante esta descarga? Dado que el archivo temporal se coloca en local ...

Para ser más claro: mi script está ubicado en el servidor que alberga la herramienta de respuesta a incidentes, interrogará mi servidor de correo (Thunderbird) y enviará directamente la respuesta (formulada de cierta manera) a la herramienta a través de su API.

¡Gracias! :)

0