""" =========================================================================================================== Script: dmarc_check.py Autor: Felipe Andrade Versão: 1.0 Descrição: Esse script faz o parse nos relatórios dmarc para validação de possíveis ataques spoofing ou phishing. =========================================================================================================== DKIM é um mecanismo de autenticação de emails que permite ao destinatário verificar se uma mensagem de email foi realmente enviada e autorizada pelo domínio indicado. 1. O que significa falha no DKIM? 1.1 Assinatura digital não corresponde ao conteúdo do email. Pode indicar que um email foi modificado após assinatura; 1.2 Servidor de email destinatário não consegue validar a assinatura usando a chave pública do domínio. Pode indicar que um email foi enviado por um servidor não autorizado ou configuração incorreta do DKIM; 2. O que pode implicar? 2.1 Perda de credibilidade já que são marcados como menos confiáveis e a probabilidade é maior de ir para o SPAM; 2.2 Rejeição automática pelo servidor do email do destinatário; 2.3 Ataques de Spoofing caso um email com falha de DKIM seja aceito, permitindo que o atacante envie emails falsificados; 2.4 Emails que nunca chegam ao destinatário ou são entregues com bastante atraso. =========================================================================================================== - SPF (Simple Policy Framework) é um mecanismo de autenticação de email que permite ao domínio remetente especificar quais servidores de email estão autorizados a enviar emails em seu nome. 1. O que significa falha no SPF? É bem semelhante ao DKIM, somados aos danos à reputação do domínio. =========================================================================================================== """ import xml.etree.ElementTree as ET import os from collections import defaultdict def parse_dmarc_report(xml_file): tree = ET.parse(xml_file) root = tree.getroot() ip_issues = defaultdict(lambda: {'count': 0, 'dkim_fails': 0, 'spf_fails': 0, 'rejected': 0}) for record in root.findall('record'): source_ip = record.find('row/source_ip').text count = int(record.find('row/count').text) dkim_result = record.find('row/policy_evaluated/dkim').text spf_result = record.find('row/policy_evaluated/spf').text disposition = record.find('row/policy_evaluated/disposition').text ip_issues[source_ip]['count'] += count if dkim_result == 'fail': ip_issues[source_ip]['dkim_fails'] += count if spf_result == 'fail': ip_issues[source_ip]['spf_fails'] += count if disposition == 'reject': ip_issues[source_ip]['rejected'] += count return ip_issues def aggregate_results(directory): aggregated_issues = defaultdict(lambda: {'count': 0, 'dkim_fails': 0, 'spf_fails': 0, 'rejected': 0}) for filename in os.listdir(directory): if filename.endswith('.xml'): xml_file = os.path.join(directory, filename) ip_issues = parse_dmarc_report(xml_file) for ip, data in ip_issues.items(): aggregated_issues[ip]['count'] += data['count'] aggregated_issues[ip]['dkim_fails'] += data['dkim_fails'] aggregated_issues[ip]['spf_fails'] += data['spf_fails'] aggregated_issues[ip]['rejected'] += data['rejected'] return aggregated_issues # Substitua pelo caminho da pasta que contém os arquivos XML directory = 'folder/' aggregated_issues = aggregate_results(directory) if aggregated_issues: for ip, data in aggregated_issues.items(): print(f"IP: {ip}") print(f"Total de Emails: {data['count']}") print(f"Falhas DKIM: {data['dkim_fails']}") print(f"Falhas SPF: {data['spf_fails']}") print(f"Mensagens Rejeitadas: {data['rejected']}") print('-' * 40) else: print("Nenhum problema identificado.")