Как я могу отфильтровать файл pcap по определенному протоколу, используя python? - PullRequest
11 голосов
/ 11 февраля 2010

У меня есть несколько файлов pcap, и я хочу фильтровать по протоколу, то есть, если я хочу фильтровать по протоколу HTTP, в файле pcap останется все, кроме пакетов HTTP.

Существует инструмент под названием openDPI , и он идеально подходит для того, что мне нужно, но нет оболочки для языка Python.

Кто-нибудь знает какие-либо модули Python, которые могут делать то, что мне нужно?

Спасибо

Редактировать 1:

Фильтрация HTTP была только примером, есть много протоколов, которые я хочу отфильтровать.

Редактировать 2:

Я попробовал Scapy, но я не понимаю, как правильно фильтровать. Фильтр принимает только выражение фильтра пакетов Berkeley, то есть я не могу применить msn, HTTP или другой определенный фильтр из верхнего уровня. Кто-нибудь может мне помочь?

Ответы [ 7 ]

15 голосов
/ 30 декабря 2010

Быстрый пример использования Scapy, так как я только что написал один:

pkts = rdpcap('packets.pcap')
ports = [80, 25]
filtered = (pkt for pkt in pkts if
    TCP in pkt and
    (pkt[TCP].sport in ports or pkt[TCP].dport in ports))
wrpcap('filtered.pcap', filtered)

Это отфильтрует пакеты, которые не являются ни HTTP, ни SMTP. Если вы хотите, чтобы все пакеты , но HTTP и SMTP, третья строка должна быть:

filtered = (pkt for pkt in pkts if
    not (TCP in pkt and
    (pkt[TCP].sport in ports or pkt[TCP].dport in ports)))
wrpcap('filtered.pcap', filtered)
13 голосов
/ 09 июля 2011

Я знаю, что это очень старый вопрос, но я просто наткнулся на него и подумал, что дам мой ответ. С этой проблемой я сталкивался несколько раз на протяжении многих лет, и я продолжаю возвращаться к dpkt . Первоначально из очень способной dugsong , dpkt - это, прежде всего, библиотека создания / анализа пакетов. Я понимаю, что разбор pcap был запоздалой мыслью, но он оказался очень полезным, потому что разбор заголовков pcaps, IP, TCP и TCP не вызывает затруднений. Он анализирует все протоколы более высокого уровня, которые становятся временным поглотителем! (Я написал свою собственную библиотеку разбора pyap pcap, прежде чем нашел dpkt)

Документация по использованию функции синтаксического анализа pcap немного тонкая. Вот пример из моих файлов:

import socket
import dpkt
import sys
pcapReader = dpkt.pcap.Reader(file(sys.argv[1], "rb"))
for ts, data in pcapReader:
    ether = dpkt.ethernet.Ethernet(data)
    if ether.type != dpkt.ethernet.ETH_TYPE_IP: raise
    ip = ether.data
    src = socket.inet_ntoa(ip.src)
    dst = socket.inet_ntoa(ip.dst)
    print "%s -> %s" % (src, dst)

Надеюсь, это поможет следующему парню пересечь этот пост!

4 голосов
/ 12 февраля 2010

Что-то вроде

from pcapy import open_offline
from impacket.ImpactDecoder import EthDecoder
from impacket.ImpactPacket import IP, TCP, UDP, ICMP

decoder = EthDecoder()

def callback(jdr, data):
    packet = decoder.decode(data)
    child = packet.child()
    if isinstance(child, IP):
        child = packet.child()
        if isinstance(child, TCP):
            if child.get_th_dport() == 80:
                print 'HTTP'

pcap = open_offline('net.cap')
pcap.loop(0, callback)

с помощью

http://oss.coresecurity.com/projects/impacket.html

3 голосов
/ 24 февраля 2016

sniff поддерживает автономный режим, в котором вы можете предоставить файл pcap в качестве входных данных. Таким образом, вы можете использовать преимущества фильтрации команды sniff для файла pcap.

>>> packets = sniff(offline='mypackets.pcap')
>>>
>>> packets
<Sniffed: TCP:17 UDP:0 ICMP:0 Other:0>

Надеюсь, это поможет!

3 голосов
/ 11 февраля 2010

Попробуйте pylibpcap .

1 голос
/ 30 августа 2012

Я попробовал то же самое, используя метод @nmichaels, но он становится громоздким, когда я хочу повторить его по нескольким протоколам. Я попытался найти способы прочитать файл .pcap, а затем отфильтровать его, но не нашел помощи. По сути, когда кто-то читает файл .pcap, в Scapy нет функции, которая позволяла бы фильтровать эти пакеты, с другой стороны, с помощью такой команды, как

a=sniff(filter="tcp and ( port 25 or port 110 )",prn=lambda x: x.sprintf("%IP.src%:%TCP.sport% -> %IP.dst%:%TCP.dport%  %2s,TCP.flags% : %TCP.payload%"))

помогает фильтровать, но только во время прослушивания.

Если кто-нибудь знает какой-либо другой метод, где мы можем использовать синтаксис BPF вместо оператора for?

1 голос
/ 21 мая 2011

для фильтрации / вывода конкретного протокола, который вы должны выполнить для анализа каждого пакета, в противном случае вы можете пропустить некоторый http-трафик через нестандартный порт, который течет в вашей сети. Конечно, если вам нужна свободная система, вы можете проверить только номер порта источника и назначения, но это не даст вам точных результатов. вам нужно искать особые свойства протокола, такие как ключевые слова GET, POST, HEAD и т. д. для HTTP и другие для другого протокола, и проверять каждый TCP-пакет.

...