web-dev-qa-db-ja.com

Get TCP Flags with Scapy

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

packet['TCP'].flags値から手動で抽出せずに、単一のTCP=フラグを取得する方法はありますか?

12
auino

通常、FLAGSを処理する通常の方法は、ビットマップおよびビットごとの演算子を使用することです。 Packetクラスにフラグをテストする特定のメソッドがない場合、IMHOで実行できる最善の方法は次のとおりです。

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

そして、次のようにテストします。

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

残念ながら、pythonにはこれをよりエレガントにするswitchステートメントがありませんが、それほど重要ではありません。

お役に立てれば!

13
Paulo Bu

Packet.sprintf()メソッドを使用できます。

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

「長い」名前が必要な場合は、長い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']
13
Pierre

この質問がなされた時には存在していなかった記録のための別のオプション。現在のScapy開発バージョンで動作します(この変更を含む最初のリリースは2.4.0です。2.4.0rc*にも含まれます)。

フラグ値でstr()を使用できるようになりました。

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

これも機能します。

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