Hacking con Python 3: Capitulo 13 — DNS y direcciones IP

Vay3t
6 min readAug 4, 2023

--

Como interactuar con direcciones IP y nombres de dominio en Python

Que es un servidor DNS?

Un servidor DNS (Sistema de Nombres de Dominio) es un sistema que traduce nombres de dominio legibles por humanos en direcciones IP numéricas utilizadas por las computadoras para comunicarse en Internet. Facilita la navegación al convertir nombres de dominio fáciles de recordar en direcciones IP que las máquinas pueden entender y procesar.

Registros DNS

Los registros DNS son entradas en una base de datos DNS que proporcionan información sobre un dominio, como la dirección IP asociada, servidores de correo electrónico, subdominios y otros datos. Estos registros facilitan la navegación y comunicación en Internet al dirigir las solicitudes a los recursos adecuados.

Ejemplos

user@vay3t:~$ host -t A vay3t.org
vay3t.org has address 185.199.109.153
vay3t.org has address 185.199.110.153
vay3t.org has address 185.199.108.153
vay3t.org has address 185.199.111.153

user@vay3t:~$ host -t AAAA cloudflare.com
cloudflare.com has IPv6 address 2606:4700::6810:85e5
cloudflare.com has IPv6 address 2606:4700::6810:84e5

user@vay3t:~$ host -t PTR 1.1.1.1
1.1.1.1.in-addr.arpa domain name pointer one.one.one.one.

user@vay3t:~$ host -t NS megacorpone.com
megacorpone.com name server ns1.megacorpone.com.
megacorpone.com name server ns3.megacorpone.com.
megacorpone.com name server ns2.megacorpone.com.
ns1.megacorpone.com has address 51.79.37.18
ns2.megacorpone.com has address 51.222.39.63
ns3.megacorpone.com has address 66.70.207.180

user@vay3t:~$ host -t MX mitm.cl
mitm.cl mail is handled by 5 alt1.aspmx.l.google.com.
mitm.cl mail is handled by 1 aspmx.l.google.com.
mitm.cl mail is handled by 5 alt2.aspmx.l.google.com.
mitm.cl mail is handled by 10 aspmx3.googlemail.com.
mitm.cl mail is handled by 10 aspmx2.googlemail.com.

user@vay3t:~$ host -t SOA example.com
example.com has SOA record ns.icann.org. noc.dns.icann.org. 2022091266 7200 3600 1209600 3600

user@vay3t:~$ host -t CNAME blog.vay3t.org
blog.vay3t.org is an alias for adoring-goldberg-1338be.netlify.app.

user@vay3t:~$ host -t TXT microsoft.com
microsoft.com descriptive text "docusign=d5a3737c-c23c-4bd0-9095-d2ff621f2840"
microsoft.com descriptive text "d365mktkey=QDa792dLCZhvaAOOCe2Hz6WTzmTssOp1snABhxWibhMx"
microsoft.com descriptive text "d365mktkey=SxDf1EZxLvMwx6eEZUxzjFFgHoapF8DvtWEUjwq7ZTwx"
microsoft.com descriptive text "d365mktkey=j2qHWq9BHdaa3ZXZH8x64daJZxEWsFa0dxDeilxDoYYx"
microsoft.com descriptive text "facebook-domain-verification=fwzwhbbzwmg5fzgotc2go51olc3566"
microsoft.com descriptive text "google-site-verification=GfDnTUdATPsK1230J0mXbfsYw-3A9BVMVaKSd4DcKgI"
microsoft.com descriptive text "google-site-verification=M--CVfn_YwsV-2FGbCp_HFaEj23BmT0cTF4l8hXgpvM"
microsoft.com descriptive text "google-site-verification=pjPOauSPcrfXOZS9jnPPa5axowcHGCDAl1_86dCqFpk"
microsoft.com descriptive text "google-site-verification=uFg3wr5PWsK8lV029RoXXBBUW0_E6qf1WEWVHhetkOY"
microsoft.com descriptive text "hubspot-developer-verification=OTQ5NGIwYWEtODNmZi00YWE1LTkyNmQtNDhjMDMxY2JjNDAx"
microsoft.com descriptive text "8RPDXjBzBS9tu7Pbysu7qCACrwXPoDV8ZtLfthTnC4y9VJFLd84it5sQlEITgSLJ4KOIA8pBZxmyvPujuUvhOg=="
microsoft.com descriptive text "v=spf1 include:_spf-a.microsoft.com include:_spf-b.microsoft.com include:_spf-c.microsoft.com include:_spf-ssg-a.msft.net include:spf-a.hotmail.com include:_spf1-meo.microsoft.com -all"
microsoft.com descriptive text "fg2t0gov9424p2tdcuo94goe9j"
microsoft.com descriptive text "t7sebee51jrj7vm932k531hipa"
microsoft.com descriptive text "d365mktkey=3uc1cf82cpv750lzk70v9bvf2"
microsoft.com descriptive text "d365mktkey=6358r1b7e13hox60tl1uagv14"

Transferencia de Zona

Las transferencias de zona DNS, también conocidas como AXFR (por el tipo de solicitud), son un método utilizado para copiar y mantener actualizada la información de un dominio entre varios servidores DNS. Esto permite que los administradores compartan y sincronicen los datos de un dominio, incluidos todos sus subdominios, a lo largo de diferentes servidores, mejorando la eficiencia y la disponibilidad del sistema.

Ataque AXFR

Un ataque de transferencia de zona es un tipo de amenaza de seguridad en la que un atacante intenta obtener una copia no autorizada de la base de datos DNS de un dominio a través de una transferencia de zona.

user@vay3t:~$ host -l megacorpone.com ns2.megacorpone.com
Using domain server:
Name: ns2.megacorpone.com
Address: 51.222.39.63#53
Aliases:

megacorpone.com name server ns1.megacorpone.com.
megacorpone.com name server ns2.megacorpone.com.
megacorpone.com name server ns3.megacorpone.com.
admin.megacorpone.com has address 51.222.169.208
beta.megacorpone.com has address 51.222.169.209
fs1.megacorpone.com has address 51.222.169.210
intranet.megacorpone.com has address 51.222.169.211
mail.megacorpone.com has address 51.222.169.212
mail2.megacorpone.com has address 51.222.169.213
ns1.megacorpone.com has address 51.79.37.18
ns2.megacorpone.com has address 51.222.39.63
ns3.megacorpone.com has address 66.70.207.180
router.megacorpone.com has address 51.222.169.214
siem.megacorpone.com has address 51.222.169.215
snmp.megacorpone.com has address 51.222.169.216
support.megacorpone.com has address 51.222.169.218
syslog.megacorpone.com has address 51.222.169.217
test.megacorpone.com has address 51.222.169.219
vpn.megacorpone.com has address 51.222.169.220
www.megacorpone.com has address 149.56.244.87
www2.megacorpone.com has address 149.56.244.87

Se puede automatizar este proceso con Bash en caso de necesitar una solución rápida y efectiva:

#!/bin/bash

if [ $# -ne 1 ];then
echo "[*] Usage: bash $0 <target>"
exit 1
else
for dom in $(host -t ns $1 | awk '{print $4}'); do
echo "========================="
#echo $dom
host -l $1 $dom
if [ $? -eq 0 ]; then
break
fi
done
fi

Modulo dnspython

dnspython es una biblioteca de Python diseñada para facilitar el trabajo con DNS en programas y aplicaciones escritos en Python. Este módulo permite a los desarrolladores realizar consultas DNS, analizar registros DNS, y gestionar operaciones relacionadas con DNS de manera sencilla y eficiente, sin tener que lidiar con los detalles técnicos de la implementación del protocolo DNS.

Este modulo no viene en la biblioteca estándar de Python por lo cual debe ser instalada con pip3

sudo pip3 install dnspython

Ejemplos

Queries sencillas

import dns.resolver

name = "example.com"

for qtype in ["A", "AAAA", "MX", "NS", "TXT", "SOA"]:
answer = dns.resolver.resolve(name, qtype, raise_on_no_answer=False)
if answer.rrset is not None:
print(answer.rrset)

Output

example.com. 300 IN A 93.184.216.34
example.com. 300 IN AAAA 2606:2800:220:1:248:1893:25c8:1946
example.com. 300 IN MX 0 .
example.com. 300 IN NS b.iana-servers.net.
example.com. 300 IN NS a.iana-servers.net.
example.com. 300 IN TXT "v=spf1 -all"
example.com. 300 IN TXT "wgyf8z8cgvm2qmxpnbnldrcltvk4xqfn"
example.com. 300 IN SOA ns.icann.org. noc.dns.icann.org. 2022091266 7200 3600 1209600 3600

Ataque AXFR — Compatible con Python2 y Python3

En ocaciones es útil buscar scripts en fuentes abiertas como servidores Git como GitHub y GitLab o sitios de pastes, por ejemplo, Pastebin.

https://gist.github.com/Will-Beninger/53d45969e582dc9ce7022d4db4db1d90

Conocer el proveedor de correos de un dominio

# Creado por openai

import dns.resolver


def get_mail_provider(domain):
try:
# Realizar una consulta DNS para obtener los registros MX del dominio
mx_records = dns.resolver.query(domain, "MX")

# Obtener el valor del registro MX de mayor prioridad (menor valor)
mx_record = str(mx_records[0].exchange)

# Extraer el dominio del valor del registro MX
# mail_provider = mx_record.split(".")[-3]

return mx_record
except dns.resolver.NXDOMAIN:
return f"El dominio '{domain}' no existe."
except dns.resolver.NoAnswer:
return f"No se encontraron registros MX para el dominio '{domain}'."
except dns.resolver.Timeout:
return (
f"La consulta DNS para el dominio '{domain}' excedió el tiempo de espera."
)


if __name__ == "__main__":
# Ingresa el dominio que deseas auditar
domain_to_audit = "facebook.com"

# Obtener el proveedor de correo asociado al dominio
mail_provider = get_mail_provider(domain_to_audit)

print(f"El proveedor de correo del dominio '{domain_to_audit}' es: {mail_provider}")

Fuerza bruta de subdominios

import dns.resolver
import sys

dom = sys.argv[1]

subdomains = [
"www",
"vpn",
"sql",
"movil",
"pagos",
"postgres",
"zona",
"mysql",
"dns",
"clientes",
"cpanel",
"empresas",
]

for sub in subdomains:
try:
answer = dns.resolver.query("{}.{}".format(sub, dom), "A")
if answer.rrset is not None:
print("{}.{} --> {}".format(sub, dom, answer.rrset))
except dns.resolver.NXDOMAIN:
try:
answer = dns.resolver.query("{}.{}".format(sub, dom), "AAAA")
if answer.rrset is not None:
print("{}.{} --> {}".format(sub, dom, answer.rrset))
except dns.resolver.NXDOMAIN:
continue

Modulo python-whois

WHOIS es un directorio público mediante el cual puede saber «quién es» («who is» en inglés) el propietario de un dominio o dirección IP.

Este modulo no viene en la biblioteca estándar de Python por lo cual debe ser instalada con pip3

sudo pip3 install python-whois

Ejemplos

  • Consultar información básica de WHOIS para un dominio:
import whois

domain = "example.com"
w = whois.whois(domain)
print(w)
  • Extraer información específica del registro WHOIS:
import whois

domain = "example.com"
w = whois.whois(domain)

print(f"Nombre de dominio: {w.domain_name}")
print(f"Fecha de creación: {w.creation_date}")
print(f"Fecha de vencimiento: {w.expiration_date}")
print(f"Servidores de nombres: {w.name_servers}")
  • Verificar la disponibilidad de un dominio:
import whois

domain = "example.com"

try:
w = whois.whois(domain)
if w.status is None:
print(f"El dominio {domain} está disponible.")
else:
print(f"El dominio {domain} no está disponible.")
except Exception as e:
print(f"Error al consultar el dominio {domain}: {e}")
  • Consultar información de WHOIS para múltiples dominios:
import whois

domains = ["example1.com", "example2.com", "example3.com"]

for domain in domains:
print(f"Consultando información de WHOIS para {domain}:")
w = whois.whois(domain)
print(w)
print("\n" + "=" * 80 + "\n")

Bonus Track — IP Geolocation

En este script realiza una solicitud a un servidor HTTP cuya función es regresar información geografía de una IP. En otra entrada se tocará el tópico de interacción con sitios web.

Nota: El sitio web usado es algo inestable por lo cual es necesario ejecutar nuevamente el script.

import json
import sys
import urllib.request

ip_address = sys.argv[1]

request_url = "https://geolocation-db.com/jsonp/" + ip_address

try:
with urllib.request.urlopen(request_url) as response:
if response.getcode() == 200:
result = response.read().decode()
result = result.split("(")[1].strip(")")
result = json.loads(result)
print(result)
else:
print("[-] Error while getting IP location, try again.")
except Exception as e:
print("[-] Error:", e)
exit()

--

--

Vay3t
Vay3t

No responses yet