В прошлой части мы сформировали ARP-запрос, который спрашивает у устройств сети – «Кто обладает ip-адресом 192.168.0.1». Сейчас нам нужно написать код, отвечающий за того, куда мы будем отправлять этот запрос.
Как мы уже выяснили обмен данными между устройствами в локальной сети производится посредством MAC-адресов устройств, а не посредством их IP-адресов. MAC-адреса источника и адреса назначения прописываются в той части запроса, который относится к Ethernet.
Поэтому нам необходимо создать Ethernet-фрейм и отправить его на широковещательный адрес. В scapy это реализовано посредством класса .Ether() – в качестве аргумента, нам нужно передать этому классу MAC широковещательного адреса.
Создаем переменную:
broadcast = scapy.all.Ether()
Для того, чтобы понять какое поле у .Ether() отвечает за широковещательный адрес вновь прибегнем к функции ls():
и что мы видим ?
Итак, нужное нам поле называется dst. Изменяем наш код соответствующим образом:
Не забываем, что MAC-адрес броадкаста - это виртуальный MAC-адрес, в реальности устройства с таким MAC-адресом не существует, но если мы отправим на него запрос – его получает все устройства нашей подсети.
Теперь посмотрим с помощью summary() как выглядит наш пакет broadcast:
получаем:
Пакет с нашего компьютера с MAC- адресом 74:e5:43:5f:00:bf отправляется на широковещательный адрес – все работает корректно.
Теперь нам остается объединить пакеты arp_request и broadcast. В scapy это делается с помощью прямого слеша: «/»
Продолжение следует….
Конструктивная критика приветствуется.
Эта статья была полезной? Поставьте лайк и поделитесь с друзьями в социальных сетях!
Оставьте отзывы и замечания!
Предыдущая часть:
Программируем сканер локальной сети. Часть 2
База знаний:
Методы: .ls(), .summary()
Объекты: Ether()
Модули: scapy
Понятия: Протокол ARP