嗅探原理與反嗅探技術(shù)詳解WEB安全 -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【m.clearvueentertainment.com - 電腦資料】

   

    一.嗅探器的基礎(chǔ)知識

    1.1 什么是嗅探器?

    嗅探器的英文寫法是Sniff,可以理解為一個安裝在計(jì)算機(jī)上的 設(shè)備它可以用來 計(jì)算機(jī)在網(wǎng)絡(luò)上所產(chǎn)生的眾多的信息,

嗅探原理與反嗅探技術(shù)詳解WEB安全

。簡單一點(diǎn)解釋:一部電話的 裝置, 可以用來 雙方通話的內(nèi)容,而計(jì)算機(jī)網(wǎng)絡(luò)嗅探器則可以 計(jì)算機(jī)程序在網(wǎng)絡(luò)上發(fā)送和接收到的數(shù)據(jù)。

    可是,計(jì)算機(jī)直接所傳送的數(shù)據(jù),事實(shí)上是大量的二進(jìn)制數(shù)據(jù)。因此, 一個網(wǎng)絡(luò) 程序必須也使用特定的網(wǎng)絡(luò)協(xié)議來分解嗅探到的數(shù)據(jù), 嗅探器也就必須能夠識別出那個協(xié)議對應(yīng)于這個數(shù)據(jù)片斷,只有這樣才能夠進(jìn)行正確的解碼。

    計(jì)算機(jī)的嗅探器比起電話 器,有他獨(dú)特的優(yōu)勢: 很多的計(jì)算機(jī)網(wǎng)絡(luò)采用的是“共享媒體"。 也就是說,你不必中斷他的通訊,并且配置特別的線路,再安裝嗅探器,你幾乎可以在任何連接著的網(wǎng)絡(luò)上直接 到你同一掩碼范圍內(nèi)的計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)。我們稱這種 方式為“基于混雜模式的嗅探”(promiscuous mode) 。 盡管如此,這種“共享” 的技術(shù)發(fā)展的很快,慢慢轉(zhuǎn)向“交換” 技術(shù),這種技術(shù)會長期內(nèi)會繼續(xù)使用下去, 它可以實(shí)現(xiàn)有目的選擇的收發(fā)數(shù)據(jù)。

    1.2嗅探器是如何工作的

    1.2.1如何 網(wǎng)絡(luò)上的信息

    剛才說了,以太網(wǎng)的數(shù)據(jù)傳輸是基于“共享”原理的:所有的同一本地網(wǎng)范圍內(nèi)的計(jì)算機(jī)共同接收到相同的數(shù)據(jù)包。這意味著計(jì)算機(jī)直接的通訊都是透明可見的。

    正是因?yàn)檫@樣的原因,以太網(wǎng)卡都構(gòu)造了硬件的“過濾器”這個過濾器將忽略掉一切和自己無關(guān)的網(wǎng)絡(luò)信息。事實(shí)上是忽略掉了與自身MAC地址不符合的信息。

    嗅探程序正是利用了這個特點(diǎn),它主動的關(guān)閉了這個嗅探器,也就是前面提到的設(shè)置網(wǎng)卡“混雜模式”。因此,嗅探程序就能夠接收到整個以太網(wǎng)內(nèi)的網(wǎng)絡(luò)數(shù)據(jù)了信息了。

    1.2.2什么是以太網(wǎng)的MAC地址

    MAC:Media Access Control.

    由于大量的計(jì)算機(jī)在以太網(wǎng)內(nèi)“共享“數(shù)據(jù)流,所以必須有一個統(tǒng)一的辦法用來區(qū)分傳遞給不同計(jì)算機(jī)的數(shù)據(jù)流的。這種問題不會發(fā)生在撥號用戶身上,因?yàn)橛?jì)算機(jī)會假定一切數(shù)據(jù)都由你發(fā)動給modem然后通過電話線傳送出去?墒,當(dāng)你發(fā)送數(shù)據(jù)到以太網(wǎng)上的時候,你必須弄清楚,哪臺計(jì)算機(jī)是你發(fā)送數(shù)據(jù)的對象。的確,現(xiàn)在有大量的雙向通訊程序出現(xiàn)了,看上去,他們好像只會在兩臺機(jī)器內(nèi)交換信息,可是你要明白,以太網(wǎng)的信息是共享的,其他用戶,其實(shí)一樣接收到了你發(fā)送的數(shù)據(jù),只不過是被過濾器給忽略掉了。

    MAC地址是由一組6個16進(jìn)制數(shù)組成的,它存在于每一塊以太網(wǎng)卡中。后面的章節(jié)將告訴你如何查看自己計(jì)算機(jī)的MAC地址。

    如果你對網(wǎng)絡(luò)結(jié)構(gòu)不太熟悉,建議參考一下OSI 7-Layer Model,這將有助于你理解后面的東西以太網(wǎng)所使用的協(xié)議主要是TCP/IP,并且TCP/IP也用于其他的網(wǎng)絡(luò)模型(比如撥號用戶,他們并不是處于一個以太網(wǎng)環(huán)境中)。舉例一下,很多的小團(tuán)體計(jì)算機(jī)用戶都為實(shí)現(xiàn)文件和打印共享,安裝了“NetBEUI” 因?yàn)樗皇腔赥CP/IP協(xié)議的, 所以來自于網(wǎng)絡(luò)的 一樣無法得知他們的設(shè)備情況。

    基于Raw協(xié)議,傳輸和接收都在以太網(wǎng)里起著支配作用。你不能直接發(fā)送一個Raw數(shù)據(jù)給以太網(wǎng),你必須先做一些事情,讓以太網(wǎng)能夠理解你的意思。這有點(diǎn)類似于郵寄信件的方法,你不可能直接把一封信投遞出去,你必須先裝信封,寫地址,貼郵票,網(wǎng)絡(luò)上的傳輸也是這樣的。

    下面給出一個簡單的圖示,有助于你理解數(shù)據(jù)傳送的原理:

    _________

    /.........\

    /..Internet.\

    +-----+  +----+.............+-----+

    |UserA|-----|路由|.............|UserB|

    +-----+ ^ +----+.............+-----+

    |    \.........../

    |      \---------/

    +------+

    |嗅探器|

    +------+

    UserA IP 地址: 10.0.0.23

    UserB IP 地址: 192.168.100.54

    現(xiàn)在知道UserA要于UserB進(jìn)行計(jì)算機(jī)通訊,UserA需要為10.0.0.23到192.168.100.54的通訊建立一個IP包

    這個IP包在網(wǎng)絡(luò)上傳輸,它必須能夠穿透路由器。因此, UserA必須首先提交這個包給路由器。由每個路由器考查目地IP地址然后決定傳送路徑。

    UserA 所知道的只是本地與路由的連接,和UserB的IP地址。UserA并不清楚網(wǎng)絡(luò)的結(jié)構(gòu)情況和路由走向。

    UserA必須告訴路由預(yù)備發(fā)送的數(shù)據(jù)包的情況,以太網(wǎng)數(shù)據(jù)傳輸結(jié)構(gòu)大概是這樣的:

    +--+--+--+--+--+--+

    | 目標(biāo) MAC    |

    +--+--+--+--+--+--+

    | 源 MAC      |

    +--+--+--+--+--+--+

    |08 00|

    +--+--+-----------+

    |          |

    .          .

    .  IP 包    .

    .          .

    |          |

    +--+--+--+--+-----+

    | CRC校驗(yàn) |

    +--+--+--+--+

    理解一下這個結(jié)構(gòu),UserA的計(jì)算機(jī)建立了一個包假設(shè)它由100個字節(jié)的長度(我們假設(shè)一下,20 個字節(jié)是IP信息,20個字節(jié)是TCP信息,還有60個字節(jié)為傳送的數(shù)據(jù)),F(xiàn)在把這個包發(fā)給以太網(wǎng),放14個字節(jié)在目地MAC地址之前,源MAC地址,還要置一個0x0800的標(biāo)記,他指示出了TCP/IP棧后的數(shù)據(jù)結(jié)構(gòu)。同時,也附加了4個字節(jié)用于做CRC校驗(yàn) (CRC校驗(yàn)用來檢查傳輸數(shù)據(jù)的正確性)。

    現(xiàn)在發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)。

    所有在網(wǎng)內(nèi)的計(jì)算機(jī)通過適配器都能夠發(fā)現(xiàn)這個數(shù)據(jù)片,其中也包括路由適配器,嗅探器和其他一些機(jī)器。通常,適配器都具有一塊芯片用來做結(jié)構(gòu)比較的,檢查結(jié)構(gòu)中的目地MAC地址和自己的MAC地址,如果不相同,則適配器會丟棄這個結(jié)構(gòu)。這個操作會由硬件來完成,所以,對于計(jì)算機(jī)內(nèi)的程序來說,整個過程時毫無察覺的。

    當(dāng)路由器的以太網(wǎng)適配器發(fā)現(xiàn)這個結(jié)構(gòu)后,它會讀取網(wǎng)絡(luò)信息,并且去掉前14個字節(jié),跟蹤4個字節(jié)。查找0x8000標(biāo)記,然后對這個結(jié)構(gòu)進(jìn)行處理(它將根據(jù)網(wǎng)絡(luò)狀況推測出下一個最快路由節(jié)點(diǎn),從而最快傳送數(shù)據(jù)到預(yù)定的目標(biāo)地址)。

    設(shè)想,只有路由機(jī)器能夠檢查這個結(jié)構(gòu),并且所有其他的機(jī)器都忽略這個 結(jié)構(gòu),則嗅探器無論如何也無法檢測到這個結(jié)構(gòu)的。

    1.3.1 MAC地址的格式是什么?

    以太網(wǎng)卡的MAC地址是一組48比特的數(shù)字,這48比特分為兩個部分組成,前面的24比特用于表示以太網(wǎng)卡的寄主,后面的24比特是一組序列號,是由寄主進(jìn)行支派的。這樣可以擔(dān)保沒有任何兩塊網(wǎng)卡的MAC地址是相同的(當(dāng)然可以通過特殊的方法實(shí)現(xiàn))。如果出現(xiàn)相同的地址,將發(fā)生問題,所有這一點(diǎn)是非常重要的。這24比特被稱之為OUI(Organizationally Unique Identifier)。

    可是,OUI的真實(shí)長度只有22比特,還有兩個比特用于其他:一個比特用來校驗(yàn)是否是廣播或者多播地址,另一個比特用來分配本地執(zhí)行地址(一些網(wǎng)絡(luò)允許管理員針對具體情況再分配MAC地址)。

    舉個例子,你的MAC地址在網(wǎng)絡(luò)中表示為 03 00 00 00 00 01 。第一個字節(jié)所包含的值二進(jìn)制表示方法為00000011。 可以看到,最后兩個比特都被置為真值。他指定了一個多播模式,向所有的計(jì)算機(jī)進(jìn)行廣播,使用了“NetBEUI”協(xié)議(一般的,在Windows計(jì)算機(jī)的網(wǎng)絡(luò)中,文件共享傳輸?shù)仁遣皇褂肨CP/IP協(xié)議的)。.

    1.3.2 我如何得到自己計(jì)算機(jī)的MAC地址?

    Win9x

    Win9x自帶的這個程序?qū)⒏嬖V你答案:“winipcfg.exe”

    WinNT

    在命令行的狀態(tài)下運(yùn)行這個命令:"ipconfig /all"

    它會顯示出你的MAC網(wǎng)卡地址,下面是一個例子:

    Windows 2000 IP Configuration

    Host Name . . . . . . . . . . . . : bigball

    Primary DNS Suffix . . . . . . . :

    Node Type . . . . . . . . . . . . : Hybrid

    IP Routing Enabled. . . . . . . . : No

    WINS Proxy Enabled. . . . . . . . : No

    Ethernet adapter 本地連接:

    Connection-specific DNS Suffix . :

    Description . . . . . . . . . . . : Legend/D-Link DFE-530TX PCI Fast Eth

    ernet Adapter (Rev B)

    Physical Address. . . . . . . . . : 00-50-BA-25-5D-E8

    DHCP Enabled. . . . . . . . . . . : No

    IP Address. . . . . . . . . . . . : 192.168.10.254

    Subnet Mask . . . . . . . . . . . : 255.255.128.0

    Default Gateway . . . . . . . . . : 192.168.10.3

    Ethernet adapter SC12001:

    Description . . . . . . . . : DEC DC21140 PCI Fast Ethernet

    Linux

    運(yùn)行“ifconfig”,

電腦資料

嗅探原理與反嗅探技術(shù)詳解WEB安全》(http://m.clearvueentertainment.com)。結(jié)果如下:

    eth0    Link encap:Ethernet HWaddr 08:00:17:0A:36:3E

    inet addr:192.0.2.161 Bcast:192.0.2.255 Mask:255.255.255.0

    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

    RX packets:1137249 errors:0 dropped:0 overruns:0

    TX packets:994976 errors:0 dropped:0 overruns:0

    Interrupt:5 Base address:0x300

    Solaris

    用 “arp” 或者 “netstat -p” 命令

    1.3.3我如何才能知道有那些計(jì)算機(jī)和我的MAC地址直接關(guān)聯(lián)?

    對于WinNT和Unix機(jī)器,可以直接使用“arp -a”查看。

    1.3.4我能夠改變我的MAC地址嗎?

    可以。簡單的說一下:

    第一種方法,你要做地址欺騙,因?yàn)镸AC地址是數(shù)據(jù)包結(jié)構(gòu)的一部分, 因此,當(dāng)你向以太網(wǎng)發(fā)送一個數(shù)據(jù)包的時候,你可以覆蓋源始的MAC信息。

    第二種方法,很多網(wǎng)卡允許在一定的時間內(nèi)修改內(nèi)部的MAC地址。

    第的三種方法, 你可以通過重新燒錄EEPROM來實(shí)現(xiàn)MAC地址的修改。但是這種方法要求你必須有特定的硬件設(shè)備和適用的芯片才能修改,而且這種方法將永遠(yuǎn)的修改你的MAC地址。

    二.反嗅探技術(shù)

    2.1我如何才能檢測網(wǎng)內(nèi)是否存在有嗅探程序?

    理論上,嗅探程序是不可能被檢測出來的,因?yàn)樾崽匠绦蚴且环N被動的接收程序,屬于被動觸發(fā)的,它只會收集數(shù)據(jù)包,而不發(fā)送出任何數(shù)據(jù),盡管如此,嗅探程序有時候還是能夠被檢測出來的。

    一個嗅探程序,不會發(fā)送任何數(shù)據(jù),但是當(dāng)它安裝在一臺正常的局域網(wǎng)內(nèi)的計(jì)算機(jī)上的時候會產(chǎn)生一些數(shù)據(jù)流。舉個例子,它能發(fā)出一個請求,始DNS根據(jù)IP地址進(jìn)行反相序列查找。

    下面一種簡單的檢測方法:

    ping 方法

    很多的嗅探器程序,如果你發(fā)送一個請求給哪臺有嗅探程序的機(jī)器,它將作出應(yīng)答

    說明:

    1.  懷疑IP地址為10.0.0.1的機(jī)器裝有嗅探程序,它的MAC地址確定為00-40-05-A4-79-32.

    2.  確保機(jī)器是在這個局域網(wǎng)中間。

    3.  現(xiàn)在修改MAC地址為00-40-05-A4-79-33.

    4.  現(xiàn)在用ping命令ping這個IP地址。

    5.  沒有任何人能夠看到發(fā)送的數(shù)據(jù)包,因?yàn)槊颗_計(jì)算機(jī)的MAC地址無法與這個數(shù)據(jù)包中的目地MAC不符,所以,這個包應(yīng)該會被丟棄。

    6.  如果你看到了應(yīng)答,說明這個MAC包沒有被丟棄,也就是說,很有可能有嗅探器存在。

    現(xiàn)在,這種方法已經(jīng)得到了廣泛的推崇和宣揚(yáng),新一代的 們也學(xué)會了在他們的代碼中加入虛擬的MAC地址過濾器很多的計(jì)算機(jī)操作系統(tǒng)(比如Windows)都支持MAC過濾器(很多過慮器只檢查MAC的第一個字節(jié),這樣一來,MAC地址FF-00-00-00-00-00和FF-FF-FF-FF-FF-FF就沒有區(qū)別了。(廣播地址消息會被所有的計(jì)算機(jī)所接收)。這種技術(shù)通常會用在交換模型的以太網(wǎng)中。當(dāng)交換機(jī)發(fā)現(xiàn)一個未知的MAC地址的時候,它會執(zhí)行類似“flood”的操作,把這個包發(fā)送給每個節(jié)點(diǎn)。

    2.2本機(jī)嗅探程序的檢測

    本機(jī)嗅探的程序檢測方法比較簡單,只要檢查一下網(wǎng)卡是否處于混雜模式就可以了,在Linux下,這個比較容易實(shí)現(xiàn),而在Windows平臺上,并沒有現(xiàn)成的函數(shù)可供我們實(shí)現(xiàn)這個功能,我們來用一點(diǎn)小技巧:

    #include

    #define MAX_PACK_LEN 65535

    #define MAX_HOSTNAME_LAN 255

    #pragma comment (lib , "ws2_32.lib")

    int main()

    {

    SOCKET SockRaw,Sock;

    WSADATA wsaData;

    int ret=0;

    struct sockaddr_in sAddr,addr;

    char RecvBuf[MAX_PACK_LEN];

    char FAR name[MAX_HOSTNAME_LAN];

    struct hostent FAR * pHostent;

    char *Buf=(char *)malloc(128);

    int settimeout=1000;//這里我們設(shè)置了一秒鐘超時

    printf("UNSniffer for Win2k v1.0\nPower by BigBall\nHomePage:http:\/\/www.patching.net\/liumy\nEmail:liumy@patching.net\nOicq:9388920\n\nChecking your system ,wait a moment please...\n");

    WSAStartup(MAKEWORD(2,2),&wsaData);

    //建立一條RawSocket

    SockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_IP);

    再建立一條UDP

    Sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

    memset(&sAddr,0,sizeof(sAddr));

    memset(&addr,0,sizeof(addr));

    sAddr.sin_family=AF_INET;

    sAddr.sin_port=htons(5257);

    addr.sin_family=AF_INET;

    addr.sin_port=htons(5258);

    //把IP地址指向本機(jī)

    addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

    memset(RecvBuf,0, sizeof(RecvBuf));

    pHostent=malloc(sizeof(struct hostent));

    gethostname(name, MAX_HOSTNAME_LAN);

    pHostent=gethostbyname(name);

    //取得自己的IP地址

    memcpy(&sAddr.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);

    free(pHostent);

    //綁定一個本機(jī)的接收端口

    bind(SockRaw, (struct sockaddr *)&sAddr, sizeof(sAddr));

    //虛連接到本機(jī)的一個未打開的端口

    connect(Sock,(struct sockaddr *)&addr,sizeof(addr));

    Buf="$%">1234567890!@#$%^&*";

    //設(shè)置超時

    setsockopt(SockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&settimeout,sizeof(int));

    //向虛連接端口發(fā)送一個數(shù)據(jù)包

    send(Sock,Buf,strlen(Buf),0);

    //使用SockRaw嘗試接收這個數(shù)據(jù)包

    ret=recv(SockRaw,RecvBuf,sizeof(RecvBuf),0);

    if(ret==SOCKET_ERROR || ret==0)

    printf("No found any sniffer in your system!\n");

    else

    {

    //進(jìn)行ChkSum

    if(Buf=="$%">1234567890!@#$%^&*")

    printf("Warning!!! Found sniffer!!!\n");

    }

    closesocket(Sock);

    closesocket(SockRaw);

    free(pHostent);

    free(Buf);

    WSACleanup();

    return 0;

    }

   

最新文章