網絡詞彙基本概念,什麼是Sniffer?

網絡詞彙基本概念,什麼是Sniffer?

什麼是Sniffer

現在人們談到黑客攻擊,一般所指的都是以主動方式進行的,例如利用漏洞或者猜測系統密碼的方式對系統進行攻擊。但是其實還有一類危害非常大的被動攻擊方式往往為大家所忽視,那就是利用Sniffer進行嗅探攻擊。

Sniffer,中文可以翻譯為嗅探器,是一種威脅性極大的被動攻擊工具。使用這種工具,可以監視網絡的狀態、數據流動情況以及網絡上傳輸的信息。當信息以明文的形式在網絡上傳輸時,便可以使用網絡監聽的方式來進行攻擊。將網絡接口設置在監聽模式,便可以將網上傳輸的源源不斷的信息截獲。黑客們常常用它來截獲用戶的口令。據說某個骨幹網絡的路由器曾經被黑客攻人,並嗅探到大量的用戶口令。本文將詳細介紹Sniffer的原理和應用。

一、Sniffer 原理1.網絡技術與設備簡介

在講述Sni計er的概念之前,首先需要講述局域網設備的一些基本概念。

數據在網絡上是以很小的稱為幀(Frame)的單位傳輸的,幀由幾部分組成,不同的部分執行不同的功能。幀通過特定的稱為網絡驅動程序的軟件進行成型,然後通過網卡發送到網線上,通過網線到達它們的目的機器,在目的機器的一端執行相反的過程。接收端機器的以太網卡捕獲到這些幀,並告訴操作系統幀已到達,然後對其進行存儲。就是在這個傳輸和接收的過程中,嗅探器會帶來安全方面的問題。

每一個在局域網(LAN)上的工作站都有其硬件地址,這些地址惟一地表示了網絡上的機器(這一點與Internet地址系統比較相似)。當用戶發送一個數據包時,這些數據包就會發送到LAN上所有可用的機器。

在一般情況下,網絡上所有的機器都可以“聽”到通過的流量,但對不屬於自己的數據包則不予響應(換句話說,工作站A不會捕獲屬於工作站B的數據,而是簡單地忽略這些數據)。如果某個工作站的網絡接口處於混雜模式(關於混雜模式的概念會在後面解釋),那麼它就可以捕獲網絡上所有的數據包和幀。 2.網絡監聽原理

Sniffer程序是一種利用以太網的特性把網絡適配卡(NIC,一般為以太網卡)置為雜亂(promiscuous)模式狀態的工具,一旦網卡設置為這種模式,它就能接收傳輸在網絡上的每一個信息包。

普通的情況下,網卡只接收和自己的地址有關的信息包,即傳輸到本地主機的信息包。要使Sniffer能接收並處理這種方式的信息,系統需要支持BPF,Linux下需要支持SOCKET一PACKET。但一般情況下,網絡硬件和TCP/IP堆棧不支持接收或者發送與本地計算機無關的數據包,所以,為了繞過標準的TCP/IP堆棧,網卡就必須設置為我們剛開始講的混雜模式。一般情況下,要激活這種方式,內核必須支持這種偽設備Bpfilter,而且需要root權限來運行這種程序,所以sniffer需要root身份安裝,如果只是以本地用戶的身份進人了系統,那麼不可能喚探到root的密碼,因為不能運行Sniffer。

基於Sniffer這樣的模式,可以分析各種信息包並描述出網絡的結構和使用的機器,由於它接收任何一個在同一網段上傳輸的數據包,所以也就存在著捕獲密碼、各種信息、秘密文檔等一些沒有加密的信息的可能性。這成為黑客們常用的擴大戰果的方法,用來奪取其他主機的控制權 3 Snifffer的分類

Sniffer分為軟件和硬件兩種,軟件的Sniffer有 NetXray、Packetboy、Net monitor等,其優點是物美價廉,易於學習使用,同時也易於交流;缺點是無法抓取網絡上所有的傳輸,某些情況下也就無法真正瞭解網絡的故障和運行情況。硬件的Sniffer通常稱為協議分析儀,一般都是商業性的,價格也比較貴。

實際上本文中所講的Sniffer指的是軟件。它把包抓取下來,然後打開並查看其中的內容,可以得到密碼等。Sniffer只能抓取一個物理網段內的包,就是說,你和監聽的目標中間不能有路由或其他屏蔽廣播包的設備,這一點很重要。所以,對一般撥號上網的用戶來說,是不可能利用Sniffer來竊聽到其他人的通信內容的。 4.網絡監聽的目的 當一個黑客成功地攻陷了一臺主機,並拿到了root權限,而且還想利用這臺主機去攻擊同一網段上的其他主機時,他就會在這臺主機上安裝Sniffer軟件,對以太網設備上傳送的數據包進行偵聽,從而發現感興趣的包。如果發現符合條件的包,就把它存到一個LOg文件中去。通常設置的這些條件是包含字“username”或“password”的包,這樣的包裡面通常有黑客感興趣的密碼之類的東西。一旦黑客截獲得了某臺主機的密碼,他就會立刻進人這臺主機。

如果Sniffer運行在路由器上或有路由功能的主機上,就能對大量的數據進行監控,因為所有進出網絡的數據包都要經過路由器。

Sniffer屬於第M層次的攻擊。就是說,只有在攻擊者已經進入了目標系統的情況下,才能使用Sniffer這種攻擊手段,以便得到更多的信息。

Sniffer除了能得到口令或用戶名外,還能得到更多的其他信息,比如一個重要的信息、在網上傳送的金融信息等等。Sniffer幾乎能得到任何在以太網上傳送的數據包。

Sniffer是一種比較複雜的攻擊手段,一般只有黑客老手才有能力使用它,而對於一個網絡新手來說,即使在一臺主機上成功地編譯並運行了Sniffer,一般也不會得到什麼有用的信息,因為通常網絡上的信息流量是相當大的,如果不加選擇地接收所有的包,然後從中找到所需要的信息非常困難;而且,如果長時間進行監聽,還有可能把放置Sniffer的機器的硬盤撐爆。5.一個簡單的Sniffer程序 下面是一個非常簡單的C程序,它可以完成一般的監聽功能,/* */中的內容是本文的註解。/*下面是包含進行調用系統和網絡函數的頭文件*/ #include〈stdio.h〉

#include〈sys/socket.h〉

#include〈netinet/in.h〉

#include〈arpa/inet.h〉

/*下面是IP和TCP包頭結構*/

struct IP{

unsigned int ip_length:4;

/*定義IP頭的長度*/

unsigned int ip_version:4;

/*IP版本,Ipv4 */

unsigned char ip_tos;

/*服務類型*/

unsigned short

ip_total_length; /*IP數據包的總長度*/

unsigned short ip_id;

/*鑑定城*/

unsigned short ip_flags;

/*IP 標誌 */

unsigned char ip_ttl;

/*IP 包的存活期*/

unsigned char ip_protocol;

/*IP 上層的協議*/

unsigned short ip_cksum;

/*IP頭校驗和*/

unsigned int ip_source ;

/*源IP地址*/

unsigned int ip_source;

/*目的IP地址*/

};

struct tcp{

unsigned short tcp_source_port;

/*定義TCP源端口*

unsigned short tcp_dest_port;

/*TCP目的端口*/

unsigned short tcp_seqno;

/*TC P序列號*/

unsigned int tcp_ackno;

/*發送者期望的下一個序列號*/

unsigned int tcp_res1:4;

/*下面幾個是TCP標誌*/

tcp_hlen:4

tcp_fin:1,

tcp_syn:1,

tcp_rst:1,

tcp_psh:1,

tcp_ack:1,

tcp_urg:1,

tcp_res2:2;

unsignd short tcp_winsize; /*能接收的最大字節數*/

unsigned short tcp_cksum;

/* TCP校驗和*/

unsigned short tcp_urgent;

/* 緊急事件標誌*/

};

/*主函數*/

int main()

{

int sock,bytes_recieved,fromlen;

char buffer[65535];

struct sockaddr_in from;

/*定義socket結構*/

struct ip ip;

/*定義IP和TCP*/

struct tcp *tcp;

sock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);

/* 上面是建立socket連接,第一個參數是地址族類型,用INTERNET類型*/

/* 第二個參數是socket類型,這裡用了SOCK_RAW,它可以繞過傳輸層*/

/* 直接訪問IP層的包,為了調用SOCK_RAW,需要有root權限*/

/* 第三個參數是協議,選IPPROTO_TCP指定了接收TCP層的內容*/

while(1)

/*建立一個死循環,不停的接收網絡信息*/

{

fromlen=sizeof from;

bytes_recieved=recvfrom(sock,buffer,sizeofbuffer,0,(struct sockaddr *)&from,&fromlen);

/*上面這個函數是從建立的socket連接中接收數據*/

/*因為recvfrom()需要一個sockaddr數據類型,所以我們用了一個強制類型轉換*/

print("\nBytes received ::: %5d\n",bytes_recieved);

/*顯示出接收的數據字節數*/

printf("source address ::: %s\n",inet_ntoa(from.sin_addr));

/*顯示出源地址*/

ip=(struct ip *)buffer;

/*把接收的數據轉化為我們預先定義的結構,便於查看*/

printf("IP header length ::: %d\n",ip->ip_length);

/*顯示IP頭的長度*/

print("Protocol ::: %d\n",ip->ip_protocol);

/*顯示協議類型,6是TCP,17是UDP*/

tcp=(struct tcp *)(buffer + (4*ip->ip_iplength));

/*上面這名需要詳細解釋一下,因為接收的包頭數據中,IP頭的大小是固定的4字節*/

/*所以我用IP長度乘以4,指向TCP頭部分*/

printf("Source port ::: %d\n",ntohs(tcp->tcp_source_port); /*顯示出端口*/

printf("Dest prot ::: %d\n",ntohs(tcp->tcp_dest_port));/*顯示出目標端口*/

以上這個C程序是為了說明Sniffer的接收原理而列舉的一個最簡單的例子,它只是完成了Sniffer的接收功能,在運行它之前,我們還需要手工把同卡設為混雜模式,在root權限下用如下命令設置: ifconfig eth0 promisc 假設etho是你的以太網設備接口,然後運行編譯好的程序,就可以看到接收的數據包了。

這個程序雖然簡單,但是它說明了Sniffer的基本原理,就是先把同卡設備設為混雜模式,然後直接接收IP層的數據。

當然這個程序的功能也太簡單,只能顯示源地址、目標地址和源端口、目標端口等極為簡單的信息,這對於黑客來說是沒有什麼用處的,黑客要的是密碼之類的信息,這可以使用一些免費的Sniffer程序來完成。


分享到:


相關文章: