Sniffer: программа для анализа трафика в сети
Sniffer (или сниффер) – это программа или устройство, используемое для перехвата, анализа и записи сетевого трафика. Сниффер может использоваться для различных целей, таких как обнаружение сетевых атак, диагностика проблем с сетевыми приложениями и профилирование сетевых протоколов.
Например, при помощи сниффера можно анализировать сетевой трафик, который проходит через локальную сеть, и выявить любые проблемы в работе сетевых приложений. Снифферы также используются в информационной безопасности для обнаружения сетевых атак, таких как атаки типа man-in-the-middle, ARP-отравление и другие.
Пример кода для создания сниффера на языке Python:
python
import socket
import struct
import textwrap
# функция для разбора Ethernet-кадров
def ethernet_frame(data):
dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]
# функция для разбора MAC-адресов
def get_mac_addr(bytes_addr):
bytes_str = map('{:02x}'.format, bytes_addr)
return ':'.join(bytes_str).upper()
# функция для разбора IP-пакетов
def ipv4_packet(data):
version_header_length = data[0]
version = version_header_length >> 4
header_length = (version_header_length & 15) * 4
ttl, proto, src, target = struct.unpack('! 8x B B 2x 4s 4s', data[:20])
return version, header_length, ttl, proto, ipv4(src), ipv4(target), data[header_length:]
# функция для преобразования IP-адресов
def ipv4(addr):
return '.'.join(map(str, addr))
# функция для разбора TCP-сегментов
def tcp_segment(data):
(src_port, dest_port, sequence, acknowledgement, offset_reserved_flags) = struct.unpack('! H H L L H', data[:14])
offset = (offset_reserved_flags >> 12) * 4
flag_urg = (offset_reserved_flags & 32) >> 5
flag_ack = (offset_reserved_flags & 16) >> 4
flag_psh = (offset_reserved_flags & 8) >> 3
flag_rst = (offset_reserved_flags & 4) >> 2
flag_syn = (offset_reserved_flags & 2) >> 1
flag_fin = offset_reserved_flags & 1
return src_port, dest_port, sequence, acknowledgement, flag_urg, flag_ack, flag_psh, flag_rst, flag_syn, flag_fin, data[offset:]
# создание сокета для приема сетевых пакетов
conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
raw_data, addr = conn.recvfrom(65535)
dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
print('\nEthernet Frame:')
print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, src_mac, eth_proto))
if eth_proto == 8:
(version, header_length, ttl, proto, src, target, data) = ipv4_packet(data)
print('IPv4 Packet:')
print('Version: {}, Header Length: {}, TTL: {}'.format(version, header_length, ttl))
print('Protocol: {}, Source: {}, Target: {}'.format(proto, src, target))
if proto == 6:
(src_port, dest_port, sequence, acknowledgement, flag_urg, flag_ack, flag_psh, flag_rst, flag_syn, flag_fin, data) = tcp_segment(data)
print('TCP Segment:')
print('Source Port: {}, Destination Port: {}'.format(src_port, dest_port))
print('Sequence: {}, Acknowledgement: {}'.format(sequence, acknowledgement))
print('Flags:')
print('URG: {}, ACK: {}, PSH: {}, RST: {}, SYN: {}, FIN: {}'.format(flag_urg, flag_ack, flag_psh, flag_rst, flag_syn, flag_fin))
print('Data:')
print(textwrap.indent(data.hex(), ' '))
Этот код создает сокет для приема TCP-пакетов и выводит данные Ethernet-, IPv4- и TCP-уровней для каждого полученного пакета. Кроме того, он позволяет просмотреть содержимое данных TCP-сегмента.