- 基於Unix作業系統的命令列封包嗅探器(Sniffer)
- libacp
- 要捕捉送往主機MAC位址以外的封包,必須啟用網路卡上Promiscuous Mode(混雜模式),這需要superuser/root 的存取權限
- Tcpdump裡所使用的過濾語言被稱為BPF(Berkeley Packet Filtering)
- 要捕捉送往主機MAC位址以外的封包,必須啟用網路卡上Promiscuous Mode(混雜模式),這需要superuser/root 的存取權限
- 使用-i 選項,指定要在哪一個介面上監聽,後面接介面名稱
$ sudo tcpdump –i eth1
- 可以使用any 關鍵字,輕鬆捕捉到進出任何介面的交通流量
$ sudo tcpdump –i any
- 顯示捕捉介面清單,使用-D選項
$ sudo tcpdump –D # 印出的表單中,any是基於Linux的系統,lo為loopback介面
BPF(Berkeley Packet Filtering)
Tcp被執行時,跟在選項後面的任何東西會被視為BPF表達示,由一個或多個原語(primitive)組成,一般由標示符(identifier,名稱或數字)和修飾符(qualifier)組成Type(類型)
定義修飾符參考到哪一種項目
host(主機):定義要捕捉的特定主機,假設協定為ip,因而可以是IP位址或網域名稱$ sudo tcpdump host 10.2.3.4 $ sudo tcpdump host foo.bar.com
net(網路):定義要捕捉的特定網路,如果給定一個位元組,假設為A級網路遮罩,兩個位元組,假設為B級網路遮罩,三個位元組,假設為C級網路遮罩$ sudo tcpdump net 10.1
會比對任何其來源或目的地址符合10.1.x.x的封包- port:定義要捕捉的特定port(TCP或UDP)
$ sudo tcpdump port 80
也支援/etc/services裡的服務
$ sudo tcpdump port ssh
- portrange:定義要捕捉特定port範圍(TCP或UDP)
$ sudo tcpdump portrange 135-139
- Direction(方向):定義要過濾的方向,src(來源位址)
$ sudo tcpdump src net 10.1.1
dst(目的地位址)$ sudo tcpdump dst net 10.1.1
Protocl(協定):定義要過濾的協定
- ether:Ethernet協定選項
- fddi:FDDI協定選項(和Ethernet以相同方式處理)
- tr:TR協定選項
- wlan:無線網路選項
- ip:IP位址
- ip6:IPv6位址
- arp:ARP(Address Resolution Protocol,位址解析協定)選項
- rarp:RARP(Reverse Address Resolution Protocol,反向位址解析協定)選項
- 採用各種不同原語,並且使用Bollean邏輯(and、not、or)結合他們:
$ sudo sudo tcpdump –i eth1 tcp port80 and ether \ host 00:0C:F1:D1:B6:20 #監聽eth1介面偵測由MAC位址為 00:0C:F1:D1:B6:20之系統所傳送接收的HTTP交通量 $ sudo tcpdump –i eth2 not tcp port 22 #捕捉SSH以外的一切
把封包寫到磁區
$ sudo tcpdump –i eth2 –w eth2-all-but-ssh.pcap not tcp port 22 #d寫入選項 –w ,選項後指定黨名,封包被寫入磁碟,而不是顯示在螢幕上 $ sudo tcpdump –s 0 –i eth2 –w eth2-all-but-ssh.pacp not tcp port 22 #預設上tcpdump只檢查每個封包的前68個位元組, #足以取得IP標頭以及ICMP、TCP、UDP或類似標頭, #這是為了節省記憶體(封包緩衝區)。要確保整個封包被捕捉到(包含payload), #使用-s snaplen選項,並把他設成0 $ sudo tcpdump –s 0 –C 100 –I eth2 –w eth2-all-but-ssh.pcap \ not tcp port 22 #-C選項(chunk,資料塊),接受指定檔案大小,若超過指定尺寸, #會開始另一個捕捉檔,直到使用Ctrl-C停止。 #會行程.pcap1、pcap2、pcap3…的錯誤情況 $ sudo tcpdump –s 0 –C 100 –W 10 –I eth2 –w eth2-all-but-ssh.pcap \ not tcp port 22 #選項-C與-W(wrap)相結合,限制有多少個檔案可以被建立, #建立一個循環的緩衝區
進階BPF過濾
BPF支援一些相當複雜及仔細的過濾選項,BPF在tcpdump被執行時行程編譯的虛擬機器,能夠過濾封包並且進行一些非常複雜的相關比較,包括遮罩(masking)或平移(shifting)之類的位元操作。 大多數常用的標頭遮罩(header mask),都是預先處理好的,使用tcpflags和tcp-rst內建的offset/field(偏移/欄位)值,可以過濾TCP標頭$sudo tcpdump –I eth0 ‘tcp[tcpflags] & tcp-rst !=0’ #使用&符號執行邏輯AND,須將表達式封裝在引號裡, #否則命令殼會以不同的方式假讀它
進階頃印顯示
Verbosity(詳細程度)
- -q (Quiet):列印最精簡的協定資訊
- -v (Sligbtly Verbose):IP TTL、IP Identification、IP Length、IP Options被顯示;IP與ICMP校驗和被驗證。若搭配-w選項使用,每10秒會顯示一次封包計數
- -vv (More Verbose):除了-v選項的動作外,TCP和UDP校驗和也會背驗證,應用層(application layer)資料被顯示為常見的本地區域網路協定,例如,NFS、SMB、NBT等等。這只有在-s選項也被使用時才有用
- -vvv (Total Verbosity):除了-vv的動作外,更詳細的協定資料被顯示,像是Telnet選項
Format(格式)
皆須至少搭配使用-v選項 - -A (ASCII):以ASCII格式列印payload資料,這對可列印文字的協定(如HTTP、SMTP、SIP很好),但是對基於二進制的協定(如SMB、ARP、Peer-to-Peer、Chat)則不是這麼好用
- -x (Hex-Only):以十六進制的格式列印payload資料
- -xx (Hex-Wite-Link-Layer):與-x相同,除了它還包含資料鏈結層(link layer)以外,這還清楚顯示第2層細節,像是MAC位址
- -X (Hex-Plus-ASCII):一邊列印十六進制,一邊列印ASCII,可用於查看基於二進制或混合二進制/ASCII的協定時
- -XX (Hex-Plus-ASCII-With-Link-Layer):與-X相同,多包含了資料鏈結層的資料
通常使用tcpdump進行補捉,再透過Wireshark觀看它們
使用tcpdump節取封包
$ sudo tcpdump –r capture.pcap –w http.pcap tcp port 80 #使用-r (read)選項,從pcap節取出所有的HTTP交通流量, #並儲存到另一個新檔案 $ sudo –r port-scan.pcap –w snack-packets.pcap \ ‘tcp[tcpflags] = 0x12’ #從SYN中濾出系統所送回的SNACK封包0x12是ACK位元(高半位元組(high-nibble)的位置1)加上SYN位元(低半位元組(low-nibble)的位置2的值)。測試防火牆時,先依照你喜歡的方式組態防火牆,然後用port scanner測試它,使用上述的BPF,只檢視對port掃描回應為開啟的那些port,再比較掃描器的輸出最後得到內含SNACK封包的packets.pcap,只顯示那些以open connection回覆來回應連接請求的封包
沒有留言:
張貼留言