Bagaimana cara menangkap paket ack atau syn oleh Tcpdump?

48

Saya ingin menggunakan aturan filter untuk menangkap hanya paket ack atau syn. Bagaimana saya melakukan ini?

larry
sumber
Secara pribadi saya tidak akan melakukan ini. Saya akan menangkap semua paket, lalu memfilter pada bendera SYN dan ACK nanti. Jika Anda memecahkan masalah TCP, Anda hampir selalu ingin melihat seluruh percakapan, bukan hanya berjabat tangan atau ACK. Jika Anda tidak tertarik dengan muatan data aktual, Anda dapat membatasi ukuran paket tcpdump -s SIZE. Header TCP bisa panjang variabel, jadi menangkap -s 128mungkin akan mendapatkan semua header yang mungkin dan mungkin sedikit data.
suprjami
4
Mungkin Anda tidak memecahkan masalah TCP. Mungkin Anda ingin melihat seberapa akrab suatu program, dan Anda ingin menghitung koneksi keluarnya. Seperti saya, sekarang.
Dan Pritts

Jawaban:

81

The sintaks pcap filter yang digunakan untuk tcpdump harus bekerja dengan cara yang sama pada wireshark capture filter.

Dengan tcpdump saya akan menggunakan filter seperti ini.

tcpdump "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"

Lihatlah halaman manual tcpdump , dan perhatikan dengan cermat tcpdag.

Pastikan juga untuk memeriksa bagian-bagian dalam Wireshark Wiki tentang menangkap dan menampilkan filter. Sayangnya kedua jenis filter ini menggunakan sintaks yang sama sekali berbeda, dan nama yang berbeda untuk hal yang sama.

Jika Anda menginginkan filter tampilan alih-alih menangkap filter, Anda mungkin perlu membuat ekspresi yang menggabungkan tcp.flags.ack, dan tcp.flags.syn. Saya jauh lebih terbiasa dengan filter tangkap, jadi Anda harus mengatasinya sendiri.

Sakit kepala
sumber
1
Saya lebih menyukai respons Anda. Sepertinya Anda berusaha. Suara positif untuk Anda.
Ablue
4
Ini adalah jawaban yang bagus dengan referensi yang bagus, tetapi harap dicatat bahwa sintaks ini akan menangkap paket yang memiliki flag SYN atau ACK yang ditetapkan, bahkan jika flag lain juga ditetapkan. Ini mungkin atau mungkin bukan yang dimaksudkan OP. Silakan lihat jawaban saya di bawah ini untuk filter yang lebih ketat jika hanya paket TCP SYN atau ACK yang diinginkan. Tepuk tangan.
JJC
14

Walaupun jawaban @ Zoredache bagus dan lengkap, perhatikan bahwa sintaks akan menghasilkan paket yang memiliki set TCP SYN atau flag TCP ACK, termasuk paket yang tidak hanya paket "TCP SYN" atau "TCP ACK", karena mereka juga memiliki set bendera lainnya. Ini mungkin atau mungkin bukan apa yang Anda (atau pembaca masa depan) maksudkan. Misalnya, sintaks itu juga akan menangkap paket TCP SYN-ACK, TCP FIN-ACK, dll. Jika Anda hanya menginginkan paket TCP SYN atau TCP ACK (yaitu HANYA salah satu dari flag yang ditetapkan), sintaksis filter capture yang tepat adalah:

'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'

Setara:

'tcp[13] == 2 or tcp[13] == 16'

Tepuk tangan!

JJC
sumber
9

Saya membuat skrip untuk melihat "synners" teratas. Untuk itu, saya hanya mempertimbangkan paket syn awal (paket pertama dari tiga paket jabat tangan). Yaitu, syn = 1, ack = 0

while :; do
  date; 
  tcpdump -i eth1 -n -c 100 \
  'tcp[tcpflags] & (tcp-syn) != 0' and 
  'tcp[tcpflags] & (tcp-ack) == 0' 2> /dev/null \
  | awk '{ print $3}' \
  | sort | uniq -c | sort | tail -5;
  echo;
  sleep 1
done
edward
sumber
5
Itu contoh yang bagus. Anda dapat menyederhanakan filter tcpdump capture Anda lebih jauh dengan mengganti "'tcp [tcpflags & & (tcp-syn)! = 0' dan 'tcp [tcpflags] & (tcp-ack) == 0'" hanya dengan 'tcp [tcpflags ] == tcp-syn '. Itu akan secara otomatis mengecualikan paket dengan ACK diatur. Tepuk tangan!
JJC
9
tcpdump 'tcp[13] = 3'

http://danielmiessler.com/study/tcpdump/

Maju

Anda juga dapat memfilter berdasarkan bagian tertentu dari paket, serta menggabungkan beberapa kondisi ke dalam grup. Yang pertama berguna ketika mencari hanya SYNs atau RSTs, misalnya, dan yang terakhir untuk isolasi lalu lintas yang lebih maju.

UAP RSF

[Petunjuk: Anagram untuk bendera TCP: Penyerang Tidak Terampil Pester Real Security Folk]

memo Anda: ...

Tunjukkan semua URGpaket URGENT ( ) ...

tcpdump 'tcp[13] & 32 != 0'

Tunjukkan semua ACKpaket ACKNOWLEDGE ( ) ...

tcpdump 'tcp[13] & 16 != 0'

Tunjukkan semua PSHpaket PUSH ( ) ...

tcpdump 'tcp[13] & 8 != 0'

Tunjukkan semua RSTpaket RESET ( ) ...

tcpdump 'tcp[13] & 4 != 0'

Tunjukkan semua SYNpaket SYNCHRONIZE ( ) ...

tcpdump 'tcp[13] & 2 != 0'

Tunjukkan semua FINpaket FINISH ( ) ...

tcpdump 'tcp[13] & 1 != 0'

Tunjukkan semua paket SYNCHRONIZE / ACKNOWLEDGE ( SYNACK) ...

tcpdump 'tcp[13] = 18'

[ Catatan: Hanya PSH, RST, SYN, dan FINbendera ditampilkan dalam output bidang bendera tcpdump ini. URGs dan ACKs ditampilkan, tetapi ditampilkan di tempat lain di output daripada di bidang bendera]

kastet
sumber
2
Plagarisme tidak diperbolehkan di Stack Exchange . Harap edit posting ini untuk memperjelas bahwa Anda telah menyalin konten dari situs tertaut. Terima kasih.
Chris S
4

Saya hanya ingin mendapatkan paket SYN sendiri, saya menggunakan perintah berikut:

tcpdump -i eth7 'tcp[13] & 2 != 0'

Ini seharusnya bekerja untuk Anda secara langsung.

Sidharth
sumber
3
Ini akan menangkap semua paket dengan set flag SYN, termasuk SYN, SYN-ACK, dll. Jika Anda hanya menginginkan paket SYN, gunakan 'tcp [13] == 2' sebagai gantinya. Tepuk tangan!
JJC
1

itu harus menunjukkannya tanpa filter atau argumen.

Ablue
sumber
Jawaban Anda secara teknis benar, tetapi OP mungkin dimaksudkan untuk memasukkan kata "hanya" dalam pertanyaannya. ;-) Ceria!
JJC