DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1345|回复: 0
打印 上一主题 下一主题

[待整理] 基于sniffer的网络安全分析仪设计与实现

[复制链接]
跳转到指定楼层
楼主
发表于 2015-4-26 17:28:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
摘要
          本作品在xilinx提供的spartan3e-500 Rev C开发平台上成功地嵌入uclinux,并使用网络安全开发包libpcap编写代码,实现了基于Sniffer技术的局域网简单流量分析功能。
           
          人机交互操作,通过telent命令或者超级终端实现。
           
          一.系统设计
          1.硬件设计
          Xilinx公司的spartan3e starter kit 提供以太网10/100 phy 接口,JTAG  USB下载,2个9引脚的RS-232串行接口等连接器和接口资源,并且其目标应用市场定位在消费类、电信/数据通信、服务器、存储器。结合开发板的优势推知,spartan3e starter kit 在嵌入小型操作系统后,在实现网络数据捕捉及处理方面有一定的优势,为我们的作品设计提供了宝贵的前提。
           
          本设计选择操作系统uclinux,uclinux 是 一种优秀的嵌入式Linux版本。它集成了标准linux操作系统的稳定性、强大的网络功能和出色的文件系统等主要优点,更重要的是没有MMU(内存管理单元),更适合小型应用。
           
          基于以上考虑,我们可以使用edk套件搭建出uclinux运行的硬件平台。
           
          2.软件设计
          基于信息安全专业的背景,以前使用过软件版本的sniffer。本设计设想在搭建的uclinux平台上实现sniffer功能,进行网络数据的捕捉以及处理,实现局域网简单流量分析功能。
           
          首先网络流量分析是必要的,傻瓜式攻击就可以让网络瘫痪,因此诊断网络异常情况,是维护网络的必备技能。以太局域网上普遍使用tcp/ip协议,要掌握整个局域网的使用情况,必须对底层的网络传输数据包进行捕获并分析,才能准确地判定以太局域网的网络状况。
           
          而本次设计中使用了数据包捕获开发包Libpcap(the Packet Capture Library),它是一个高层的编程接口,隐藏了操作系统的细节,可以捕获网络上的所有数据包。Libpcap中使用了BPF过滤机制,使Libpcap具有捕获特定数据包的功能。
           
          基于以上分析,我们设想通过分析以太网网络的数据包流向,用来诊断整个网络是否出现了异常情况,实现了局域网安全分析的功能。另外,针对arp病毒的泛滥情况,特别开发了一个arp工具,用来对整个网络的ip、mac地址进行扫描,并快速的更新arp缓存。
           
        二.系统实现

          1.硬件实现
          搭建硬件平台流程,建议不要更改,有些是环环相套的。
           
          (1.申请评估版ip包
          edk9.1提供的以太网控制器ip有两种,一种是opb Ethernet  ,另一种就是opb Ethernetlite,这两种最主要的区别就是ethernet支持硬件过滤的混杂模式,而ethernetlite是一种简化了的控制器,适合于以太网的简单应用,但却不支持混在模式,本作品的设计前提就是网卡必须要工作再混在模式,所以只能选择需要注册使用的opb Ethernet,考虑到非专业设计公司使用,故申请了3个月的免费ip使用权。若要参考本设计的话,该步骤是十分必须的。若需要,可以到xilinx公司的网站上进行申请,需要说明的是申请的ip许可包是跟pc的网卡地址绑定的,具体申请步骤不再详述。
           
       

         
          (2.定制板上资源
          本作品用到的板上I/O接口:RS232_DCE、FLASH、DDR_SDRAM、Ethernet_Mac等。xilinx公司嵌入式套件EDK中xps提供的bsb(base system  builder)可以轻松地实现板上资源的定制。下面就结合一些步骤图片来说明下如何完成该硬件设计。
           
          (1)启动xps9.1i,软件系统会弹出如图所示的对话框,其中共有三个选项。由于我们是要新建一个硬件平台,因此点选“Base  System  Bulider wizard(recommended)”, 点击“OK”,进入下一步向导。
         

        (2)在弹出的对话框中,点击“Browse”按钮,选择一个目标磁盘建立一个自己的工程文件夹并进入,点击保存,系统会自动为此项目生成一个system.xmp(务必使用system文件名);点击“OK”按钮,进入BSB欢迎对话框。

         

        (3)在欢迎对话框中,选择“I would  like to create  a new design”,点击“Next”按钮。

         

        (4)进入开发板选择对话框,进行如图所示选择。spartan-3E Starter Board 的版本有C跟D两种,他们其实在接口资源以及内置资源方面是非常相似的,仅有一处不同,DDR SDRAM存储器容量的不同,C版本的只有32MB,而D版本的却有64MB。可以根据DDR SDRAM的型号来确定开发板的版本,我所使用的开发板,DDR SDRAM型号为MT46V32M16,由此确定出开发板型号为D。若不注重这个问题的话,选择C跟D都是可以的。

         

       

         

        (5)进入处理器选择对话框,因为spartan-3E只支持软核MicroBlaze,所以保留默认设置即可。点击“Next”进入下一步。

         

        (6)进入MicroBlaze配置对话框,参考时钟频率选择默认值50MHz即可,MicroBlaze处理器的总线时钟频率选择为“66.67”MHz。其中参考时钟由开发板上的时钟源提供,被用来产生总线和处理器的频率。Cache  setup选项点选“Enable”,其他项保持默认即可,点击“Next”进入下一步。

         

        (7)进入I/O端口配置对话框。I/O设备选择“RS232_DCE”,不选择”RS232_DTE”和“Leds_8bit”。对于RS232_DCE,波特率选择“115200”,并且打开中断,其他选项默认即可。点击对话框右侧的“Data Sheet”按钮,可以看到每个外设的详细资料,从这里我们可以或得很多帮助的,可以充分利用下。选择完毕后点击“Next”,进入下一步。

         

        (8)继续I/O配置,在该对话框中只需要点选“Flash_16M×8”,peripheral选项列中选择“OPB EMC”,点击“Next”,进入下一步。

         

       

         

          (9)进入外部存储器与网络接口对话框,如图所示。
           
          spartan-3E开发板使用使用外部存储器DDR SDRAM,所以需要点选它。因为网络数据捕获需要通过网络接口来实现,所以“Ethernet_Mac”选项是必不可少的,同时需要把中断打开,
         

          点击“Next”,进入下一步。
        (10)由于需要使用uclinux操作系统,因此需要添加定时器,在出现的对话框中点击“Add Peripherals”按钮,在弹出的对话框中选择“OPB TIMER”,然后点击“OK”按钮。
         

        (11)在接下来的对话框中,timer  mode点选“one timer is present”并开中断,然后点击“Next”,进入下一步。

         

        (12)进入cache配置对话框。因为在系统构建之初,我们已经选择了对外部存储器进行cache缓存,所以在这里需要对其大小进行设置,数据cache与指令cache分别为默认的“8KB”和“2KB”即可,并且勾选“ICache”与“DCache”,之后点击“Next”按钮。

         

        (13)剩下的步骤,可以一直点击Next到generate。

         

        (14)出现“the next step”对话框时,点“OK”。

         

        至此针对网络安全分析仪的硬件资源定制完成。

         

          (3.混杂模式功能开启(特别重要)
          默认情况下,以太网控制器ip核opb  ethernet 的混在模式功能是没有开启的,需要在xilinx公司提供的emac v1_01_a驱动代码里面添加开启代码。具体步骤如下:
           
          (1)System  Assembly View1 视图中,右键单击Ethernet_Mac选择Driver:emac_v1_01_a中的“Browse  Driver  Sources”之后,在弹出的文件对话框中点选src进入该目标打开xemac_selftest.c。
           
          (2)编辑xemac_selftest.c,将 XEM_ECR_PROMISC_ENABLE_MASK添加到XEM_ECR_RESET_STATE  的定义中,记住添加的代码前面有个位运算符或“|”。
           
          (4.添加支持操作系统的附加选项
          (1)在System  Assembly View1 视图中,切换到“Bus Interface”,可以看到MicroBlaze系统中各个模块与总线的连接情况。
           
          (2)这里,我们需要对系统做如下添加:将窗口切换到“Ports”,打开“debug_module”,点击“Interrupt”中的“Net”选项,选择“debug_module_Interrupt”。
           
          (3)打开“opb_intc_0”,然后双击“L to H”。
           
          (4)我们需要把debug_module_Interrupt加入到“Connected  Interrupt”栏中,方法是在左侧选中debug_module_Interrupt,点击加号,即可加入到右侧的“Connected  Interrupt”栏中。
           
          (5.生成uclinux板上支持bsp
          (1)由于本作品需要在MicroBlaze处理器上运行uclinux,因此首先应该将uclinux的配置文件petalinux_v1_00_b复制到\EDK\sw\lib\bsp文件夹下。
           
          (2)重新打开工程文件。
           
          (3)进行软件平台配置,点击“software”菜单,启动“software platform setting”。
           
          (4)系统会弹出软件平台的配置窗口,这里共有4个可配置项,我们只需要配置其中的“software  platform”、“”。对“software  platform”进行配置时候,点击它,窗口右侧为可配置参数,包括两个子窗口。在processor parameters中将“CORE_CLOCK_FREQ_Hz”的current value 修改为50000000;在os & library settings”子窗口中,打开os下拉菜单,选择petalinux(其实就是uclinux)。点击左侧的os  and  libraries,进行配置。配置参数如下:
           
          flash_memory_bank: 0;flash_memory: FLASH_16Mx8;main_memory_bank: 0
          main_memory: DDR_SDRAM_16Mx16;stdin: RS232_DCE;stdout: RS232_DCE
          点击OK,保存配置。
           
          (5)进入EDK的software菜单,点击 Generate BSP and Libraries,系统会自动生成板级支持包与库。可以在工程目录文件夹下的/microblaze_0/libsrc/ petalinux_v1_00_b目录中找到已生成的两个配置文件Kconfig.auto和auto-config.in。
           
          说明:Kconfig.auto,是针对kernel 2.6的,auto-config.in是针对kernel 2.4的。用记事本打开其中一个看看究竟,会发现都是一些#define 定义,原来硬件信息就是通过这些定义传递给内核并编译完成的。
         
          3.嵌入uclinux
          环境说明
          1.嵌入uclinux,所需要的资源包petalinux-v0.30-rc1.tar.gz,可以从http://developer.petalogix.com/wiki/WikiStarthttp://developer.petalogix.com/wiki/WikiStart 网址下载得到。
          2.windows xp  + vmware(Redhat9)
          3.ISE9.1(sp3)+EDK9.1(sp2)
          4.Cisco  TFTP  Server
           
          目录说明
                                                                         目录
                       
                                                                         描述
                       
                                                                         D:\petalinux
                       
                                                                         windows共享给vmware(redhat9)的目录
                       
                                                                         /mnt/hgfs/123
                       
                                                                         vmware(redhat9)共享给windows的目录
                       
                                                                         /embedded
                       
                                                                         petalinux-v0.30-rc1.tar.gz解压到该目录
                       
           
          操作步骤
          (1.vmware的redhat9图形界面安装vmware tools。
          (1)开启虚拟机中的redhat9系统;
           
          (2)点击“虚拟机”菜单中的“设置”选项,在cd-rom选项中,点选“使用iso镜像”,并将文件定位到vmware安装目录中linux.iso;
           
          (3)点击“虚拟机”菜单中的“安装vmware工具”,此时在桌面会出现光盘图标vmware  tools;
           
          (4)双击光盘图标进入,点击可执行文件rpm运行,稍许便可以安装完成。
           
          (2.建立共享文件夹
           我们需要建立一个可以在windows与linux系统之间共享的文件夹,通过虚拟机vmware来建立。在建立之前请确保vmware tools已经安装成功。
           
          (1)点击“虚拟机”菜单中的“设置”选项,在出现的对话框中点击“选项”,进入设置页面。
           
          (2)点击“共享文件夹”,在右侧点击“添加”按钮,进入设置向导。在名称栏填写“123”,在主机文件夹添加windows共享目录D:\petalinux,点击“完成”。
           
          这样在系统每启动之后,虚拟机redhat9都会将windows共享文件夹D:\petalinux挂载到/mnt/hgfs/123中。至此,windows与linux之间的文件共享通道已经建立完成。这对于以后的嵌入式开发工作来说,是至关重要的。除此方法之外,当然还有另外的文件共享方法,比如ftp等。但是相比较而言,这种方法更为简便。
           
          (3.建立内核编译环境
          嵌入式开发,需要在pc的linux虚拟环境中建立交叉编译环境。我们使用了开发包petalinux-v0.30-rc1.tar.gz,下面就此包的使用方法来说明下。
          (1)将petalinux-v0.30-rc1.tar.gz开发包复制到redhat9系统中的工作目录/embedded。
           
          (2)开启终端,执行命令cd  /embedded,进入工作目录;
           
          (3)在该目录,执行解压缩开发包的操作,命令为:tar  -zxvf  petalinux-v0.30-rc1.tar.gz;
           
          (4)解压缩完成之后,会在该目录中生成一个文件夹petalinux-v0.30-rc1;
           
          (5)下面来说明下这个文件夹的结构
          petalinux-v0.30-rc1
             + tools  ;包含编译器(gcc)工具和各种提供简便操作的帮助脚本
             |   + common
             |   |   + petalogix
             |   |       + bin
             |   + linux-i386
             |       + microblaze-uclinux-tools
             |
             + software
             |   + petalinux-dist      //主要的linux编译环境
             |   + linux-2.6.x-petalogix  //linux2.6内核
             |   + uClinux-2.4.x    //linux 2.4内核
             |   + user-apps   //用户程序文件夹   |
             + hardware
             |   + reference-designs  //参考设计
             |   + user-platforms    //edk硬件工程
             |   + edk_user_repository   // petalinux配置文件
             |   +fs-boot
             + settings.sh/settings.sch  //脚本程序,将编译环境定位到该开发包,执行哪一个脚本,取决于shell类型。
           
          (6)特别要说明的是,每次开启一个终端,都得执行脚本文件settings.sh/sch,否则是报错error:“PETALINUX environment variable not set”。
           
          (4复制edk工程目录
           复制edk工程目录到user-platforms,这就需要用到windows与linux之间的共享文件夹。具体操作方法比较简单,不再赘述。但是有一点必须要说明:
          edk工程文件名必须是system.xmp,这是因为开发包里面的脚本,比如说petalinux-copy-autoconfig,其作用就是将工程目录中libgen生成的kconfig.auto 转换成linux格式并复制到当前活动的platform中,但是其只会寻找system.xmp的工程!
           
          (5.select a platform
          (1)在终端设置petalinux环境
          在 petalinux-v0.30-rc1目录下面,执行source  setthings.sh命令
          (2)终端进入petalinux-dist目录,执行make menuconfig命令,之后会出现
          内核配置页面,如下图所示做出选择:
           
                               
                                       

                       
           
          退出并保存设置
        (6.working with autoconfig
          进入user-platforms文件夹中的edk工程目录uclinux,执行下面脚本petalinux-copy-autoconfig
           
          (7.petalinx配置及内核编译
          此步骤是依照自己的需要,来进行内核裁剪的,但是有些地方必须注意,需要把默认选择了的选项给去掉,负责会报错。
           
          (1)进入petalinux-dist目录,运行命令make menuconfig,出现内核配置对话框,选择进入Kernel/Library/Defaults selection,出现下图所示页面,并依照图做出类似选择。
           
                               
                                       

                       
           
          退出并保存;
           
          (2)紧接着就跳出了Linux Kernel Configuration 页面,在这里我们需要做出如下变动:
           
          依此顺序 NetworkingàNetworking options进入配置页面,选择Packet socket并退出到Linux Kernel Configuration 页面;
           
          依此顺序Device DriversàNetwork  device supportàEthernet(10 or 100Mbit)进入配置页面,选择Xilinx 10/100 OPB EMAC support,取消选择Xilinx 10/100 OPB EMACLITE  support,退出到Device Drivers配置页面;
           
          找到Input device support,进入配置页面,取消Keypad  Test  Device选择;
           
          一路退出并最终保存;
           
          (3)之后会跳出Main Menu配置页面
          进入System Settings配置页面,取消 Copy  final image to tftpboot的选择,再进入Flash Partition Table将Partition 3 size设置为80000并退出到main menu;
           
          进入core  applications配置页面,选择enable console shell;取消选择agetty并退出到main menu;
           
          进入 Library Configuration配置页面,选择 Bulid Libpcap并退出到main menu;
           
          进入Filesystem  Applications配置页面,取消flatfsd选择并退出到main menu;
           
          进入 Network  Applications配置页面,取消dhcpcd-new(2.0/2.4)选择并退出到main menu;
           
          进入BusyBox配置页面,选择chmod并退出;
           
          一路退出,并最后保存设置;
           
          (4)编译内核
          运行命令make  dep,是建立源文件跟头文件的依赖关系;
           
          运行命令make   all,进行内核编译工作;
           
          一段时间之后,可以顺利编译完成。成功之后会在petalinux-dist目录中发现多了个images文件夹,这里面就是我们需要的文件。
           
          (8.使用bootloader固化内核设计
          (1)在windows系统下打开建立的edk工程system.xmp,在project information  area中的Applications列做如下图所示的修改:
           
       

           
          a.先进行“Set  Compiler Options”,如图所示点击右键之后会出现一个设置对话框,其中有三个选项列,分别是Environment,Debug and Optimization,Paths and Options。要做的修改如下表所示:
           
                                                                         Attribute
                       
                                                                         value
                       
                                                                         Environment
                       
                                                                          
                       
                                                                         Application mode
                       
                                                                         executable
                       
                                                                         Output  ELF file
                       
                                                                         default  value
                       
                                                                         Linker  Script
                       
                                                                         Use default  Linker Script
                       
                                                                         Stack Size
                       
                                                                         1K
                       
                                                                         Debug and Optimization
                       
                                                                          
                       
                                                                         Optimization  Level
                       
                                                                         Size Optimized(-Os)
                       
                                                                         Advance
                       
                                                                          
                       
                                                                         Other Compiler Options to Append
                       
                                                                         -Wall
                       
         
          b.添加fs-boot 文件夹里面的c源文件跟头文件
          使用共享文件夹将petalinux-v0.30-rc1/hardware目录下面的fs-boot文件夹复制到windows系统;将sources跟headers项目下的文件删除,具体方法是在文件上面点右键选择“remove”;然后在“sources”跟“headers”上点右键,选择“Add  Existing Files”,将位置定位到fs-boot下面的文件,完成添加步骤。
           
          c. make  project : TestApp_Peripheral inactive,方法是点右键,选择“Make  Project  Inactive”。
           
          (2)使用xps打开edk工程system.xmp,在Hardware菜单下选择“Generate  Netlist”生成网表,进程无误之后,再在该菜单下选择“Generate Bitstream”,生成硬件比特文件。
           
          (3)建立一个超级终端,参数如下:
          波特率:115200,数据位:8,奇偶校验:无,停止位:1,数据流控制:无。
           
          连接串口线,电源线,jtag下载线,RJ45网络接口,开通电源。
           
          (4)在xps菜单“Device Configuration”下选择“Download  Bitstream”,进行硬件比特流文件的下载;下载完成之后会出现如下提示:
          FS-BOOT:Waiting  for  SREC  image……
          表示硬件比特流已经下载成功。
           
          现在固化内核需要做的有以下几个步骤;
          a.网上下载tftp服务器,使用windows跟linux共享文件目录将petalinux-dist目录下新生成的images复制到windowsx系统目录下面,并将该images目录作为tftp服务器的根目录。
           
          b.在超级终端下,选择传送à发送文本文件,定位到images目录下面的u-boot.srec,进行文件传送,成功之后,出现如下“u-boot>”提示。
           
          c.输入命令 loadb,之后会出现类似于“Ready for binary download to {address} at 115200 bps…
          出现该提示之后,超级终端à传送à传送文件,images目录下的ub.config.img,通讯协议选择Kermit;
           
          完成传输之后,输入命令autosrc 目的就是要启动刚传输的脚本文件。
           
          紧接着输入以下命令,进行环境设置
           
           U-Boot> setenv  ipaddr     192.168.158.210
           U-Boot>setenv serverip     192.168.158.57
           U-Boot>saveenv
          说明:serverip就是tftp所在windows系统的ip地址,可以在cmd命令行下通过ipconfig来查看。ipaddr是目标板ip地址,可以自己设定,只要跟serverip地址在同一个网段即可。
           
          d.完成内核下载
          U-Boot>run  update_uboot
          U-Boot>run  update_kernel
          命令执行完成之后,就完成了内核下载工作。
           
          (9.固化硬件设计
          使用impact工具将edk工程目录下面的download.bit文件转换成mcs格式的PROM文件,并烧入开发板上的PROM:xcf04,将fpga配置方式选择为主串配置方式即可,该步骤不再赘述。
           
          下载完成之后,板子重新上电,在超级终端就会发现系统的启动过程。至此,uclinux的嵌入式系统已经安装成功。
        2.软件实现
          sniffer
          (1)流程图
       

         

          (2)设计明细
          ◆   嗅探器的开发
          嗅探器的功能是嗅探以太网上的数据包,并且按照用户输入的参数进行格式化输出。
           
          源代码核心函数介绍:
          1)查找网络接口
          int pcap_findalldevs(pap_if_t **alldevsp,char *errbuf)
          -l 调用pcap_findalldevs查找机器的所有可用的网络接口,并用一个网络接口链表返回,然后打印出本机的网卡接口信息。
           
          2)打开网络接口
          pcap_t*  pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *ebuf)
          -i 指定网卡接口(device)的值,-p指定promisc的值,值为1,表示设置网卡为混杂模式,值为0,表示不设置为混杂模式。本函数返回一个libpcap句柄。
           
          3)捕获指定的网卡
          int pcap_loop(pcap_t* p,int cnt, pcap_handler callback,u_char *user)
          -c 指定cnt的数值,cnt是捕获的数据包的个数,-1表示捕获个数为无限个。
          每次捕获一个数据包就调用callback指示的回调函数。所以,利用这个回调函数的特点,程序可以循环捕捉数据包并
          调用回调函数进行分析。
           
          4)数据包处理
          使用pcap_loop捕获了数据包后,我们需要调用回调函数来分析以太网协议,由于以太网协议是分层的,所以我们
          需要根据以太网的数据包的类型字段来判断协议类型,然后逐一进行分析,并输出协议报头和内容。还要根据用户的输入
          参数进行特殊的格式化输出,这样子可以便于分析网络的通信状况。
           
          <1>以太网协议分析
          void ether_printer(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
          本函数处理以太网报头,并输出以太网的mac地址流向。另外,根据以太帧的上层协议类型字段进行逐一分析,
          0x0806表示arp协议,0x0800表示ip协议。并分别调用各自的分析函数。
          -m 指定输出以太网的网卡mac地址流。默认情况不会输出硬件地址流向。
           
          <2>arp协议分析
          void arp_printer(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
          本函数处理arp协议报头,并分析arp的操作码,按照arp requset和arp reply两种数据包进行输出。
           
          -n  指定输出的格式,输出域名而不是ip地址。
           
          <3>ip协议分析
          void ip_printer(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
          本函数按照ip报头里面的上层协议字段,分tcp(6)、udp(17)和icmp(1)三种协议进行分析处理。
           
          <4>tcp协议分析
          void tcp_printer(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
          本函数分析tcp协议,输出源ip地址,源端口,目的ip地址,目的端口。
          -n指定输出的格式,输出域名而不是ip地址。
          -a 解析端口号为相应的服务名
          -v 输出tcp的详细信息,包括序列号,确认应答号,控制标志,窗口大小,检查和,紧急指针,包长度,服务类型,ip段偏移值,生存周期,如果指定了-x,还可以输出数据包的十六进制内容。
           
          <5>udp协议分析
          void udp_printer(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
          本函数分析udp协议,输出源ip地址,源端口,目的ip地址,目的端口。
          -n指定输出的格式,输出域名而不是ip地址。
          -a 解析端口号为相应的服务名
          -v 输出udp的详细信息,包括包长度,服务类型,ip段偏移值,生存周期,如果指定了-x,还可以输出数据包的十六进制内容。
           
          <6>icmp协议分析
          void icmp_printer(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
          本函数分析icmp协议,输出icpm协议的源ip地址,目的ip地址,以及类型,比如echo request和echo reply。
          -n指定输出的格式,输出域名而不是ip地址。
           
          5)数据包统计
             本程序使用SIGINT信号,在键盘上的Ctrl+C快捷键按下后发出终止信号SIGINT,然后程序调用信号处理函数,输出数据包的总大小,捕获时间,还有arp、ip、tcp、udp、icmp、ether网的数据包总个数以及占用的百分比。
             signal(SIGINT, sigIntHandler)  //用来设定SIGINT信号
             void sigIntHandler(int sig)    //SIGINT信号处理函数
         
          6)其他辅助函数
          char *copy_argv(register char **argv) //BPF内核过滤参数处理
          int32_t gmt2local(time_t t)  //本地时间转换函数
          void  ts_print(register const struct timeval *tvp) //时间打印函数
             void getportname(int portn,char portch[], char *protocol) //端口号->服务名
             static void hex_print(const u_char *buf, int len, int offset)//
          十六进制打印
          【域名处理】
          『
           struct {
                          unsigned long int ipaddr;
                          char hostname[MAXSTRINGSIZE];
          }nametable[MAXENTRY]; //ip域名高速缓存
           
          int tbllength=0;
          void intohost(unsigned long int iadd, char *hn)
          void reghost(unsigned long int iadd)
          void print_hostname(u_char *ipadd)
          』
          arp tool
           
          (1)流程图
       

       
         

          (2)程序明细
          ★arptool设计
          arptool用于扫描局域网的ip、mac地址对应表,并且具有发送arp数据包的功能,可以对付局域网的arp欺骗攻击。
          源代码核心函数介绍:
          1)   取得本机ip地址
          int get_ip(struct in_addr* addr)
          本函数使用ioctl系统调用获得系统ip地址,并保存到addr结构体中。
           
          2)   取得子网掩码
          int get_mask(struct in_addr* addr)
          本函数使用ioctl系统调用获得子网掩码,并保存到addr结构体中。
           
          3)   取得本机硬件地址
          int get_packet_sock(struct sockaddr_ll* sll, char *device, u_char hwaddr[])
          本函数使用ioctl系统调用获得本机硬件地址,并保存到addr结构体中。
          同时可以自己定义硬件地址,用来和arpsend配合。
          同时生成一个sockaddr_ll结构体,用来发送arp数据包。
           
          4)   嗅探arp数据包
          void* sniff(void* myip)
          利用libpcap嗅探数据包,并指定arp数据包,目标地址为本机ip,回调函数为
          void handler(u_char* user, const struct pcap_pkthdr* hdr, const u_char* pack)
           
          5)   发送arp数据包
          int arpsend_local(int sock, struct sockaddr_ll* sll,u_char* pdip, u_char* pdmac)
          int arpsend(int sock, struct sockaddr_ll* sll, u_long SrcIP, u_long DstIP, u_char DstHW[])
          arpsend_local为列表ip、mac地址所用的本机arp发包函数。
          arpsend是用来发送自定义的arp数据包,供主函数调用。
          -n  指定发送的arp包的个数
          -a  指定发送arp request包,默认的是arp reply包
          -w  指定发送数据包的时间间隔(秒数),默认是1秒
              -d  指定发送数据包的目标ip地址
          -s  指定发送数据包的源ip地址
          -t  指定发送数据包的目标硬件地址
          -r  指定发送数据包的源硬件地址
           
          6)   输出ip-mac对应表
          int listIPMAC(u_char *device)
          本函数里面用新的线程进行监听,线程函数为sniff,同时用arpsend_local发送本机的arp数据包,然后调用下面的函数。
           
          void handler(u_char* user, const struct pcap_pkthdr* hdr, const u_char* pack)
          本函数是嗅探arp数据包的回调函数,读取嗅探的arp包,并解析出来源ip和源mac地址,然后输出ip、mac对应表。
         
          3.用户程序建立以及microblaze 上运行
          程序板上调试可以使用网络文件系统NFS,但是我的nfs建立不起来,只能使用了另一种方法,因为发现板上uclinux系统有tftp命令,故使用windows系统下的tftp服务器。具体方法如下:
           
           
  •                                          使用petalinux-new-app脚本建立用户程序,并编译。具体方法参考user-apps目录下面的README。
           
  •                                          将生成的执行文件通过共享文件夹复制到tftp服务器根目录
           
  •                                          目标板上电启动之后,在超级终端,使用ifconfig eth0 x.x.x.x命令分配板上系统一个ip地址。
           
  •                                          开启tftp服务器,进入板上系统的可写入目录/var(ramfs文件系统),执行命令

          tftp  192.168.158.57(tftp服务器ip) &ndash;g &ndash;r 可执行文件名
           
  •                                          修改可执行文件的权限  chmod 755  可执行文件名

          (6)./可执行文件,查看运行结果。
           
          4.软硬件融合
          当程序的运行情况符合自己的预期的时候,就可以将其加载到操作系统内核了。具体方法如下:
           
  •                                          redhat9系统,在已经建立了petalinux环境的终端中,执行命令进入

          petalinux-dist目录,执行命令make image
           
  •                                          将新生成的images文件夹通过共享文件夹复制到windows系统中tftp服务器根目录下。
           
  •                                          开启tftp服务器,板子上电,当出现“hit anykey to stop autoboot”时候,敲击键盘上某个键,此时会出现“U-Boot>”提示,输入命令“run update_kernel”执行之,经过一段时间之后,内核就会更新完成。
           
  •                                          重新上电启动,就会在/bin目录下面找到编译成功的用户程序。

           
          功能特色
          嵌入式系统功能及特色:
          在xilinx公司提供的开发板上,实现了基于fpga的嵌入式设计,成功地固化操作系统uclinux。fpga的配置方式为主串方式;板上的DDR SDRAM(MT46V32M16)相当于系统内存,Intel StrataFlash Parallel NOR FLASH相当于系统硬盘;嵌入的系统支持了多文件系统,比如romfs,ramfs。ramfs非常适合于嗅探结果的临时存放,方便了分析;以太网卡驱动初始化添加了混杂模式,为程序的全网嗅探提供了可能;标准输入输出设备为串口,同时也支持telnet远程控制操作。
           
          程序功能及特色:
          嗅探器的实现,主要使用了网络数据包捕获函数包libpcap。编写的代码可捕获tcp,udp,arp,icmp,ip等协议的数据包,并可实现协议,ip,端口等的过滤以及详细的基于ip,协议的流量统计功能;arp工具可输出局域网的ip-mac映射表,并可发送特定ip,mac地址的arp数据包以及时纠正错误的arp缓存。
           
          系统测试
          测试环境
          本作品测试的环境是以太局域网。
           
          测试设备
          有镜像端口的交换机或者10BASE-T  Ethernet  Hub
           
          工具使用流程简述
           
  •                                          使用命令  nsa &ndash;i eth0,根据结果以及流量统计分析可疑ip地址,初步认识该ip地址行为。
           
  •                                          使用nsa提供的参数,对特定的数据包进行协议,ip地址,端口号,或者mac地址的过滤,进行详细分析。

        功能测试
          测试-: 局域网内的异常行为是很多的,但是异常行为或多或少都会在数据包行为,比如流向,频度,端口特征等方面体现出来,因此是可以分析出来的。现在只选择一种行为arp欺骗进行数据包的侦测分析。
           
          步骤描述:
          1.模拟出arp欺骗行为。
           
          2.打开超级终端,设定各个参数。目标板上电,在超级终端使用ifconfig eth0 命令,分配给嵌入式系统同一网段的ip地址。
           
          3.telnet命令登陆目标板,用户名,密码均为root。
           
          4.使用命令nsa &ndash;i eth0 arp > /var/result,进行arp数据包捕获,一段时间之后,使用ctrl+c命令停止。
           
          5.使用命令 vi /var/result查看抓包结果。
           
          测试结果及分析
       

          模拟出来的arp欺骗,其显著特征就是要不断地发送arp回应包来更新受害主机的arp缓存来达到欺骗的目的。通过使用我们的程序可以抓到如图所示的arp数据包,网关mac地址为假,可以肯定的是有台主机在进行arp欺骗并冒充网关的角色。
           
          测试二:
          综合抓包测试,主要进行nsa工具的全方位演示
          1.nsa -i eth0 &ndash;na   抓取eth0接口并输出数据流向以及应用层协议和域名名称并统计。
           
          2. nsa -i 1 -c 4444   抓取指定个数的1号接口数据包并统计。
           
          3.nsa  ip src host 192.168.158.57  and tcp  port 80 抓取ip地址为192.168.158.57的http协议的数据流向并统计。
           
          4. nsa  -v -x  src net 192.168 and dst port 80  抓取网络地址为192.168网络的http协议的数据包并打印16进制数据内容以及包头信息。
           
          测试三:arptool测试
          功能一:列出ip-mac映射表,使用命令arptool &ndash;l
          结果:
           
       

           
          功能二:指定ip、mac,发送arp数据包
          arptool -d 192.168.158.57 -s 192.168.158.210  -r 00:0A:35:00:22:01 &ndash;n  3
          使用该命令向192.168.158.57发送192.168.158.210正确的arp数据包3次。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-15 12:40 , 耗时 0.096256 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表