Utilisation de curl pour obtenir les résultats DNS

Présentation de deux méthodes pour utiliser la commande curl afin d’obtenir les résultats des requêtes DNS.

Cet article présente deux méthodes pour utiliser la commande curl afin d’obtenir les résultats des requêtes DNS :

  1. Format DNS JSON
  2. Format DNS Wire Format

1. Requête au format DNS JSON

Retourne une réponse DNS au format JSON, facile à analyser.

Google

curl -H 'accept: application/dns-json' "https://dns.google/resolve?name=baidu.com&type=A" | jq .

Cloudflare

curl -H 'accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=baidu.com&type=A' | jq .

Aliyun

curl -H "accept: application/dns-json" "https://223.5.5.5/resolve?name=baidu.com&type=1" | jq .

dns.pub

curl -H 'accept: application/dns-json' 'https://doh.dns.pub/dns-query?name=baidu.com&type=A' | jq .

AdGuard Private DNS

# Non pris en charge pour le moment

2. Requête au format DNS Wire Format

Retourne une réponse DNS au format binaire, nécessitant une analyse ultérieure.

Google

curl -H 'accept: application/dns-message' 'https://dns.google/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

Cloudflare

curl -H 'accept: application/dns-message' 'https://cloudflare-dns.com/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

Aliyun

curl -H 'accept: application/dns-message' "https://dns.alidns.com/dns-query?dns=P8QBAAABAAAAAAAABWJhaWR1A2NvbQAAAQAB"  | hexdump -c

dns.pub

curl -H 'accept: application/dns-message' 'https://doh.dns.pub/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

AdGuard Private DNS

curl -H 'accept: application/dns-message' 'https://public0.adguardprivate.com/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

Analyser la réponse DNS avec Python

# pip install dnspython
# pip install requests
# Analyser la réponse au format JSON
import json
import requests

def query_dns_json(domain="example.com", type="A"):
  """Utiliser le format JSON pour interroger DNS"""
  url = "https://dns.google/resolve"
  params = {"name": domain, "type": type}
  headers = {"accept": "application/dns-json"}

  response = requests.get(url, params=params, headers=headers)
  return json.dumps(response.json(), indent=2)

# Analyser la réponse au format Wire Format
def query_dns_wire(domain="example.com"):
  """Utiliser le format Wire Format pour interroger DNS"""
  import dns.message
  import requests
  import base64

  # Créer un message de requête DNS
  query = dns.message.make_query(domain, 'A')
  wire_format = query.to_wire()
  dns_query = base64.b64encode(wire_format).decode('utf-8')

  # Envoyer la requête
  url = "https://dns.google/dns-query"
  params = {"dns": dns_query}
  headers = {"accept": "application/dns-message"}

  response = requests.get(url, params=params, headers=headers)
  dns_response = dns.message.from_wire(response.content)
  return str(dns_response)

if __name__ == "__main__":
  print("Résultat de la requête au format JSON:")
  print(query_dns_json())
  print("\nRésultat de la requête au format Wire Format:")
  print(query_dns_wire())

Générer les données encodées en Base64 au format DNS Wire Format

# pip install dnspython
import base64
import dns.message
import dns.rdatatype

# Créer un message de requête DNS
query = dns.message.make_query('example.com', dns.rdatatype.A)

# Convertir le message en format Wire Format
wire_format = query.to_wire()

# Convertir en base64
wire_format_base64 = base64.b64encode(wire_format).decode('utf-8')

# Afficher
print(wire_format_base64)