用ARP偽裝廣播探測網路中的Sniffer

2021-03-31 21:31:05 字數 4812 閱讀 1843

嗅探器(sniffer)一直以來都是一種讓人惱火的黑客工具,因為它是一種靜態的攻擊軟體,它的存在不會留下任何痕跡,因此人們很難將它揪出來。可是,它的危害性卻又是相當大的(它就像乙個監視器,你的「一舉一動」都在它的監視之下,你說危害大不大)。所以,我們不能不要想個辦法出來檢查網路中是否存在sniffer,這是非常必要的。

1. sniffer原理

所謂知己知彼方能百戰不殆,要了解探測sniffer的方法,就先得了解sniffer的原理。首先,讓我們來看一看區域網中是怎樣傳輸資料的。當乙個資料報的目的地是區域網內的某台計算機時,此資料報將以廣播的形式被傳送到網內每一台計算機上。而每台計算機的網絡卡將分析資料報中的目的mac位址(即乙太網位址),如果此位址為本計算機mac位址或為廣播位址(ff-ff-ff-ff-ff-ff),那麼,資料報將被接收,而如果不是,網絡卡將直接將其丟棄。但是,這裡有乙個前提,就是接收端計算機的網絡卡是在正常模式下工作的。而如果網絡卡被設定為混雜模式,那麼它就可以接收所有經過的資料報了(當然也包括目的地不是本機的資料報)。就是說,只要是傳送到區域網內的資料報,都會被設定成混雜模式的網絡卡所接收!這也就是sniffer的基本原理了。至於sniffer的具體實現和一些細節,這裡就不多講了,大家有興趣可以參考相關資料。

2. 乙太網中傳輸的arp資料報

知道了sniffer的基本原理,現在,我們就要想想怎麼才能將區域網中隱藏的sniffer揪出來,這才是本篇文章的主題。這裡,我們需要自己構造arp資料報,所以,就先簡單介紹一下arp請求和應答資料報的結構:

typedef struct _et_header    //乙太網頭部

et_header;

typedef struct _arp_header   //arp頭部

arp_header;

以上就是網路中傳輸的arp資料報的結構了。至於結構中每個欄位所表示的具體含義以及如何初始化,超出了本文章的討論範圍,大家有興趣可以參看《tcp-ip協議詳解》一書。

3. 探測區域網中的sniffer

終於進入主題了。既然sniffer是一種靜態的黑軟,不會留下任何日誌,那麼我們就要主動的去探測它。鑑於sniffer的原理是設定網絡卡為混雜模式,那麼,我們就可以想辦法探測網路中被設定為混雜模式的網絡卡,以此來判斷是否存在sniffer。

這裡,讓我們再來看看計算機接收資料報的規則。前面已經講過,在正常模式下,首先由網絡卡判斷資料報的目的mac位址,如果為本機mac位址或為廣播位址,那麼資料報將被接收進入系統核心,否則將被丟棄。而如果網絡卡被設定為混雜模式,那麼所有的資料報都將直接進入系統核心。資料報到達系統核心後,系統還將進一步對資料報進行篩選:系統只會對目的mac位址為本機mac位址或廣播位址的資料報做出響應――如果接收到的是arp請求報文,那麼系統將回饋乙個arp應答報文。但是,不同的是,系統核心和網絡卡對廣播位址的判斷有些不一樣:以windows系統為例,網絡卡會判斷mac位址的所有六位,而系統核心只判斷mac位址的前兩位(win98甚至只判斷前一位),也就是說,對於系統核心而言,正確的廣播位址ff-ff-ff-ff-ff-ff和錯誤的廣播位址ff-ff-ff-ff-ff-fe是一樣的,都被認為是廣播位址,甚至ff-ff-00-00-00-00也會被系統核心認為是廣播位址!

寫到這裡,聰明的讀者大概已經知道該怎麼做了。如果我們構造乙個目的mac位址為ff-ff-ff-ff-ff-fe的arp請求報文,那麼,對於在正常工作模式下的網絡卡,資料報將被丟棄,當然也就不會回饋任何報文;而對於在混雜模式下網絡卡,資料報將被接收進入系統核心。而系統核心會認為這個mac位址是廣播位址,因此就會回饋乙個arp應答報文。這樣,我們就可以判斷出這台機器上存在sniffer了。

4. 主要原始碼分析

由以上分析可知,程式大概分為兩個模組,乙個是傳送偽裝廣播位址的arp請求報文,另乙個是接收回饋的arp應答報文並做出分析。我們就分別用兩個執行緒來實現。主線程負責傳送,監聽執行緒負責接收。

首先是建立乙太網頭部和arp頭部的結構:

★typedef struct _et_header    //乙太網頭部

et_header;

typedef struct _arp_header   //arp頭部

arp_header;

★然後是傳送arp請求報文的主線程,取得所有介面卡的名字。其中,「adapter_name」表示乙個用於存放介面卡名字的緩衝區,而這些介面卡名字將以unicode編碼方式存入此緩衝區中。unicode編碼方式就是用乙個字的空間(兩個位元組)來存放乙個字元。這樣,每個字元間自然會出現乙個'/0'。而兩個介面卡名字之間將會有乙個字為'/0'作為間隔。adapter_length:這個緩衝區的大小:

★if(packetgetadapternames((char*)adapter_name, &adapter_length)==false)

★開啟介面卡,此處我預設開啟第一塊介面卡:

★lpadapter=(lpadapter)packetopenadapter((lptstr)adapter_list[0]); 

if (!lpadapter||(lpadapter->hfile==invalid_handle_value))★★

strtomac("00e06e41508f",s_mac);    //"00e06e41508f"是筆者測試程式所用的本地機的網絡卡位址,測試者應將其改為測試機網絡卡位址

memcpy(et_header.eh_src,s_mac,6);

strtomac("fffffffffffe",d_mac);  //目的實體地址設定為fffffffffffe。   

memcpy(et_header.eh_dst,d_mac,6);

et_header.eh_type=htons(0x0806);  //型別為0x0806表示這是arp包

arp_header.arp_hdr=htons(0x0001);  //硬體位址型別乙太網位址

arp_header.arp_pro=htons(0x0800);  //協議位址型別為ip協議

arp_header.arp_hln=6;              //硬體位址長度為6

arp_header.arp_pln=4;              //協議位址長度為4

arp_header.arp_opt=htons(0x0001);  //標識為arp請求

arp_header.arp_spa=i***_addr("172.24.21.10");  //"172.24.21.10"是我測試程式所用的本地機的ip,測試者應將其改為測試機ip

memcpy(arp_header.arp_sha,et_header.eh_src,6);

arp_header.arp_tpa=i***_addr(argv[1]);

memcpy(arp_header.arp_tha,et_header.eh_dst,6);

★傳送資料報:

★lppacket=packetallocatepacket();     //給packet結構指標分配記憶體

packetinitpacket(lppacket,buffer,512);   //初始化packet結構指標

packetsetnumwrites(lpadapter,5);  //設定傳送次數

packetsendpacket(lpadapter,lppacket,true);//傳送arp請求包

★最後別忘了掃尾工作:

★packetfreepacket(lppacket);   //釋放packet結構指標

packetcloseadapter(lpadapter);  //關閉介面卡

★最後是監聽執行緒:

設定接收資料報的系列引數:

★packetsethwfilter(lpadapter, ndis_packet_type_directed);   //設定網絡卡為直接模式

packetsetbuff(lpadapter,1024);     //設定網絡卡接收資料報的緩衝區大小

packetsetreadtimeout(lpadapter,2);   //設定接收到乙個包後的「休息」時間

★接收資料報:

★packetreceivepacket(lpadapter, lppacket, true);   //接收資料報★

對資料報進行分析,以得出結論:

★char *buf;

bpf_hdr *lpbpfhdr;

et_header *lpethdr;

in_addr addr=;

buf=(char *)lppacket->buffer;

lpbpfhdr=(bpf_hdr *)buf;

lpethdr=(et_header *)(buf+lpbpfhdr->bh_hdrlen);

if(lpethdr->eh_type==htons(0x0806))     //判斷是否為arp包

,dest_ip[20]=;

addr.s_un.s_addr=lparphdr->arp_spa;

memcpy(source_ip,i***_ntoa(addr),strlen(i***_ntoa(addr)));

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

addr.s_un.s_addr=lparphdr->arp_tpa;

memcpy(dest_ip,i***_ntoa(addr),strlen(i***_ntoa(addr)));

if(!strcmp(source_ip,ip) && !strcmp(dest_ip,"172.24.21.10"))   //判斷接收到的包的源ip與目的ip是否正確(字串變數ip是從主線程傳遞過來的被探測機的ip)}}

★5. 結尾

真的是所謂一物降一物,sniffer雖然厲害,但我們終究找到了破解它的辦法了。由於這個原理,軟體anti-sniff應運而生。當然,我寫的這個程式比起anti-sniff來可以說是小巫見大巫,但是,萬變不離其綜,它們的基本原理都是一樣的。

用ARP偽裝廣播探測網路中的Sniffer

用arp偽裝廣播探測網路中的sniffer 嗅探器 sniffer 一直以來都是一種讓人惱火的黑客工具,因為它是一種靜態的攻擊軟體,它的存在不會留下任何痕跡,因此人們很難將它揪出來。可是,它的危害性卻又是相當大的 它就像乙個監視器,你的 一舉一動 都在它的監視之下,你說危害大不大 所以,我們不能不要...

利用arp發現網路中的嗅探器

1.sniffer原理 所謂知己知彼方能百戰不殆,要了解探測sniffer的方法,就先得了解sniffer的原理。首先,讓我們來看一看區域網中是怎樣傳輸資料的。當乙個資料報的目的地是區域網內的某台計算機時,此資料報將以廣播的形式被傳送到網內每一台計算機上。而每台計算機的網絡卡將分析資料報中的目的ma...

交換網路中的嗅探和ARP欺騙

文章提交 refdom refdom at 263.net 乙太網內的嗅探 sniff 對於網路安全來說並不是什麼好事,雖然對於網路管理員能夠跟蹤資料報並且發現 網路問題,但是如果被破壞者利用的話,就對整個網路構成嚴重的安全威脅。至於嗅探的好處和壞處就不羅嗦了。arp快取表 假設這樣乙個網路 hub...