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 matplotlib ou graphviz para 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)