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


Сетевой сканер — это инструмент, который помогает анализировать сеть, находить активные устройства и проверять, какие порты на них открыты. Такие сканеры часто используются системными администраторами для проверки безопасности сети и выявления доступных служб. В этой статье рассмотрим создание простого сетевого сканера на Python с использованием библиотеки scapy.
Сетевой сканер — это инструмент, который помогает анализировать сеть, находить активные устройства и проверять, какие порты на них открыты. Такие сканеры часто используются системными администраторами для проверки безопасности сети и выявления доступных служб. В этой статье рассмотрим создание простого сетевого сканера на Python с использованием библиотеки scapy.
Установка
pip install scapy
Пример кода сетевого сканера
Код ниже предназначен для сканирования сети в поисках активных хостов и открытых портов на них. Он использует ICMP для проверки доступности устройства и TCP для определения состояния портов.
# -*- 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 пакетов с флагами могут потребоваться права администратора.
Пример вывода
При запуске кода вы можете получить следующий вывод.
[+] 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.
Установка
pip install scapy
Пример кода сетевого сканера
Код ниже предназначен для сканирования сети в поисках активных хостов и открытых портов на них. Он использует ICMP для проверки доступности устройства и TCP для определения состояния портов.
# -*- 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 пакетов с флагами могут потребоваться права администратора.
Пример вывода
При запуске кода вы можете получить следующий вывод.
[+] 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 для анализа сети, нахождения активных устройств и проверки открытых портов. Этот инструмент можно расширять и дополнять, добавляя сканирование других протоколов или автоматизируя отправку отчетов.