
Un marco de pruebas para soluciones de seguridad y filtrado de correo.
Un framework de pruebas para soluciones de seguridad y filtrado de correo.
IMPORTANTE: ¡No hagas nada malvado con esto! Las pruebas de soluciones en la nube o alojadas siempre deben ser aprobadas por el proveedor probado. Usa solo tus propias cuentas de prueba y no molestes a nadie con una carga de correos de prueba.
El framework de pruebas de seguridad de correo funciona con Python >=3.5. Simplemente clona este repositorio y continúa. No se requieren dependencias adicionales.
El script mail-tester.py ejecuta las pruebas. Lee el mensaje de ayuda con ./mail-tester.py --help y revisa la lista de módulos de prueba y evasión con ./mail-tester.py -l para obtener una visión general de las capacidades y el uso del script. Algunas sugerencias:
--smtp-server y --to deben ser proporcionados para una ejecución de prueba mínima.--. Estos archivos de configuración se pueden usar invocando ./mail-tester.py @tester.conf (configuración contenida en tester.conf).--to para probar diferentes configuraciones de filtro.--auto-delay para la limitación automática de los correos. Esto se puede ajustar con --delay-step, --delay-max y --delay.--spam-folder y --malware-folder. Las muestras no están incluidas en este repositorio (y no lo estarán). Buenos lugares para obtener malware son theZoo, Das Malwerk u otras colecciones. El spam se puede exportar directamente de tu carpeta de Spam, pero debe estar en formato EML.--blacklist y se utilizan como direcciones de remitente.--evasion content-disposition. Estos se usaron en el pasado para confundir soluciones de AV/sandboxing y permitir que pasaran correos maliciosos.--log. Los proveedores de filtrado de correo a menudo rechazan correos en el diálogo SMTP, lo cual se refleja en el registro generado.--output como archivos planos en un directorio, en formato MBox (--mbox) o MailDir (--maildir). Esto es útil para probar clientes de correo sin enviar ningún correo, para documentar o revisar los casos de prueba generados.Se pueden implementar pruebas propias con una clase en uno de los archivos Python existentes o nuevos en el directorio tests/. La clase debe ser una subclase de MailTestBase ubicada en el módulo tests.base de este proyecto. Las pruebas recién implementadas se descubren automáticamente cuando la variable de clase active se establece en True. Además (si planeas contribuir con pruebas de vuelta al repositorio principal), las variables de clase identifier, name y description deben configurarse adecuadamente.
Existen las siguientes clases base con métodos o variables de clase destinadas a ser sobrescritas:
MailTestBase: Clase de prueba para pruebas genéricas.
generateTestCases(): Genera mensajes de prueba. Estos deben generarse con las clases MIME* de los paquetes email.mime.* de Python o con la clase Message de email.message para garantizar mensajes de correo válidos.active: Valor booleano que indica si la prueba debe estar activa.identifier: Identificador corto de la prueba. Este se usa para habilitar o deshabilitar pruebas en los parámetros.name: Título corto de la prueba.description: Descripción más larga de la prueba, debe ajustarse aproximadamente a 100 caracteres.delivery_sender y delivery_recipient: Valores booleanos, False por defecto. Normalmente, el remitente y los destinatarios se establecen en el mensaje y el módulo SMTP de Python los toma de allí. A veces es deseable establecerlos explícitamente en la biblioteca SMTP, lo que se puede configurar estableciendo estos valores en .Se recomienda encarecidamente establecer los asuntos de los mensajes generados para poder reconocer las pruebas en la bandeja de entrada receptora.
Las clases de evasión implementan técnicas para evitar el reconocimiento de propiedades particulares del correo por parte de las soluciones de seguridad de correo. Actualmente, se implementa una técnica de evasión que intenta ocultar archivos adjuntos de dichas soluciones mediante encabezados Content-Disposition intencionalmente rotos.
Las evasiones se implementan mediante un patrón de clase fábrica. La clase DeliveryBase instancia una clase fábrica derivada de la clase BaseEvasionFactory. El constructor de la fábrica recibe una bandera que indica si la evasión está activada. La instancia de la fábrica de evasión se pasa luego a la clase de prueba y se almacena en su atributo evasions que contiene un diccionario con los identificadores de evasión como claves. Dentro de la prueba, se instancia una clase de evasión (basada en EvasionBase) con getEvasionGenerator(). Los parámetros del constructor se definen individualmente por técnica de evasión.
Las siguientes clases base se utilizan para implementar evasiones:
BaseEvasionFactory: Las fábricas de evasión deben basarse en esta clase. Normalmente, solo se deben establecer las siguientes variables de clase:
active: Establecer a True si la evasión debe estar activa.identifier: Identificador corto del módulo de evasión utilizado para habilitarlo en la configuración de prueba.name: Título corto de la técnica de evasión.description: Descripción más larga de la técnica de evasión. Debe ajustarse aproximadamente a 100 caracteres.generator_evasion: Clase de evasión que se instancia si la evasión está habilitada.generator_default: Clase de evasión que se instancia si la evasión está deshabilitada.BaseEvasion: La implementación de evasiones debe ser una subclase de esta clase base. El siguiente método debe ser sobrescrito:
__init__(): Debe instanciar la clase con el mensaje base o archivo adjunto que debe ser manipulado con técnicas de evasión.generate(): Aplica la técnica de evasión al objeto pasado al constructor y lo entrega al llamador como una tupla (descripción, objeto con evasión aplicada).Generalmente, la clase de evasión debe generar todas las variantes de evasión y pasar la predeterminada como un caso de prueba dedicado, mientras que las clases de evasión predeterminadas solo pasan el objeto dado o crean las estructuras de datos necesarias, como encabezados.
Las técnicas de evasión se utilizan en casos de prueba donde son aplicables. Por ejemplo, si una técnica de evasión manipula el encabezado de un correo o archivo adjunto, se deben implementar los siguientes pasos:
self.evasions, por ejemplo:evasion_items = self.evasions["evasion_identifier"].getEvasionGenerator(message)
for evasion_item in evasion_items:
yield evasion_item
La técnica de evasión de content disposition ya está implementada en el framework y debe utilizarse para todos los casos de prueba que se centran en el reconocimiento de archivos adjuntos maliciosos. El constructor recibe un archivo adjunto y el nombre de archivo deseado. Luego, la clase de evasión genera tuplas (nombre de evasión, archivo adjunto con la técnica de evasión aplicada) que pueden ser directamente entregadas por el método generateAttachments() de las pruebas.
finalizeMessage(msg): Por defecto, la clase base de prueba establece los encabezados From y To en consecuencia. Este comportamiento se puede sobrescribir si es necesario para el caso de prueba.MailAttachmentTestBase: Clase de prueba para casos de prueba de archivos adjuntos. Esto genera un correo completo válido con un Asunto y una parte de texto y adjunta el caso de prueba. Derivado de MailTestBase, por lo tanto, los métodos/variables de él también se pueden sobrescribir aquí.
generateAttachments(): Genera casos de prueba como tuplas (descripción, archivo adjunto).subject: Establece el asunto. El marcador de posición {} se reemplaza por la descripción generada por generateAttachments().generateTestCases(): ya está sobrescrito con una implementación de la generación de mensajes descrita anteriormente, pero puede adaptarse aún más si es necesario.