2012-08-01 11 views
7

http başlıklarını tcpdump kullanarak yakalamaya çalışıyorum.Tcpdump filtresi ve bit maskelemesini anlama

Bu filtre iyi çalışıyor ama bunu anlayamıyorum - Onu google'dan

(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) 

ama herhangi bir yararlı bilgi Burada

bulamıyorum bütün tcpdump komutu

olduğunu
sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and 
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0 

cevap

15

http başlıklarını alan BPF filtresi değil, tcpdump komutunuzda "-A" anahtarı.

tcpdump komutunuz, tcp trafiğini belirli bir hedefe veya son BPF filtresinin sıfır olmayan bir toplamla sonuçlanan bir hesaplama içerdiği eth0 üzerindeki belirli bir kaynaktan arar. "-A" seçeneğiyle, her paketi ASCII'de bağlantı düzeyi üstbilgisine ek olarak yazdırır.

Aşağıdaki hesaplamayı açıkladım, ancak gerçek filtrede, muhtemelen kopyalama ve yapıştırma yoluyla bazı sorunların olduğuna inanıyorum. Eğer tcpdump bu filtreleri kullandığınızda,

  • ip[2:2]

    iki bayt (yani 3 & 4 bayt) ifade eder bayt sınırları girmeyen alanlar incelerken genellikle kullanılan tcp bit maskeleme, kullandığınız IP başlığında, bayt 2'den başlayarak (ofset 0'da başladığını unutmayın). Bu toplam, IP paketinin maksimum uzunluğunu 65535 bayt olabilecek toplam uzunluğunu temsil eder. Burada bit maskesi için

, netlik için, ben önceden pended '0' öylesine 0xf0x0f olur maske ettik. Masanın üstündeki '0', aşağıdaki GuyHarris'ten gelen yoruma göre düştü.

  • ip[0]&0x0f

    bu genellikle için 4 ile çarpılarak, 32 bitlik kelimeler ve gibi IP başlık uzunluğunu verecek IP başlığındaki 0 ​​baytı ikinci yarısında (yani 1 bayt), değinmektedir böyle bir hesaplama.
  • tcp[12]&0xf0)

    bu genellikle ile çarpılır, 32-bitlik kelimelerle ve bu şekilde TCP başlığının boyutunu belirtir veri alanı ofset byte 12 birinci yarısı (diğer bir deyişle 11 bayt), değinmektedir Böyle bir hesaplama için 4.

Sen

Filtreniz gereken onlar 32 bit/4 bayt kelimelerdir çünkü 4'e son 2 uzunlukları çarpmak gerekiyor ve bu yüzden doğru olduğu hesaplanması için bayt olarak toplam çevrilecek gerek hesaplama: - IP başlık uzunluğunu - (bayt)

  • IP paket uzunluğu, TCP başlık uzunluğu

ve bu değer arayan ze edilmesi Eğer çıkarma gerçekleştirdiğinizde bu

sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

gibi ro, yani bir şey, bir sıfır olmayan toplam arıyoruz.Bu sıfır olmayan toplam, katmanın (4) yukarısında, yani tcp veri yükündeki verilerin, tipik olarak uygulama trafiğinin olduğu anlamına gelir.

Ayrıca, port 80 varsayarak en http trafiği port 80

Böyle bir filtre yaygın ama normal RFC'lere göre olmayan bir SYN, verileri tespit etmek için güvenlik halk tarafından kullanılır bitti eklemek isteyebilirsiniz izin verilir.

'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

TCPIPGuide Btw TCP/IP üzerinde çok iyi, ücretsiz online rehber - yani her şey gibi bir şey olmazdı.

Güncelleme: Guy Harris güncelleme gereği bit maskesi üzerinde 'lider sıfır' bölümünü değiştirin. aynı şey 0xf`

+1

'0x0f' ve '; önde gelen sıfırlar onaltılık değerlerde ihmal edilebilir. Bununla birlikte, kod, önde gelen sıfırlar varsa, daha fazla * açıkça * okuyabilir. '<< 2',' * 4' ile aynıdır; Bununla birlikte, >> 2 ','/2 '(2'ye böl), ki bu yanlıştır - muhtemelen bir yazım hatasıdır. –

+1

Çok çok kapsamlı bir cevap verdiğiniz için teşekkürler! lider sıfır düştü eğer – kingasmk

+1

@GuyHarris thx, ben bu yüzden sadece ben netlik için benim yorum koymak düşündüm emin değildi. İlgili '>> 2'FC * 4'' aynı olmak, ben sadece * 4 'oldukça açıktır 'gibi netlik için 2' >>' dan değiştirdi ve değerlerin farkı açıklamak için gerekli olduğunu hissetti (32 -bit kelimelere göre baytlar) ve '<< 2' yazım hatası ile ilgili şüpheleri ortadan kaldırır. –