วิธีจับภาพ ack หรือ syn packets โดย Tcpdump


48

ฉันต้องการใช้กฎตัวกรองเพื่อจับ ack หรือแพ็กเก็ต syn เท่านั้น ฉันจะทำสิ่งนี้ได้อย่างไร


ส่วนตัวฉันจะไม่ทำเช่นนี้ ฉันจะจับแพ็คเก็ตทั้งหมดแล้วกรองที่ธง SYN และ ACK ในภายหลัง หากคุณกำลังแก้ไขปัญหา TCP คุณต้องการเห็นการสนทนาทั้งหมดไม่ใช่แค่การจับมือหรือ ACK หากคุณไม่สนใจข้อมูลที่บรรจุจริงคุณสามารถ จำกัด ขนาดของแพ็คเก็ตtcpdump -s SIZEได้ ส่วนหัวของ TCP อาจมีความยาวผันแปรได้ดังนั้นการจับ-s 128อาจจะได้รับส่วนหัวที่เป็นไปได้ทั้งหมดและอาจมีข้อมูลเล็กน้อย
suprjami

4
บางทีคุณอาจไม่ได้แก้ปัญหา TCP บางทีคุณอาจต้องการดูว่าโปรแกรมช่างพูดช่างเป็นอย่างไรและคุณต้องการนับการเชื่อมต่อขาออก ชอบฉันตอนนี้
Dan Pritts

คำตอบ:


81

ไวยากรณ์กรอง pcapใช้สำหรับ tcpdump ควรจะทำงานตรงเช่นเดียวกับใน Wireshark กรองการจับภาพ

ด้วย tcpdump ฉันจะใช้ตัวกรองแบบนี้

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

ตรวจสอบหน้า man tcpdumpและใส่ใจกับ tcpflags

อย่าลืมตรวจสอบส่วนต่างๆใน Wireshark Wiki เกี่ยวกับตัวกรองการจับภาพและการแสดงผล น่าเสียดายที่ตัวกรองทั้งสองประเภทใช้ไวยากรณ์ที่แตกต่างกันโดยสิ้นเชิงและชื่อที่ต่างกันสำหรับสิ่งเดียวกัน

หากคุณต้องการตัวกรองการแสดงผลแทนตัวกรองการจับคุณอาจจะต้องสร้างการแสดงออกรวม tcp.flags.ack และ tcp.flags.syn ฉันคุ้นเคยกับตัวกรองการจับภาพมากขึ้นดังนั้นคุณจะต้องทำงานด้วยตัวคุณเอง


1
ฉันชอบคำตอบของคุณดีกว่า ดูเหมือนคุณจะพยายามแล้ว โหวตให้คุณ
Ablue

4
นี่เป็นคำตอบที่ดีพร้อมการอ้างอิงที่ดี แต่โปรดทราบว่าไวยากรณ์นี้จะจับแพ็คเก็ตใด ๆ ที่มีการตั้งค่าสถานะ SYN หรือ ACK แม้ว่าจะตั้งค่าสถานะอื่นแล้วก็ตาม นี่อาจเป็นสิ่งที่ OP ตั้งใจจะทำหรือไม่ก็ได้ โปรดดูคำตอบของฉันด้านล่างสำหรับตัวกรองที่เข้มงวดยิ่งขึ้นหากต้องการเพียงแพ็กเก็ต TCP SYN หรือ ACK เท่านั้น ไชโย
JJC

14

ในขณะที่คำตอบของ @ Zoredache นั้นดีและสมบูรณ์โปรดทราบว่าไวยากรณ์จะให้ผลลัพธ์แพ็กเก็ตใด ๆ ที่มี TCP SYN หรือชุดแฟล็ก TCP ACK รวมถึงแพ็กเก็ตที่ไม่ได้เป็นเพียงแค่แพ็คเก็ต "TCP SYN" หรือ "TCP ACK" เท่านั้นยังมีชุดธงอื่น ๆ นี่อาจเป็นสิ่งที่คุณตั้งใจ (หรือผู้อ่านในอนาคต) ยกตัวอย่างเช่นไวยากรณ์ที่ยังจะจับแพ็กเก็ต TCP SYN-ACK, TCP FIN-ACK ฯลฯ หากคุณต้องการเพียง TCP SYN หรือ TCP ACK แพ็คเก็ต (เช่นเพียงหนึ่งของธงที่ได้ระบุ) ไวยากรณ์จับตัวกรองที่เหมาะสมคือ:

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

เท่า:

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

ไชโย!


9

ฉันสร้างสคริปต์เพื่อดู "ซินเนอร์" อันดับต้น ๆ เพื่อที่ฉันจะพิจารณาเพียงเริ่มต้นแพ็คเก็ต syn (แพ็คเก็ตแรกของการจับมือแพ็กเก็ตสาม) นั่นคือ 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

5
นั่นเป็นตัวอย่างที่ดี คุณสามารถทำให้ตัวกรองการจับภาพ tcpdump ของคุณง่ายยิ่งขึ้นโดยแทนที่ "'tcp [tcpflags] & (tcp-syn)! = 0' และ 'tcp [tcpflags] & (tcp-ack) == 0'" เพียงแค่ 'tcp [tcpflags] ] == tcp-syn ' สิ่งนั้นจะแยกแพ็คเก็ตโดยอัตโนมัติด้วยชุด ACK ไชโย!
JJC

9
tcpdump 'tcp[13] = 3'

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

สูง

นอกจากนี้คุณยังสามารถกรองตามส่วนที่ระบุของแพ็คเก็ตเช่นเดียวกับการรวมหลายเงื่อนไขเป็นกลุ่ม ตัวอย่างก่อนหน้านี้มีประโยชน์เมื่อค้นหาเฉพาะSYNs หรือ s เท่านั้นRSTและตัวหลังสำหรับการแยกการรับส่งข้อมูลขั้นสูงยิ่งขึ้น

UAP RSF

[คำแนะนำ: แอนนาแกรมสำหรับแฟล็ก TCP: Unskilled Attackers Pester Real Security Folk]

บันทึกของคุณ: ...

แสดงให้ฉันเห็นทุกURGแพ็กเก็ตด่วน ( )

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

แสดงACKแพ็กเก็ตACKNOWLEDGE ( ) ทั้งหมดให้ฉันดู...

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

แสดงPSHแพ็กเกจPUSH ( ) ทั้งหมดให้ฉันดู...

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

แสดงให้ฉันเห็นทุกRSTแพ็กเก็ตRESET ( ) ...

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

แสดงให้ฉันเห็นทุกชุดข้อมูลซิงโครไนซ์ ( SYN)

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

แสดงให้ฉันเห็นทั้งหมดFINแพ็คเก็ตFINISH ( ) ...

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

แสดงให้ฉันเห็นทั้งหมดSYNACKแพ็คเก็ตซิงโครไนซ์ / ACKNOWLEDGE ( ) ...

tcpdump 'tcp[13] = 18'

[ หมายเหตุ:เฉพาะPSH, RST, SYNและFINธงจะปรากฏในการส่งออกข้อมูลธง tcpdump ของ URGs และACKs จะปรากฏขึ้น แต่จะปรากฏที่อื่นในผลลัพธ์มากกว่าในฟิลด์ธง]


2
โจรกรรมทางวรรณกรรมไม่ได้ช่วยในการแลกเปลี่ยนชุด โปรดแก้ไขโพสต์นี้เพื่อให้ชัดเจนว่าคุณได้คัดลอกเนื้อหาจากเว็บไซต์ที่เชื่อมโยง ขอขอบคุณ.
Chris S

4

ฉันต้องการได้รับแพ็คเก็ต SYN เท่านั้นฉันใช้คำสั่งต่อไปนี้:

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

มันควรจะทำงานให้คุณในทันที


3
สิ่งนี้จะจับแพ็คเก็ตใด ๆ ด้วยชุดธง SYN รวมถึง SYN, SYN-ACK ฯลฯ หากคุณต้องการเพียงแพ็คเก็ต SYN ให้ใช้ 'tcp [13] == 2' แทน ไชโย!
JJC

1

ควรแสดงโดยไม่มีตัวกรองหรืออาร์กิวเมนต์ใด ๆ


คำตอบของคุณถูกต้องทางเทคนิค แต่ OP อาจหมายถึงการรวมคำว่า "เท่านั้น" ในคำถามของเขา ;-) ไชโย!
JJC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.