Нестандартное использование ARP
АрхивСетевое окружение (архив)В данной статье описывается для чего нужен и как можно использовать ARP протокол
Автор не несет никакой ответственности за ущерб, который может быть нанесен после прочтения данной статьи. Материал предоставляется ИСКЛЮЧИТЕЛЬНО в учебных целях.
Прежде всего, мне хотелось бы немного рассказать о том, как в локальной сети пакеты передаются от одного интерфейса к другому. В соответствии с семи-уровневой моделью OSI уровень связи данных (Data link layer) организует данные в кадры (frame). Иногда ее называют канальным уровнем. Каждый кадр имеет заголовок (header), содержащий адрес и управляющую информацию, а завершающая секция кадра (trailer) используется для исправления ошибок (иногда ее называют хвостом кадра). Кадр доставляется на сетевой адаптер, физический адрес которого совпадает с физическим адресом назначения из заголовка кадра. Заголовок кадра содержит физический адрес интерфейса назначения, часто называемый MAC-адресом (от Media Access Control - управление доступом к носителю). Система с указанным адресом принимает посланное сообщение и обрабатывает его.
Структура MAC кадра для DIX | ||
MAC - кадр | IP датагарамма | FCS (контрольная сумма MAC кадра) |
Поля MAC кадра для DIX Ethernet | |||||||||||||
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D |
Dst MAC | Src MAC | Tp |
Обозначения:
Dst MAC - Destination Hardware Address
Src MAC - Source Hardware Address
Tp - Protocol Type
Таким образом, для доставки датаграммы в локальной сети нужно определить физический адрес узла назначения. Именно для этого существует процедура автоматического определения физических адресов. Протокол разрешения адресов (Address Resolution Protocol - ARP) обеспечивает метод динамической трансляции между IP-адресом и соответствующим физическим адресом на основе широковещательных рассылок.
Система локальной сети самостоятельно использует ARP для исследования информации о физических адресах (хотя есть возможность при необходимости вручную ввести ARP-таблицу). Когда хосту нужно начать коммуникацию с другим хостом в локальной сети, он ищет IP-адрес получателя в ARP-таблице, которая обычно располагается в оперативной памяти. Если для нужного IP-адреса не находится требуемого элемента таблицы, хост посылает широковещательный запрос ARP, содержащий искомый IP-адрес назначения. Отметим что MAC адрес для широковещательной рассылки FF:FF:FF:FF:FF:FF.
Целевой хост узнает свой IP-адрес и обрабатывает запрос. После этого он изменяет собственную таблицу трансляции адресов, включая в нее IP-адрес и физический адрес отправителя широковещательной рассылки и посылает ответ, содержащий аппаратный адрес своего интерфейса. Когда система, пославшая запрос получает такой ответ, она обновляет свою таблицу ARP и становится готовой к пересылке данных по локальной сети.
Формат сообщений ARP | |
Количество октетов |
Поле |
2 | Тип аппаратного адреса |
2 | Протокол адресации высокого уровня |
1 | Длина аппаратного адреса |
1 | Длина адреса высокого уровня |
2 | Тип сообщения: 00 01 - запрос, 00 02 - ответ |
* | Аппаратный адрес источника |
* | Адрес высокого уровня источника |
* | Аппаратный адрес приемника |
* | Адрес высокого уровня приемника |
Пример кадра с ARP запросом | ||||||||||||||||
Offset | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
0000: | FF | FF | FF | FF | FF | FF | 00 | 40 | 95 | 01 | 59 | 01 | 08 | 06 | 00 | 01 |
0010: | 08 | 00 | 06 | 04 | 00 | 01 | 00 | 40 | 95 | 01 | 59 | 01 | 0A | 00 | 00 | 06 |
0020: | 00 | 00 | 00 | 00 | 00 | 00 | 0A | 00 | 00 | 01 |
Расшифровка пакета полученная с помощью сниффера NetXRay | ||
Ethernet Version II | ||
Address | 00-40-95-01-59-01 | FF-FF-FF-FF-FF-FF |
Ethernet II Protocol Type | ARP (08 06) | |
Address Resolution Protocol | ||
Hardware Type | Ethernet (00 01) | |
Protocol Type | IP Protocol (80 00) | |
Hardware Address Lenght | 6 bytes (06) | |
Protocol Address Lenght | 4 bytes (04) | |
Operations | ARP Request (00 01) | |
Source Hardware Address | 00-40-95-01-59-01 | |
IP Source Address | 10.0.0.6 (0A 00 00 06) | |
Destination Hardware Address | 00-00-00-00-00-00 | |
IP Destination Address | 10.0.0.1 (0A 00 00 01) | |
Calculate CRC: 0x6ffd5fa9 |
Данный ARP-запрос был "пойман" после того как была запущена программа ping 10.0.0.1. В ARP-таблице не было данного IP-адреса - поэтому был послан запрос. Отметим что поле Destination Hardware Address неизвестно - поэтому заполнено нулями (00:00:00:00:00:00).
Как уже говорилось выше данные о соответствии IP адреса и физического адреса хранятся в ARP-таблице. Просмотреть ее содержимое командой ARP.
> ARP -a выводит список всех закешированных элементов
> ARP -a <IP> [IA] выведет соответствие MAC для указанного <IP> для интерфейса IA
> ARP -d <IP> [IA] удаляет существующий элемент с <IP> из таблицы для интерфейса IA
> ARP -s <IP> <MAC> [IA] добавляет элемент для интерфейса IA
Как можно нестандартно использовать ARP протокол? Ответ прост - дело в том что большинство операционных систем ARP-ответ заносит сразу же без проверки (посылала ли система запрос) в ARP таблицу (исключением является Solaris, который игнорирует ARP ответы, если не посылался ARP запрос). Почему в остальных ОС не применен такой же метод, остается загадкой.
Чем грозит такая ситуация? Если интерфейс получит данные о том, что какому-то IP соответствует несуществующий MAC, то IP-датаграммы к данному хосту будут вкладываться в кадр с фальшивым MAC. Это приведет к тому, что ни один сетевой интерфейс в локальной сети не будет воспринимать этот пакет. Таким образом, все данные уйдут в "никуда". Для реализации подобной атаки необходимо периодически (интервал зависит от операционной системы) посылать ложные ARP ответы. В результате атакуемый хост не сможет установить соединение с хостом, IP адрес которого указан в ложном ARP ответе. Данная атака применима, даже если уже установлено соединение между двумя хостами. После посылки даже одного ложного ARP ответа соединение будет разорвано по таймауту. Для того чтобы два хоста не смогли обмениваться пакетами друг с другом, необходимо направить ложные ARP ответы на один из хостов. Если же ставить целью полностью отключить хост от сети, то необходимо периодически посылать ложные ARP ответы от всех хостов в сети. Тогда на атакуемом хосте сложится впечатление, что поврежден кабель или вышла из строя сетевая карта. Однако это впечатление легко рассеять, достаточно лишь запустить снииффер и убедиться что интерфейс работает и пакеты отправляются и получаются.
Демонстрация атаки:
на хосте, который атакуем запускается ping с ключом -t (до прерывания пользователем). Через некоторое время посылается ложный ARP-ответ, а затем ARP ответ с правильным MAC-адресом. Посылать ARP-ответ можно или с помощью сниффера NetXRay, либо специально написанными для этого программами. Вот что будет результатом:
>ping -t 10.0.0.1
Обмен пакетами с 10.0.0.1 по 32 байт:
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 10.0.0.1: число байт=32 время<10мс TTL=128
Как видим возникает таймаут посланных пакетов. А какая будет ситуация если послать только один ARP-ответ с несуществующим MAC в данном случае? В этом случае хост не сможет установить соединение с хостом с IP-адресом 10.0.0.1 до тех пор пока не будет прервано выполнение команды ping. Дело в том, что при попытке послать данные другим приложением по этому же IP-адресу, в кеше ARP-таблицы будет найдено соответствие MAC и IP (повторяющаяся команда ping не дает этим данным "устареть"). Если же мы прекратить пинговать хост, то через некоторое время (для многих систем 35-40 секунд) элемент ARP-таблицы будет удален из нее, и при последующих попытках какого-нибудь приложения установить соединение или послать датаграмму к хосту, будет послан ARP-ответ и в таблицу соответствия MAC и IP адреса занесутся верные данные.
Как защитить себя от данной атаки? Необходимо статически прописать элементы в ARP таблице. Это не совсем удобно (учитывая то, что в локальной сети может быть много хостов), но тогда можно быть уверенным, что данная атака на ваш хост не принесет желаемого результата, для атакующего. Однако определить какой именно хост является атакующим, не представляется возможным.
Есть одна особенность, с которой столкнулся автор статьи в процессе экспериментов со статическими записями в ARP-таблице на Windows NT 4.0 (Service Pack 5). Попробуем добавить статическую запись, а потом попробовать снова послать ложный ARP-ответ.
Добавляем элемент:
arp -s 10.0.0.1 00-95-40-20-40-01
Проверяем список элементов:
arp -a
Интерфейс: 10.0.0.6 on Interface 2
Адрес IP Физический адрес Тип
10.0.0.1 00-95-40-20-40-01 статический
По идее все в порядке - элемент добавлен, и он является статическим. То есть, он не должен изменяться ни при каких обстоятельствах. Проверим это на деле - посылаем ложный ARP-ответ (Src IP: 10.0.0.1, Src MAC: 00-11-22-33-44-55, Dst IP: 10.0.0.6, Dst MAC: 00-40-95-01-59-01). Затем проверяем таблицу записей:
arp -a
Интерфейс: 10.0.0.6 on Interface 2
Адрес IP Физический адрес Тип
10.0.0.1 00-11-22-33-44-55 статический
Что получается? Элемент является статическим, т.е. он не будет удален из ARP-таблицы через некоторое время, а MAC-адрес поменялся, после получения ложного ARP-ответа! Аналогичная особенность присутствует и на Windows 95/9 и даже на Windows 2000 (Professional, Advanced Server). Из этого можно сделать вывод, что защитить себя, прописав статические элементы на данных ОС, к сожалению, нельзя.
Использование персональных файрволов, таких как Tiny Personal FireWall, AtGuard, OutPost - тоже не сможет защитить от данной атаки. В этих брендмауэрах анализируются IP-датаграммы (TCP, UDP, ICMP протоколы). Очень жаль, что нет мониторинга ARP-пакетов. Будем надеяться, что в последующих версиях появятся эти функции.
Еще одной атакой в основу, которой положены слабые места ARP-протокола, является создание "ложного ARP сервера". Представим себе сеть, разделенную на сегменты, которые соединяются сервером, имеющим два интер-фейса. Пакеты из одного сегмента, предназначенные для хостов из другого сег-мента пересылаются через сервер.
Для того чтобы хост1 отправил датаграмму IP хосту2, необходимо переслать сначала ее на интерфейс1 сервера, а затем датаграмма будет отправлена с интерфейса2 хосту2. Как это происходит: IP-датаграмма укладывается в MAC-кадр, в котором Src MAC=MAC1, Dst MAC=MACs1. При получении интерфейсом1 на сервере, определяется что датаграмма предназначена для хоста2. IP-датаграмма укладывается в MAC-кадр, в котором Src MAC=MACs2, Dst MAC=MAC2 и отправляется. Данный кадр, отправленный с интерфейса2 сервера будет получен хостом2. Этот пример приведен для того чтобы яснее представить атаку "ложный ARP-сервер". Используя данную атаку возможно сниффить траффик между хостами, находящимися в разных сегментах. Это позволяет сниффить траффик даже если сеть разделена на сегменты свитчами и хабами. Итак имеем сеть поделенную на сегменты свитчами или хабами.
При обычных условиях хост3 (атакующий) не может прослушивать траффик между хостами хост1 и хост2. Для создания ложного ARP-сервера сначала необходимо хосту3 послать два ложных ARP-ответа хост1 и хосту2:
1. ARP ответ направленный хосту1 | |
MAC-кадр | Src MAC:MAC3 |
Dst MAC:MAC1 | |
ARP-Ответ | Src IP :IP2 |
Src MAC:MAC3 | |
Dst IP :IP1 | |
Dst MAC:MAC1 |
2. ARP ответ направленный хосту2 | |
MAC-кадр | Src MAC:MAC3 |
Dst MAC:MAC2 | |
ARP-Ответ | Src IP :IP1 |
Src MAC:MAC3 | |
Dst IP :IP2 | |
Dst MAC:MAC2 |
Таким образом после получения хостами указанных пакетов, в ARP-таблицах появятся следующие элементы: хост1: IP2:MAC3
хост2: IP1:MAC3
Вследствие этого хост1 все пакеты, предназначенные для хост2 будет направлять по MAC-адресу MAC3, тоже самое будет делать и хост2 с пакетами для хост1.
Теперь хосту3 необходимо "слушать" весь траффик, и следующим образом обрабатывать такие пакеты
- получив MAC-кадр с MAC1->MAC3(IP1->IP2) сменить MAC-кадр на MAC3->MAC2(IP1->IP2) и отправить пакет;
- получив MAC-кадр с MAC2->MAC3(IP2->IP1) сменить MAC-кадр на MAC3->MAC1(IP2->IP1) и отправить пакет.
Продолжение следует...