新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > 基于sniffer的網絡安全分析儀設計與實現

        基于sniffer的網絡安全分析儀設計與實現

        作者: 時間:2017-06-08 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201706/352621.htm

        摘要

        本作品在xilinx提供的spartan3e-500 Rev C開發平臺上成功地嵌入uclinux,并使用網絡安全開發包編寫代碼,實現了基于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復制到EDKswlibbsp文件夾下。

        (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,表示不設置為混雜模式。本函數返回一個句柄。

        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)

        利用嗅探數據包,并指定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服務器。具體方法如下:

        1. 使用petalinux-new-app腳本建立用戶程序,并編譯。具體方法參考user-apps目錄下面的README。

        2. 將生成的執行文件通過共享文件夾復制到tftp服務器根目錄

        3. 目標板上電啟動之后,在超級終端,使用ifconfig eth0 x.x.x.x命令分配板上系統一個ip地址。

        4. 開啟tftp服務器,進入板上系統的可寫入目錄/var(ramfs文件系統),執行命令

        tftp 192.168.158.57(tftp服務器ip) –g –r 可執行文件名

        1. 修改可執行文件的權限 chmod 755 可執行文件名

        (6)./可執行文件,查看運行結果。

        4.軟硬件融合

        當程序的運行情況符合自己的預期的時候,就可以將其加載到操作系統內核了。具體方法如下:

        1. redhat9系統,在已經建立了petalinux環境的終端中,執行命令進入

        petalinux-dist目錄,執行命令make image

        1. 將新生成的images文件夾通過共享文件夾復制到windows系統中tftp服務器根目錄下。

        2. 開啟tftp服務器,板子上電,當出現“hit anykey to stop autoboot”時候,敲擊鍵盤上某個鍵,此時會出現“U-Boot>”提示,輸入命令“run update_kernel”執行之,經過一段時間之后,內核就會更新完成。

        3. 重新上電啟動,就會在/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

        工具使用流程簡述

        1. 使用命令 nsa –i eth0,根據結果以及流量統計分析可疑ip地址,初步認識該ip地址行為。

        2. 使用nsa提供的參數,對特定的數據包進行協議,ip地址,端口號,或者mac地址的過濾,進行詳細分析。

        功能測試

        測試-: 局域網內的異常行為是很多的,但是異常行為或多或少都會在數據包行為,比如流向,頻度,端口特征等方面體現出來,因此是可以分析出來的。現在只選擇一種行為arp欺騙進行數據包的偵測分析。

        步驟描述:

        1.模擬出arp欺騙行為。

        2.打開超級終端,設定各個參數。目標板上電,在超級終端使用ifconfig eth0 命令,分配給嵌入式系統同一網段的ip地址。

        3.telnet命令登陸目標板,用戶名,密碼均為root。

        4.使用命令nsa –i eth0 arp > /var/result,進行arp數據包捕獲,一段時間之后,使用ctrl+c命令停止。

        5.使用命令 vi /var/result查看抓包結果。

        測試結果及分析

        模擬出來的arp欺騙,其顯著特征就是要不斷地發送arp回應包來更新受害主機的arp緩存來達到欺騙的目的。通過使用我們的程序可以抓到如圖所示的arp數據包,網關mac地址為假,可以肯定的是有臺主機在進行arp欺騙并冒充網關的角色。

        測試二:

        綜合抓包測試,主要進行nsa工具的全方位演示

        1.nsa -i eth0 –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 –l

        結果:

        功能二:指定ip、mac,發送arp數據包

        arptool -d 192.168.158.57 -s 192.168.158.210 -r 00:0A:35:00:22:01 –n 3

        使用該命令向192.168.158.57發送192.168.158.210正確的arp數據包3次。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜川县| 百色市| 松江区| 阳春市| 卢氏县| 如皋市| 成安县| 仪陇县| 广饶县| 北辰区| 沈丘县| 五常市| 灵台县| 澳门| 铁力市| 华阴市| 通渭县| 孟村| 彰武县| 九江县| 罗平县| 隆昌县| 古田县| 鹤峰县| 逊克县| 昭苏县| 托里县| 柘城县| 明光市| 读书| 汾阳市| 比如县| 无为县| 社会| 武平县| 玉门市| 富川| 宜阳县| 梧州市| 高雄市| 梨树县|