使用Scapy获取TCP标志

aui*_*ino 12 python tcp packet-capture scapy packet

我正在解析PCAP文件,我需要提取TCP标志(SYN,ACK,PSH,URG,...).我正在使用该packet['TCP'].flags值一次获取所有标志.

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

有没有办法获得单个TCP标志而无需手动从packet['TCP'].flags值中提取它?

Pau*_* Bu 13

通常,处理FLAGS的常用方法是使用位图和按位运算符.如果你的Packet班级没有特定的方法来测试旗帜,你可以做的最好的事情是恕我直言:

FIN = 0x01
SYN = 0x02
RST = 0x04
PSH = 0x08
ACK = 0x10
URG = 0x20
ECE = 0x40
CWR = 0x80
Run Code Online (Sandbox Code Playgroud)

并像这样测试它们:

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
Run Code Online (Sandbox Code Playgroud)

可悲的是,python没有switch声明使它更优雅,但它并不重要.

希望这可以帮助!


Pie*_*rre 13

您可以使用以下Packet.sprintf()方法:

>>> p = IP()/TCP(flags=18)
>>> p.sprintf('%TCP.flags%')
'SA'
Run Code Online (Sandbox Code Playgroud)

如果你想在"长"的名字,使用dict的,而不是长if... elif...表达式(dict通常在Python中使用时,你会使用switch其他语言):

>>> 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']
Run Code Online (Sandbox Code Playgroud)


Dra*_*orn 7

这也有效。

if packet[TCP].flags.F:
    print('FIN received')
Run Code Online (Sandbox Code Playgroud)