Skip to content

Instantly share code, notes, and snippets.

@felipeandradebezerra
Last active August 8, 2024 11:47
Show Gist options
  • Save felipeandradebezerra/3a6412f31bd34aff8f4c5d2bbde534bb to your computer and use it in GitHub Desktop.
Save felipeandradebezerra/3a6412f31bd34aff8f4c5d2bbde534bb to your computer and use it in GitHub Desktop.
Parse nos relatórios dmarc para validação de possíveis ataques spoofing ou phishing
"""
===========================================================================================================
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.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment