2016-12-27 18 views
3

http://allanrbo.blogspot.in/2011/12/raw-sockets-with-bpf-in-python.htmlからコードを取得しました。それが正常に動作しますが、私はポート90008022のような複数のTCPポート上のトラフィックを盗聴したい...複数のTCPポートのパケットを盗聴するためのPythonのBPF

だから私は事は、それは時々、あるブロー

filters_list = [ 
    # Must have dst port 67. Load (BPF_LD) a half word value (BPF_H) in 
    # ethernet frame at absolute byte offset 36 (BPF_ABS). If value is equal to 
    # 67 then do not jump, else jump 5 statements. 
    bpf_stmt(BPF_LD | BPF_H | BPF_ABS, 36), 
    bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 9000, 0, 5), <===== Here I added another port 
    bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 80, 0, 5), 


    # Must be UDP (check protocol field at byte offset 23) 
    bpf_stmt(BPF_LD | BPF_B | BPF_ABS, 23), 
    bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 0x06, 0, 3), #<==Changed for TCP "0x06" 

    # Must be IPv4 (check ethertype field at byte offset 12) 
    bpf_stmt(BPF_LD | BPF_H | BPF_ABS, 12), 
    bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 1), 

    bpf_stmt(BPF_RET | BPF_K, 0x0fffffff), # pass 
    bpf_stmt(BPF_RET | BPF_K, 0), # reject ] 

ようfilter_listを変更しました私はコードを完全に理解していませんでした。どんな助け?

答えて

3

私が知る限り、問題は最初の2つの条件ジャンプの論理から来ているようです。具体的に:

bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 9000, 0, 5), # if false, skip 5 instructions 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 80, 0, 5), 

命令bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, <val>, <jtrue>, <jfalse>)だから2行は意味

if value currently in register K is equal to <val> 
    then add <jtrue> to instruction pointer 
     (i.e. skip the next <jtrue> instructions), 
    else add <jfalse> instead` 

を意味します

if port is 9000 
    then if port is 80 
     then go on with checks… 
    else skip 5 instructions (i.e. reject) 
else 
    skip 5 instructions (i.e. pass, as jump offset was not updated from 5 to 6) 

あなたはおそらくより多くのように見える何かしたいものの:

if port is 9000 
    then go on with checks… 
else 
    if port is 80 
     then go on with checks… 
    else reject 

を私はaveのテストが、私はあなたが以下のようにジャンプオフセットを適応させる必要があると言うでしょう、このロジックを取得していない:

bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 9000, 1, 0), # if true skip 1 insn 
               # (i.e. port 80 check) else 0 
               # and check for port 80 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 80, 0, 5), # if true skip 0 else skip 5 
               # (and land on “reject”) 

編集1:をそしてなる3つのポート、フィルタリングする:

bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 8084, 2, 0), # skip the next 2 checks if true 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 9000, 1, 0), # skip the next check if true 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 5), # if true go on else reject 

編集2:も(宛先ポートに加えて)送信元ポートにフィルタを適用するには、あなたがこのような何か(まだ私の側にテストされていない)を試みることができる:

# Load TCP src port into register K, and check port value 
# For packets with IP header len == 20 bytes, TCP src port should be at offset 34 
# We adapt the jump offsets to go to next check if no match (or to “reject” after 
# the last check), or to skip all remaining checks on ports if a match is found. 
bpf_stmt(BPF_LD | BPF_H | BPF_ABS, 34),   # 34 == offset of src port 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 8084, 6, 0), 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 9000, 5, 0), 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 22, 4, 0), 

# As before: if no match on src port, check on dst port 
bpf_stmt(BPF_LD | BPF_H | BPF_ABS, 36), 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 8084, 2, 0), 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 9000, 1, 0), 
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 5), 

… 
+0

答えをありがとう。 2つ以上のポートをフィルタリングする場合、フィルタは何ですか。私は3つのポートを試しました---> 'bpf_jump(BPF_JMP | BPF_JEQ | BPF_K、8084,1,0)、bpf_jump(BPF_JMP | BPF_JEQ | BPF_K、9000,1,0)、bpf_jump(BPF_JMP | BPF_JEQ | BPF_K、22、0 、5)、 '。 Imは '9000'と' 22'のトラフィックしか得ていません。 – Veerendra

+0

@Veerendra:私は3つのポート(まだテストされていませんが、私の答えを編集)。 – Qeole

+0

ありがとう!あなたは私の日を救った:)現在、宛先ポート== '9000'または' 8084'または '22'(私がフィルタに追加したもの)のパケットを取得していますが、興味があるパケットが必要ですports(関心のあるポートは 'source'または' destination'にあります:両方のパケットが必要です!) – Veerendra

関連する問題