Найти в Дзене
Практика Python

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

На данный момент наш скрипт умеет составлять и собирать ARP-запросы, отправлять их на все возможные ip-адреса локальной сети, а также захватывать от них ответы.

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

Он запоминает в один список адреса, от которых мы получили ответ и в другой список - не занятые ip-адреса. Однако помимо нужных нам данных - мы получаем и сохраняем много не нужных пользователю данных. Все эти данные нужны нам в процессе разработки скрипта, для того чтобы понимать как происходит процесс. Пользователя же интересуют лишь конкретные ip-адреса и MAC-адреса устройств, которые находятся на данный момент в сети.

Синим подчеркнута - "полезная часть данных"
Синим подчеркнута - "полезная часть данных"

Сначала избавимся от списка не отвечающих ip-адресов. Строку:

answer_yes, answer_no = scapy.all.srp(arp_request_broadcast, timeout=1)

заменим на:

answer_yes = scapy.all.srp(arp_request_broadcast, timeout=1) [0]

answer_no теперь нам больше не нужен, кроме того, используя [0] , мы указываем srp(), что она должна возвращать только первый список.

Теперь нам нужно спарсить нужные значения из строк ответа. Причем следует учесть, что summary() выдает только основные поля ответа. Он не учитывает все поля, а они нам необходимы для парсинга. Чтобы увидеть ответ полностью переберем список в цикле for:

Перебор списка с ответами - код
Перебор списка с ответами - код

Они выглядят так:

Перебор списка с ответами - вывод
Перебор списка с ответами - вывод

Обращаем внимание:

(<Ether dst=ff:ff:ff:ff:ff:ff type=ARP |<ARP pdst=192.168.0.61 |>>, <Ether dst=74:e5:43:5f:00:bf src=08:3d:88:ba:a5:77 type=ARP |<ARP hwtype=0x1 ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=08:3d:88:ba:a5:77 psrc=192.168.0.61 hwdst=74:e5:43:5f:00:bf pdst=192.168.0.29 |>>)

Ответ разбит на два элемента - они разделены запятой. Во втором элементе ip-адрес устройства равен полю psrc , а его MAC-адрес полю hwsrc

Поэтому обращаемся не ко всему элементу, а к его подэлементу и соответствующему полю:

print (element[1].psrc)

print (element[1].hwsrc)

обращаемся к полям  hwsrc   и   psrc  - код
обращаемся к полям hwsrc и psrc - код

ответ - как раз то, что нам нужно:

обращаемся к полям  hwsrc   и   psrc  - вывод
обращаемся к полям hwsrc и psrc - вывод

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

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

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

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

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

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

База знаний:

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

Модули: scapy

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