IPv6 дедалі активніше використовується у корпоративних і домашніх мережах, але багато його механізмів залишаються малозрозумілими навіть для досвідчених адміністраторів. Автоматична конфігурація адрес, використання link-local та принципи внутрішньої довіри спрощують розгортання мережі, проте водночас формують нові поверхні ризику. Саме тому IPv6 потребує окремого й уважного аналізу, а не сприйняття як «безпечнішої заміни IPv4».
У першій частині матеріалу розглядаються базові принципи роботи IPv6 у локальному сегменті: як пристрої отримують адреси, чому ICMPv6 відіграє критичну роль і як формується довіра між вузлами без участі адміністратора.
IPv6 ще далеко не повсюдно впроваджується, але більшість сучасних операційних систем мають IPv6 увімкненим за замовчуванням. У корпоративних мережах це часто призводить до прихованих вразливостей: навіть якщо використовується лише IPv4, системи Windows надають перевагу IPv6 за замовчуванням і періодично запитують налаштування IPv6.
Зловмисники можуть використовувати довірчу природу протоколів IPv6 для запуску атак у локальній мережі. Особливо небезпечними є спуфінгові атаки, коли зловмисник видає себе за легітимний вузол мережі або вставляє фальшиві пакети з метою MITM та/або DNS-спуфінгу в локальній мережі.
Кожен мережевий пристрій з увімкненим IPv6 автоматично отримує локальну адресу каналу з fe80::/10діапазону. Ця адреса формується незалежно від наявності DHCPv6 або глобального префікса та є обов’язковою для роботи всіх ключових протоколів нижчого рівня: SLAAC (Stateless Address Autoconfiguration), NDP, RA, RS та інших.
Локальні адреси каналу дійсні лише в межах одного сегмента L2 і не маршрутизуються за його межі. Однак, у межах сегмента, вони є основними ідентифікаторами вузлів у трафіку служби IPv6.
У всіх пакетах ICMPv6, включаючи RA та NA, відправник повинен використовувати лише свою локальну адресу каналу як адресу джерела. Це означає, що:
DHCPv6-сервери, маршрутизатори, клієнти та атакуючі пристрої обмінюються повідомленнями за допомогою
fe80::/10;
Будь-яка машина, що отримує RA або NA, запише локальну адресу каналу як джерело маршруту, шлюзу або DNS-сервера;
Зловмисник, який знає свій fe80::, може підробити RA, підставляючи себе як шлюз або DNS, не знаючи глобального префікса.
Крім того, SLAAC використовує RA-пакети від маршрутизатора, які вказують глобальний префікс IPv6-адреси. Клієнт, який отримує цей RA від джерела з локальною для каналу адресою, вважатиме це джерело маршрутизатором, якщо пакет пройде базову перевірку параметрів.
Таким чином, адреса локального каналу в IPv6 є обов’язковим ідентифікатором L2, знання якого необхідне для більшості спуфінг-атак у локальній мережі. Його отримання та підробка не потребує прав адміністратора на цільовій машині.
У мережах IPv4 для виявлення хостів у сегменті використовувався широкомовний трафік. Наприклад, ARP-запити, NetBIOS-NS та інші. У випадку IPv6 широкомовлення було скасовано та замінено групами багатоадресної розсилки. Тобто, замість надсилання мережевих пакетів усім хостам поспіль, хости тепер прослуховують певні групи, залежно від їхньої ролі та контексту.
ff02::1– «Адреса багатоадресної розсилки всіх вузлів» – адреса для всіх вузлів у локальному сегменті. Фактично, будь-який пристрій з увімкненим IPv6 автоматично підписується на цю групу. Якщо IPv6 активний на комп’ютері, він повинен прийняти цю адресу. Наступні дані надсилаються за допомогоюff02::1
Запит відлуння ICMPv6
Оголошення маршрутизатора (ICMPv6
type=134)
ff02::2– «All-Routers Multicast Address» (Адреса багатоадресної розсилки всіх маршрутизаторів) – адреса для всіх маршрутизаторів у локальному сегменті. Використовується для специфічних запитів, таких як запит маршрутизатора. Пристрої, що виконують функції маршрутизатора IPv6, повинні приймати пакети, надіслані на цю адресу. Використання адреси ff02::2маршрутизаторами є обов’язковим для правильної роботи запиту маршрутизатора ICMPv6 ( type 133), який надсилається кінцевими станціями під час SLAAC (автоконфігурації адрес без урахування стану) або під час отримання інформації про мережеві маршрути.
Адреси
ff02::/16зарезервовані для багатоадресної розсилки на рівні каналу. Пам’ятайте, що вони ніколи не маршрутизуються за межі сегмента L2. Також використання цих адрес для багатоадресної розсилки регулюється RFC 4291, розділ: 2.7.1.
Механізм доставки багатоадресної розсилки є фундаментальною функцією, від якої залежить робота протоколів автоконфігурації, виявлення сусідів та маршрутизації. У мережах IPv6 кожен пристрій з активним стеком IPv6 автоматично обробляє певні адреси багатоадресної розсилки на рівні сегмента L2. Це необхідно для роботи основних протоколів IPv6, таких як NDP, SLAAC та ICMPv6.
Наприклад:
Усі вузли обробляють пакети, адресовані
ff02::1(всім кінцевим хостам);
Пристрої, що виконують роль маршрутизаторів, обробляють пакети на
ff02::2(всіх маршрутизаторах).
Цей механізм дозволяє зловмиснику взаємодіяти з усіма хостами або маршрутизаторами в локальній мережі одночасно , навіть не знаючи їхніх адрес. Це використовується в:
Збір інформації про мережу;
Атаки, пов’язані з хибним RA (оголошенням маршрутизатора)
Викрадення DNS через RDNSS
Мережа для демонстрації атак виглядатиме наступним чином. Вона невелика, але достатня для демонстрації атак у цій статті. Варто зазначити, що префікс 2001:db8::/64виділено для мережі, тобто клієнти отримують свої адреси за допомогою SLAAC.
Це насправді надзвичайно корисний метод збору інформації про мережі IPv6. Звичайно, ми можемо використовувати Multicast Ping на ff02::1та ff02::2для виявлення хостів і маршрутизаторів, але цей метод досить шумний і його дуже легко виявити. А хости можуть не завжди відповідати пакетом відповіді, оскільки його можна легко відфільтрувати прошивкою або навіть HIPS/HBF.
Набагато цікавіший метод — пасивне виявлення хостів, яке здійснюється шляхом аналізу трафіку в ефірі. Тобто, лише аналізуючи ефір, можна зібрати інформацію про сегмент. Ми можемо прослуховувати лише ключові протоколи в NDP, SLAAC, DHCPv6 та MLD, щоб ідентифікувати активні хости та зрозуміти, як структурована мережа.
Під час пасивного збору інформації в сегменті IPv6 варто зосередитися на перехопленні певних типів пакетів, оскільки вони є найціннішими для розуміння структури мережі та наявності активних хостів. Більшість базових протоколів, від автоконфігурації до розв’язання адрес, взаємодіють через багатоадресну розсилку, що означає, що весь процес можна спостерігати, просто прослуховуючи трафік у сегменті.
На відміну від IPv4, де агресивне сканування ARP було нормою, активне сканування мереж /64 в IPv6 просто безглуздо, оскільки займає багато часу. Тому лише моніторинг ICMPv6, DHCPv6 та MLD дає нам позитивний вплив. Наприклад:
Аналіз RA (оголошення маршрутизатора) виявляє активні маршрутизатори та конфігурації префіксів;
Запит/реклама сусідів дозволяє нам пов’язувати MAC-адреси та IPv6-адреси в локальній мережі, навіть якщо пристрої не взаємодіють зовні;
Пакети DAD часто надсилаються першими, коли пристрій увімкнено, що дає нам точку раннього виявлення;
Через DHCPv6 ми можемо бачити, хто запитує конфігурації та хто відповідає;
MLD може виділяти «сплячі» пристрої, які нічого не надсилають до мережі, але підписані на певні групи.
Ви можете автоматизувати процес аналізу такого трафіку за допомогою невеликого скрипта Python зі Scapy:
#!/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)
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: ("ICMPv6 - Router Solicitation", Fore.CYAN),
ICMPv6ND_RA: ("ICMPv6 - Router Advertisement", Fore.GREEN),
ICMPv6ND_NS: ("ICMPv6 - Neighbor Solicitation", Fore.BLUE),
ICMPv6ND_NA: ("ICMPv6 - Neighbor Advertisement", Fore.MAGENTA),
ICMPv6ND_Redirect: ("ICMPv6 - Redirect", Fore.LIGHTRED_EX),
ICMPv6MLReport: ("ICMPv6 - MLD Report", Fore.LIGHTCYAN_EX),
ICMPv6MLReport2: ("ICMPv6 - MLD Report", Fore.LIGHTCYAN_EX),
ICMPv6MLDone: ("ICMPv6 - MLD Done", Fore.LIGHTCYAN_EX),
ICMPv6EchoRequest: ("ICMPv6 - Echo Request", Fore.LIGHTBLACK_EX),
ICMPv6EchoReply: ("ICMPv6 - Echo Reply", Fore.LIGHTBLACK_EX)
}
def handle(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 "?"
# ICMPv6 Detection
for proto, (desc, color) in ICMP6_TYPES.items():
if proto in pkt:
break
else:
# DHCPv6 Detection
if UDP in pkt and pkt[UDP].dport == 547:
for dhcp_type, name in DHCP6_TYPES.items():
if dhcp_type in pkt:
desc = f"DHCPv6 - {name}"
color = Fore.YELLOW
break
else:
return
else:
return
print(color + f"[{datetime.now().strftime('%H:%M:%S')}] {desc}")
print(f"{Style.DIM} MAC {eth_src} -> {eth_dst}")
print(f"{Style.DIM} IPv6 {ip6_src} -> {ip6_dst}")
print(Style.RESET_ALL + "-" * 60)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="IPv6 NDP & DHCPv6 Sniffer")
parser.add_argument("-i", "--interface", required=True, help="Interface to sniff on")
parser.add_argument("-t", "--time", type=int, default=0, help="Sniff duration (0 = infinite)")
args = parser.parse_args()
print(Fore.LIGHTWHITE_EX + f"[*] Sniffing on {args.interface} for {args.time or '∞'} seconds...\n")
sniff(iface=args.interface, prn=handle, timeout=args.time or None, store=0)
Мета цього сніфера полягає в пасивному прослуховуванні ключових протоколів IPv6, таких як NDP, MLD та DHCPv6, та відображенні корисної інформації про вузли мережі, включаючи MAC-адреси, IPv6-адреси та типи повідомлень. Сніфер працює наступним чином:
Вибір інтерфейсу: користувач вказує мережевий інтерфейс (
-i eth0), з якого буде перехоплюватися трафік. Ви також можете встановити часовий ліміт (-t 60) або залишити режим прослуховування безстроковим (за замовчуванням);
Обробка пакетів: для кожного пакета, що проходить,
handle_packet()викликається функція, яка перевіряє його вміст на наявність типів повідомлень, що нас цікавлять;
Визначення типу трафіку: сніффер розрізняє такі повідомлення:
Виявлення сусідів ICMPv6 (RS, RA, NS, NA, перенаправлення); ICMPv6 MLD (виявлення багатоадресного слухача);
DHCPv6 (запит, реклама, відповідь тощо)
Вилучення даних: з кожного пакета вилучається наступне:
MAC-адреса відправника та одержувача;
Адреси джерела та призначення IPv6.
Розбір DHCPv6: на відміну від ICMPv6, DHCPv6 вимагає, щоб тип визначався вбудованим повідомленням (Solicit, Advertise тощо), тому
parse_dhcpv6()використовується окрема функція.
Ось приклад реального виводу сніфера в момент аналізу трафіку в локальному сегменті IPv6:
~:$ sudo python3 sniffer.py -i eth0 -t 500

На скріншоті показано, як сніффер перехоплює ключові IPv6-пакети в режимі реального часу. Кожен з них цікавий для зловмисника:
DHCPv6 Solicit – клієнт шукає DHCPv6-сервер, що відкриває можливість його підміни та надсилання шкідливих параметрів (DNS, маршрути).
Запит на доступ до маршрутизатора (RS) – пристрій запитує доступ до RA, що означає, що він вразливий до підміни RA та атак через налаштування маршрутизатора.
Реклама сусіда (NA) – участь в обміні NDP дозволяє здійснювати спуфінгові атаки та перехоплювати трафік.
Звіт MLD – показує, в яких групах багатоадресної розсилки бере участь клієнт, що допомагає побудувати топологію мережі та ідентифікувати активні пристрої.
Таким чином, використовуючи простий аналіз трафіку, можна збирати дані про мережу, не вдаючись до активного сканування або mcast ping.
Таким чином, IPv6 за замовчуванням створює середовище високої довіри всередині локального сегмента. Link-local адреси, багатоадресна розсилка та службові протоколи працюють автоматично й постійно обмінюються інформацією між вузлами, навіть якщо IPv6 формально не використовується в мережі. Це робить структуру сегмента прозорою для будь-якого пристрою з активним IPv6-стеком.
Розуміння цих механізмів дозволяє перейти від теорії до практики. У другій частині ми розглянемо, як ця довіра використовується в реальних мережах, починаючи з пасивного аналізу трафіку та закінчуючи повноцінними сценаріями перехоплення і контролю трафіку.