¿Cómo puedo filtrar un archivo pcap por protocolo específico usando Python?
filter scapy (8)
Tengo algunos archivos pcap y deseo filtrar por protocolo, es decir, si deseo filtrar por protocolo HTTP, todo lo que no sean paquetes HTTP permanecerá en el archivo pcap.
Hay una herramienta llamada openDPI , y es perfecta para lo que necesito, pero no hay envoltorio para el lenguaje Python.
¿Alguien sabe algún módulo de Python que pueda hacer lo que necesito?
Gracias
Editar 1:
El filtrado HTTP fue solo un ejemplo, hay muchos protocolos que quiero filtrar.
Editar 2:
Intenté Scapy, pero no entiendo cómo filtrar correctamente. El filtro solo acepta la expresión del filtro de paquetes de Berkeley, es decir, no puedo aplicar un msn o HTTP u otro filtro específico de la capa superior. ¿Alguien puede ayudarme?
Prueba pylibpcap .
tal vez esto puede ayudar a Scapy ?
Algo a lo largo de las líneas de
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)
utilizando
Un ejemplo rápido usando Scapy, ya que acabo de escribir uno:
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)
Eso filtrará los paquetes que no son HTTP ni SMTP. Si desea todos los paquetes pero HTTP y SMTP, la tercera línea debe ser:
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)
para filtrar un protocolo específico, debe realizar un análisis por paquete; de lo contrario, podría perder algo del tráfico http en un puerto no convencional que fluye en su red. por supuesto, si quiere un sistema flexible, puede verificar el número de puerto de origen y de destino, pero eso no le dará resultados exactos. debe buscar características específicas de un protocolo como GET, POST, HEAD, etc. palabras clave para HTTP y otros para otro protocolo y verificar cada paquete TCP.
Sé que esta es una pregunta muy vieja, pero la encontré y pensé que iba a dar mi respuesta. Este es un problema que he encontrado varias veces a lo largo de los años, y sigo encontrándome a mí mismo retrocediendo a dpkt . Originario de dugsong muy capaz, dpkt es principalmente una biblioteca de creación / análisis de paquetes. Me da la sensación de que el análisis de pcap fue una idea de último momento, pero resultó ser muy útil, porque el análisis de encabezados de pcaps, IP, TCP y TCP es sencillo. ¡Está analizando todos los protocolos de nivel superior que se convierten en el sumidero del tiempo! (Escribí mi propia biblioteca de análisis python pcap antes de encontrar dpkt)
La documentación sobre el uso de la funcionalidad de análisis pcap es un poco delgada. Aquí hay un ejemplo de mis archivos:
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)
Espero que esto ayude al próximo chico a encontrar esta publicación.
sniff admite una opción fuera de línea en la que puede proporcionar el archivo pcap como entrada. De esta forma puede usar las ventajas de filtrado del comando sniff en el archivo pcap.
>>> packets = sniff(offline=''mypackets.pcap'')
>>>
>>> packets
<Sniffed: TCP:17 UDP:0 ICMP:0 Other:0>
Espero que ayude !
He intentado lo mismo con el método @nmichaels, pero se vuelve engorroso cuando quiero iterarlo en múltiples protocolos. Traté de encontrar formas de leer el archivo .pcap y luego filtrarlo, pero no encontré ayuda. Básicamente, cuando uno lee un archivo .pcap no hay función en Scapy que permita filtrar estos paquetes, por otro lado usando un comando como,
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%"))
ayuda a filtrar pero solo mientras inhala.
Si alguien sabe de algún otro método, ¿podemos usar una sintaxis BPF en lugar de la declaración for?