Создание простого сетевого сканера на Python

GetCoder.ru
Изображение статьи

Сетевой сканер — это инструмент, который помогает анализировать сеть, находить активные устройства и проверять, какие порты на них открыты. Такие сканеры часто используются системными администраторами для проверки безопасности сети и выявления доступных служб. В этой статье рассмотрим создание простого сетевого сканера на Python с использованием библиотеки scapy.

Сетевой сканер — это инструмент, который помогает анализировать сеть, находить активные устройства и проверять, какие порты на них открыты. Такие сканеры часто используются системными администраторами для проверки безопасности сети и выявления доступных служб. В этой статье рассмотрим создание простого сетевого сканера на Python с использованием библиотеки scapy.

Установка

  • copy
pip install scapy

Пример кода сетевого сканера

Код ниже предназначен для сканирования сети в поисках активных хостов и открытых портов на них. Он использует ICMP для проверки доступности устройства и TCP для определения состояния портов.

  • copy
# -*- coding: utf-8 -*- from scapy.all import ICMP, IP, sr1, TCP import threading class Scaner(): #Сканирование одного хоста для проверки, активен ли он def scan_host(self, ip): pkt = IP(dst=ip)/ICMP() resp = sr1(pkt, timeout=1, verbose=False) if resp is not None: print(f"[+] Host {ip} is alive") return True else: print(f"[-] Host {ip} is not reachable") return False #Сканирование порта на заданном IP-адресе def scan_port(self, ip, port): pkt = IP(dst=ip)/TCP(dport=port, flags="S") resp = sr1(pkt, timeout=1, verbose=False) if resp and resp.haslayer(TCP) and resp.getlayer(TCP).flags == 0x12: print(f"[+] Port {port} on {ip} is open") #Сканирование сети в указанном диапазоне IP-адресов и портов def scan_network(self, ip_prefix, ports=[80, 443], num_threads=4): threads = [] for i in range(1, 255): ip = f"{ip_prefix}.{i}" t = threading.Thread(target=self.scan_host_ports, args=(ip, ports), daemon=True) t.start() threads.append(t) if len(threads) >= num_threads: for t in threads: t.join() threads = [] #Сканирует конкретный IP по заданным портам def scan_host_ports(self, ip, ports): if self.scan_host(ip): for port in ports: self.scan_port(ip, port) if __name__ == "__main__": # Укажите префикс сети, например, 192.168.1 network_prefix = "192.168.1" sc = Scaner() sc.scan_network(network_prefix, ports=[22, 80, 443, 8080], num_threads=10)
Исходный код

Как работает этот код?

  • Проверка хоста: Функция scan_host отправляет ICMP-запрос (аналогичный команде ping), чтобы проверить, активен ли хост. Если ответ получен, хост считается активным.
  • Сканирование порта: scan_port отправляет пакет с флагом SYN для проверки состояния порта. Если порт открыт, ответ TCP будет содержать флаг SYN+ACK.
  • Сканирование сети: scan_network создает потоки для параллельного сканирования всех IP-адресов в указанном диапазоне (например, 192.168.1.1–192.168.1.254).
  • Параллельное выполнение: Код использует многопоточность, чтобы ускорить сканирование.

Важные предостережения

  • Использование с разрешением: Запуск сетевого сканирования должен осуществляться только на ваших сетях или с разрешения сетевого администратора.
  • Права администратора: Для отправки ICMP и TCP пакетов с флагами могут потребоваться права администратора.

Пример вывода

При запуске кода вы можете получить следующий вывод.

  • copy
[+] Host 192.168.1.5 is alive [+] Port 80 on 192.168.1.5 is open [+] Port 443 on 192.168.1.5 is open [-] Host 192.168.1.6 is not reachable ...

Заключение

Этот простой сетевой сканер демонстрирует, как можно использовать Python и scapy для анализа сети, нахождения активных устройств и проверки открытых портов. Этот инструмент можно расширять и дополнять, добавляя сканирование других протоколов или автоматизируя отправку отчетов.

  • 26.10.2024
  • 67
  • 0

Создание простого сетевого сканера на Python

Сетевой сканер — это инструмент, который помогает анализировать сеть, находить активные устройства и проверять, какие порты на них открыты. Такие сканеры часто используются системными администраторами для проверки безопасности сети и выявления доступных служб. В этой статье рассмотрим создание простого сетевого сканера на Python с использованием библиотеки scapy.

Установка

  • copy
pip install scapy

Пример кода сетевого сканера

Код ниже предназначен для сканирования сети в поисках активных хостов и открытых портов на них. Он использует ICMP для проверки доступности устройства и TCP для определения состояния портов.

  • copy
# -*- coding: utf-8 -*- from scapy.all import ICMP, IP, sr1, TCP import threading class Scaner(): #Сканирование одного хоста для проверки, активен ли он def scan_host(self, ip): pkt = IP(dst=ip)/ICMP() resp = sr1(pkt, timeout=1, verbose=False) if resp is not None: print(f"[+] Host {ip} is alive") return True else: print(f"[-] Host {ip} is not reachable") return False #Сканирование порта на заданном IP-адресе def scan_port(self, ip, port): pkt = IP(dst=ip)/TCP(dport=port, flags="S") resp = sr1(pkt, timeout=1, verbose=False) if resp and resp.haslayer(TCP) and resp.getlayer(TCP).flags == 0x12: print(f"[+] Port {port} on {ip} is open") #Сканирование сети в указанном диапазоне IP-адресов и портов def scan_network(self, ip_prefix, ports=[80, 443], num_threads=4): threads = [] for i in range(1, 255): ip = f"{ip_prefix}.{i}" t = threading.Thread(target=self.scan_host_ports, args=(ip, ports), daemon=True) t.start() threads.append(t) if len(threads) >= num_threads: for t in threads: t.join() threads = [] #Сканирует конкретный IP по заданным портам def scan_host_ports(self, ip, ports): if self.scan_host(ip): for port in ports: self.scan_port(ip, port) if __name__ == "__main__": # Укажите префикс сети, например, 192.168.1 network_prefix = "192.168.1" sc = Scaner() sc.scan_network(network_prefix, ports=[22, 80, 443, 8080], num_threads=10)
Исходный код

Как работает этот код?

  • Проверка хоста: Функция scan_host отправляет ICMP-запрос (аналогичный команде ping), чтобы проверить, активен ли хост. Если ответ получен, хост считается активным.
  • Сканирование порта: scan_port отправляет пакет с флагом SYN для проверки состояния порта. Если порт открыт, ответ TCP будет содержать флаг SYN+ACK.
  • Сканирование сети: scan_network создает потоки для параллельного сканирования всех IP-адресов в указанном диапазоне (например, 192.168.1.1–192.168.1.254).
  • Параллельное выполнение: Код использует многопоточность, чтобы ускорить сканирование.

Важные предостережения

  • Использование с разрешением: Запуск сетевого сканирования должен осуществляться только на ваших сетях или с разрешения сетевого администратора.
  • Права администратора: Для отправки ICMP и TCP пакетов с флагами могут потребоваться права администратора.

Пример вывода

При запуске кода вы можете получить следующий вывод.

  • copy
[+] Host 192.168.1.5 is alive [+] Port 80 on 192.168.1.5 is open [+] Port 443 on 192.168.1.5 is open [-] Host 192.168.1.6 is not reachable ...

Заключение

Этот простой сетевой сканер демонстрирует, как можно использовать Python и scapy для анализа сети, нахождения активных устройств и проверки открытых портов. Этот инструмент можно расширять и дополнять, добавляя сканирование других протоколов или автоматизируя отправку отчетов.