一个用于邮件安全与过滤解决方案的测试框架。
重要提示: 不要利用此工具做任何邪恶之事!对云端或其他托管解决方案的测试必须始终获得被测试提供商的批准。仅使用您自己的测试账户,不要用大量测试邮件打扰任何人。
该邮件安全测试框架适用于 Python >=3.5。只需拉取此仓库即可开始,无需其他依赖。
脚本 mail-tester.py 负责运行测试。使用 ./mail-tester.py --help 查看帮助信息,并使用 ./mail-tester.py -l 查看测试和规避模块列表,以了解脚本的功能和使用方法。以下是一些提示:
--smtp-server 和 --to 参数以进行最基本的测试运行。-- 前缀的配置文件中。通过调用 ./mail-tester.py @tester.conf 可使用这些配置文件(配置内容包含在 tester.conf 中)。--to 配置多个收件人,以测试不同的过滤配置。--auto-delay 可自动限制邮件发送频率。可通过 --delay-step、--delay-max 和 --delay 进行微调。--spam-folder 和 --malware-folder 参数配置这些目录。本仓库不包含(也不会包含)这些样本。获取恶意软件的好去处包括 theZoo、Das Malwerk 或其他收集站。垃圾邮件可以直接从您的垃圾邮件文件夹导出,但必须为 EML 格式。--blacklist 参数提供,并用作发件人地址。--evasion content-disposition 启用一些巧妙的附件识别规避技巧。这些技巧过去曾被用来迷惑防病毒/沙盒解决方案,使其放过恶意邮件。--log 记录测试结果。邮件过滤提供商通常会在 SMTP 对话中拒绝邮件,这将在生成的日志中体现。--output 以纯文件形式导出到目录中,或使用 MBox (--mbox) 或 MailDir (--maildir) 格式。这对于在不发送任何邮件的情况下测试邮件用户代理、记录或审查生成的测试用例非常有用。可以在 tests/ 目录下的现有或新建 Python 文件中通过一个类来实现自定义测试。该类必须是本项目 tests.base 模块中 MailTestBase 的子类。当类变量 active 设置为 True 时,新实现的测试会自动被发现。此外(如果您计划将测试贡献回主仓库),应适当设置类变量 identifier、name 和 description。
以下基础类包含可供覆盖的方法或类变量:
MailTestBase:通用测试的测试类。
generateTestCases():生成测试消息。应使用 Python email.mime.* 包中的 MIME* 类或 email.message 中的 Message 类来生成,以确保有效的邮件消息。active:布尔值,表示测试是否应处于活动状态。identifier:测试的简短标识符。用于在参数中启用或禁用测试。name:简短的测试标题。description:较长的测试描述,应控制在约 100 个字符内。delivery_sender 和 delivery_recipient:布尔值,默认为 False。通常,发件人和收件人在消息中设置,Python SMTP 模块会从那里获取。有时希望在 SMTP 库中显式设置它们,可以通过将这些值设置为 True 来配置。finalizeMessage(msg):默认情况下,基础测试类会相应地设置 和 标头。如果测试用例需要,可以覆盖此行为。强烈建议设置生成消息的主题,以便在收件箱中识别测试。
规避类实现了用于逃避邮件安全解决方案识别特定邮件属性的技术。目前实现了一种通过故意破坏 Content-Disposition 标头来隐藏附件的规避技术。
规避方法通过工厂类模式实现。DeliveryBase 类实例化一个派生自 BaseEvasionFactory 类的工厂类。工厂构造函数接收一个指示规避是否激活的标志。然后将规避工厂实例传递给测试类,并存储在其 evasions 属性中,该属性包含一个以规避标识符为键的字典。在测试内部,使用 getEvasionGenerator() 实例化一个规避类(基于 EvasionBase)。构造函数的参数根据每种规避技术单独定义。
以下是用于实现规避方法的基础类:
BaseEvasionFactory:规避工厂必须基于此类。通常只需设置以下类变量:
active:如果规避应激活,则设置为 True。identifier:规避模块的简短标识符,用于在测试配置中启用它。name:规避技术的简短标题。description:规避技术的较长描述。应控制在约 100 个字符内。generator_evasion:如果规避启用,则实例化此类。generator_default:如果规避禁用,则实例化此类。BaseEvasion:规避方法的实现必须是此基础类的子类。必须覆盖以下方法:
__init__():应使用需要应用规避技术的基础消息或附件来实例化类。generate():将规避技术应用于传递给构造函数的对象,并将其以 (描述, 应用规避后的对象) 元组形式返回给调用者。通常,规避类应生成所有规避变体,并将默认情况作为专用测试用例传递,而默认规避类仅传递给定对象或创建所需的数据结构(如标头)。
规避技术用于适用的测试用例中。例如,如果某项规避技术操纵邮件或附件的标头,则必须实现以下步骤:
self.evasions 中的规避工厂实例实例化适当的规避类,例如:evasion_items = self.evasions["evasion_identifier"].getEvasionGenerator(message)for evasion_item in evasion_items:
yield evasion_item
内容处置规避技术已在框架中实现,应用于所有针对恶意附件识别的测试用例。构造函数接收一个附件和预期的文件名。然后规避类生成 (规避名称, 应用了规避技术的附件) 元组,这些元组可以直接由测试的 generateAttachments() 方法生成。
MailAttachmentTestBase:附件测试用例的测试类。这会生成一封包含主题和文本部分的完整有效邮件,并将测试用例附加到其中。继承自 MailTestBase,因此来自它的方法/变量也可以在此处覆盖。
generateAttachments():以 (描述, 附件) 元组的形式生成测试用例。subject:设置主题。占位符 {} 会被 generateAttachments() 生成的描述替换。generateTestCases():已经被上述消息生成的实现所覆盖,但如有需要可以进一步调整。