В первой части мы создали простейший вариант сканера локальной сети, однако его вывод значительно отличается от вывода netdiscover.
Сейчас мы глубже копнем в модуль scapy и посмотрим в каком виде посылаются ARP-запросы, какие поля данных при этих запросах мы можем использовать.
Создаем экземпляр ARP-запроса мы можем получить с помощью метода модуля scapy - scapy.all.ARP(). Применив функцию summary() мы увидим, как выглядит сам ARP-запрос:
summary() выводит нам следующее:
Т.е. по ARP не форматированный экземпляр спрашивает: «who has 0.0.0.0» ? -"у кого ip-адрес – 0.0.0.0"?) и указывает что ответ нужно отправить по ip-адресу 192.168.0.29 (это наш ip-адрес ).
Теперь разберемся, какими переменными обладаем экземпляр .ARP(). Для этого будет использовать функцию scapy – .ls().
scapy.all.ls (scapy.all.ARP()):
ls() выдает нам все переменные доступные через .ARP():
Нетрудно заметить, что за запрашиваемый ip-адрес отвечает поле - pdst. В дальнейшем, оперируя с pdst мы сможем сканировать не только подсеть, в которую подключен нам компьютер, но и любую подсеть. Кроме того, уже не нужно будет прописывать сканируемый диапазон ip-адресов в программном коде – он будет передаваться сканеру как аргумент командной строки.
Итак, удаляем из кода функцию ls() - она сделала свое дело и пока больше нам не нужна и подставляем аргумент pdst в экземпляр ARP-запроса:
Теперь у нас есть пакет, который спрашивает: «Чей ip-адрес 192.168.0.1»?
Продолжение следует….
Конструктивная критика приветствуется.
Эта статья была полезной? Поставьте лайк и поделитесь с друзьями в социальных сетях!
Оставьте отзывы и замечания!
Предыдущая часть:
Программируем сканер локальной сети. Часть 1
База знаний
Методы: .ls(), .summary()
Объекты: .ARP()
Модули: scapy
Понятия: Протокол ARP