DHCDROP(8)

НАЗВАНИЕ
dhcdrop - программа для выявления и нейтрализации несанкционированных DHCP серверов в Ethernet сетях.

СИНТАКСИС
dhcdrop [ -h ] [ -D ] [ -t ] [ -y ] [ -r ] [ -b ] [ -a ] [ -A ] [ -f ] [ -R ] [ -q ]

[ -m count ] [ -c count ] [ -n hostname ] [ -N clientname ] [ -p port ] [ -P port ] [ -w seconds ]

[ -T timeout ] [ -M max-hosts-scan ] [ -l MAC-address ] [ -L network ] [ -S network/mask ] [ -F from-IP ]

[ -s server-IP ] [ -C children count (2 - 32) ] [ initial-MAC-address ] < -i interface-name|interface-index >

ОПИСАНИЕ
Подавление DHCP сервера dhcdrop осуществляется при помощи атаки DHCP starvation, либо при помощи флуда DHCPDISCOVER сообщениями. Подробности смотрите ниже. Кроме того, dhcdrop может применяться как средство диагностики и стресс-тестирования при настройке и разработке DHCP серверов.

ОПЦИИ

-h  показывает help-сообщение, а так же - коды возврата программы.

-D  просмотр списка имён и индексов сетевых интерфейсов. Актуально в ОС Windows - см. пример ниже.

-t  Режим теста. В этом режиме dhcdrop не выполняет подавление сервера. Производится лишь посылка DHCPDISCOVER, если на него приходит ответ от не игнорируемого сервера, то программа заверается возвращаяя код 200 и выводя на экран строку вида

    DHCP SRV: 10.7.7.1 (IP-hdr: 10.7.7.1) SRV ether: 00:02:44:75:77:E4, YIP: 10.7.7.205

    содержащую содержащую минимум информации о создающем проблему DHCP сервере.

-y  подразумевается ответ "yes" на любой вопрос программы.

-r  отключает рандомизацию MAC адреса источника. Каждый последующий MAC адрес источника отличается от предыдущего на 1.

-b  указывает на необходимость использования флага BROADCAST в отправляемых DHCP пакетах.

-a  всегда ожидать ответа сервера на порт DHCP клиента по умолчанию (68), даже если задано значение номера порта клиента отличное от значения по умолчанию.

-A  всегда ожидать ответа с порта DHCP сервера по умолчанию (67), даже если задано значение номера порта сервера отличное от значения по умолчанию.

-f  режим флуда запросами DHCPDISCOVER. ПРИМЕНЯТЬ С ОСТОРОЖНОСТЬЮ. Удобен для стресс-тестирования сервера. В случае указания опции -r все отправляемые пакеты имеют одинаковый MAC адрес.

-R  отправляет сообщение DHCPRELEASE с MAC адресом источника указанном при запуске программы и IP адресом указанным при помощи опции -F к серверу указанному опцией -s

-q  "тихий" режим работы. Выводится минимум информации.

-m count
    максимальное число попыток получения ответа от сервера.

-c count
    максимальное число адресов арендуемых у сервера.

-n hostname
    значение DHCP опции HostName (по умолчанию - "DHCP-dropper")

-N clientname
    значение DHCP опции Vendor-Class (по умолчанию - "DHCP-dropper")

-p port
    порт используемый клиентом для отправки DHCP сообщений. По умолчанию - 68

-P port
    порт сервера, на который отправляются DHCP сообщения.

-w  seconds
    задаёт таймаут рестарта процесса получения IP адресов в случае использования агрессивного режима. По умолчанию - 60 секунд.

-T timeout
    устанавливает таймаут ожидания ответа сервера (в секундах). По умолчанию - 3 секунды.

-M maximum-hosts
    максимально допустимое количество сканируемых хостов в случае использования агрессивного режима.

-l MAC-address
    Ethernet адрес сервера который необходимо игнориновать при выполненении поиска ложных DHCP серверов в сети. В этой опции следует указать адрес DHCP сервера ответственного за раздачу адресов в данном участке сети. Может быть указано несколько адресов - каждый должен предворяться ключом -l

-L legal-network
    указывает легальную IP подсеть для выбранного интерфейса. Использование этой опции автоматически включает агрессивный режим получения IP адресов. Может быть указано несколько сетей - каждая должна предворяться ключом -L Подробное описание смотрите ниже.

-S network/mask
    ARP сканирование сети 'сеть' с использованием сетевой маски 'маска' в CIDR нотации. IP адрес источника задаётся опцией -F Если IP адрес источника не задан - используется случайный адрес из диапазона указанной подсети. Пример использования смотрите ниже.

-F source-ip
    указывает IP адрес источника для сканирования сети (опция -S ), либо IP адрес DHCP клиента для отправки сообщения DHCPRELEASE (опция -R ).

-s server-ip-adress
    задаёт IP адрес DHCP сервера. Используется с опцией -R

-C count
    число порождаемых процессов-потомков. Совместим только с флагом -f Используется для увеличения числа отправляемых пакетов за еденицу времени.

initial-MAC-address
    задаёт MAC адрес источника используемый при отправке первого DHCP сообщения, либо используемый постоянно, в случае использования опции -f (flood) вместе с опцией -r Если не указан, то используется случайный MAC адрес источника.

-i interface
    имя либо индекс сетевого интерфейса (см. ключ -D ). Не может быть "any"! Единственный обязательный параметр программы.

ТЕОРЕТИЧЕСКАЯ ОСНОВА
В протоколе DHCP определена опция, которая задает длительность аренды IP адреса (Lease time) - это время на которое DHCP сервер выдаёт IP адрес в пользование клиенту. По истечении этого временного интервала клиент должен выполнить попытку обновить IP адрес с целью продления аренды. Для сервера выдача IP адреса в аренду означает то, что за время аренды данный IP адрес может быть выдан только владельцу аренды и никому кроме него. Идентификация клиентов сервером производится на основании MAC адреса. Обычно, каждый сервер имеет пул динамических IP адресов, т.е. IP адресов которые не закреплены за конкретными MAC адресами и выдаются динамически по запросу любому клиенту. Пул на SOHO маршрутизаторах в конфигурации по умолчанию имеет небольшой размер - от нескольких десятков до двух сотен адресов. В случае использования ПО, выполняющего роль DHCP сервера, величину пула определяет тот, кто настраивает. Если пул адресов исчерпан, то DHCP сервер игнорирует запросы от новых клиентов (возможно документируя это в логах) - т.е., фактически, бездействует. Таким образом, в случае появления в сети ложных DHCP их можно нейтрализовать достаточно просто - необходимо получить аренду на все доступные на данном сервере IP адреса, каждый раз посылая запросы от уникальных клиентов. Чем больше время аренды в настройках сервера, тем на больший срок DHCP сервер оказывается нейтрализован в случае исчерпания динамического пула. Для большинства SOHO маршрутизаторов Lease Time исчисляется днями, или даже неделями. В случае использования в качестве DHCP сервера WinGate, dhcpd и прочего подобного софта, время зависит от фантазии человека который его настроил.

ПРИНЦИП РАБОТЫ dhcdrop
Программа открывает указанный в параметрах командной строки интерфейс в promiscuous режиме, формирует DHCP запрос (DHCPDISCOVER), используя случайный исходящий MAC адрес (если в параметрах не задано иное поведение) и отправляет его в интерфейс:
01:58:04.681600 00:70:de:3b:b9:05 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800),
length 342: (tos 0x10, ttl 64, id 33964, offset 0, flags [none],
proto UDP (17), length 328)
0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:70:de:3b:b9:05,
length 300, xid 0xcc1cfc5c, Flags [none]
        Client-Ethernet-Address 00:70:de:3b:b9:05
        Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: Discover
        Parameter-Request Option 55, length 3:
        Domain-Name-Server, Default-Gateway, Subnet-Mask
        Hostname Option 12, length 12: "DHCP-dropper"
        Vendor-Class Option 60, length 12: "DHCP-dropper"
        Client-ID Option 61, length 7: ether 00:70:de:3b:b9:05
После чего переходит к ожиданию ответа (DHCPOFFER) сервера. Если получен ответ с предложением аренды IP адреса, то в интерфейс отправляется следующий DHCP запрос (DHCPREQUEST) на который сервер отвечает DHCPACK-пакетом подтверждающим возможность использования данного IP адреса клиентом. На этом операция получения аренды, на предложенный сервером IP адрес, завершена. Программа изменяет MAC адрес источника и вновь посылает DHCPDISCOVER, после чего, все вышеуказанные операции по получению аренды нового IP адреса повторяются. Стоит обрать внимание, что программа изменяет не только MAC адрес клиента в DHCP сообщении, но и MAC адрес в заголовке Ethernet-фрейма. Данная возможность максимально приближает работу программы к работе реального DHCP клиента (а так же, позволяет обойти DHCP snooping). Цикл получения IP адресов с сервера завершается, когда получено заданное параметром максимальное число IP адресов, либо в случае исчерпания динамического пула сервера.

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
Просмотр списка интерфейсов

Актуально в ОС семейства Windows. Используется ключ -D :
C:>dhcdrop -D
Available interfaces:
1:\Device\NPF_GenericDialupAdapter
  descr: Adapter for generic dialup and VPN capture
2:\Device\NPF_{0C796DB5-22D9-46AB-9301-9C7ADC2304AF}
  descr: ZyXEL GN650 1000Base-T Adapter          (Microsoft's Packet Scheduler)
  iaddr: 192.168.1.2/24  bcast: 255.255.255.255
  iaddr: 10.7.7.7/24  bcast: 255.255.255.255
В качестве аргумента для ключа программы можно задать либо индекс интерфейса 2, либо его имя: \Device\NPF_{0C796DB5-22D9-46AB-9301-9C7ADC2304AF} Интерактивный режим

Самый простой вариант использования программы для поиска и выбора подавляемого сервера вручную:
$ sudo dhcdrop -i eth1
Using interface: 'eth1'
Got response from server 10.7.7.1 (IP-header 10.7.7.1), server ethernet address: 00:02:44:75:77:E4, lease time: 1.1h (3960s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:16:09:D8:CF:60 You IP: 10.7.7.201/24
Drop him? [y/n] n
Searching next server...
Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:16:09:D8:CF:60 You IP: 192.168.1.2/24
Drop him? [y/n] y
1. Got BOOTREPLY (DHCPACK) for client ether: 00:16:09:D8:CF:60 You IP: 192.168.1.2/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:A2:FA:12:41:F7 You IP: 192.168.1.3/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:56:EA:F8:1C:B0 You IP: 192.168.1.4/24
<пропущено>
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Finished.
При получении ответа от DHCP сервера dhcdrop сообщает информацию о предлагаемом IP адресе и спрашивает о необходимости подавления данного сервера. Получив отрицательный ответ - продолжает поиск серверов в сети игнорируя обнаруженный ранее сервер. В случае получения утвердительного ответа - начинает процесс подавления сервера указанным выше способом Режим автоматического подавления всех серверов кроме легитимного

В случае, если мы знаем (а обычно мы знаем) MAC адрес легального DHCP сервера в нашей сети, операцию подавления ложных серверов можно упростить:
$ sudo dhcdrop -i eth1 -y -l 00:02:44:75:77:E4
Using interface: 'eth1'
Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:37:C5:10:BE:16 You IP: 192.168.1.2/24
1. Got BOOTREPLY (DHCPACK) for client ether: 00:37:C5:10:BE:16 You IP: 192.168.1.2/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:94:26:88:33:BD You IP: 192.168.1.3/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:E5:AC:7B:79:BB You IP: 192.168.1.4/24
<пропущено>
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Finished.
В подобном варианте использования dhcdrop подавляет любой сервер, кроме указанного опцией -l сервера, не задавая дополнительных вопросов (благодаря использованию опции -y ). Тестовый режим

Тестовый режим -t удобно использовать для выполнения программы из скриптов, в автоматизированном режиме. Ниже приведён пример простейшего скрипта:
00 #!/bin/bash
01 LEGAL_SERVER="00:11:22:33:44:55"
02 DROPPER="/usr/sbin/dhcdrop"
03 IFNAME="eth1"
04 $DROPPER -i $IFNAME -t -l $LEGAL_SERVER -m 3
05 if [ $? = 200 ]
06 then
07    echo Illegal server found Dropping him
08    $DROPPER -i eth1 -l $LEGAL_SERVER -y
09 else
10    echo Illegal server not found.
11 fi
В строке 4 выполняется запуск dhcdrop в тестовом режиме, с указанием опции легального для сети DHCP сервера -l , опцией режима тестирования -t и опцией задающей максимальное число попыток отправки DHCPDISCOVER в режиме поиска сервера -m Если ни на один из отправленных запросов не придёт ответа - программа завершается с кодом 0. Если приходит ответ от сервера не заданного опцией -l , программа завершается с кодом 200, что вызывает последующий запуск программы с параметрами определяющими подавление любого DHCP сервера в сети, кроме легального. Использование агрессивного режима получения адресов

Как можно догадаться из описания протокола DHCP - если клиент уже получил конфигурационный набор данных от нелегального DHCP сервера, то сервер не выдаст повторно этот набор другому клиенту пока не истечёт срок аренды. Следовательно, простое исчерпание пула IP адресов не спасёт клиентов уже получивших неверные конфигурационные данные - сервер будет выдавать эти адреса только изначально запросившим их клиентам и будет игнорировать запросы от dhcdrop. При следующей попытке обновления адреса клиенты вновь получат информацию от нелегального DHCP сервера, и так будет продолжаться пока не отключат нелегальный DHCP сервер. Для решения подобных проблем, в dhcdrop, начиная с версии 0.5, добавлен агрессивный режим получения IP адресов. Включается опцией -L указывающей легитимную IP подсеть для данного Ethernet сегмента сети. Алгоритм его работы следующий: dhcdrop запускает обычный режим подавления и исчерпывает весь пул свободных IP адресов нелегального DHCP сервера. Анализирует первый DHCPOFFER полученный от нелегального DHCP. При помощи сетевой маски и IP адреса клиента выданных сервером получает адрес IP сети обслуживаемой этим сервером. Запускает ARP-сканирование полученной подсети, с целью выявить хосты получившие неправильную конфигурационную информацию. По умолчанию, число сканируемых хостов ограничено числом 512 (можно изменить опцией ) - некоторые сервера выдают конфигурационные наобры с маской /8, что соответствует примерно 16 млн. хостов - сканирование такого адресного диапазона займёт очень большое время. Отправляет DHCP серверу сообщения DHCPRELEASE от каждого из найденных хостов (исключая сам сервер). Ожидает 60 секунд (значение по умолчанию, может быть изменено опцией -w ) после чего перезапускает процесс получения IP адресов. В качестве примера запустим dhcdrop с теми же параметрами, что и в предыдущем примере, но дополнительно укажем легальную IP сеть 10.7.7.0.
$ sudo dhcdrop -i eth1 -y -l 00:02:44:75:77:E4 -L 10.7.7.0
Using interface: 'eth1'
Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24
1. Got BOOTREPLY (DHCPACK) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:FB:E7:A4:19:EC You IP: 192.168.1.6/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:CB:44:F9:A8:6F You IP: 192.168.1.7/24
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Trying to use agressive mode.
Starting ARP scanning network in range: 192.168.1.0 - 192.168.1.255...
Illegal DHCP server perhaps assigned IP adresses to the following hosts:
1. Received ARP-reply from: 00:1e:2a:52:c8:ca (192.168.1.1) - itself DHCP server.
2. Received ARP-reply from: 00:03:ff:15:52:90 (192.168.1.3)
3. Received ARP-reply from: 00:03:ff:14:52:90 (192.168.1.4)
4. Received ARP-reply from: 00:a0:c5:30:52:90 (192.168.1.200)
Sending DHCPRELEASE for invalid clients:
Send DHCPRELEASE for host 00:03:ff:15:52:90 (192.168.1.3).
Send DHCPRELEASE for host 00:03:ff:14:52:90 (192.168.1.4).
Send DHCPRELEASE for host 00:a0:c5:30:52:90 (192.168.1.200).
Restart dropping DHCP server after 60 seconds timeout...
1. Got BOOTREPLY (DHCPACK) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:F1:32:14:60:A3 You IP: 192.168.1.3/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:2D:1C:80:ED:12 You IP: 192.168.1.4/24
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
WARNING: Failed to take away all the IP addresses assigned by DHCP server.
Perhaps DHCP server checks availability of IP addresses by sending ARP-request
before assigning them. Try to restart dhcpdrop later. If it doesn't help
try to disconnect problem hosts temporarily, then send manually DHCPRELEASE
from address of this hosts (use option -R) and restart dhcdrop.
Finished.
Пояснения к результатам работы программы. После вывода надписи "Trying to use agressive mode." начинается ARP сканирование подсети обслуживаемой нелегальным DHCP сервером в указанном диапазоне. В результате найдено 4 хоста, включая сам DHCP сервер (1й хост). Затем, dhcdrop посылает серверу 192.168.1.1 сообщения DHCPRELEASE от адресов (Ethernet & IP) всех хостов найденных в подсети кроме самого DHCP сервера и останавливает выполнение на 60 секунд. Таймаут необходим потому, что некоторые DHCP сервера удерживают выдачу IP адреса новому клиенту в течение небольшого времени после получения сообщения DHCPRELEASE от предыдущего клиента. В случае необходмости значение таймаута можно изменить опцией -w. По истечении таймаута, dhcdrop запускает процесс получения освободившихся IP адресов. Успешно удалось получить IP адреса 192.168.1.5 (был получен изначально, при старте программы), 192.168.1.3 и 192.168.1.4. Последние два адреса были успешно особождены сервером после получения сообщений DHCPRELEASE сгенерированных dhcdrop. Не удалось получить адрес 192.168.1.200 несмотря на присутствие этого хоста в сети, и то, что от его адреса было отправлено сообщение DHCPRELEASE. Одна из причин неудачи описана в предупреждении, в конце вывода программы - DHCP сервер перед выдачей адресов может проверять присутствует ли в сети хост с запрашиваемым IP адресом и только после этого - выдавать адрес, если таковой хост в сети отсутствует. В противном случае - новая аренда на этот адрес выдана не будет. В этой ситуации может помочь отключение проблемных хостов от сети вручную и отправка сообщений DHCPRELEASE от адреса этих хостов серверу (см. пример ниже), после чего необходимо снова запустить процесс получения IP адресов. Но в нашем случае проблема кроется не в этом - хост 192.168.1.200 имеет статически установленный адрес и потому никогда не запрашивал конфигурации у DHCP сервера. Сама необходимость указания легальной сети для запуска агрессивного режима необходима что бы проверить - не пересекается ли адресный диапазон выдаваемый нелегальным DHCP сервером с адресным пространством подсети в которой он обнаружен. Если адресные пространства пересекаются - ARP сканирование будет проведено по хостам имеющим правильную конфигурацию и выведет ошибочную информацию. Потому в случае обнаружения пересечения диапазонов адресов агрессивный режим не запускается. Отправка сообщения DHCPRELEASE

Возможно у вас возникнет необходимость отправки сообщений DHCPRELEASE в ручном режиме. Например по причине указанной в предыдущем примере. Сделать это можно при помощи опции -R :
$ sudo dhcdrop -i eth1 -R -s 192.168.1.1 -F 192.168.1.4 00:2D:1C:80:ED:12
Using interface: 'eth1'
Send DHCPRELEASE from 00:2D:1C:80:ED:12 client IP 192.168.1.4 to DHCP server 192.168.1.1
Finished.
Опция -s задаёт IP адрес сервера, -F - IP адрес DHCP клиента, 00:2D:1C:80:ED:12 - Ethernet адрес клиента. В результате в сеть отправлен пакет вида:
16:13:43.887735 00:2d:1c:80:ed:12 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342:
(tos 0x10, ttl 64, id 29807, offset 0, flags [none], proto UDP (17), length 328)
0.0.0.0.68 > 192.168.1.1.67: BOOTP/DHCP, Request from 00:2d:1c:80:ed:12,
length 300, xid 0xb2f04a28, Flags [none]
    Client-IP 192.168.1.4
    Client-Ethernet-Address 00:2d:1c:80:ed:12
    Vendor-rfc1048 Extensions
    Magic Cookie 0x63825363
    DHCP-Message Option 53, length 1: Release
    Server-ID Option 54, length 4: 192.168.1.1
    Client-ID Option 61, length 7: ether 00:2d:1c:80:ed:12
Сканирование сегмента сети

Вы можете использовать ARP сканирование сети для поиска клиентов получивших неверную конфигурационную информацию. Осуществляется подобное при помощи опции -S :
$ dhcdrop -i eth1 -S 192.168.1.0/24
Using interface: 'eth1'
Starting ARP-scanning for subnet 192.168.1.0/24.
IP address range 192.168.1.0 - 192.168.1.255.
WARNING: Source IP is not set (use option -F).
Using random value for source IP address: 192.168.1.195
1. Received ARP-reply from: 00:1e:2a:52:c8:ca (192.168.1.1).
2. Received ARP-reply from: 00:a0:c5:30:52:90 (192.168.1.200).
Finished.
Как следует из предупреждения напечатанного программой - при запуске не был задан IP адрес источника, потому dhcdrop выбирает случайный IP адрес из диапазона адресов указанной подсети. Если вам нужно указать адрес источника - используйте опцию -F Для данного типа сканирования не важны фактические настройки маршрутизации в вашей сети. Всегда будет использоваться интерфейс заданный опцией -i из расчёта что хосты указанной подсети находятся в одном Ethernet сегменте с хостом на котором запущен dhcdrop. Так же, данная опция позволяет обнаружить дублирование IP адресов в одном сегменте сети, даже если сканирование производится с хоста чей IP адрес дублируется другим хостом.

АВТОР
Эта программа была написана Roman Chebotarev <roma@ultranet.ru>, Какие-либо замечания/предложения/пожелания по поводу данной программы, сообщайте по адресу <roma@ultranet.ru>.

MAN ФАЙЛ
Страница руководства создана Andrew Clark <andyc@altlinux.org>, на основе статьи автора програмы по адресу - http://www.netpatch.ru/dhcdrop.html