Scapy — это мощная библиотека Python для работы в сети и управления пакетами. Он предоставляет гибкий и простой в использовании интерфейс для создания пакетов и управления ими, отправки и получения пакетов по сети, а также для выполнения различных задач, таких как сканирование, трассировка и обнаружение сети.

Установка Скапи

Чтобы установить Scapy, в вашей системе должны быть установлены Python и pip (менеджер пакетов Python). Если у вас их еще нет, вы можете обратиться к Документации по Python за инструкциями по их установке.

После того, как у вас установлены Python и pip, вы можете установить Scapy, используя следующую команду:

pip install scapy

Использование Скапи

Чтобы использовать Scapy, вам нужно будет импортировать его в свой скрипт Python. Затем вы можете использовать различные функции и классы, предоставляемые Scapy, для создания пакетов и управления ими, отправки и получения пакетов по сети и выполнения различных задач.

Вот пример того, как использовать Scapy для отправки пинг-пакета ICMP на целевой хост и получения ответа:

from scapy.all import *

# Send an ICMP ping packet to the target host
response = sr1(IP(dst="192.168.1.1")/ICMP())

# Print the response
print(response)

Этот скрипт отправит пинг-пакет ICMP на целевой хост с IP-адресом 192.168.1.1 и напечатает ответ.

Scapy предоставляет широкий спектр функций и классов для создания пакетов и управления ими, включая функции для создания различных типов пакетов, таких как пакеты IP, TCP, UDP и ICMP, а также функции для управления полями пакетов, такими как IP-адреса источника и получателя и номера портов.

Вот пример того, как использовать Scapy для создания и отправки пакета TCP SYN на целевой хост:

# Create a TCP SYN packet
packet = IP(dst="192.168.1.1")/TCP(dport=80, flags="S")

# Send the packet and receive the response
response = sr1(packet)

# Print the response
print(response)

Этот сценарий создаст пакет TCP SYN с IP-адресом назначения 192.168.1.1 и портом назначения 80 и отправит его на целевой хост. Затем он напечатает ответ.

Пример: сканирование открытых портов

Одной из распространенных задач, для которых можно использовать Scapy, является сканирование портов. Вот пример того, как вы можете использовать Scapy для сканирования диапазона IP-адресов на наличие открытых портов TCP:

from scapy.all import *
# Define the range of IP addresses to scan
ip_range = "192.168.1.1/24"
# Define the list of ports to scan
ports = [22, 80, 443]
# Iterate through the IP addresses
for ip in IPNetwork(ip_range):
    # Iterate through the ports
    for port in ports:
        # Send a TCP SYN packet to the target host and port
        response = sr1(IP(dst=str(ip))/TCP(dport=port, flags="S"))
        # If a response is received, the port is open
        if response is not None:
            print(f"Port {port} is open on {ip}")

Этот скрипт просканирует диапазон IP-адресов, указанных в переменной ip_range, на наличие портов, указанных в списке ports. Он отправит пакет TCP SYN на каждый IP-адрес и порт и проверит наличие ответа. Если ответ получен, он напечатает сообщение, указывающее, что порт открыт.

Пример: Трассировка

Scapy также можно использовать для выполнения трассировки. Вот пример того, как вы можете использовать Scapy для выполнения трассировки к целевому хосту:

from scapy.all import *

# Define the target host
target_host = "www.example.com"
# Set the maximum number of hops
max_hops = 30
# Set the timeout value
timeout = 2
# Set the starting TTL value
ttl = 1
# Set a flag to indicate if the target host has been reached
reached = False
# Perform the traceroute
while not reached and ttl <= max_hops:
    # Send an ICMP packet with the current TTL value
    response = sr1(IP(dst=target_host, ttl=ttl)/ICMP(), timeout=timeout)
    # If a response is received, print the IP address of the responding host
    if response is not None:
        print(f"Hop {ttl}: {response.src}")
        # If the responding host is the target host, set the reached flag to True
        if response.src == target_host:
            reached = True
    # If no response is received, print "*"
    else:
        print(f"Hop {ttl}: *")
    # Increment the TTL value
    ttl += 1
# Print a message if the target host was not reached
if not reached:
    print(f"Target host {target_host} not reached")

Этот скрипт выполнит трассировку к целевому хосту, указанному в переменной target_host. Он отправит ICMP-пакет с увеличивающимися значениями TTL и будет ждать ответа. Если ответ получен, он напечатает IP-адрес отвечающего хоста. Если ответ не получен, он напечатает *. Трассировка будет продолжаться до тех пор, пока не будет достигнут целевой хост или не будет достигнуто максимальное количество переходов.
Пример: обнаружение сети

Scapy также можно использовать для обнаружения сети, например, для обнаружения хостов и устройств в сети. Вот пример того, как вы можете использовать Scapy для обнаружения сети с использованием протокола ARP:

from scapy.all import *

# Define the range of IP addresses to scan
ip_range = "192.168.1.1/24"
# Send an ARP request to each IP address in the range
for ip in IPNetwork(ip_range):
    response = sr1(ARP(pdst=str(ip)), timeout=1, verbose=0)
    # If a response is received, print the IP and MAC addresses of the responding host
    if response is not None:
        print(f"Host {response.psrc} has MAC address {response.hwsrc}")

Этот скрипт будет сканировать диапазон IP-адресов, указанных в переменной ip_range, и отправлять ARP-запрос на каждый адрес. Если ответ получен, он напечатает IP- и MAC-адреса отвечающего хоста.

Заключение

Scapy — это мощная и гибкая библиотека Python для работы в сети и управления пакетами. Он предоставляет широкий спектр функций и классов для создания пакетов и управления ими, отправки и получения пакетов по сети и выполнения различных задач, таких как сканирование, трассировка и обнаружение сети. Если вам нужно выполнить какую-либо из этих задач в своих сценариях Python, определенно стоит рассмотреть Scapy.