WedX - журнал о программировании и компьютерных науках

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

Я хочу сделать сниффер пакетов в Python 3.5, который захватывает UDP, TCP и ICMP. Это краткий пример:

 import socket
 import struct

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())
# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

s.bind((HOST,0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a package
n=1
while(n<=400):
    print('Number ', n)
    data=s.recvfrom(65565)
    packet=data[0]
    address= data[1]
    header=struct.unpack('!BBHHHBBHBBBBBBBB', packet[:20])
    if(header[6]==6): #header[6] is the field of the Protocol
        print("Protocol = TCP")
    elif(header[6]==17):
        print("Protocol = UDP")
    elif(header[5]==1):
        print("Protocol = ICMP") 
    n=n+1

Проблема в том, что он захватывает только UDP-пакеты :( Вывод:

Number  1 Protocol = UDP Number  2 Protocol = UDP Number  3 Protocol = UDP Number  4 Protocol = UDP Number  5 Protocol = UDP Number  6 Protocol = UDP Number  7

Есть 2 варианта:

  • Сниффер может перехватывать только UDP-пакеты.
  • Я просто получаю UDP-пакеты.

Я думаю, что наиболее логичный ответ - мой сниффер работает некорректно и просто перехватывает UDP. Любая идея?


  • Бьюсь об заклад, Scapy лучше подходит для этой работы, чем модуль сокета. Это намного удобнее для сниффинга пакетов. 04.06.2016
  • Какую платформу вы используете? В Unix / Linux вам, как правило, необходимо иметь root-доступ для захвата каждого пакета. 05.06.2016
  • @HughFisher Я использую Windows 7 с PyDev и Eclipse. Я выполняю eclipse как администратор. 05.06.2016

Ответы:


1

Я сам нахожусь на этапе создания парсера / сниффера пакетов Python, и в своем исследовании я обнаружил, что для того, чтобы иметь возможность анализировать все входящие пакеты, такие как TCP, ICMP, UDP, ARP и т. Д., Вы не должны использовать нижеприведенный сокет введите, потому что socket.IPPROTO_IP выдает только IP-пакеты и является фиктивным протоколом

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

скорее вы должны использовать это и лучше всего работает с системами Linux

s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
18.03.2017
  • @E. Уильямс Возможно, это немного обыденное исправление, но я думаю, вам следует использовать PF_PACKET (семейство протоколов) вместо AF_PACKET (семейство адресов), потому что вы пытаетесь управлять сокетом, а не типом адреса. Это также может уменьшить проблемы при создании пакетов для альтернативных операционных систем. Просто предложение. 25.09.2017

  • 2

    Вы используете "gethostbyname", и этот метод получает один из всех IP-адресов вашего компьютера. Вместо этого метода вы должны использовать «gethostbyname_ex», который получает список с несколькими адресами. Вы должны выбрать адрес, используемый для браузера, и вы будете захватывать пакеты TCP, UDP и ICMP.

    18.07.2018
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]