史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > Hacker/Cracker 及加解密技術文件
忘記密碼?
註冊帳號 論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2003-10-19, 01:53 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 SNIFF原理解析

一 前言

SNIFF真是一個古老的話題,關於在網路上採用SNIFF來獲取敏感信息已經不是什麼
新鮮事,也不乏很多成功的案例,那麼,SNIFF究竟是什麼呢? SNIFF就是嗅探器,就是
竊聽器,SNIFF靜悄悄的工作在網路的底層,把你的秘密全部記錄下來。看過威爾史密斯
演的《全民公敵》嗎?SNIFF就像裡面精巧的竊聽器一樣,讓你防不勝防。

SNIFF可以是軟體,也可以是硬體,既然是軟體那就要分平台,有WINDOWS下的、UNXI
下的等,硬體的SNIFF稱為網路分析儀,反正不管硬體軟體,目標只有一個,就是獲取在網
絡上傳輸的各種信息。本文僅僅介紹軟體的SNIFF。

當你舒適的坐在家裡,愜意的享受網路給你帶來的便利,收取你的EMAIL,購買你喜歡
的物品的時候,你是否會想到你的朋友給你的郵件,你的信用卡帳號變成了一個又一個的
信息包在網路上不停的傳送著,你是否曾經這些信息包會通過網路流入別人的機器呢?你
的擔憂不是沒有道理的,因為SNIFF可以讓你的擔憂變成實實在在的危險。就好像一個人躲
在你身後偷看一樣。。。。。。



二 網路基礎知識

「網路基礎知識」,是不是聽起來有點跑題了?雖然聽起來這和我們要談的SNIFF沒什麼
關係,可是還是要說一說的,萬丈高樓平地起,如果連地基都沒打好,怎麼蓋樓?!如果你
對網路還不是十分清楚的話,最好能靜下心來好好看看,要知道,這是基礎的基礎,在這裡
我只是簡單的說一下,免得到時候有人迷糊,詳細的最好能夠自己去找書看看。


(1)TCP/IP體系結構

開放系統互連(OSI)模型將網路劃分為七層模型,分別用以在各層上實現不同的功能,
這七層分別為:套用層、表示層、會話層、傳輸層、網路層、資料鏈路層及物理層。而TCP/IP
體系也同樣遵循這七層標準,只不過在某些OSI功能上進行了壓縮,將表示層及會話層合併入
套用層中,所以實際上我們打交道的TCP/IP僅僅有5層而已,網路上的分層結構決定了在各層
上的傳輸協定分佈及功能實現,從而決定了各層上網路設備的使用。實際上很多成功的系統都是基
於OSI模型的,如:如畫格中繼、ATM、ISDN等。

TCP/IP的網路體系結構(部分)


-----------------------------------
| SMTP | DNS | HTTP | FTP | TELNET| 套用層
-----------------------------------
| TCP | UDP | 傳輸層
-----------------------------------
| IP | ICMP | ARP RARP | 網路層
------------------------
| IEEE 802 乙太網 SLIP/PPP PDN etc| 資料鏈路層
-----------------------------------
| 網路卡 電纜 雙絞線 etc | 物理層
-----------------------------------



從上面的圖中我們可以看出,第一層物理層和第二層資料鏈路層是TCP/IP的基礎,而
TCP/IP本身並不十分關心低層,因為處在資料鏈路層的網路設備驅動程式將上層的傳輸協定和
實際的物理接頭隔離開來。網路設備驅動程式位於CD片訪問子層(MAC)。

(2)網路上的設備

中繼器:中繼器的主要功能是終結一個網段的信號並在另一個網段再生該信號,一句話,
就是簡單的放大而已,工作在物理層上。

網 橋:網路橋接使用MAC物理位址實現中繼功能,可以用來分隔網段或連接部分異種網路,工
作在資料鏈路層。

路由器:路由器使用網路層位址(IP,X.121,E.164等),主要負責資料包的路由尋徑,也能
處理物理層和資料鏈路層上的工作。

網 關:主要工作在網路第四層以上,主要實現收斂功能及傳輸協定轉換,不過很多時候網關都
被用來描述任何網路互連設備。

(3)TCP/IP與乙太網

乙太網和TCP/IP可以說是相互相成的,可以說兩者的關係幾乎是密不可分,乙太網在
一二層提供物理上的連線,而TCP/IP工作在上層,使用32位的IP位址,乙太網則使用48位
的MAC位址,兩者間使用ARP和RARP傳輸協定進行相互轉換。從我們上面TCP/IP的模型圖中可以
清楚的看到兩者的關係。

載波監聽/衝突檢測(CSMA/CD)技術被普遍的使用在乙太網中,所謂載波監聽是指在以
太網中的每個站點都具有同等的權利,在傳輸自己的資料時,首先監聽信道是否空閒,如
果空閒,就傳輸自己的資料,如果信道被佔用,就等待信道空閒。而衝突檢測則是為了防
止發生兩個站點同時監測到網路沒有被使用時而產生衝突。乙太網採用廣播機制,所有與
網路連接的工作站都可以看到網路上傳遞的資料。

為了加深你的理解,我們來看看下面的圖,一個典型的在乙太網中客戶與伺服器使用
TCP/IP傳輸協定的通信。


用戶工作 FTP客戶 <-------------------------> FTP伺服器 套用層
| |
內核中的傳輸協定棧 TCP <-------------------------> TCP 傳輸層
| |
內核中的傳輸協定棧 IP <-------------------------> IP 網路層
| |
乙太網驅動程式 <-------------------------> 乙太網驅動程式 資料鏈路層

──────-------------------------------
乙太網



??唆唆了這麼多,有人煩了吧?相信我,這是基礎的基礎,可以說是說得是很簡單拉,
如果需要,拿出個幾十萬字來說上面的內容,我想也不嫌多,好了,讓我們進入下一節,
sniff的原理。



三 SNIFF的原理

要知道在乙太網中,所有的通訊都是廣播的,也就是說通常在同一個網段的所有網路接
口都可以訪問在物理媒體上傳輸的所有資料,而每一個網路接頭都有一個唯一的硬體位址,
這個硬體位址也就是網路卡的MAC位址,大多數系統使用48比特的位址,這個位址用來表示網
絡中的每一個設備,一般來說每一塊網路卡上的MFC位址都是不同的,每個網路卡廠家得到一段
位址,然後用這段位址分配給其生產的每個網路卡一個位址。在硬體位址和IP位址間使用ARP
和RARP傳輸協定進行相互轉換。

在正常的情況下,一個網路接頭應該只回應這樣的兩種資料畫格:

1.與自己硬體位址相匹配的資料畫格。 2.發向所有機器的廣播資料畫格。

在一個實際的系統中,資料的收發是由網路卡來完成的,網路卡接收到傳輸來的資料,網路卡
內的單片程序接收資料畫格的目的MAC位址,根據電腦上的網路卡驅動程式設定的接收模式判
斷該不該接收,認為該接收就接收後產生中斷信號通知CPU,認為不該接收就丟掉不管,所
以不該接收的資料網路卡就截斷了,電腦根本就不知道。CPU得到中斷信號產生中斷,操作
系統就根據網路卡的驅動程式設定的網路卡中斷程序位址使用驅動程式接收資料,驅動程式接收
資料後放入信號堆棧讓操作系統處理。而對於網路卡來說一般有四種接收模式:

廣播方式:該模式下的網路卡能夠接收網路中的廣播信息。 組播方式:設定在該模式下 的網路卡能夠接收組播資料。 直接方式:在這種模式下,只有目的網路卡才能接收該數 據。 混雜模式:在這種模式下的網路卡能夠接收一切通過它 的資料,而不管該資料是否是 傳給它的。

好了,現在我們總結一下,首先,我們知道了在乙太網中是關於廣播方式傳送資料的,也
就是說,所有的物理信號都要經過我的機器,再次,網路卡可以置於一種模式叫混雜模式
(promiscuous),在這種模式下工作的網路卡能夠接收到一切通過它的資料,而不管實際上數
據的目的位址是不是他。這實際上就是我們SNIFF工作的基本原理:讓網路卡接收一切他所能接
收的資料。

(圖一)





我們來看一個簡單的例子,如圖一所顯示,機器A、B、C與集線器HUB相連接,集線器HUB通
過路由器Router訪問外部網路。這是一個很簡單也很一般的情況,比如說在公司大樓裡,我
所在的網路部辦公室裡的幾台機器通過集線器連接,而網路部、開發部、市場部也是同樣如
此,幾個部門的集線器通過路由器連接。還是回到我們的圖一上來,值得注意的一點是機器
A、B、C使用一個普通的HUB連接的,不是用SWITCH,也不是用ROUTER,使用SWITCH和ROUTER
的情況要比這複雜得多。

我們假設一下機器A上的管理員為了維護機器C,使用了一個FTP指令向機器C進行遠端登入,
那麼在這個用HUB連接的網路裡資料走向程序是這樣的。首先機器A上的管理員輸入的登入機
器C的FTP密碼經過套用層FTP傳輸協定、傳輸層TCP傳輸協定、網路層IP傳輸協定、資料鏈路層上的乙太網
驅動程式一層一層的包裹,最後送到了物理層,我們的網線上。接下來資料畫格送到了HUB上,
現在由HUB向每一個接點廣播由機器A發出的資料畫格,機器B接收到由HUB廣播發出的資料畫格,
並檢查在資料畫格中的位址是否和自己的位址相匹配,發現不是發向自己的後把這資料畫格丟棄,
不予理睬。而機器C也接收到了資料畫格,並在比較之後發現是發現自己的,接下來他就對這數
據畫格進行分析處理。

在上面這個簡單的例子中,機器B上的管理員如果很好奇,他很想知道究竟登入機器C上FTP
密碼是什麼?那麼他要做的很簡單,僅僅需要把自己電腦上的網路卡置於混雜模式,並對接收到
的資料畫格進行分析,從而找到包含在資料畫格中的密碼信息。



四 做一個自己的sniff

在上一節裡,我們已經知道了SNIFF的基本原理是怎麼一回事,這一節我們來親自動手做一個
自己的sniff,畢竟,用程序程式碼來說話比什麼都要來得真實,也容易加深理解。

回頭想一想我們上面說的原理,我們要做的事情有幾件:

1. 把網路卡置於混雜模式。 2. 捕獲資料包。 3. 分析資料包。

註:下面的來源碼取至Chad Renfro的<< Basic Packet-Sniffer Construction from the Ground Up>>
一文中
/************************Tcp_sniff_2.c********************/
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include
8.#include
9.#include "headers.h"

#define INTERFACE "eth0"

/*Prototype area*/

10.int Open_Raw_Socket(void);
11.int Set_Promisc(char *interface, int sock);
12.int main() {
13.int sock, bytes_recieved, fromlen;
14.char buffer[65535];
15.struct sockaddr_in from;
16.struct ip *ip;
17.struct tcp *tcp;
18.sock = Open_Raw_Socket();
19. Set_Promisc(INTERFACE, sock);

20. while(1)
22. {
23. fromlen = sizeof from;
24. bytes_recieved = recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen);
25. printf("\nBytes received ::: %5d\n",bytes_recieved);
26. printf("Source address ::: %s\n",inet_ntoa(from.sin_addr));
27. ip = (struct ip *)buffer;
/*See if this is a TCP packet*/
28. if(ip->ip_protocol == 6) {
29. printf("IP header length ::: %d\n",ip->ip_length);
30. printf("Protocol ::: %d\n",ip->ip_protocol);
31. tcp = (struct tcp *)(buffer + (4*ip->ip_length));
32. printf("Source port ::: %d\n",ntohs(tcp->tcp_source_port));
33. printf("Dest port ::: %d\n",ntohs(tcp->tcp_dest_port));
34. }

35. }
36.}
37.int Open_Raw_Socket() {
38. int sock;
39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
/*Then the socket was not created properly and must die*/
40. perror("The raw socket was not created");
41. exit(0);
42. };
43. return(sock);
44. }

45.int Set_Promisc(char *interface, int sock ) {
46. struct ifreq ifr;
47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1);
48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {
/*Could not retrieve flags for the interface*/
49. perror("Could not retrive flags for the interface");
50. exit(0);
51. }
52. printf("The interface is ::: %s\n", interface);
53. perror("Retrieved flags from interface successfully");
54. ifr.ifr_flags |= IFF_PROMISC;
55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) {
/*Could not set the flags on the interface */
56. perror("Could not set the PROMISC flag:");
57. exit(0);
58. }
59. printf("Setting interface ::: %s ::: to promisc", interface);
60. return(0);
61. }

/***********************EOF**********************************/



上面這段程序中有很詳細的註解,不過我想還是有必要說一說,首先
第10行--int Open_Raw_Socket(void); 是我們的自訂函數,具體內容如下:


37.int Open_Raw_Socket() {
38. int sock;
39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
/*Then the socket was not created properly and must die*/
40. perror("The raw socket was not created");
41. exit(0);
42. };
43. return(sock);
44. }




第39行 if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {

這裡我們使用了socket函數,使新增了了一個原始套接頭,使之收到TCP/IP信息包。

接下來第11行-int Set_Promisc(char *interface, int sock),這也是我們的自訂函數,
目的是把網路卡置於混雜模式,具體內容如下:
45.int Set_Promisc(char *interface, int sock ) {
46. struct ifreq ifr;
47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1);
48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {
/*Could not retrieve flags for the interface*/
49. perror("Could not retrive flags for the interface");
50. exit(0);
51. }
52. printf("The interface is ::: %s\n", interface);
53. perror("Retrieved flags from interface successfully");
54. ifr.ifr_flags |= IFF_PROMISC;
55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) {
/*Could not set the flags on the interface */
56. perror("Could not set the PROMISC flag:");
57. exit(0);
58. }
59. printf("Setting interface ::: %s ::: to promisc", interface);
60. return(0);
61. }

首先 struct ifreq ifr; 定一了一個ifrreg的結構ifr,接下來
strncpy(ifr.ifr_name, interface,strnlen(interface)+1);,就是把我們網路設備的名字填
充到ifr結構中,在這裡 #define INTERFACE "eth0" ,讓我們再往下看,
ioctl(sock, SIOCGIFFLAGS, &ifr),SIOCGIFFLAGS請求表示需要獲取接頭標誌,現在到了
第54行,在我們成功的獲取接頭標誌後把他設定成混雜模式,
ifr.ifr_flags |= IFF_PROMISC;ioctl (sock, SIOCSIFFLAGS, &ifr)。OK,現在我們所說的
第一步已經完成--------把網路卡置於混雜模式。

現在進入第二步,捕獲資料包。從第20行開始,我們進入了一個死循環,while(1),在
第24行,recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen),
這個函數要做的就是接收資料,冰把接收到的資料放入buffer中。就是這麼簡單,已經完成了我
們要捕獲資料包的工作。

到了第三步,分析資料包。27行,ip = (struct ip *)buffer,使我們在頭文件中的IP結
構對應於所接收到的資料,接下來判斷在網路層中是否使用的是TCP傳輸協定,
if(ip->ip_protocol == 6) ,如果答案是,tcp信息包從整個IP/TCP包 buffer + (4*ip->ip_length)
位址處開始,所以31行 tcp = (struct tcp *)(buffer + (4*ip->ip_length)),然後對應
結構把你所需要的信息輸出。
/*************************headers.h**************************/
/*structure of an ip header*/
struct ip {
unsigned int ip_length:4; /*little-endian*/
unsigned int ip_version:4;
unsigned char ip_tos;
unsigned short ip_total_length;
unsigned short ip_id;
unsigned short ip_flags;
unsigned char ip_ttl;
unsigned char ip_protocol;
unsigned short ip_cksum;
unsigned int ip_source; unsigned int ip_dest;
};

/* Structure of a TCP header */
struct tcp {
unsigned short tcp_source_port;
unsigned short tcp_dest_port;
unsigned int tcp_seqno;
unsigned int tcp_ackno;
unsigned int tcp_res1:4, /*little-endian*/
tcp_hlen:4,
tcp_fin:1,
tcp_syn:1,
tcp_rst:1,
tcp_psh:1,
tcp_ack:1,
tcp_urg:1,
tcp_res2:2;
unsigned short tcp_winsize;
unsigned short tcp_cksum;
unsigned short tcp_urgent;
};
/*********************EOF***********************************/



從上面的分析我們可以清楚的認識到,認識一個SNIFF需要對TCP/IP傳輸協定有著詳細的瞭解,
否則你根本無法找到你需要的信息。有了上面的基礎,你可以自己來做一個你需要的SNIFF了。


五 常用的SNIFF

很少有原因會讓你自己親自動手來做一個自己的SNIFF,除非你是想瞭解他的原理,或者是
其他一些特別的原因,比如你要在某個特殊的環境攔截一些特殊的資料包。下面我們就來看
看一些在網路上經常使用的SNIFF。

(1)windows環境下

windows環境下當然是大名鼎鼎的netxray以及sniffer pro了,實際上很多人都是用他在
windows環境下抓包來分析,不過我想很少有人笨到去在別人的電腦上安裝一個圖形界面的SNIFF,
除非他和管理員很熟悉........ netxray的使用就不多說了,反正windows下的東西就是
click,click,click,非常的方便用戶。

(2)UNUX環境下

UNUX環境下的sniff可以說是百花齊放,一抓就是一大把,如sniffit,snoop,tcpdump,dsniff
等都是比較一般的,他們都有一個好處就是發佈來源碼,可以讓你研究,當然也都是免費的:)

1. sniffit

sniffit可以執行在Solaris、SGI和Linux等平台上,由Lawrence Berkeley Laboratory 實驗
室開發的一個免費的網路監聽軟體。最近Sniffit 0.3.7也推出了NT版本,並也支持WINDOWS2000.

使用方法:
-v 顯示版本信息
-a 以ASCII形式將監聽的結果輸出。
-A 在進行記錄時,所有不可列印的字串都用替代
-b 等同於同時使用參數-t & -s。
-d 將監聽所得內容以十六進位方式顯示在當前終端
-p 記錄連線到的包,0為所有連接埠。預設為0。
-P protocol 選項要檢查的傳輸協定,預設為TCP。可能的選項有IP、TCP、ICMP、UDP和他們的組合。
-s 指定sniffer 檢查從 傳送的資料包。 -t 指定sniffer 檢查傳送到的資料包。
-i 進入交互模式
-l 設定資料包大小,default是300字元
註:參數可以用@來表示一個IP範圍,比如 -t 192.168.@ -t和-s 只適用於TCP/UDP資料包,對
於ICMP和IP也進行解釋。但如果只選項了-p參數,則只用於TCP和UDP包。

舉例說明:

#sniffit -a -p 21 -t xxx.xxx.xxx.xxx

監聽流向機器xxx.xxx.xxx.xxx的21連接埠(FTP)的信息,並以ASCII顯示

#sniffit -d -p 23 -b xxx.xxx.xxx.xxx

監聽所有流出或流入機器xxx.xxx.xxx.xxx的23連接埠(telnet)的信息,並以16進制顯示

你可以在這裡找到sniffit http://reptile.rug.ac.be/~coder/sniffit/sniffit.html

2. snoop

snoop預設情況安裝在Solaris下,是一個用於顯示網路交通的程序,不過SNIFF是把雙刃劍,
既然管理員能用他來監視自己的網路,當然一個心懷惡意的入侵者也可以用他來SNIFF自己感興
趣的內容。值得一提的是, SNOOP被發現存在一個緩衝區溢出漏洞,當以導致入侵者以執行
snoop(通常為root)的身份遠端進入系統。這是題外話,暫且就此打住。

使用方法:
[ -a ] # Listen to packets on audio
[ -d device ] # settable to le?, ie?, bf?, tr?
[ -s snaplen ] # Truncate packets
[ -c count ] # Quit after count packets
[ -P ] # Turn OFF promiscuous mode
[ -D ] # Report dropped packets
[ -S ] # Report packet size
[ -i file ] # Read previously captured packets
[ -o file ] # Capture packets in file
[ -n file ] # Load addr-to-name table from file
[ -N ] # Create addr-to-name table
[ -t r|a|d ] # Time: Relative, Absolute or Delta
[ -v ] # Verbose packet display
[ -V ] # Show all summary lines
[ -p first[,last] ] # Select packet(s) to display
[ -x offset[,length] ] # Hex dump from offset for length
[ -C ] # Print packet filter code


例如:

#snoop -o saved A B

監聽機器A與B的談話,並把內容存儲於文件saved中



3. tcpdump

tcpdmp也算是一個很有名氣的網路監聽軟體,FREEBSD還把他附帶在了系統上,是一個被
很多UNIX高手認為是一個專業的網路系統管理工具。

使用方法:
tcpdump採用指令行方式,它的指令格式為:
tcpdump [ -adeflnNOpqStvx ][ -c 數量 ][ -F 檔案名 ][ -i 網路接頭 ][ -r 檔案名]
[ -s snaplen ][ -T 類型 ][ -w 檔案名 ][陳述式 ]
1. tcpdump的選項介紹
-a 將網路位址和廣播位址轉變成名字;
-d 將匹配信息包的程式碼以人們能夠理解的彙編格式給出;
-dd 將匹配信息包的程式碼以c語言程序段的格式給出;
-ddd 將匹配信息包的程式碼以十進制的形式給出;
-e 在輸出行列印出資料鏈路層的頭部信息;
-f 將外部的Internet位址以數字的形式列印出來;
-l 使標準輸出變為緩衝行形式;
-n 不把網路位址轉換成名字;
-t 在輸出的每一行不列印時間戳;
-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;
-vv 輸出詳細的報文信息;
-c 在收到指定的包的數目後,tcpdump就會停止;
-F 從指定的文件中讀取陳述式,忽略其它的陳述式;
-i 指定監聽的網路接頭;
-r 從指定的文件中讀取包(這些包一般通過-w選項產生);
-w 直接將包寫入文件中,並不分析和列印出來;
-T 將監聽到的包直接解釋為指定的類型的報文,一般的類型有rpc和snmp

2. tcpdump的陳述式介紹

陳述式是一個正則陳述式,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' ,'||'。



舉例使用:

#tcpdump host AAA.BBB.CCC.DDD

將監聽IP位址為AAA.BBB.CCC.DDD的機器的通話

#tcpdump tcp port 23 host AAA.BBB.CCC.DDD

將監聽IP位址為AAA.BBB.CCC.DDD的機器的23連接埠的通話



4. dsniff

之所以要談談dsniff,是因為他不僅僅是一個sniff,在他的整個套件包中,包含了很多
其它有用的工具,如arpspoof,dnsspoof,macof,tcpkill等等,SNIFF的手段更加的多樣和
複雜化。dsniff是由DugSong開發的你可以在他的主頁上找到這個工具。 目前dsniff支持
OpenBSD (i386), Redhat Linux (i386), 和Solaris (sparc). 並且在FreeBSD, Debian Linux,
Slackware Linux, AIX, 和HP-UX上也能運轉得很好。但是dsniff需要幾個其他的第三方軟體進
行支持,他們分別是,Berkeley DB ,OpenSSL, libpcap, libnet, libnids。如果條件允
許的話,你最好能夠親自讀一讀dsniff的來源碼,你可以在
http://naughty.monkey.org/~dugsong/ 找到dsniff。


六 深入sniff

單純的sniff的功能始終是局限的,所以在大多數的情況下,sniff往往和其他手段結合起來使
用,sniff和spoof已及其他技術手段結合在一起對網路構成的危害是巨大的。單純的sniff好比缺
了一隻腿,無法發揮大的作用,例如在sniff原理一節中我們討論的例子裡,我一再的強調我們使
用的是一個普通的HUB進行連接是有原因的,如果我們把在圖一中的HUB用一個switch替代,那情況
就要複雜一些了,如圖二所顯示:

圖(二)





在圖二中,我們的機器A、B、C與Switch相連接,而Switch通過路由器Router訪問外部網路。我
們先來瞭解Switch的工作原理:

在我們圖一中的 HUB 只是簡單地把所接收到的信號通過所有連接埠(除了信號來的那個口)重複
傳送出去不同,而圖二中的Switch卻可以檢查每一個收到的資料包,並對資料包進行相應的處理。
在Switch內儲存著每一個網段上所有節點的物理位址,只允許必要的網路流量通過Switch。舉例來
說,當Switch接收到一個資料包之後,根據自身儲存的網路位址表檢查資料包內包含的傳送和接收
方位址。如果接收方位於傳送方網段,該資料包就會被Switch丟棄,不能通過交換機傳送到其它的
網段;如果接收方和傳送方位於兩個不同的網段,該資料包就會被Switch轉發到目標網段。這樣,
通過交換機的過濾和轉發,可以有效避免網路廣播風暴,減少誤包和錯包的出現。順便說一句,現在
Switch和HUB的價格相去無幾,所以hub正逐漸被網路交換機取代。

現在回到我們的例子中來,在圖二中仍然和圖一一樣,我們假設機器A上的管理員為了維護機器C,
使用了一個FTP指令向機器C進行遠端登入,那麼在這裡,資料是這樣走的:首先機器A上的管理員輸入
的登入機器C的FTP密碼經過套用層FTP傳輸協定、傳輸層TCP傳輸協定、網路層IP傳輸協定、資料鏈路層上的乙太網
驅動程式一層一層的包裹,最後送到了物理層,我們的網線上。接下來資料畫格送到了Switch上,而
Switch檢查資料畫格中的目的位址,並在他自身儲存的網路位址表中知道了他應該把這資料畫格發到機器
C那裡,於是,接下來機器C接收到了從A發來的信息,發現他是發給自己的信息,於是進行分析處理。

OK,現在我們機器B上的管理員的好奇心只能深深的埋藏在心裡了,因為資料包根本就沒有經過他,
就算他把自己的網路卡設定成混雜模式也是有力無處使。

在瞭解在一個Switch環境下原理後,我們結合一些手段去設法sniff,是的,我們可以做到這一點,
有許多的手段可以讓管理員B滿足他的好奇心,在下面我會提出幾個辦法,當然只是其中的一些辦法
而已。

1 ARP Spoof

在關於IP通信的內部網中,我們可以使用 ARP Spoof 的手段,瞭解什麼是ARP Spoof的前提你先
要明白一下什麼是ARP和RARP傳輸協定,什麼是MAC位址,什麼又是IP位址。ARP傳輸協定是位址轉換傳輸協定,
RARP被稱為反向位址轉換傳輸協定,他們負責把IP位址和MAC位址進行相互轉換對應。

ARP Spoof 攻擊的根本原理是因為電腦中維護著一個 ARP 高速緩衝,並且這個ARP 高速緩衝是
隨著電腦不斷的發出ARP請求和收到ARP回應而不斷的更新的,ARP 高速緩衝的目的是把機器的IP地
址和MAC位址相互映射。你可以使用 arp 指令來檢視你自己的 ARP 高速緩衝。現在設想一下,一個
Switch工作在資料鏈路層,他根據MAC位址來轉發他所接收的資料包,而計算器維護的 ARP 高速緩衝
卻是動態的......你想到什麼了嗎?

為了加深理解,現在給我們的機器編上號,機器A:IP位址為 10.0.0.1 ,MAC位址為
20-53-52-43-00-01 ,機器B:IP位址為 10.0.0.2 ,MAC位址為 20-53-52-43-00-02,機器C:IP位址
為 10.0.0.3 ,MAC位址為 20-53-52-43-00-03 。現在機器B上的管理員是個聰明的傢伙,他向機器
A發出一個 ARP Reply (傳輸協定沒有規定一定要等ARP Request出現才 能傳送ARP Reply,也沒有
規定一定要傳送過ARP Request才能接收ARP Reply),其中的目的IP位址為10.0.0.1,目的MAC
位址為 20-53-52-43-00-01 ,而源IP位址為10.0.0.3,源MAC位址為 20-53-52-43-00-02 ,好了,
現在機器A更新了他的 ARP 高速緩衝,並相信了IP位址為10.0.0.3的機器的MAC位址是
20-53-52-43-00-02 。當機器A上的管理員發出一條FTP指令時---ftp 10.0.0.3,資料包被送到了
Switch,Switch檢視資料包中的目的位址,發現MAC為 20-53-52-43-00-02 ,於是,他把資料包
發到了機器B上。再設想一下,如果不想影響A和C之間的通信該怎麼辦?你可以同時欺騙他們雙方,
來一個 man-in-middle 。

當然,在實際的操作中你還需要考慮到一些其他的事,比如某些操作系統在會主動的傳送ARP請
求包來更新相應的ARP入口等。

2. MAC Flooding

在上面我們曾經提到過,Switch之所以能夠由資料包中目的MAC位址判斷出他應該把資料包傳送到
那一個連接埠上是根據他本身維護的一張位址表。這張位址表可能是動態的也可能是靜態的,這要看
Switch的廠商和Switch的型號來定,對於某些Switch來說,他維護的是一張動態的位址表,並且地
址表的大小是有上限的,比如 3com Superstack Switch 3300 (3c16981 Hardware v.1 Software v.2.10)
就是這樣一種Switch,我們可以通過傳送大量錯誤的位址信息而使SWITCH維護的位址表「溢出」,
從而使他變成廣播模式來達到我們要 sniff 機器A與機器C之間的通信的目的。

3. Fake the MAC address

偽造MAC位址也是一個常用的辦法,不過這要關於你網路內的Switch是動態更新其位址表,這實
際上和我們上面說到的 ARP Spoof 有些類似,只不過現在你是想要Switch相信你,而不是要機器A
相信你。因為Switch是動態更新其位址表的,你要做的事情就是告訴Switch:HI,我是機器C。換成
技術上的問題你只不過需要像Switch傳送偽造過的資料包,其中源MAC位址對應的是機器C的MAC位址,
現在Switch就把機器C和你的連接埠對應起來了。不過其中存在一個問題,現在機器C也會說了:
HI,Switch老大,我才是機器C呢!,現在你該怎麼辦?切,還用問!讓他說不了話就可以了,
DOS還是其他什麼,隨便你了......

4. ICMP Router Advertisements

這主要是由ICMP路由器發現傳輸協定(IRDP)的缺陷引起的,在Windows 95、98、2000及SunOS、
Solaris 2.6等系統中,都使用了IRDP傳輸協定,SunOS系統只在某些特定的情況下使用該傳輸協定,而
Windows95 ,Windows95b, Windows98, Windows98se, 和 Windows2000都是預設的使用IRDP傳輸協定。
IRDP傳輸協定的主要內容就是告訴人們誰是路由器,設想一下,一個HACK利用IRDP宣稱自己是路由器的
情況會有多麼的糟糕!所有相信HACK的請求的機器把他們所有的資料都傳送給HACK所控制的機器.........

5. ICMP Redirect

所謂ICMP重轉發IP,就是指告訴機器向另一個不同的路由傳送他的資料包,ICMP重轉發IP通常使
用在這樣的場合下,假設A與B兩台機器分別位於同一個物理網段內的兩個邏輯子網內,而A和B都
不知道這一點,只有路由器知道,當A傳送給B的資料到達路由器的時候,路由器會向A送一個ICMP
重轉發IP包裹,告訴A:HI,別再送資料給我轉交了,你就直接送到B那裡就可以了。設想一下,
一個hack完全可以利用這一點,使得A傳送給B的資料經過他。

上面提到的這些方法只不是其中的一些,為了配合sniff能夠工作得更有效率,還有其他許多
的辦法,其實sniff的目的說穿了只有一個,就是抓包,從抓包這個概念上引伸下去,所有為了能
夠抓到網路上的信息包而採用的技術都可以歸入sniff,單純的sniff是沒有什麼效率的。你還能
想到什麼嗎?進攻路由器,在路由器上放置sniff......,在系統內核中植入sniff......等等。


七 如何防止SNIFF

防止sniff最有效的手段就是進行合理的網路分段,並在網路中使用交換機和網路橋接,在理想的情
況下使每一台機器都擁有自己的網路段,當然這會使你的網路建設費用增加很多,所以你可以盡量
使相互信任的機器屬於同一個網段,使他們互相之間不必擔心sniff的存在。並在網段於網段間進
行硬體屏障。你也可以使用加密技術對你在網路中傳送的敏感資料如戶ID或密碼,你的銀行帳號,
商業機密等進行加密,你可以選用SSH等加密手段。為了防止ARP欺騙,你可以使用永久的ARP
緩衝條目,反正上面的攻擊手段和原理你也看了,你就反過來想想該怎麼辦好了。不過有盾必有矛,
平時的安全意識才是最重要的。

(註:以下關於AntiSniff的介紹取至backend翻譯整理的L0pht AntiSniff 技術我的文件一文)

當你做做層層保護後,你還是懷疑自己的網路上存在sniff該怎麼辦? L0pht 小組為了探測
sniff專門發佈了一個軟體 AntiSniff,當然這個軟體不是免費的:),AntiSniff 工具用於檢測局
域網中是否有機器處於混雜模式,AntiSniff Version 1.x被設計為執行在乙太網的Windows系統中,
提供了簡單易用的圖形用戶界面,AntiSniff Version 1.x 主要工作在非交換環境下的本機網段中,
如果執行在交換環境下其功能將大打折扣。AntiSniff Ver 2.0 將不但能在本機網段中,而且能夠穿
過路由器和交換機進行工作。

◆ 操作系統類特殊測試

Linux 內核測試

舊版本的Linux內核存在一個奇怪的特性,可被用於確定機器是否處於混雜模式。在正常情形下,
網路卡會過濾和丟棄那些目標位址不是本機MAC位址或乙太網廣播位址的資料包。如果資料包的目標地
址為本機乙太網位址或廣播位址,將傳送給內核進行處理,因為其認為該乙太網資料畫格包含了本機
的正確IP位址或該網路廣播位址。如果網路卡處於混雜模式,則每個資料包都會傳遞給操作系統進行
分析或處理。許多版本的 Linux內核只檢查資料包中的IP位址以確定是否存放到IP堆棧中進行處理。
為了利用這一點,AntiSniff構造一個無效乙太網位址而IP位址有效的資料包。對於使用了這些內核
版本和處於混雜模式的Linux系統,由於只檢查到IP位址有效而將其接收並存放到相應堆棧中。通過
在這個偽造的乙太網資料畫格中構造一個ICMP ECHO請求,這些系統會返迴響應包(如果處於混雜模式)
或忽略(如果不處於混雜模式),從而暴露其工作模式。當偽造的乙太網資料畫格中的IP位址設定為網路
廣播位址時這個測試非常有效。 AntiSniff的使用者可以修改偽造的乙太網址,預設值為66:66:66:66:66:66。

NetBSD

許多NetBSD內核具有與上述Linux內核相同的特性,不過偽造乙太網資料畫格中的 IP位址必須設為廣
播位址。

Windows 95/98/NT

根據對網路驅動程式頭文件的瞭解,可以知道當處於混雜模式時,Microsoft的操作系統會確切地檢
查每個包的乙太網位址。如果與網路卡的乙太網位址匹配,將作為目標IP位址為本機的資料包存放到相應
堆棧中處理。可以被利用的一點是系統對乙太網廣播包的分析。在正常情形下,例如機器工作在非混
雜模式下,網路卡只向系統內核傳輸那些目標乙太網址與其匹配或為乙太網廣播位址(ff:ff:ff:ff:ff:ff)
的資料包。如果機器處於混雜模式下,網路驅動程式仍然會檢查每個資料包的乙太網位址,但檢查是否
為廣播包時卻只檢查頭8位位址是否為0xff。因此,為了使處於混雜模式的系統返迴響應信息,
AntiSniff構造乙太網位址為ff:00:00:00:00:00且含有正確目標IP 位址的資料包,當Microsoft的操
作系統接收到這個資料包時,將根據網路驅動程式檢查到的細微差別而返迴響應包(如果處於混雜模式)
或丟棄這個資料包(如果處於非混雜模式)。

需要注意的是,這個檢查與使用的網路驅動程式有關。Microsoft預設的網路驅動程式具有以上特性,
大多數的廠商為了保持相容性也繼承了這些特性。不過有些網路卡會在其硬體層中檢查乙太網位址的頭8位,
所以可能會無論系統真正的狀態是什麼都總是返回正值。關於這類網路卡和驅動程式請訪問
AntiSniff Ver 1.x的web網站。

◆ DNS 測試

進行DNS測試的原因是許多攻擊者使用的網路資料收集工具都對IP位址進行反向 DNS解析,因為他們
希望根據域名尋找更有價值的主機。例如joepc1.foo.bar對攻擊者的吸引力往往不如payroll.foo.bar
這種商業域名。此時這些工具就由被動型網路工具變為主動型網路工具了。而不監聽網路通訊的機器
不會試突反向解析資料包中的 IP位址。為了利用這一點,AntiSniff Ver 1.x使自身處於混雜模式下,
向網路傳送虛假目標IP位址的資料包,然後監聽是否有機器傳送該虛假目標IP位址的反向DNS查詢。
偽造資料包的乙太網位址、檢查目標、虛假目標IP位址可由用戶定制。

◆ 網路和主機回應時間測試

這種測試已被證明是最有效的。它能夠發現網路中處於混雜模式的機器,而不管其操作系統是什麼。
警告,這個測試會在很短的時間內產生巨大的網路通訊流量。進行這種測試的理由是不處於混雜模式
的網路卡提供了一定的硬體底層過濾機制。也就是說,目標位址非本機(廣播位址除外)的資料包將被網路卡
的固件丟棄。在這種情況下,驟然增加、但目標位址不是本機的網路通訊流量對操作系統的影響只會
很小。而處於混雜模式下的機器則缺乏此類底層的過濾,驟然增加、但目標位址不是本機的網路通訊
流量會對該機器造成較明顯的影響(不同的操作系統/內核/用戶方式會有不同)。這些變化可以通過網
絡通訊流量工具監視到。


根據以上要點,AntiSniff Ver 1.x 首先利用ICMP ECHO請求及回應計算出需要檢測機器的回應時間
基準和平均值。在得到這個資料後,立刻向本機網路傳送大量的偽造資料包。與此同時再次傳送測試
資料包以確定平均回應時間的變化值。非混雜模式的機器的回應時間變化量會很小,而混雜模式的機
器的回應時間變化量則通常會有 1-4個數量級。為了對付攻擊者和入侵者們最常用的多種工具,
AntiSniff進行了三種網路飽和度測試:SIXTYSIX、TCPSYN和THREEWAY。

* SIXTYSIX測試構造的資料包資料全為0x66。這些資料包不會被非混雜模式的機器接收,同時
方便使用一般的網路監聽/分析工具(如tcpdump和snoop等)記錄和捕獲。

* TCPSYN測試構造的資料包包含有效的TCP頭和IP頭,同時TCP標誌域的SYN位被設定。

* THREEWAY測試採取的原理基本上與TCPSYN一樣,但更複雜些。在這種測試中兩個實際不存在
的機器間多次建立完整的TCP三方握手通訊。它能夠更好地欺騙那些駭客工具。

AntiSniff Ver 1.x 中能夠通過以上三種資料包測試發現正處於混雜模式機器的測試方法最好周
期性地進行和與以前的資料比較。回應時間測試第一次執行的資料還能夠用於分析一個大型網路在
flooding和非flooding狀態時的效能,並說明 工程師調整網路效能。一旦確信本機網路已執行在正
常(沒有未經允許而處於混雜模式的機器) 狀態,就應該設定AntiSniff工具週期性執行。只要發現
某台機器效能(回應時間)發生數量級的變化,一般就能確定其正處於混雜模式。這種方法不需比較
兩台獨立系統間的效能資料,而只需比較同一台機器不同時候的資料就能確定該機器是否處於混雜
模式。

八 結尾

本文旨在向你描述sniff的基本原理,為的是要使你不僅僅能夠瞭解什麼是sniff而已,而是要明
白sniff運轉的根本原理,文章參考了大量的資料,牽涉到直接引用的已經註明出處和作者,非常的
感謝他們。在此還要感謝 W.Richhard.Stevens,雖然其人已逝,但留下的TCP/IP三磁碟區本真是造福了
大家,文章的很多地方也是拜他老人家指點迷經才得以感悟。最後還要感謝雀巢咖啡,讓我得以熬
夜把這篇文章寫完,呵呵,謝謝大家。



本文出自作者: xundi

SNIFFER(嗅探器)-簡介
http://www.slime2.com.tw/forums/show...ighlight=SNIFF
psac 目前離線  
送花文章: 3, 收花文章: 1630 篇, 收花: 3204 次
舊 2003-10-19, 11:41 PM   #2 (permalink)
58501061
榮譽勳章

勳章總數
UID -
在線等級:
文章: n/a
精華:
預設

下來慢慢看
 
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
舊 2003-10-20, 02:23 AM   #3 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 45071
在線等級: 級別:0 | 在線時長:0小時 | 升級還需:5小時
註冊日期: 2003-03-05
VIP期限: 2005-12
文章: 84
精華: 0
預設

感謝分享
ian78 目前離線  
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
舊 2003-10-29, 08:35 PM   #4 (permalink)
註冊會員
榮譽勳章
UID - 80577
在線等級: 級別:4 | 在線時長:40小時 | 升級還需:5小時級別:4 | 在線時長:40小時 | 升級還需:5小時級別:4 | 在線時長:40小時 | 升級還需:5小時級別:4 | 在線時長:40小時 | 升級還需:5小時
註冊日期: 2003-06-24
VIP期限: 2010-04
文章: 22
精華: 0
現金: 5546 金幣
資產: 10546 金幣
預設

3q3q
adslwlan 目前離線  
送花文章: 1, 收花文章: 3 篇, 收花: 5 次
舊 2003-10-29, 10:55 PM   #5 (permalink)
vpn
榮譽勳章

勳章總數
UID -
在線等級:
文章: n/a
精華:
預設

perfect............
 
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
舊 2003-10-30, 03:56 PM   #6 (permalink)
bzbz
榮譽勳章

勳章總數
UID -
在線等級:
文章: n/a
精華:
預設

這個文章不錯,滿詳細的!
 
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
舊 2003-11-06, 05:16 PM   #7 (permalink)
no1power
榮譽勳章

勳章總數
UID -
在線等級:
文章: n/a
精華:
預設

多謝賜教
 
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 10:17 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2020, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1