Что такое сетевое сканирование?
Сканирование сети – это процесс сбора информации о устройствах в компьютерной сети через использование сетевых протоколов. Это особенно актуально для сетевых администраторов, тестеров проникновения и, ну … хакеров.
Предварительные условия
Вы должны знать базовый Python. Кроме того, не так много! Я буду писать по какой-то основной теории сети, прежде чем попасть в реальный код, поэтому, если вы уже знаете этот материал, не стесняйтесь пропустить вперед!
Вся код для этого урока можно найти в моем Репозиторий GitHub Отказ
zeyu2001/Сетевой сканер
Простой сетевой сканер, построенный с скапий для Python
Протоколы, протоколы, протоколы
Связь по сетью использует то, что мы называем Стек протокола – Создание более высокого уровня, более сложные разговоры на вершине проще, более рудиментарных разговоров. Слои сети могут быть представлены моделью OSI и моделью TCP/IP. Каждый сетевой уровень соответствует группе системных сетевых протоколов.
С целью этого урока мы будем касаться себя только с протоколом ARP и протоколом TCP.
Протокол разрешения адресов (ARP)
ARP Maps IP-адреса на MAC-адресах. IP-адреса логично адреса, пока MAC-адреса являются Физический адреса. Когда компьютеры взаимодействуют друг с другом по сети, они указывают целевой IP-адрес. Тем не менее, переключатели (которые действуют как пакетные экспедиторы), не понимают IP-адреса – они могут сделать только управление решениями на основе MAC-адресов. Следовательно, компьютеры должны определять MAC-адрес своего предполагаемого получателя перед отправкой пакета.
Если компьютер желает отправить пакет до 192.168.52.2, сначала отправит запрос ARP, спрашивая все Устройства в сети “Кто IP-адрес 192.168.52.2? «Компьютер с IP-адресом 192.168.52.2 будет отвечать на« Привет, мне 192.168.52.2. Мой MAC-адрес 03-CA-4B-2C-13-8A. “
Как вы могли заметить, поскольку ARP является автономным протоколом, любой может отправить запрос ARP в любое время, чтобы узнать о устройствах в сети через ARP ответов. Мы будем использовать Scapy для сканирования сети, используя запросы ARP и создать список IP-адресов на сопоставления MAC-адресов.
Протокол управления передачей (TCP)
TCP – это протокол транспортного уровня, на котором работает большинство услуг. Это протокол, ориентированный на соединение, что означает, что два устройства должны будут настроить TCP Соединение перед обменом данных. Это достигается с помощью трехходового рукопожатия.
TCP использует Порт номера дифференцировать между различными приложениями на одном устройстве. Например, если я работаю как Firefox, так и Chrome на своем компьютере, ОС использует номера портов для различения двух приложений, чтобы веб-страницы предназначались для Chrome, не отображаются на Firefox.
Когда хост P желает подключиться к хосту Q, он отправит пакет SYN для размещения Q. Если Host Q прослушивает целевой порт и желает принять новое соединение, он ответит с пакетом SYN + ACK. Чтобы установить соединение, хост P посылает окончательный пакет ACK.
Использование SCAPY, мы отправим пакеты SYN в диапазон номеров портов, прослушивая для SYN + ACK ответов, и, следовательно, определите, какие порты открыты.
Скаксировать
Scapy – это инструмент манипуляций пакетов, написанный в Python. Если вы еще этого не сделали, вам нужно установить SCANY с PIP.
$ pip install scapy
Теперь мы можем начать пробовать основные особенности скапий.
$ python3 ... >>> from scapy.all import *
Мы можем создать пакет, как так:
>>> Ether()
Мы создали рамку Ethernet. Это соответствует слою канала данных (слой 2) модели OSI. Если мы не пройдем ни в какие параметры, будут использоваться значения по умолчанию.
Мы можем указать параметры, такие как MAC-адрес назначения:
>>> p = Ether(dst='ff:ff:ff:ff:ff:ff') >>> p.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = d0:81:7a:b0:bb:0c type = 0x9000
Здесь мы указали DST = 'FF: FF: FF: FF: FF: FF'
, который является вещательным адресом. Пакет адресована все Устройства в локальной сети.
Мы можем стекать протоколы более высокого уровня сверху протокола Ethernet, как так
>>> p = Ether() / IP() >>> p.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = ip chksum = None src = 127.0.0.1 dst = 127.0.0.1 \options \
Здесь мы сложены IP, сетевой слой (слой 3) протокол на вершине Ethernet, протокол слоя канала данных (слой 2).
ARP сканер
from scapy.all import * def arp_scan(ip): request = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip) ans, unans = srp(request, timeout=2, retry=1) result = [] for sent, received in ans: result.append({'IP': received.psrc, 'MAC': received.hwsrc}) return result
Создание запроса ARP
Вау, что мы здесь сделали? Во-первых, мы сложены ARP поверх Ethernet и установили адрес назначения Ethernet в адрес широковещательного вещания, чтобы все устройства в локальной сети получают этот запрос ARP.
Отправка и получение
Далее мы позвонили SRP ()
Чтобы отправить запрос ARP, и ждать ответа. Мы указали время ожидания 2 секунды, и если мы не получим ответ ARP в течение 2 секунд, мы повторим 1 раз, прежде чем отказаться от.
Анализируя результаты
SRP ()
Возвращает два списка: список отвеченных запросов и список запросов без ответа. В рамках списка отвеченных запросов вложены списки: [
Отказ
Информация, содержащаяся в пакетах, хранится как атрибуты. Мы используем Gealy.psrc
Чтобы получить исходный IP-адрес ответа и Gealy.hwsrc
Чтобы получить исходный MAC-адрес ответа.
TCP сканер
from scapy.all import * def tcp_scan(ip, ports): try: syn = IP(dst=ip) / TCP(dport=ports, flags="S") except socket.gaierror: raise ValueError('Hostname {} could not be resolved.'.format(ip)) ans, unans = sr(syn, timeout=2, retry=1) result = [] for sent, received in ans: if received[TCP].flags == "SA": result.append(received[TCP].sport) return result
Создание пакета SYN
Здесь мы создаем IP-пакет и укажите IP-адрес назначения, затем стеките TCP сверху его, указав порты назначения и установку флага SYN.
Обратите внимание, что ДПОР
Может быть либо единым портом, либо диапазон портов.
Если
dport = 80
Пакет TCP будет отправлен только в порт 80 (http).Если
dport = [80, 443]
Пакет TCP будет отправлен на оба Порт 80 (HTTP) и порт 443 (HTTPS)Если
dport = (0, 1000)
Пакет TCP будет отправлен на все Порты из порта 0 в порт 1000.
Следовательно, параметр портов нашей функции может быть целым числом, список или кортеж.
Флаги = "S"
Устанавливает флаг SYN в пакете TCP. Если приемный порт открыт, он должен ответить с пакетом с установленными флагами "SA"
(для SYN + ACK).
Socket.Gorror
Socket.Gaierror
Поднят, когда приведен IP-адрес недействителен, либо приведен имя хоста не может быть разрешено службой DNS. Мы ловим это исключение и поднимаем более значимое исключение с пользователем вместо этого.
Отправка и получение
Опять же, мы отправляем пакет и ждать ответа. Мы используем SR ()
вместо SRP ()
Потому что мы имеем дело со слоем 3 пакета. Оба метода возвращают те же результаты, но SRP ()
предназначен для пакетов слоя 2.
Анализируя результаты
Не все ответы Syn + Ack пакеты! Если порт не открыт, целевое устройство может ответить на пакет RST (RESET) для информирования нашей ОС, что она не хочет устанавливать соединение TCP.
Мы используем, если получил [TCP] .flags
Чтобы проверить флаги TCP полученного пакета. Обратите внимание, что мы можем использовать <Пакет> [<Протокол>]
Для доступа к конкретной протоколе информации пакета. Опять же, информация хранится как атрибуты, и мы используем получил [TCP] .flags
Для получения флагов принятого пакета. получил [TCP] .sport
является исходным портом принятого пакета.
Полный код
Я использовал argparse
Чтобы включить наш сканер в приложение командной строки и добавил некоторую документацию. Полный код встроен ниже. Вы также можете найти его в моем Репозиторий GitHub Отказ
Вывод
Это все! Я надеюсь, что вам понравилось читать это столько, сколько мне нравилось, писать. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь сообщить мне в комментариях.
Оригинал: “https://dev.to/zeyu2001/network-scanning-with-scapy-in-python-3off”