TP – Usurpation de messages et protection du DNS
BTS SIO SISR 2e année – Bloc 3 – S09 – en binôme : un tape, l'autre lit ; on échange les rôles à chaque partie
Note
But. Lire des en-têtes de messages pour détecter une usurpation, écrire les enregistrements SPF, DKIM et DMARC d'un domaine de laboratoire dans un serveur DNS, durcir ce serveur (transfert de zone, version), puis signer la zone avec DNSSEC et constater qu'une modification est détectée.
Durée : 3 h 10. Prérequis : cours S09 lu.
Warning
Domaine de laboratoire uniquement. Tout se fait sur un domaine interne (lab.local) servi par ta machine virtuelle. On ne touche jamais au DNS d'un domaine réel (celui de l'établissement ou d'une entreprise), et on n'envoie aucun message d'usurpation.
Note
Comment ce TP fonctionne. Tu anticipes (« J'anticipe »), tu manipules, tu notes ce que tu constates, puis tu expliques (« Je comprends »).
Binôme : ____________ / ____________
Contraintes
- Une machine virtuelle Debian avec un compte
sudo, instantané avant de commencer ; paquetsbind9etbind9-dnsutils(qui fournitdigetdelv). - Les adresses du TP sont des adresses de documentation (
192.0.2.0/24,203.0.113.0/24) ; les clés DKIM sont fictives.
Partie A – Lire des en-têtes (≈ 40 min)
Quatre messages arrivent chez un salarié de l'entreprise verdier.example. Voici des extraits fictifs de leurs en-têtes (le serveur de réception est mx.verdier.example).
Message 1
Authentication-Results: mx.verdier.example;
spf=pass smtp.mailfrom=client-a.example;
dkim=pass header.d=client-a.example;
dmarc=pass header.from=client-a.example
Received: from mail.client-a.example (mail.client-a.example [192.0.2.60])
by mx.verdier.example ...
Return-Path: <commande@client-a.example>
From: "Commandes" <commande@client-a.example>
Reply-To: commande@client-a.example
Subject: Bon de commande 4471
Message 2
Authentication-Results: mx.verdier.example;
spf=pass smtp.mailfrom=promo-rapide.example;
dkim=none;
dmarc=fail header.from=verdier.example
Received: from srv77.promo-rapide.example (srv77.promo-rapide.example [203.0.113.77])
by mx.verdier.example ...
Return-Path: <bounce@promo-rapide.example>
From: "Direction" <direction@verdier.example>
Reply-To: paiement.urgent@mail-secure.example
Subject: Virement urgent et confidentiel
Message 3 (message transféré par une liste de diffusion de l'association)
Authentication-Results: mx.verdier.example;
spf=fail smtp.mailfrom=partenaire.example;
dkim=pass header.d=partenaire.example;
dmarc=pass header.from=partenaire.example
Received: from relais.association.example (relais.association.example [198.51.100.9])
by mx.verdier.example ...
Return-Path: <contact@partenaire.example>
From: "Partenaire" <contact@partenaire.example>
Subject: Compte rendu de la réunion
Message 4
Authentication-Results: mx.verdier.example;
spf=pass smtp.mailfrom=verdler.example;
dkim=pass header.d=verdler.example;
dmarc=pass header.from=verdler.example
Received: from mail.verdler.example (mail.verdler.example [203.0.113.200])
by mx.verdier.example ...
Return-Path: <comptabilite@verdler.example>
From: "Comptabilité" <comptabilite@verdler.example>
Subject: Changement de RIB du fournisseur
A1 – Analyse
J'anticipe. Dans quels messages, selon toi, y a-t-il une tentative de tromperie ? ______________________
| Message | Résultat SPF | DKIM | DMARC | Verdict (légitime ? usurpation ? autre ?) | Indices |
|---|---|---|---|---|---|
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 |
Éléments de réponse
1 : légitime (tout passe, tout est aligné sur le même domaine). 2 : usurpation. SPF « passe » mais pour le domaine de l'expéditeur réel (promo-rapide.example), qui n'est pas celui du From: : pas d'alignement, DMARC échoue, pas de DKIM, Reply-To vers une autre adresse. 3 : légitime malgré un SPF en échec : le relais de la liste n'est pas dans le SPF du partenaire, mais DKIM passe et est aligné : DMARC passe. 4 : tout passe, mais le domaine est un domaine proche (verdler avec un « l » à la place du « i ») : hameçonnage par domaine ressemblant ; la demande de changement de RIB est un classique de la fraude.
A2 – Ce que ça change
Je comprends. Pourquoi le message 4 réussit-il SPF, DKIM et DMARC ? Quelle protection manque à l'entreprise pour s'en prémunir ? ______________________
Partie B – Écrire les enregistrements dans un serveur DNS (≈ 50 min)
B1 – Installer BIND et déclarer une zone
Crée la zone (le fichier qui décrit le domaine) : sudo nano /etc/bind/db.lab.local
$TTL 300
@ IN SOA ns1.lab.local. admin.lab.local. ( 2026101901 3600 600 86400 300 )
IN NS ns1.lab.local.
IN MX 10 mail.lab.local.
IN TXT "v=spf1 ip4:192.0.2.25 -all"
ns1 IN A 127.0.0.1
mail IN A 192.0.2.25
www IN A 192.0.2.80
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@lab.local"
sel1._domainkey IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlabkeyfictive"
Puis déclare-la dans /etc/bind/named.conf.local (ajoute à la fin) :
Vérifie, puis recharge :
sudo named-checkzone lab.local /etc/bind/db.lab.local
sudo named-checkconf && echo "configuration valide"
sudo systemctl restart bind9
Je comprends. named-checkzone et named-checkconf testent sans appliquer : une zone invalide mal rechargée peut rendre le domaine injoignable. Relis la zone : quel enregistrement donne le serveur de messagerie ? la liste des expéditeurs autorisés ? la politique en cas d'échec ? ______________________
B2 – Interroger
dig @127.0.0.1 lab.local MX +short
dig @127.0.0.1 lab.local TXT +short
dig @127.0.0.1 _dmarc.lab.local TXT +short
dig @127.0.0.1 sel1._domainkey.lab.local TXT +short
Note les résultats : ______________________
J'anticipe. Un message envoyé depuis 192.0.2.99 avec une enveloppe @lab.local : passe-t-il SPF ? ______________________ (réponse en partie C).
Partie C – SPF et DMARC : raisonner (≈ 25 min)
C1 – SPF
Avec l'enregistrement v=spf1 ip4:192.0.2.25 -all, donne le résultat SPF de chaque envoi (le domaine de l'enveloppe est lab.local) :
| Envoi depuis | Résultat SPF (pass, fail) | Pourquoi |
|---|---|---|
192.0.2.25 (le serveur de l'entreprise) |
||
192.0.2.99 (une autre machine) |
||
| Un outil d'envoi de newsletters hébergé chez un prestataire, non déclaré |
C2 – Faire entrer un prestataire
L'entreprise utilise un prestataire de newsletters qui publie son SPF sous spf.prestataire.example. Réécris l'enregistrement SPF pour l'autoriser (aide : include:), en gardant -all :
C3 – DMARC : une mise en place progressive
Classe dans l'ordre les trois étapes ci-dessous et explique ce qu'on observe et ce qu'on risque à chacune :
| Étape | Politique | On observe… | On risque… |
|---|---|---|---|
| 1 | p=none |
||
| 2 | p=quarantine |
||
| 3 | p=reject |
Partie D – Durcir le serveur DNS (≈ 30 min)
D1 – Le transfert de zone
J'anticipe. Un inconnu peut-il demander toute la zone à ton serveur ? ______________________
Résultat : ______________________
Je comprends. Quelles informations un attaquant récupère-t-il ainsi ? Pourquoi est-ce utile pour préparer une attaque ? ______________________
Interdis les transferts : dans /etc/bind/named.conf.local, ajoute à l'intérieur du bloc de la zone la ligne allow-transfer { none; };, puis :
Résultat (constat) : ______________________
D2 – La version
Note ce que le serveur annonce : ______________________
Dans /etc/bind/named.conf.options, ajoute dans le bloc options { … }; la ligne version "non communiquee";, recharge (sudo rndc reload) et relance la commande : ______________________
Point de contrôle : captures de D1 (avant et après) et D2 (avant et après).
Partie E – DNSSEC : signer, valider, détecter (≈ 40 min)
E1 – Créer les clés et signer la zone
cd /etc/bind
sudo cp db.lab.local db.lab.local.src
sudo dnssec-keygen -a ECDSAP256SHA256 -f KSK -n ZONE lab.local
sudo dnssec-keygen -a ECDSAP256SHA256 -n ZONE lab.local
for k in Klab.local*.key; do echo "\$INCLUDE $k"; done | sudo tee -a db.lab.local.src
sudo dnssec-signzone -N INCREMENT -o lab.local -f db.lab.local.signed db.lab.local.src
Je comprends. Deux clés sont créées : une KSK (signe les clés) et une ZSK (signe la zone). La commande de signature produit le fichier db.lab.local.signed et un fichier dsset-lab.local. qui contient l'enregistrement DS, à publier dans la zone parente : c'est ce qui crée la chaîne de confiance.
E2 – Servir la zone signée
Dans /etc/bind/named.conf.local, remplace db.lab.local par db.lab.local.signed dans la ligne file, puis :
J'anticipe. Que voit-on en plus de l'enregistrement A ? ______________________
Éléments de réponse
Un enregistrement RRSIG : la signature de l'enregistrement A.
E3 – Valider comme le ferait un résolveur
Crée un fichier de confiance à partir de l'enregistrement DS (ici, le domaine de laboratoire n'a pas de parent : c'est toi qui joues la racine de confiance), puis interroge avec delv, un outil qui valide :
cd /etc/bind
awk '{ d=""; for(i=7;i<=NF;i++) d=d $i; printf "trust-anchors {\n \"lab.local.\" static-ds %s %s %s \"%s\";\n};\n", $4,$5,$6,d }' dsset-lab.local. | sudo tee /root/ta.conf
sudo delv @127.0.0.1 -a /root/ta.conf +root=lab.local www.lab.local A
Résultat (cherche la mention fully validated) : ______________________
E4 – Une falsification
Simule un attaquant qui modifie un enregistrement : change l'adresse de www dans le fichier signé, sans re-signer :
sudo sed -i 's/192.0.2.80/192.0.2.66/' /etc/bind/db.lab.local.signed
sudo rndc reload
dig @127.0.0.1 www.lab.local A +short
sudo delv @127.0.0.1 -a /root/ta.conf +root=lab.local www.lab.local A
J'anticipe. Que renvoient dig et delv ? ______________________
Éléments de réponse
dig renvoie la fausse adresse (192.0.2.66) : un client qui ne valide pas ne voit rien. delv refuse : « no valid signature found » / « RRSIG failed to verify ». C'est l'intérêt de DNSSEC : un résolveur qui valide détecte la falsification. La signature de www ne correspond plus aux données.
Remets la bonne adresse (sudo sed -i 's/192.0.2.66/192.0.2.80/' /etc/bind/db.lab.local.signed), recharge, et vérifie que delv redonne fully validated.
Je comprends. Cite deux limites de DNSSEC : ______________________
Point de contrôle : captures de E2, E3 et E4.
Retour en entreprise (si ta situation le permet)
- Observer : quels enregistrements SPF, DKIM et DMARC ton entreprise publie-t-elle ? (consultation par
digou un outil en ligne sur le domaine de l'entreprise, avec accord du tuteur : c'est de la lecture publique.) - Documenter : qui gère le compte du bureau d'enregistrement du nom de domaine ? Quel second facteur ? Quelle date d'expiration ?
Rendu
Compte rendu PDF, nommé RENDU-B3A2-S09-NOM.pdf, contenant l'analyse de la partie A, la zone et les captures des parties B à E, et les réponses aux questions.
Bilan de la séance
| Compétence du référentiel | Ce que j'ai fait dans cette séance | Niveau |
|---|---|---|
| B3.2 – Préserver l'identité numérique de l'organisation | ||
| B3.4 – Garantir la disponibilité, l'intégrité et la confidentialité des services informatiques et des données de l'organisation face à des cyberattaques |
Note
Je sais faire, sans aide :
- Lire des en-têtes et distinguer usurpation, relais légitime et domaine ressemblant ;
- Écrire des enregistrements SPF, DKIM et DMARC ;
- Restreindre le transfert de zone et masquer la version d'un serveur DNS ;
- Signer une zone et prouver la détection d'une falsification ;
- Dire ce que DNSSEC garantit et ce qu'il ne garantit pas.
Ce que je dois reprendre : ______________________