
Un framework de test pour les solutions de sécurité et de filtrage des e-mails.
Un cadre de test pour les solutions de sécurité et de filtrage des courriels.
IMPORTANT : Ne faites rien de malveillant avec cela ! Les tests de solutions cloud ou hébergées doivent toujours être approuvés par le fournisseur testé. Utilisez uniquement vos propres comptes de test et n'ennuyez personne avec une multitude de courriels de test.
Le cadre de test de sécurité des courriels fonctionne avec Python >=3.5. Il suffit de cloner ce dépôt et de commencer. Aucune autre dépendance n'est requise.
Le script mail-tester.py exécute les tests. Lisez le message d'aide avec ./mail-tester.py --help et consultez la liste des
modules de test et d'évasion avec ./mail-tester.py -l pour obtenir un aperçu des capacités et de l'utilisation du
script. Quelques conseils :
--smtp-server et --to doivent être fournis pour une exécution de test minimale.--. Ces fichiers de configuration peuvent être
utilisés en invoquant ./mail-tester.py @tester.conf (configuration contenue dans tester.conf).--to pour tester différentes configurations de filtrage.--auto-delay pour un réglage automatique du débit des
courriels. Cela peut être affiné avec --delay-step, --delay-max et --delay.--spam-folder et --malware-folder. Les échantillons ne sont pas inclus dans ce dépôt (et ne le seront pas).
De bons endroits pour obtenir des malwares sont theZoo, Das Malwerk ou
d'autres collections. Les spams peuvent être exportés directement depuis votre dossier Spam, mais doivent être au format EML.--blacklist et sont utilisées comme adresses d'expéditeur.--evasion content-disposition. Elles étaient utilisées
par le passé pour tromper les solutions d'analyse antivirus/sandbox et leur laisser passer des courriels malveillants.--log. Les fournisseurs de filtrage de courriels rejettent souvent les courriels lors du dialogue SMTP,
ce qui est reflété dans le journal généré.--output sous forme de fichiers simples dans un répertoire, au format MBox (--mbox) ou MailDir (--maildir).
Cela est utile pour tester les clients de messagerie sans envoyer de courriels, pour documenter ou examiner les cas de test générés.Les tests personnalisés peuvent être implémentés avec une classe dans l'un des fichiers Python existants ou nouvellement créés dans le répertoire tests/.
La classe doit être une sous-classe de MailTestBase située dans le module tests.base de ce projet. Les tests nouvellement
implémentés sont découverts automatiquement lorsque la variable de classe active est définie à True. De plus (si vous prévoyez
de contribuer des tests au dépôt principal), les variables de classe identifier, name et description doivent être
définies de manière appropriée.
Les classes de base suivantes existent avec des méthodes ou des variables de classe destinées à être surchargées :
MailTestBase : Classe de test pour les tests génériques.
generateTestCases() : Génère des messages de test. Ceux-ci doivent être générés avec les classes MIME* des packages
email.mime.* de Python ou avec la classe Message de email.message pour garantir des messages électroniques valides.active : Valeur booléenne indiquant si le test doit être actif.identifier : Identifiant court du test. Celui-ci est utilisé pour activer ou désactiver les tests dans les paramètres.name : Titre court du test.description : Description plus longue du test, doit tenir dans environ 100 caractères.delivery_sender et delivery_recipient : Valeurs booléennes, par défaut. Normalement, l'expéditeur et les destinataires sont définis dans le
message et le module SMTP de Python les reprend à partir de là. Parfois, il est souhaitable de les définir explicitement dans
la bibliothèque SMTP, ce qui peut être configuré en définissant ces valeurs sur .Il est fortement recommandé de définir les sujets des messages générés afin de pouvoir reconnaître les tests dans la boîte de réception destinataire.
Les classes d'évasion implémentent des techniques pour éviter la reconnaissance de propriétés particulières des courriels par les solutions de sécurité des courriels. Actuellement, une technique d'évasion qui tente de cacher les pièces jointes à ces solutions en utilisant des en-têtes Content-Disposition intentionnellement cassés est implémentée.
Les évasions sont implémentées par un modèle de classe d'usine. La classe DeliveryBase instancie une classe d'usine dérivée de
la classe BaseEvasionFactory. Le constructeur de l'usine reçoit un indicateur qui signale si l'évasion est activée. L'instance
de l'usine d'évasion est ensuite passée à la classe de test et stockée dans son attribut evasions qui contient un dict
avec les identifiants d'évasion comme clés. À l'intérieur du test, une classe d'évasion (basée sur EvasionBase) est instanciée avec
getEvasionGenerator(). Les paramètres du constructeur sont définis individuellement par technique d'évasion.
Les classes de base suivantes sont utilisées pour implémenter les évasions :
BaseEvasionFactory : Les usines d'évasion doivent être basées sur cette classe. En général, seules les variables de classe suivantes
doivent être définies :
active : Définir sur True si l'évasion doit être active.identifier : Identifiant court du module d'évasion utilisé pour l'activer dans la configuration de test.name : Titre court de la technique d'évasion.description : Description plus longue de la technique d'évasion. Doit tenir dans environ 100 caractères.generator_evasion : Classe d'évasion qui est instanciée si l'évasion est activée.generator_default : Classe d'évasion qui est instanciée si l'évasion est désactivée.BaseEvasion : L'implémentation des évasions doit être une sous-classe de cette classe de base. La méthode suivante doit être
surchargée :
__init__() : Doit instancier la classe avec le message ou la pièce jointe de base qui doit être manipulé(e) avec des
techniques d'évasion.generate() : Appliquer la technique d'évasion à l'objet passé au constructeur et le renvoyer à l'appelant sous forme de
tuple (description, objet avec évasion appliquée).En général, la classe d'évasion doit générer toutes les variantes d'évasion et passer la valeur par défaut comme cas de test dédié, tandis que les classes d'évasion par défaut ne font que transmettre l'objet donné ou créer les structures de données requises, comme les en-têtes.
Les techniques d'évasion sont utilisées dans les cas de test où elles sont applicables. Par exemple, si une technique d'évasion manipule l'en-tête d'un courriel ou d'une pièce jointe, les étapes suivantes doivent être implémentées :
self.evasions, par exemple :
evasion_items = self.evasions["evasion_identifier"].getEvasionGenerator(message)for evasion_item in evasion_items:
yield evasion_item
La technique d'évasion Content-Disposition est déjà implémentée dans le cadre et doit être utilisée pour tous les cas de test
qui ciblent la reconnaissance de pièces jointes malveillantes. Le constructeur reçoit une pièce jointe et le nom de fichier prévu.
La classe d'évasion renvoie ensuite des tuples (nom d'évasion, pièce jointe avec technique d'évasion appliquée) qui peuvent directement
être renvoyés par la méthode generateAttachments() des tests.
finalizeMessage(msg) : Par défaut, la classe de test de base définit les en-têtes From et To en conséquence. Ce
comportement peut être surchargé si nécessaire pour le cas de test.MailAttachmentTestBase : Classe de test pour les cas de test de pièces jointes. Cela génère un courriel complet valide avec un sujet
et une partie texte et y attache le cas de test. Dérivé de MailTestBase, donc les méthodes/variables de celui-ci peuvent
être surchargées ici aussi.
generateAttachments() : Génère des cas de test sous forme de tuples (description, pièce jointe).subject : Définit le sujet. L'espace réservé {} est remplacé par la description générée par
generateAttachments().generateTestCases() : est déjà surchargée avec une implémentation de la génération de messages décrite ci-dessus, mais peut être adaptée
davantage si nécessaire.