DHCP — это сетевой протокол, который позволяет клиентам, подключенным к сети, получать информацию о конфигурации TCP/IP (например, частный IP-адрес) от DHCP-сервера. В статье покажу, как перехватить пакеты DHCP на Python с помощью библиотеки Scapy.
Еще по теме: Истощение и подмена DHCP-сервера
Перехват пакетов DHCP на Python с помощью Scapy
Сервер DHCP (точка доступа, маршрутизатор или сервер) динамически назначает IP-адрес и другие параметры конфигурации каждому устройству, подключенному к сети.
Протокол DHCP использует протокол UDP для общения между сервером и клиентами. Он реализуется с помощью двух портов: порт 67 UDP для сервера и порт 68 UDP для клиента.
Статья в образовательных целях, для обучения этичных хакеров. При написании статьи использовались личные устройства автора. Несанкционированный взлом сетей и манипуляции с трафиком являются незаконными и рассматривается как уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши незаконные действия.
Мы создадим простой слушатель DHCP с использованием библиотеки Scapy на Python. Другими словами, мы сможем прослушивать пакеты DHCP в сети и перехватывать важную информацию при подключении устройства к сети.
Для начала, нужно установить Scapy:
1 |
$ pip install scapy |
Если вы знакомы с Scapy, вы, возможно, уже знаете о функции sniff() в Scapy, которая отвечает за прослушивание любого типа пакетов, которые можно отслеживать. Чтобы убрать другие пакеты, которые нас не интересуют, просто используем параметр фильтрации в функции sniff():
1 2 3 4 5 6 |
from scapy.all import * import time def listen_dhcp(): # Убедитесь, что это DHCP с параметрами фильтрации sniff(prn=print_packet, filter='udp and (port 67 or port 68)') |
В функции listen_dhcp() вызываем функцию sniff() и передаем функцию print_packet(), которую определим как обратный вызов, выполняемый при прослушивании и соответствии пакета параметрам фильтрации.
Сопоставляем пакеты UDP с портом 67 или 68 в их атрибутах для фильтрации DHCP.
Определим функцию print_packet():
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 |
def print_packet(packet): # Сначала инициализируем эти переменные как None target_mac, requested_ip, hostname, vendor_id = [None] * 4 # Получаем MAC-адрес запросившего if packet.haslayer(Ether): target_mac = packet.getlayer(Ether).src # Получаем параметры DHCP dhcp_options = packet[DHCP].options for item in dhcp_options: try: label, value = item except ValueError: continue if label == 'requested_addr': # Получаем запрошенный IP requested_ip = value elif label == 'hostname': # Получаем имя хоста устройства hostname = value.decode() elif label == 'vendor_class_id': # Получаем идентификатор производителя vendor_id = value.decode() if target_mac and vendor_id and hostname and requested_ip: # Если все переменные не равны None, выводим детали устройства time_now = time.strftime("[%Y-%m-%d - %H:%M:%S]") print(f"{time_now}: {target_mac} - {hostname} / {vendor_id} запросил {requested_ip}") |
Сначала извлекаем MAC-адрес из атрибута src слоя Ether.
Затем, если в пакете есть параметры DHCP, перебираем их и извлекаем requested_addr (который представляет собой запрошенный IP-адрес), hostname (имя хоста запрашивающего) и vendor_class_id (идентификатор клиента DHCP-поставщика). После этого получаем текущее время и отображаем детали.
Начнем сниффинг:
1 2 |
if __name__ == "__main__": listen_dhcp() |
Вот мой результат, когда я попробовал подключиться с тремя разными устройствами:
1 2 3 |
[2022-04-05 - 09:42:07] : d8:12:65:be:88:af - DESKTOP-PSU2DCJ / MSFT 5.0 requested 192.168.43.124 [2022-04-05 - 09:42:24] : 1c:b7:96:ab:ec:f0 - HUAWEI_P30-9e8b07efe8a355 / HUAWEI:android:ELE requested 192.168.43.4 [2022-04-05 - 09:58:29] : 48:13:7e:fe:a5:e3 - android-a5c29949fa129cde / dhcpcd-5.5.6 requested 192.168.43.66 |
Теперь у вас есть быстрый сниффер DHCP на Python, который вы можете расширить. Я предлагаю вывести переменную dhcp_options в функции print_packet(), чтобы посмотреть, как выглядит этот объект.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Как написать сканер портов на Python
- Создание сканера Wi-Fi сетей на Python Scapy
- Создание скрипта Python Nmap для сканирования портов