Рубрики
Без рубрики

Сетевое сканирование с скапий в Python

Что такое сетевое сканирование? Сетевое сканирование – это процесс сбора информации о D … Помечено Python, Scapy, Network, Безопасность.

Что такое сетевое сканирование?

Сканирование сети – это процесс сбора информации о устройствах в компьютерной сети через использование сетевых протоколов. Это особенно актуально для сетевых администраторов, тестеров проникновения и, ну … хакеров.

Предварительные условия

Вы должны знать базовый 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”