当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : Ubuntu下C语言+libnet实现ARP数据包广播
帖子发表于 : 2011-06-07 8:35 

注册: 2010-05-31 11:22
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
先说一下相关的“废话”:

近来学校宿舍楼ARP攻击一直很猖獗,而且大多数是主机欺骗型ARP攻击。每次攻击都要至少半天整栋宿舍楼上不去网(我们这边每栋宿舍楼划分一个网段,像我们楼就是10.1..23.254/22)。我曾经抓到过ARP攻击数据包,局域网遭受攻击的时候被我逮了个正着:某台主机广播一个ARP数据包,内容是10.1.23.254 is at xxxxxxxx(即错误的网关MAC,我们的网关是10.1.23.254),然后整栋楼就断网大半天。

没有办法,绝大部分人不懂MAC绑定,没有主动防御意识。我自己绑定了MAC只能保护自己,却只能眼睁睁看着局域网瘫痪。这不端午放假前一天的晚上又被攻击,然而网络中心的管理员都放假了,我们一下就断网3天!

我真的怒了!

偶尔看到百度百科上ARP那一词条上,作者推荐了一个叫做“欣向全ARP工具”的东西,说是具有主动维护功能,就是向网内广播正确的网关与MAC地址。我觉的这个功能挺好,就下载下来试了试。那是WIN下的软件,我平时都是用Ubuntu,只好在同学机器上试,反正都上不去网,就死马当作活马医吧。没想到那个破烂玩意儿在使用其他任何功能之前,都必须扫描网络。我想扫就扫吧,反正很快(Linux下用nmap扫描10.1.23.254/22 的网段半分钟左右就OK了)。没想到那破东西居然明知道我的网段,却硬是从10.0.0.0扫描到10.254.254.254!!还扫了将近1个小时!终于扫描完成了啊,我就迫不及待用那个“主动维护”功能呐,没想到它不让自己填写网关跟MAC,还弹出窗口说自己找不到MAC(废话嘛,估计它是要读ARP表。都受ARP攻击了,ARP表里面就算有网关对应的MAC也不是间的是正确的啊,真不知这作者怎么设计的!),那我就手动绑定MAC吧(我知道正确的MAC地址,因为网络中心的网站上都公布这些信息的。),没想到同学那WIN7也不知道怎么的就不让绑定,用管理员权限运行CMD也不行,写个批处理也不行!我无奈,只好重启系统,可是再次打开那个破烂工具,它却说还要再扫描一次!!

我已经出离愤怒了!每次运行都要扫描,每次扫描都要一个小时的话,局域网早就瘫了,还维护个P啊!

后来有发现我那个网络接口不管用了,没信号(不是同学扫描局域网那台机器,而是那台机器上网的网口!一个宿舍才俩网口啊!大家都是用交换机的,XD!),我都想直接找百度百科那个ARP词条作者去理论了!神马破烂玩意儿都往百科上放!!

我还知道一些P2P软件可以发这种东西,都是WIN下的,但是害怕不安全,怕被人发现痕迹(虽说想做好事儿,但是手段毕竟有点hack)。就罢手Windows了,自己在Linux下来写!

首先,我写这个东西不是想做坏事儿的,也希望看到这篇博客的朋友不要拿去做坏事儿!

我只给出实现最基本功能的代码,稍微修改一下还可以实现好多其他的功能(我所在局域网的网关是10.1.23.254,其MAC地址为00:1c:f9:6a:4c:00,其实是一思科路由器)
下面是代码:(sendarp.c)
代码:
#include <stdio.h>
#include <libnet.h>
int main()
{
   int res;
   /*********init paras*****************/
   libnet_t *l;/*****libnet handler*/
   libnet_ptag_t p_tag;
   char *device="eth0";
   char err_buff[LIBNET_ERRBUF_SIZE];
   char *src_ip_str="10.1.23.254";
   char *dest_ip_str="0.0.0.0";
   u_char src_mac[6]={0x00,0x1c,0xf9,0x6a,0x4c,0x00};
   u_char dest_mac[6]={0xff,0xff,0xff,0xff,0xff,0xff};
   u_long src_ip;
   u_long dest_ip;
   src_ip=libnet_name2addr4(l,src_ip_str,LIBNET_RESOLVE);
   dest_ip=libnet_name2addr4(l,dest_ip_str,LIBNET_RESOLVE);

   /**********init libnet*****************/
   l=libnet_init(
      LIBNET_LINK_ADV,
      device,
      err_buff
   );
   if(l==NULL)
   {
      printf("libnet_init err!\n");
      fprintf(stderr,"%s",err_buff);
      exit(0);
   }

   /**********build arp packet************/
   p_tag=libnet_build_arp(
      ARPHRD_ETHER,/*hardware type ethernet*/
      ETHERTYPE_IP,/*protocol type*/
      6,/*length of mac*/
      4,/*length of IP*/
      ARPOP_REPLY,/*ARP operation type*/
      src_mac,
      (u_int8_t*) &src_ip,
      dest_mac,
      (u_int8_t*) &dest_ip,
      NULL,/*payload*/
      0,/*payload size*/
      l,/*libnet handler*/
      0/*'0' stands out building a new packet*/
   );
   if(p_tag==-1)
   {
      printf("libnet_build_arp err!\n");
      exit(0);
   }

   /***********build ethernet packet header*************/
   p_tag=libnet_build_ethernet(
      dest_mac,
      src_mac,
      ETHERTYPE_ARP,
      NULL,
      0,
      l,
      0
   );
   if(p_tag==-1)
   {
      printf("libnet_build_ethernet err!\n");
      exit(0);
   }

   /*********send packets*******************************/
   for(;;)
   {
      if((res=libnet_write(l))==-1)
      {
         printf("libnet_write err!\n");
         exit(0);
      }
      printf("arp packet has been sent\n");
      sleep(1);
   }

   /*********over and destroy**************************/
   libnet_destroy(l);
   return 0;
}


终端里编译:
代码:
gcc -o sendarp sendarp.c -lnet

运行(需要root权限):
代码:
sudo ./sendarp


运行时抓包:
图片

PS:1、上述代码总体在Windows下可用,只是包含头文件的方式有所不同,有兴趣的朋友可以研究一下windows下libnet的安装、配置与使用。

2、代码中第9行:char *device="eth0",是指Linux下默认的有线网络接口,如果把“eth0"换做"wlan0"则是默认的无线网络接口。其实我是在无线网络下测试的(怕影响有线局域网),所以才有那么一堆不对应网关为10.1.23.254的IP地址。
最后,引用、转发请注明出处:http://blog.csdn.net/nihaojiayu/archive/2011/06/07/6528746.aspx


页首
 用户资料  
 
2 楼 
 文章标题 : Re: Ubuntu下C语言+libnet实现ARP数据包广播
帖子发表于 : 2011-06-08 14:13 

注册: 2009-07-25 19:23
帖子: 298
送出感谢: 3
接收感谢: 0 次
:em04 学习了


_________________

Ubuntu 桌面培训- 全中文官方文档,含汉化截图,提供PDF


页首
 用户资料  
 
3 楼 
 文章标题 : Re: Ubuntu下C语言+libnet实现ARP数据包广播
帖子发表于 : 2011-06-09 9:30 

注册: 2005-11-10 19:12
帖子: 641
送出感谢: 0 次
接收感谢: 0 次
谢谢LZ的无私奉献


页首
 用户资料  
 
4 楼 
 文章标题 : Re: Ubuntu下C语言+libnet实现ARP数据包广播
帖子发表于 : 2011-06-09 9:39 

注册: 2005-11-10 19:12
帖子: 641
送出感谢: 0 次
接收感谢: 0 次
gcc -o sendarp sendarp.c -lnet
sendarp.c:21:20: fatal error: libnet.h: 沒有此一檔案或目錄
compilation terminated.
这个头文件在哪个包里面阿.......


页首
 用户资料  
 
5 楼 
 文章标题 : Re: Ubuntu下C语言+libnet实现ARP数据包广播
帖子发表于 : 2011-06-09 9:40 

注册: 2005-11-10 19:12
帖子: 641
送出感谢: 0 次
接收感谢: 0 次
这个是现成的工具?
代码:
apt-cache search libnet|grep arp
libnet-arp-perl - module to create ARP packets and lookup for ARP information


页首
 用户资料  
 
6 楼 
 文章标题 : Re: Ubuntu下C语言+libnet实现ARP数据包广播
帖子发表于 : 2011-06-10 8:14 

注册: 2010-05-31 11:22
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
baby 写道:
gcc -o sendarp sendarp.c -lnet
sendarp.c:21:20: fatal error: libnet.h: 沒有此一檔案或目錄
compilation terminated.
这个头文件在哪个包里面阿.......

不好意思,忘了说明libnet需要自己安装了,我用的Ubuntu11.04,163的源里面有libnet1.1.4,需要安装3个文件:libnet1-dbg、libnet1-dev,libnet1-doc,装上之后就可以包含头文件了
另外,我没确认Ubuntu其他版本的源里面有没有libnet,如果你用其他版本,没有的话只能自己网上下源代码编译安装了


页首
 用户资料  
 
7 楼 
 文章标题 : Re: Ubuntu下C语言+libnet实现ARP数据包广播
帖子发表于 : 2011-06-10 8:16 

注册: 2010-05-31 11:22
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
baby 写道:
这个是现成的工具?
代码:
apt-cache search libnet|grep arp
libnet-arp-perl - module to create ARP packets and lookup for ARP information


不好意思,我没研究过libnet-arp-perl-module 具体是干什么的,我安装libnet也不是装的这个。具体方法请看楼上


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译