Ⅰ 瀏覽器嗅探是什麼意思
瀏覽器嗅探是指嗅探器。安裝了嗅探器的瀏覽器能夠接收區域網中計算機發出的數據包,並對這些數據進行分析。乙太網中是基正坦於廣播方式傳送數據的,所有的物理信號都要經過主機節點。
使用嗅探工具後,計算機則能接收所有流經本地計算機的數據包,從而實現盜取敏感信息。由於嗅探器的隱蔽芹姿性好,只是被動接收數據,而不向外發送數據,所以在傳輸數據的過程中,難以覺察到有人監聽。
1、瀏覽器嗅探的發展背景:
隨著互聯網多層次性、多樣性的發展,網吧已由過去即時通信、瀏覽網頁、電子郵件等簡單的應用,擴展成為運行大量在線游戲、在線視頻音頻、互動教學、P2P等技術應用。應用特點也呈現出多樣性和復雜性,因此,這些應用對我們的網路服務質量要求更為嚴格和苛刻。
2、瀏覽器嗅探的作用:
嗅探器可以獲取網路上流經的數據包。 用集線器hub組建的網路是基於共享的原理的, 區域網內所有的計算機都接收相同的數據包, 而網卡構造了硬體的「過濾器「 通過識別MAC地址過濾掉和自己無關的信息。
(1)網路嗅探利用什麼原理擴展閱讀:
防範瀏覽器嗅探的方法:
1、對數據進行加密:對數據的加密是安全的必要條件。其安全級別取決於加密演算法的強度和密鑰的強舉首桐度。使用加密技術,防止使用明文傳輸信息。
2、實時檢測監控嗅探器:監測網路通訊丟包和帶寬異常情況,及時發現可能存在的網路監聽機器。
3、使用安全的拓樸結構:將非法用戶與敏感的網路資源相互隔離,網路分段越細,則安全程度越大。
參考資料來源:網路-嗅探
Ⅱ 嗅探的SNIFF原理
要知道在乙太網中,所有的通訊都是廣播的,也就是說通常在同一個網段的所有網路介面都可以訪問在物理媒體上傳輸的所有數據,而每一個網路介面都有一個唯一的硬體地址,這個硬體地址也就是網卡的MAC地址,大多數系統使用48比特的地址,這個地址用來表示網路中的每一個設備,一般來說每一塊網卡上的MAC地址都是不同的,每個網卡廠家得到一段地址,然後用這段地址分配給其生產的每個網卡一個地址。在硬體地址和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-SnifferConstruction 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*/
1 0 int Open_Raw_Socket(void);
11 int Set_Promisc(char *interface,intsock);
12 int main() {
13int 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,sizeofbuffer,0,(struct sockaddr *)&from,&fromlen);
25. printf(
Bytes received :::%5d
,bytes_recieved);
26. printf(Source address :::%s
,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
,ip->ip_length);
30. printf(Protocol :::%d
,ip->ip_protocol);
31. tcp = (struct tcp *)(buffer +(4*ip->ip_length));
32. printf(Source port :::%d
,ntohs(tcp->tcp_source_port));
33. printf(Dest port :::%d
,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
,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行--intOpen_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,intsock),這也是我們的自定義函數,目的是把網卡置於混雜模式,具體內容如下:
45 int Set_Promisc(char *interface,int sock ) {
46. struct ifreq ifr;
47. strncpy(ifr.ifr_name,interface,strlen(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
,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了。
Ⅲ java編程:聽說有個叫網路嗅探器的東西,請問原理是 怎麼做出來的啊
Sniffer啊,自己去查,不想大片轉貼了。
主要原理是利用網卡的混雜模式,和乙太網自身的特點進行的。
java寫的話用 JPACAP
Jpcap是一個能夠抓取與發送網路數據包的Java組件。可以使用Jpcap從一個網路介面獲取數據包,然後在Java中對它們進行分析和顯示。同樣也可以通過一個網路介面發送任意數據包。Jpcap當前能夠 捕獲乙太網,IPv4,IPv6,ARP/RARP,TCP,UDP和ICMPv4數據包。
Jpcap實際上並非一個真正去實現對數據鏈路層的控制,而是一個中間件,Jpcap調用wincap/libcap,而給Java語言提供一個公共的介面,從而實現了平台無關性。在官方網站上聲明,Jpcap支持FreeBSD3.x,Linux RedHat6.1, Fedora Core4,Solaris,and Microsoft Windows 2000/XP等系統。
Jpcap的整個結構大體上跟wincap/libpcap是很相像的,例如NetworkInterface類對應wincap的 typedef struct_ADAPTER ADAPTER,getDeviceList()對應pcap_findalldevs()等等。
Jpcap主要的類有如下幾個:
1.NetworkInterface
該類的每一個實例代表一個網路設備,一般就是網卡。這個類只有一些數據成員,除了繼承自java.lang.Object的基本方法以外,沒有定義其它方法。
2.JpcapCaptor
該類提供了一系列靜態方法實現一些基本的功能。該類一個實例代表建立了一個與指定設備的鏈接,可以通過該類的實例來控制設備,例如設定網卡模式、設定過濾關鍵字等等。
3.JpcapSender
該類專門用於控制數據包的發送。
4.Packet
這個是所有其它數據包類的父類。Jpcap所支持的數據包有:
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。
Ⅳ 網路嗅探器的監聽原理
Sniffer程序是一種利用乙太網的特性把網路適配卡(NIC,一般為乙太網卡)置為雜亂(promiscuous)模式狀態的工具,一旦網卡設置為這種模式,它就能接收傳輸在網路上的每一個信息包。
普通的情況下,網卡只接收和自己的地址有關的信息包,即傳輸到本地主機的信息包。要使Sniffer能接收並處理這種方式的信息,系統需要支持 BPF,Linux下需要支持SOCKET-PACKET。但一般情況下,網路硬體和TCP/IP堆棧不支持接收或者發送與本地計算機無關的數據包,所以,為了繞過標準的TCP/IP堆棧,網卡就必須設置為混雜模式。一般情況下,要激活這種方式,內核必須支持這種偽設備BPFilter,而且需要root許可權來運行這種程序,所以Sniffer需要root身份安裝,如果只是以本地用戶的身份進入了系統,那麼不可能嗅探到root的密碼,因為不能運行Sniffer。
基於Sniffer這樣的模式,可以分析各種信息包並描述出網路的結構和使用的機器,由於它接收任何一個在同一網段上傳輸的數據包,所以也就存在著捕獲密碼、各種信息、秘密文檔等一些沒有加密的信息的可能性。這成為黑客們常用的擴大戰果的方法,用來奪取其他主機的控制權。