tcpdump
tcpdump 可用來擷取通過某網路介面的封包。(需有 root 權限!)
這個很久以前上課就有教了,但都沒啥用到!最近因為要查 Mail Server 為啥無法寄信,才又重新上網找了一下相關資料。
參考:鳥哥、Tsung Blog、510CTO
基本選項有:
.-n:以數字顯示,不對 IP 作反解,但仍顯示服務名稱。
.-nn:直接以 IP 及 port number 顯示,而非主機名與服務名稱。
.-p:不要以 promiscuous mode 執行。
.-t:不要顯示 timestamp。
.-i:指令要監控的網路介面,如 eth0、lo、any 等。
.-e:使用資料連接層 (OSI 第二層) 的 MAC 封包資料來顯示。
.-c:監聽的封包數,如果沒有這個參數,tcpdump 會持續不斷的監聽,直到使用者輸入 [ctrl]-c 為止。
.-q:僅列出較為簡短的封包資訊,每一行的內容比較精簡。
.-s:抓比較長的 data 做一筆記錄。
.-v:輸出一個稍微詳細的資訊,例如在 IP 封包中可以包括 ttl 和服務類型的資訊。
.-A:封包的內容以 ASCII 顯示,通常用來捉取 WWW 的網頁封包資料。
.-X:可以列出十六進位 (hex) 以及 ASCII 的封包內容,對於監聽封包內容很有用。
.-w:如果你要將監聽所得的封包資料儲存下來,用這個參數就對了!後面接檔名。
.-r:從後面接的檔案將封包資料讀出來。那個『檔案』是已經存在的檔案,並且這個『檔案』是由 -w 所製作出來的。
《範例》 tcpdump -nn -i eth0
可指定條件式要求 tcpdump 只擷取某些封包。
條件式可以是單一的『基本條件式(primitives)』,
或用 and(&&),or(||),not(!) 以及『(』、『)』組合基本條件式而成。
常用的『基本條件式(primitives)』:
host 192.168.0.254 | 來源或目的 IP 是 192.168.0.254 |
src host 192.168.0.254 | 來源 IP 是 192.168.0.254 |
dst host 192.168.0.254 | 目的 IP 是 192.168.0.254 |
ether host aa:bb:cc:dd:ee:ff | 來源或目的 mac address 是 aa:bb:cc:dd:ee:ff |
ether src aa:bb:cc:dd:ee:ff | 來源 mac address 是 aa:bb:cc:dd:ee:ff |
ether dst aa:bb:cc:dd:ee:ff | 目的 mac address 是 aa:bb:cc:dd:ee:ff |
net 192.168.0.0 mask 255.255.255.0 | 來源或目的 IP 在 192.168.0.X 可加上 src 或 dst 做進一步限制 |
net 192.168.0.0/24 | 同上 |
tcp/udp/icmp | 封包內有 tcp/udp/icmp 的資料 |
port domain | 來源或目的 port 為 domain (53) 可加上 src,dst 或 tcp,udp 做進一步限制 |
port 53 | 同上 |
tcp src port smtp | 來源 port 為 TCP/25 |
範例:
tcpdump -i eth0 'tcp'
tcpdump -i eth0 'host 192.168.0.X'
tcpdump -i eth0 'tcp and host 192.168.0.X'
tcpdump -i eth0 'tcp port 22 and host 192.168.0.X'
tcpdump -i eth0 'tcp and (not port 22) and (net 192.168.0.0/24)'
看了鳥哥介紹 -X 的參數,忍不住也來進行個實驗,決定來抓抓 POP3 的封包,我先輸入下列指令來保存封包內容:
# tcpdump -i eth0 -nn -X 'port 110' -w packet
執行後,畫面就不會出現所抓取的封包內容,直接就寫到 packet 這個檔案中。接下來我再執行下列指令來檢視封包內容:
# tcpdump -nnXr packet |less
果不其然,終於也見識到了明碼傳輸的危險性了。
節錄一些「超級詳細 Tcpdump 的用法」的內容
第一種是關於類型的關鍵字,主要包括 host、net、port,例如 host 210.27.48.2,指明 210.27.48.2 是一台主機,net 202.0.0.0 指明 202.0.0.0 是一個網路位址,port 23 指明埠號是 23。如果沒有指定類型,預設的類型是 host。
第二種是確定傳輸方向的關鍵字,主要包括 src、dst、dst or src、dst and src。這些關鍵字指明了傳輸的方向。舉例說明,src 210.27.48.2,指明 IP 封包中來源位址是 210.27.48.2 , dst net 202.0.0.0 指明目的位址是 202.0.0.0。如果沒有指明方向關鍵字,則預設是不分方向(src or dst)。
第三種是協定的關鍵字,主要包括 fddi、ip、arp、rarp、tcp、udp 等類型。fddi指明是在FDDI(光纖分佈式數據介面)上特定的網路協定,實際上它是“ether”的別名,fddi 和 ether 具有類似的來源位址和目的位址,所以可以將 fddi 協議封包當作 ether 的封包進行處理和分析。其他的幾個關鍵字就是指明了擷取的封包協定。如果沒有指定任何協定,則 tcpdump 將會擷取所有協定的封包。
除了這三種類型的關鍵字之外,其他重要的關鍵字如下:gateway、broadcast、less、greater。還有三種邏輯運算,反相運算式 not,!;與運算式 and,&&;或運算式 or,||。這些關鍵字可以組合起來構成強大的組合條件來滿足人們的需要,下面舉幾個例子來說明。
A.想要擷取所有 210.27.48.1 的主機收到的和發出的所有的數據封包:
# tcpdump host 210.27.48.1
B.想要擷取主機 210.27.48.1 和主機 210.27.48.2 或 210.27.48.3 的通信,使用命令:(在命令行中使用小括號時,一定要加跳脫符號\)
# tcpdump host 210.27.48.1 and \( 210.27.48.2 or 210.27.48.3 \)
C.如果想要擷取主機 210.27.48.1 和除了與主機 210.27.48.2 之外所有主機通信的 IP 封包,使用命令:
# tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D.如果想要擷取主機 210.27.48.1 接收或發出的 telnet 封包,使用如下命令:
# tcpdump tcp port 23 host 210.27.48.1
E.對本機的 udp 123 埠號進行監視(123 為 ntp 的服務埠號):
# tcpdump udp port 123
F.系統將只對名稱為 hostname 的主機的通信數據封包進行擷取。主機名可以是本地主機,也可以是網路上的任何一台電腦。下面的命令可以擷取主機 hostname 發送的所有數據封包:
# tcpdump -i eth0 src host hostname
G.下面的命令可以擷取所有送到主機 hostname 的數據封包:
# tcpdump -i eth0 dst host hostname
H.我們還可以擷取通過指定閘道的數據封包:
# tcpdump -i eth0 gateway GatewayIP
I.如果你還想擷取主機指定埠號的 TCP 及 UDP 數據封包,那麼執行以下命令:
# tcpdump -i eth0 host hostname and port 80
J.如果我們只需要列出送到 80 埠號的數據封包,用 dst port;如果我們只希望看到返回 80 埠號的數據封包,用 src port。
# tcpdump -i eth0 host hostname and dst port 80 目的埠號是 80
或者
# tcpdump -i eth0 host hostname and src port 80 來源埠號是80,一般是提供 HTTP 服務的伺服器
K.如果條件很多的話,要在條件之前加 and 或 or 或 not
# tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80