Найти тему
Практика Python

Программируем сканер локальной сети. Часть 3

В прошлой части мы сформировали ARP-запрос, который спрашивает у устройств сети – «Кто обладает ip-адресом 192.168.0.1». Сейчас нам нужно написать код, отвечающий за того, куда мы будем отправлять этот запрос.

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

netdiscover входит в стандартный комплект ОС Kali Linux
netdiscover входит в стандартный комплект ОС Kali Linux

Поэтому нам необходимо создать Ethernet-фрейм и отправить его на широковещательный адрес. В scapy это реализовано посредством класса .Ether() – в качестве аргумента, нам нужно передать этому классу MAC широковещательного адреса.

Создаем переменную:

broadcast = scapy.all.Ether()

Для того, чтобы понять какое поле у .Ether() отвечает за широковещательный адрес вновь прибегнем к функции ls():

создаем Ethernet-фрейм - код
создаем Ethernet-фрейм - код

и что мы видим ?

создаем Ethernet-фрейм - вывод
создаем Ethernet-фрейм - вывод

Итак, нужное нам поле называется dst. Изменяем наш код соответствующим образом:

Прописываем в  broadcast адрес широковещательного канала
Прописываем в broadcast адрес широковещательного канала

Не забываем, что MAC-адрес броадкаста - это виртуальный MAC-адрес, в реальности устройства с таким MAC-адресом не существует, но если мы отправим на него запрос – его получает все устройства нашей подсети.

Теперь посмотрим с помощью summary() как выглядит наш пакет broadcast:

Как выглядит пакет broadcast - код
Как выглядит пакет broadcast - код

получаем:

Как выглядит пакет broadcast - вывод
Как выглядит пакет broadcast - вывод

Пакет с нашего компьютера с MAC- адресом 74:e5:43:5f:00:bf отправляется на широковещательный адрес – все работает корректно.

Теперь нам остается объединить пакеты arp_request и broadcast. В scapy это делается с помощью прямого слеша: «/»

На данный момент так выглядит код сканера
На данный момент так выглядит код сканера

Продолжение следует….

Конструктивная критика приветствуется.

Эта статья была полезной? Поставьте лайк и поделитесь с друзьями в социальных сетях!

Оставьте отзывы и замечания!

Предыдущая часть:

Программируем сканер локальной сети. Часть 2

База знаний:

Методы: .ls(), .summary()

Объекты: Ether()

Модули: scapy

Понятия: Протокол ARP