---
name: dns_records
kind: function
lang: py
domain: cybersecurity
version: "1.0.0"
purity: impure
signature: "def dns_records(dominio: str, types: list | None = None) -> dict"
description: "Recoleccion OSINT pasiva de registros DNS de un dominio ejecutando `dig +short <tipo> <dominio>` por subprocess para cada tipo (default A, AAAA, MX, TXT, NS, CNAME). Parsea la salida (una linea por valor) y devuelve un dict {tipo: [valores]}. Pasivo: solo consulta DNS publico."
tags: [osint-passive, dns, recon, cybersecurity, dig]
params:
  - name: dominio
    desc: "Dominio a resolver, ej. organic-machine.com. Vacio lanza RuntimeError."
  - name: types
    desc: "Lista de tipos de registro DNS (ej. ['A','MX']). None usa los 6 defaults: A, AAAA, MX, TXT, NS, CNAME."
output: "dict {tipo: [valores]} con una clave por tipo consultado; cada valor es la lista de lineas devueltas por `dig +short` para ese tipo (lista vacia si no hay registro o el dominio no existe)."
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
tested: true
tests: ["test_parsea_salida_de_dig", "test_dominio_inexistente_listas_vacias", "test_usa_tipos_default", "test_timeout_devuelve_lista_vacia", "test_dominio_vacio_lanza_error"]
test_file_path: "python/functions/cybersecurity/dns_records_test.py"
file_path: "python/functions/cybersecurity/dns_records.py"
---

## Ejemplo

```python
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from cybersecurity import dns_records

# Resolver todos los tipos por defecto
records = dns_records("organic-machine.com")
print(records["A"])    # ['135.125.201.30']
print(records["MX"])   # ['10 mail.organic-machine.com.', ...]

# Solo los tipos que interesan
solo_a_mx = dns_records("organic-machine.com", types=["A", "MX"])
```

## Cuando usarla

Usala al iniciar el reconocimiento pasivo de un dominio para mapear su
infraestructura DNS publica (IPs, servidores de correo, nameservers, TXT con
SPF/DKIM/verificaciones). Es el primer paso barato antes de enumerar
subdominios o consultar RDAP.

## Gotchas

- Requiere el binario `dig` en PATH (paquete `dnsutils`/`bind-utils`). Si falta, lanza `RuntimeError`.
- Cada consulta tiene timeout de 10s; si una expira, esa clave queda como lista vacia y el resto continua.
- La salida es la de `dig +short` cruda: los MX incluyen prioridad ("10 mail..."), los nombres pueden venir con punto final (FQDN), y los TXT entre comillas. No se normaliza para mantener fidelidad.
- Un dominio inexistente o sin un registro concreto devuelve lista vacia (no error): distingue "sin datos" mirando las listas vacias.
- Resuelve contra el resolver configurado en el sistema; resultados pueden variar segun el DNS recursivo usado.
