
Um framework de teste para soluções de segurança e filtragem de e-mail.
Um framework de testes para soluções de segurança e filtragem de e-mail.
IMPORTANTE: Não faça nada de maldoso com isso! Testes de soluções em nuvem ou hospedadas devem sempre ser aprovados pelo provedor testado. Use apenas suas próprias contas de teste e não incomode ninguém com uma carga de e-mails de teste.
O framework de teste de segurança de e-mail funciona com Python >=3.5. Basta puxar este repositório e seguir em frente. Nenhuma dependência adicional é necessária.
O script mail-tester.py executa os testes. Leia a mensagem de ajuda com ./mail-tester.py --help e verifique a lista de módulos de teste e evasão com ./mail-tester.py -l para ter uma visão geral das capacidades e do uso do script. Algumas dicas:
--smtp-server e --to devem ser fornecidos para uma execução mínima de teste.--. Esses arquivos de configuração podem ser usados invocando ./mail-tester.py @tester.conf (configuração contida em tester.conf).--to para testar diferentes configurações de filtro.--auto-delay para limitação automática do envio de e-mails. Isso pode ser ajustado com --delay-step, --delay-max e --delay.--spam-folder e --malware-folder. As amostras não estão incluídas neste repositório (e não serão). Bons lugares para obter malware são theZoo, Das Malwerk ou outras coleções. Spam pode ser exportado diretamente da sua pasta de Spam, mas deve estar no formato EML.--blacklist e são usadas como endereços de remetente.--evasion content-disposition. Estes foram usados no passado para confundir soluções de AV/sandbox e permitir a passagem de e-mails maliciosos.--log. Provedores de filtragem de e-mail frequentemente rejeitam e-mails no diálogo SMTP, o que é refletido no log gerado.--output como arquivos simples em um diretório, no formato MBox (--mbox) ou MailDir (--maildir). Isso é útil para testar clientes de e-mail sem enviar nenhum e-mail, para documentar ou revisar os casos de teste gerados.Testes próprios podem ser implementados com uma classe em um dos arquivos Python existentes ou recém-criados no diretório tests/. A classe deve ser uma subclasse de MailTestBase localizada no módulo tests.base deste projeto. Testes recém-implementados são descobertos automaticamente quando a variável de classe active está definida como True. Além disso (se você planeja contribuir com testes de volta ao repositório principal), as variáveis de classe identifier, name e description devem ser definidas adequadamente.
Existem as seguintes classes base com métodos ou variáveis de classe destinadas à sobrescrita:
MailTestBase: Classe de teste para testes genéricos.
generateTestCases(): Gera mensagens de teste. Estas devem ser geradas com as classes MIME* dos pacotes email.mime.* do Python ou com a classe Message de email.message para garantir mensagens de e-mail válidas.active: Valor booleano indicando se o teste deve estar ativo.identifier: Identificador curto do teste. Este é usado para ativar ou desativar testes nos parâmetros.name: Título curto do teste.description: Descrição mais longa do teste, deve caber em aproximadamente 100 caracteres.delivery_sender e delivery_recipient: Valores booleanos, False por padrão. Normalmente, o remetente e os destinatários são definidos na mensagem e o módulo SMTP do Python os assume de lá. Às vezes é desejável defini-los explicitamente na biblioteca SMTP, o que pode ser configurado definindo esses valores como .Definir os assuntos das mensagens geradas é altamente recomendado para poder reconhecer os testes na caixa de entrada receptora.
Classes de evasão implementam técnicas para evitar o reconhecimento de propriedades específicas de e-mail por soluções de segurança de e-mail. Atualmente, uma técnica de evasão que tenta ocultar anexos dessas soluções por meio de cabeçalhos Content-Disposition intencionalmente quebrados é implementada.
Evasões são implementadas por um padrão de classe de fábrica. A classe DeliveryBase instancia uma classe de fábrica derivada da classe BaseEvasionFactory. O construtor da fábrica recebe uma flag que indica se a evasão está ativada. A instância da fábrica de evasão é então passada para a classe de teste e armazenada em seu atributo evasions, que contém um dicionário com os identificadores de evasão como chaves. Dentro do teste, uma classe de evasão (baseada em EvasionBase) é instanciada com getEvasionGenerator(). Os parâmetros do construtor são definidos individualmente por técnica de evasão.
As seguintes classes base são usadas para implementar evasões:
BaseEvasionFactory: As fábricas de evasão devem ser baseadas nesta classe. Normalmente, apenas as seguintes variáveis de classe devem ser definidas:
active: Definido como True se a evasão deve estar ativa.identifier: Identificador curto do módulo de evasão usado para ativá-lo na configuração de teste.name: Título curto da técnica de evasão.description: Descrição mais longa da técnica de evasão. Deve caber em aproximadamente 100 caracteres.generator_evasion: Classe de evasão que é instanciada se a evasão está ativada.generator_default: Classe de evasão que é instanciada se a evasão está desativada.BaseEvasion: A implementação de evasões deve ser uma subclasse desta classe base. O seguinte método deve ser sobrescrito:
__init__(): Deve instanciar a classe com a mensagem ou anexo base que deve ser manipulado com técnicas de evasão.generate(): Aplica a técnica de evasão ao objeto passado ao construtor e o produz para o chamador como uma tupla (descrição, objeto com evasão aplicada).Geralmente, a classe de evasão deve produzir todas as variantes de evasão e passar o padrão como um caso de teste dedicado, enquanto as classes de evasão padrão apenas passam o objeto fornecido ou criam as estruturas de dados necessárias, como cabeçalhos.
Técnicas de evasão são usadas em casos de teste onde são aplicáveis. Por exemplo, se uma técnica de evasão manipula o cabeçalho de um e-mail ou anexo, os seguintes passos devem ser implementados:
self.evasions, por exemplo:
evasion_items = self.evasions["evasion_identifier"].getEvasionGenerator(message)for evasion_item in evasion_items:
yield evasion_item
A técnica de evasão de disposição de conteúdo já está implementada no framework e deve ser usada para todos os casos de teste que visam o reconhecimento de anexos maliciosos. O construtor recebe um anexo e o nome de arquivo pretendido. A classe de evasão então produz tuplas (nome da evasão, anexo com técnica de evasão aplicada) que podem ser diretamente produzidas pelo método generateAttachments() dos testes.
finalizeMessage(msg): Por padrão, a classe base de teste define os cabeçalhos From e To de acordo. Esse comportamento pode ser sobrescrito se necessário para o caso de teste.MailAttachmentTestBase: Classe de teste para casos de teste de anexos. Gera um e-mail válido completo com um assunto e uma parte de texto e anexa o caso de teste a ele. Derivada de MailTestBase, portanto os métodos/variáveis dela podem ser sobrescritos aqui também.
generateAttachments(): Gera casos de teste como tuplas (descrição, anexo).subject: Define o assunto. O espaço reservado {} é substituído pela descrição gerada por generateAttachments().generateTestCases(): já está sobrescrito com uma implementação da geração de mensagens descrita acima, mas pode ser adaptado ainda mais, se necessário.