![image](https://habrastorage.org/getpro/habr/post_images/424/aed/937/424aed937f4db1e74b47bc8adad3b5c9.png)
Прочитал недавно статью «IPv6 под прицелом» и решил написать более подробно об атаке SLAAC (SLAAC Attack), т.к. эту атаку я уже давно в голове держу, развернутого материала на русском не нашел, да и самому интересно ее было повторить.
Суть атаки
В чем суть атаки? Во-первых, она очень простая и надежная, т.к. использует стандартные технологии и инструменты ОС. По сути, вы просто становитесь единственным IPv6-маршрутизатором в сети и раздаете клиентам IPv6-подсеть, из которой клиенты берут себе адреса либо автоматически генерируя их (SLAAC), либо спрашивая у вашего же DHCPv6-сервера. Напомню, что IPv6 включен по умолчанию во всех современных десктопных, мобильных и серверных ОС, имеет приоритет над IPv4 (кроме некоторых случаев), адрес IPv6, в отличие от IPv4, может быть получен в любой момент, а не только в момент совершения подключения, и крупные веб-сайты уже давно доступны через IPv6. Атака работает как в проводных сетях, так и в беспроводных. Не все свитчи, даже современные, поддерживают фильтрацию Router Advertisement, и, как я полагаю, не все включают эту функцию, даже если она поддерживается свитчем, полагая, что раз в сети нет IPv6, то и фильтровать ничего не нужно. К слову, на данный момент, фильтр Router Advertisement можно обойти на всех свитчах, использовав недостатки реализации.
Я смог придумать две реализации атаки:
Реализация №1
С помощью этого способа, вы сможете перехватывать только реальный IPv6-трафик к хостам, которые имеют AAAA-запись. Вам понадобится IPv6-подсеть длиной /64 и какой-либо софт для Router Advertisement, я использовал dnsmasq. IPv6-подсеть 6to4 не подойдет, т.к. все 6to4-адреса имеют приоритет ниже, чем IPv4, так что нужно использовать туннельный брокер. Клиентам будем раздавать только сам диапазон адресов, без DNS, и не используя DHCPv6.
Демон dnsmasq умеет брать подсеть прямо с интерфейса, для этого достаточно указать в конфигурационном файле следующую строку:
dhcp-range=::, constructor:wlp3s0, ra-only
Где wlp3s0 — сетевой интерфейс, в моем случае, беспроводной. Устанавливаем глобально маршрутизируемую подсеть 2001:470::/64
на интерфейс, запускаем dnsmasq, смотрим в wireshark:![image](https://habrastorage.org/getpro/habr/post_images/42f/c18/b98/42fc18b98a07d78606bd9b83f0a2c923.png)
Все компьютеры в сети сразу же назначили себе IPv6-адрес и установили маршрут по умолчанию:
% ip -6 r
2001:470:abcd::/64 dev enp4s0 proto kernel metric 256 expires 3542sec
fe80::/64 dev enp4s0 proto kernel metric 256
default via fe80::223:15ff:fe5b:240c dev enp4s0 proto ra metric 1024 expires 1781sec
Не забудьте включить маршрутизацию!
# sysctl net.ipv6.conf.all.forwarding=1
Недостаток этой реализации в том, что через ваш маршрутизатор пойдет только IPv6-трафик. Опять же, вероятнее всего, IPv4-адрес вашего компьютера будет за NAT, а значит получить IPv6-подсеть может быть не так-то просто, т.к. самый популярный протокол туннелирования — SIT — не работает за NAT. Нужно использовать либо туннелирование по протоколу AYIYA, который поддерживается у меньшинства туннельных брокеров, либо придумывать свои схемы проброса. Атака может быть замечена, если атакуемый использует какой-либо сайт с привязкой по IP. Зато, эта атака технически очень простая и применить ее можно буквально за минуту.
Реализация №2
Что же делать, если у необходимого нам хоста нет IPv6-адреса, а нам так хочется совершить незаметную MITM-атаку? Есть замечательный выход из этой ситуации — NAT64+DNS64. NAT64 позволяет вам сделать отображение всего диапазона IPv4 в /96-диапазон адресов IPv6, а DNS64 сможет отдавать такие адреса клиентам.
Под Linux существует три NAT64-демона: TAYGA (userspace) и Ecdysis (kernelspace), Jool (kernelspace), а поддержка DNS64 есть в Bind9, Unbound и специальном демоне totd, который заброшен, но все еще компилируется и работает.
Первым делом, мы должны выбрать какие-то 2 подсети, которые будем раздавать нашим клиентам. Первая подсеть нужна для отображения адресов, а вторая для маршрутизации. Я решил использовать
2001:db8:1:ffff::/96
(из диапазона «для документации») в качестве первой подсети, а в качестве второй — fde4:8dba:82e1:ffff::/64
(IPv6 ULA, аналог внутрисетевых диапазонов в IPv4).Перенастраиваем dnsmasq:
dhcp-range=fde4:8dba:82e1:ffff::1, fde4:8dba:82e1:ffff::ff, slaac
Указываем наши настройки в TAYGA:prefix 2001:db8:1:ffff::/96
И в totd:forwarder 74.82.42.42 port 53
prefix 2001:db8:1:ffff::
port 53
И запускаем все демоны. В итоге, получается как-то так:
% dig aaaa habrahabr.ru
; <<>> DiG 9.9.2-P2 <<>> aaaa habrahabr.ru
;; ANSWER SECTION:
habrahabr.ru. 2363 IN AAAA 2001:db8:1:ffff::d418:2c8d
habrahabr.ru. 2363 IN AAAA 2001:db8:1:ffff::d418:2c85
Весь трафик, отправленный на диапазон 2001:db8:1:ffff::/96, фактически пойдет через IPv4.
К сожалению, DNS устанавливается только при подключении, т.к. Router Advertisement принимает ядро, а для получения DNS нужен DHCPv6, чем ядро уже не занимается. Аналогичное поведение наблюдается в Windows 7 (другие версии не пробовал).
Заключение
Мне очень нравится эта атака. Она очень простая, надежная и работает там, где есть защиты от ARP Spoofing и IPv4 ACL. Существует и другая, но очень похожая по сути атака — Rogue RA, которая позволит выполнить MITM даже при наличии существующей IPv6-инфраструктуры, но о ней как-нибудь в другой раз.