2010年9月19日 星期日

tcpdump

  • 基於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回覆來回應連接請求的封包

Port-mirrored switch

資料出處:O'REILLY 防駭超級工具

沒有留言:

張貼留言