Mapeia registros DNS (A, MX, TXT) para entender a infraestrutura.
Contexto
O DNS (Domain Name System) é a lista telefônica da internet. Para um pentester, mapear os registros DNS é como obter a planta baixa de um edifício antes de entrar.
- Registro A (Address): Aponta para o endereço IP do servidor. Crucial para saber onde o site está hospedado.
- Registro MX (Mail Exchange): Identifica os servidores de e-mail. Revela se a empresa usa Google Workspace, Outlook ou servidores próprios (muitas vezes menos protegidos).
- Registro TXT: Frequentemente contém chaves de verificação de serviços e configurações de segurança como SPF e DKIM. Se estiverem mal configurados, permitem ataques de E-mail Spoofing.
Possibilidades de Implementação
- Enumeração Básica: Listar os registros padrão.
- Zone Transfer (AXFR): Tentar uma "Transferência de Zona", uma falha de configuração antiga que permite baixar todos os registros DNS de uma só vez.
- Visualização Gráfica: Usar bibliotecas como
matplotlibougraphvizpara gerar um mapa visual das conexões entre domínios e IPs.
Código
Para esta lição, utilizaremos a biblioteca dnspython, que é a ferramenta de elite para manipulação de registros DNS em Python.
Requisito: pip install dnspython
import dns.resolver
def dns_visualizer(domain):
print(f"{'='*60}")
print(f" 30 LESSONS IN PYTHON FOR PENTEST - LIÇÃO 03")
print(f" FERRAMENTA: DNS VISUALIZER")
print(f"{'='*60}")
print(f"[*] Alvo: {domain}\n")
# Lista de tipos de registros que queremos mapear
record_types = ['A', 'MX', 'NS', 'TXT', 'AAAA']
for record in record_types:
try:
# Realiza a consulta para o tipo específico
answers = dns.resolver.resolve(domain, record)
print(f"[+] Registro {record}:")
for rdata in answers:
# O processamento varia conforme o tipo (MX tem prioridade, A tem IP)
if record == 'MX':
print(f" -> Servidor de Mail: {rdata.exchange} (Prioridade: {rdata.preference})")
elif record == 'A':
print(f" -> Endereço IPv4: {rdata.address}")
else:
print(f" -> Dado: {rdata}")
print("-" * 30)
except dns.resolver.NoAnswer:
print(f"[-] Registro {record}: Não encontrado.")
except dns.resolver.NXDOMAIN:
print(f"[!] Erro: O domínio {domain} não existe.")
return
except Exception as e:
print(f"[!] Erro ao consultar {record}: {e}")
if __name__ == "__main__":
# Alvo da lição
alvo = "google.com"
dns_visualizer(alvo)