說明
TCP協議的Header信息,URG、ACK、PSH、RST、SYN、FIN這6個字段在14字節的位置,對應的是tcp[13],因為字節數是從[0]開始數的,14字節對應的就是tcp[13],因此在抓這幾個標志位的數據包時就要明確范圍在tcp[13]
示例1
??抓取?eth0
?網卡上所有?SSH(端口 22)
?的?SYN
?包(TCP 連接請求包),但不包含?SYN-ACK
?包(即僅抓取初始的?SYN
?請求)。?
tcpdump ?-i ?eth0 ?port 22 ?and 'tcp[13] & 2 !=0' and 'tcp[13] & 16=0' -n
-
??
-n
??-
不將 IP 地址和端口號解析為主機名和服務名(直接顯示數字形式,提高抓包效率)。
-
-
??
-i eth0
??-
指定抓取?
eth0
?網卡上的流量。
-
-
??
port 22
??-
只抓取 ??SSH(端口 22)?? 相關的流量。
-
-
??
'tcp[13] & 2 != 0'
??-
檢查 TCP 頭部第 14 字節(
tcp[13]
,因為字節從 0 開始計數)的第 2 位(SYN
?標志位),2是SYN置1時對應的10進制數字 -
& 2
?是位運算,檢查?SYN
?位是否被置 1。 -
!= 0
?表示?SYN
?標志位為 1(即該包是 ??SYN 包??)。
-
-
??
'tcp[13] & 16 = 0’
??-
檢查 TCP 頭部第 14 字節的第 5 位(
ACK
?標志位)。 -
& 16
?是位運算,檢查?ACK
?位是否被置 1,ACK置1時對應的10進制數字就是16 -
= 0
?表示?ACK
?標志位為 0(即該包 ??不是 ACK 包??)。
-
示例2
看下面這個例子,只抓syn+ack的包
tcpdump -ni eth0 port 22 and 'tcp[13] & 18 = 18'??
1. ‘tcp[13] & 18 =18’
tcp[13]表示第14個字節,二進制表示為 11 11 11 11
第一個18表示syn與ack同時置1的10進制,對應的二進制是 00 01 00 10
這兩者進行與運算,11 11 11 11 & 00 01 00 10 = 00 01 00 10 換算成10進制就是18
2. 上步說明中的00 01 00 10分別代表什么意思,我們再進一步說明
第一個00 表示保留位,8位一字節,標志位只有6個因此要增加兩個0湊成一個字節
01 其中0便是URG、1是ACK
00 表示PSH、RST都置0
10 表示SYN置1,FIN置0
3. 為什么??'tcp[13] & 18 != 0' 不僅能抓到syn+ack的包還能抓到很多其他包
原因是 & 18表示的是syn或者ack至少一個置1,因此抓到的包比較寬泛,包括syn、syn+ack、ack