Obtener TCP Banderas con Scapy

Estoy analizando un archivo PCAP y necesito extraer indicadores TCP (SYN, ACK, PSH, URG, …). Estoy usando el packet['TCP'].flags Valor de los packet['TCP'].flags para obtener todos los indicadores a la vez.

 pkts = PcapReader(infile) for p in pkts: F = bin(p['TCP'].flags) print F, bin(F), p.summary() # manual flags extraction from F 

¿Hay alguna forma de obtener un solo indicador TCP sin extraerlo manualmente del packet['TCP'].flags

Normalmente, la forma habitual de manejar FLAGS es con un bitmap y operadores a nivel de bits. Si su clase de Packet no tiene un método específico para probar las banderas, lo mejor que puede hacer IMHO es:

 FIN = 0x01 SYN = 0x02 RST = 0x04 PSH = 0x08 ACK = 0x10 URG = 0x20 ECE = 0x40 CWR = 0x80 

Y pruébalos así:

 F = p['TCP'].flags # this should give you an integer if F & FIN: # FIN flag activated if F & SYN: # SYN flag activated # rest of the flags here 

Lamentablemente, Python no tiene una statement de switch para hacer esto más elegante, pero en realidad no importa mucho.

¡Espero que esto ayude!

Puedes usar el método Packet.sprintf() :

 >>> p = IP()/TCP(flags=18) >>> p.sprintf('%TCP.flags%') 'SA' 

Si desea los nombres “largos”, use una expresión dict lugar de una larga ifelif … (los dict se usan a menudo en Python cuando usaría un switch en otros idiomas):

 >>> flags = { 'F': 'FIN', 'S': 'SYN', 'R': 'RST', 'P': 'PSH', 'A': 'ACK', 'U': 'URG', 'E': 'ECE', 'C': 'CWR', } >>> [flags[x] for x in p.sprintf('%TCP.flags%')] ['SYN', 'ACK'] 

Otra opción, para el registro, que no existía en el momento en que se hizo esta pregunta. Funciona con la versión de desarrollo actual de Scapy (la primera versión que incluye este cambio será 2.4.0; 2.4.0rc * también lo incluye).

Ahora puedes usar str() en el valor del indicador:

 >>> p = IP()/TCP(flags=18) >>> p[TCP].flags  >>> str(p[TCP].flags) 'SA' 

Esto también funciona.

 if packet[TCP].flags.F: print('FIN received')