Aller au contenu principal

Laboratoire 2

Annoncé

Introduction

Ce projet vise à vous faire explorer des fonctionnalités avancées du DNS qui ne sont pas couvertes en classe.

Remise

La remise doit être faite sur la plateforme Brio. Vous aurez à remettre:

  1. Un rapport avec les explications de vos démarches.
  2. Un programme Python
  3. Une capture d'une session sur la ligne de commande en format .txt.

Pondération

Ce travail pratique vaut pour 6% de la notre globale de la session. La grille d'évaluation détaillée est fournie dans le canal Général du Teams du cours.

Résolution itérative d'un nom de domaine

Cet exercice vise à vous faire résoudre un nom de domaine en effectuant le processus de résolution itératif manuellement plutôt que de laisser votre serveur DNS local effectuer les requêtes.

L'objectif est de résoudre le nom de domaine www.monportail.ulaval.ca.

remarque

Pour cet exercice, vous devez remettre la session sur la ligne de commande où vous avez appelé la commande dig ou nslookup. Pour remettre cette session, vous pouvez simplement copier le contenu dans un fichier format txt et le soumettre sur Brio.

Obtention des serveurs DNS Racine

Démarrez une capture Wireshark et filtrez les résultats de la capture afin de n'obtenir que les paquets liés au DNS.

Pour débuter la résolution itérative, utilisez la commande dig ou nslookup afin d'obtenir la liste des serveurs DNS Racine.

Dans votre capture Wireshark, identifiez les paquets correspondant à la question ainsi qu'à la réponse DNS.

Utilisez la capture Wireshark afin de répondre aux questions suivantes:

  1. À qui était destinée la question?
  2. Qui a répondu à la question?
  3. La réponse était-elle autoritaire?

Auriez-vous pu obtenir la réponse à ces questions directement par le résultat de la commande dig ou nslookup?

Reste de la résolution

Choisissez un serveur DNS Racine parmi la liste retournée à la question précédente. Utilisez ce serveur pour démarrer la résolution itérative.

Lorsque vous obtenez finalement l'adresse IP du serveur, répondez aux questions suivantes:

  1. Qui a répondu à votre requête de type A ou AAAA?
  2. La réponse contenait-elle d'autres éléments de réponse? Si oui, lesquels?

Connexion au site web via l'adresse IP

Utilisez l'adresse IP retournée à la question précédente pour accéder au site web www.monportail.ulaval.ca. Vous devriez obtenir une erreur similaire à la suivante.

Erreur de connexion non privée.

Expliquez pourquoi cette erreur survient lorsque vous utilisez l'adresse IP d'un serveur web plutôt que son nom de domaine pour accéder à une page web via votre fureteur.

Exploration du load-balancing par DNS en Python

Certains serveurs utilisent le DNS à des fins de balanceur de charge. L'idée est de diriger différents utilisateurs vers différents serveurs en ne retournant pas toujours les mêmes adresses IP associée à un nom de domaine.

Dans cet exercice, vous devez vérifier si le serveur DNS de cloudflare.com utilise le DNS pour séparer les requêtes des clients sur plusieurs serveurs.

Cette validation sera faite à l'aide de Python et de la librairie dnspython. Installez la librairie dnspython puis complétez le script suivant:

"""
Ce script utilise la bibliothèque dnspython pour interroger les enregistrements DNS d'un domaine cible (par défaut "cloudflare.com").
"""

import dns.resolver
import time
from collections import Counter

def get_dns_ips_with_ttl(domain):
""" Résout les enregistrements A pour un domaine donné et retourne les adresses IP ainsi que le TTL associé.
"""
adresses_ip = []
time_to_live = 0

retries = 3

while time_to_live == 0 and retries > 0:

# COMPLÉTER ICI!

# Tenter de résoudre les enregistrements A du domaine et récupérer le TTL.

# Attention de gérer le cas où le TTL est à zéro! Sans quoi le script exécutera cette fonction en boucle sans
# attendre la prochaine réponse du serveur DNS.

retries -= 1

# On gère le cas où le TTL est à zéro après plusieurs tentatives, en utilisant un TTL par défaut.
# Ça ne devrait jamais arriver.
if time_to_live == 0:
print(f"[!] TTL est toujours à zéro après plusieurs tentatives. Utilisation d'un TTL par défaut de 5 secondes.")
time_to_live = 5

return adresses_ip, time_to_live

def main():
domaine_cible = "cloudflare.com"
iterations = 5

# Compteur incrémenté chaque fois qu'une adresse IP apparaît en première position dans la liste des adresses
# IP retournées par le serveur DNS.
top_ip_tracker = Counter()

print(f"[*] Démarrage du détecteur de load balancing pour le domaine: {domaine_cible}")
print(f"[*] Exécution de {iterations} itérations")

for i in range(iterations):
adresses_ip, time_to_live = get_dns_ips_with_ttl(domaine_cible)

if adresses_ip:
ip_primaire = adresses_ip[0]

top_ip_tracker[ip_primaire] += 1

print(f"Iteration {i+1:02d} | TTL: {time_to_live}s | Top IP: {ip_primaire:<15} | Toutes les IPs: {adresses_ip}")

if i < iterations - 1:
print(f"[*] Attente {time_to_live} secondes avant la prochaine itération...\n")
time.sleep(time_to_live)
else:
print(f"Iteration {i+1:02d} | Aucune adresse IP trouvée. Essai a nouveau dans 5 secondes.")
if i < iterations - 1:
time.sleep(5)

print("\n--- Investigation Complete ---")
print("Occurence de chaque adresse IP en première position:")

for adresse_ip, count in top_ip_tracker.items():
print(f" - {adresse_ip}: {count} occurences")

if __name__ == "__main__":
main()

Exécutez le script afin d'obtenir un rapport des records A retournés par plusieurs tentatives de requête pour le domaine cloudflare.com.

Est-ce que les réponses de type A retournés par le serveur DNS de cloudflare.com sont toujours les mêmes? Sont-elles toujours dans le même ordre?

Soumettez votre script Python complété sur Brio avec votre rapport.

DNS over HTTPS

remarque

La réalisation de cet exercice nécessite l'utilisation du fureteur Google Chrome.

Vous avez peut-être déjà remarqué que vos requêtes web effectuées à partir de fureteurs comme Google Chrome ne semblent pas générer de requêtes DNS par le processus exploré ci-haut.

Cet exercice explore comment les fureteurs modernes font une résolution de nom sans passer par le résolveur du système d'exploitation.

Configurez Chrome pour utiliser l'option Use Secure DNS et utilisez le résolveur DNS de Google.

Naviguez ensuite vers la configuration DNS de votre fureteur, puis utilisez l'option Clear DNS cache afin de vider la cache DNS de votre fureteur.

Démarrez par la suite une capture Wireshark sur votre poste, puis naviguez vers le site web youtube.com.

Une fois connecté sur le site web youtube.com, arrêtez la capture Wireshark. Avez-vous vu passer des requêtes DNS pour le domaine youtube.com sur la capture? Pourquoi?