Last active
August 8, 2024 11:47
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
=========================================================================================================== | |
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