Recuperación de archivos de correo python
Resuelto¡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
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
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.
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).
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! :)
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 :)
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:
Como puedes ver, no hay ejecución espontánea al momento de descargar un archivo.
¡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!
Como tú lo sientas, gracias por tu respuesta y buena continuación :-)