Cadre de tests de sécurité de votre serveur de mails
Un cadre de test pour la sécurité du courrier et les solutions de filtrage.
IMPORTANT: Ne faites rien de mal avec ça ! Les tests de cloud ou de solutions hébergées doivent toujours être approuvés par le fournisseur testé. N'utilisez que vos propres comptes de tests et n'ennuyez personne avec vos mails de tests.
Installation
Le framework de test de sécurité du courrier fonctionne avec Python >= 3.5. Il suffit de tirer ce dépôt et de continuer. Aucune autre dépendance n'est requise.
Utilisation
Le script mail-tester.py exécute les tests. Lisez le message d'aide avec ./mail-tester.py --help et vérifiez la liste des modules de test et d'évasion avec ./mail-tester.py -l pour avoir un aperçu des fonctionnalités et de l'utilisation du script. Quelques conseils:
- Au minimum, les paramètres
--smtp-server et --to doivent être donné pour un test minimal.
- Tous les paramètres peuvent également être stockés dans des fichiers de configuration sans le préfixe
--. Ces fichiers de configuration peuvent être utilisés en invoquant ./mail-tester.py @tester.conf (configuration contenue dans tester.conf).
- Plusieurs destinataires peuvent être configurés avec
--to pour tester différentes configurations de filtres.
- Certaines solutions de filtrage du courrier peuvent rejeter des messages après un certain temps. Utilisez
--auto-delay pour la régulation automatique des messages. Cela peut être affiné avec --delay-step, --delay-max et --delay.
- Certains tests (Spam et Malware) nécessitent des échantillons. Placez-les dans des répertoires et configurez ces répertoires avec les paramètres
--spam-folder et --malware-folder. Les exemples ne sont pas inclus dans ce référentiel (et ne le seront pas). TheZoo, Das_Malwerk ou d’autres collections sont des endroits propices aux logiciels malveillants. Le spam peut être exporté directement depuis votre dossier Spam, mais doit être au format EML.
- Des listes noires peuvent être fournies avec le paramètre
--blacklist et sont utilisés comme adresses d'expéditeur.
- Les scénarios de test Shellshock et Subject XSS doivent avoir un domaine de backconnect valide, dans lequel vous pouvez voir tous les backconnects (en particulier les requêtes DNS). Le service gratuit Canary_Tokens_service peut être utilisé à cette fin. Merci à Thinkst d'avoir fourni ce service génial !
- Certaines astuces d’évasion de reconnaissance de pièces jointes peuvent être activées avec
--evasion content-disposition. Celles-ci étaient utilisées dans le passé pour confondre les solutions AV/sandboxing et les laisser transmettre des messages malveillants.
- N'oubliez pas de consigner les résultats du test avec
--log. Les fournisseurs de filtrage de messagerie rejettent souvent les messages dans la boîte de dialogue SMTP, ce qui se reflète dans le journal généré.
- Les cas de test peuvent être vidés avec
--output sous forme de fichiers simples dans un répertoire, dans les formats MBox (--mbox) ou MailDir (--maildir). Ceci est utile pour tester les agents utilisateurs de messagerie sans envoyer de courrier, pour documenter ou examiner les cas de test générés.
Développement et Extension
Tests
Les tests propres 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étectés automatiquement lorsque la variable de classe active est définie sur True. En outre (si vous envisagez de contribuer à des tests dans le référentiel principal), l'identificateur, le nom et la description des variables de classe doivent être définis de manière appropriée.
Les classes de base suivantes existent avec des méthodes ou des variables de classe destinées à remplacer:
MailTestBase: Classe de test pour les tests génériques.
generateTestCases(): Donne des messages de test. Celles-ci devraient être générées avec les classes MIME* du Python
email.mime.* packages ou avec la classe Message de email.message pour garantir la validité des messages.
active: Valeur booléenne 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 de test court.
description: Une description de test plus longue doit pouvoir contenir environ 100 caractères.
delivery_sender et delivery_recipient: Valeurs booléennes, False par défaut. Normalement, l'expéditeur et les destinataires sont définis dans le message et le module Python SMTP les prend en charge. Il est parfois souhaitable de les définir explicitement dans la bibliothèque SMTP, qui peut être configurée en définissant ces valeurs sur True.
finalizeMessage(msg): Par défaut, la classe de test de base définit les en-têtes From et To de manière agrégée. Ce comportement peut être remplacé si nécessaire pour le scénario de test.
MailAttachmentTestBase: Classe de test pour les cas de test de pièce jointe. Cela génère un courrier complet valide avec un objet et une partie texte et lui associe le scénario de test. Dérivé de MailTestBase, les méthodes/variables qu'il contient peuvent également être remplacées ici.
generateAttachments(): Donne des cas de test sous forme de tuples (description, attachement).
subject: Définit le sujet. Le place place {} est remplacé par la description donnée par generateAttachments().
generateTestCases(): est déjà remplacé par une implémentation de la génération de messages décrite ci-dessus, mais peut être adaptée si nécessaire.
Il est fortement recommandé de définir les sujets des messages générés pour pouvoir reconnaître les tests dans la boîte de réception.
Évasions
Les classes Évasion implémentent des techniques permettant d’éviter la reconnaissance de propriétés de messagerie particulières par des solutions de sécurité de messagerie.
Actuellement, une technique d'évasion qui tente de masquer les pièces jointes de telles solutions par des en-têtes Content-Disposition intentionnellement brisés est implémentée.
Mettre en œuvre de nouvelles évasions
Les évasions sont implémentées par un modèle de classe usine. La classe DeliveryBase instancie une classe de fabrique dérivée de la classe BaseEvasionFactory. Le constructeur d'usine reçoit un drapeau qui indique si l'évasion est activée. L'instance evasion factory est ensuite transmise à la classe de test et stockée dans son attribut evasions qui contient un dict avec les identifiants d'évasion comme clés. A l'intérieur du test, une classe d'évasion (basée sur EvasionBase) est instanciée avec getEvasionGenerator(). Le paramètre constructeur est défini 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 règle générale, seules les variables de classe suivantes doivent être définies:
active: Définissez 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 abrégé de la technique d'évasion.
description: Description plus longue de la technique d'évasion. Devrait contenir environ 100 caractères.
generator_evasion: Classe d'évasion instanciée si l'évasion est activée.
generator_default: Classe d'évasion instanciée si l'évasion est désactivée.
BaseEvasion: La mise en œuvre des évasions doit être une sous-classe de cette classe de base. La méthode suivante doit être remplacée:
__init__(): Doit instancier la classe avec le message de base ou la pièce jointe qui doit être manipulée avec des techniques d'évasion.
generate(): Appliquez la technique d’évasion à l’objet passé au constructeur et cédez-le à l’appelant en tant que tuple (description, objet avec évasion appliquée).
Généralement, la classe evasion doit générer toutes les variantes d'évasion et transmettre la valeur par défaut en tant que scénario de test dédié, tandis que les classes d'évasion par défaut transmettent uniquement l'objet donné ou créent les structures de données requises, comme les en-têtes.
Utiliser des techniques d'évasion dans des cas de test
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 mail ou d'une pièce jointe, les étapes suivantes doivent être implémentées:
1. Générer l'objet de base (mail ou pièce jointe) sans tenir compte de l'évasion.
2. Instancier la classe d’évasion appropriée en utilisant l’instance de la fabrique d’évasion à partir de self.evasions, exemple :
evasion_items = self.evasions["evasion_identifier"].getEvasionGenerator(message)
3. Itérer sur le générateur et céder les cas de test:
for evasion_item in evasion_items:
yield evasion_item
Utilisation de la technique d'évasion de disposition de contenu
La technique d'évasion de la disposition du contenu est déjà implémentée dans la structure et doit être utilisée pour tous les scénarios de test qui ciblent la reconnaissance des pièces jointes malveillantes. Le constructeur reçoit une pièce jointe et le nom de fichier voulu. La classe d'évasion donne alors des tuples (nom d'évasion, attachement avec technique d'évasion appliquée) qui peuvent être directement générés par la méthode tests generateAttachments().
Avertissement
L'utilisation de ce programme ne peut se faire que dans le
cadre légal d'un
audit de vulnérabilités, basé sur le consentement mutuel. Il est de la responsabilité de l'utilisateur final de ne pas utiliser ce programme dans un autre cadre. SecuriteInfo.com n'assume aucune responsabilité et n'est pas responsable de toute mauvaise utilisation ou de tout dommage causé par ce programme.
Téléchargement
Tags
RECHERCHE DE VULNERABILITÉS
MAIL
OUTIL DE HACKING
Inscription à notre lettre d'information
Inscrivez-vous à notre
lettre d'information pour vous tenir au courant de nos actualités et de nos dernières trouvailles.