网络安全技术研究嗅探与扫描实现.docx
《网络安全技术研究嗅探与扫描实现.docx》由会员分享,可在线阅读,更多相关《网络安全技术研究嗅探与扫描实现.docx(32页珍藏版)》请在冰点文库上搜索。
![网络安全技术研究嗅探与扫描实现.docx](https://file1.bingdoc.com/fileroot1/2023-7/10/3ffabc8b-c995-43b3-9778-1b1780b8ac1d/3ffabc8b-c995-43b3-9778-1b1780b8ac1d1.gif)
网络安全技术研究嗅探与扫描实现
摘要
网络嗅探器是一种用于诊断、分析、测试网络安全性并进行网络分析的重要且优秀工具。
用户可以通过该工具捕获网络中正在传输的数据包并进行分析,其结果用于网络安全的维护。
本设计主要在Windows平台使用Java语言实现简单的网络嗅探器。
通过研究当前的各种嗅探器中,学习数据包的发送、接收与过滤。
进行模块划分并使用Jpcap实现ARP扫描,ICMP扫描,TCP与UDP端口扫描。
同时把数据包的发送与接收进行多线程处理增加其扫描效率。
关键字:
嗅探技术多线程模块化
Abstract
Networksnifferisanimportantandexcellenttoolfordiagnosing,analyzing,testingnetworksecurityandconductingnetworkanalysis.Thetoolenablesuserstocaptureandanalyzepacketsthatarebeingtransmittedonthenetwork,andtheresultsareusedfornetworksecuritymaintenance.
ThisdesignmainlyusestheJavalanguagetoimplementasimplenetworksnifferontheWindowsplatform.Learntosend,receive,andfilterdatapacketsbystudyingcurrentsniffer.PartitioningmodulesandusingJpcaptoimplementARPscanning,ICMPscanning,TCPandUDPportscanning.Atthesametime,themulti-threadprocessingofsendingandreceivingdatapacketsincreasesthescanningefficiency.
Keywords:
Sniffingtechnology;Multi-threaded;Modular
第1章绪论
1.1研究目的及意义
现如今网络正逐渐向着多样性、层次性的方向发展,与此同时,网络相关技术朝着更加的复杂方向发展。
用户对于网络安全的要求也随之更为严格[1]。
但当网络出现延迟过高、掉线、流量超限等等突发情况时,管理人员所以来到网络设备可能并不具备高级的交互性或智能性,而且单凭人力也往往力不从心。
毕竟,仅靠管理人员的经验并不能准确而有效地解决问题。
这为网络嗅探器等网络工具的出现提供了需求。
网络嗅探器是一种基于被动监听原理进行网络分析的工具。
操作简单,功能强大,用户可以容易地获取网络中各中信息[2]。
若将网卡设置为混杂模式,即使数据包的目的地址不是网络嗅探器所在主机仍可捕获[3,4]。
网络嗅探技术被广泛用于故障诊断、性能分析等多个领域。
随着互联网的日渐发展,网络安全越发不容忽视,网络嗅探器将在这一领域扮演重要的角色[5]。
1.2研究现状
目前世界各国都普遍重视并大力发展网络嗅探技术。
在网络嗅探的研究方面,研究人员主要关注网络数据报文信息与网络数据流量,通过对实时网络的监控,捕获数据(目前国内外大致有两种包捕获机制应用于网络嗅探中,分别是操作系统内核提供的和由软件通过使用包捕获驱动程序提供的),识别网络信息,快速发现网络故障并对故障位置进行警告[6]。
当前市面上常见的软件嗅探器有SnifferPro、WireShark、TCPdump、Windump、DSniff等。
(1)SnifferPro是美国NetworkAssociates公司出品的一种网络分析软件,有着网络嗅探器所需要的各种基本功能。
主要用于检测网络故障与管理网络设备,支持各种系统,性能优越,有着广泛的应用。
(2)WireShark做为一个免费且开源的网络分析软件,功能十分强大。
该软件主要被用于进行网络分析,通过捕获网络中传输的各种数据包,可以直观地查看其中信息,了解网络状况从而进行网络分析。
对于网络开发和学习都有着重要的作用[7]。
(3)TCPdump是一款基于命令行的网络分析软件,小巧而实用,TCPdump在Windows系统下的版本就是Windump。
开发人员可以通过使用基本的命令行表达方式使用TCPdump,进行数据包的过滤和捕获并进行分析[8,9]。
(4)DSniff是一款功能强大而广受欢迎的网络嗅探软件。
在此之前的软件大多使用被动嗅探的方式,而该软件使用了许多可使用主动攻击的软件,使主动嗅探的方式代替被动嗅探。
这些软件可主动发送数据包而不是被动接收,数据包被发送到目的主机,可以从相应的返回数据中获取相关信息。
因此,软件可以在各种网络环境中进行工作,甚至当目的主机不与软件直接相连时仍能正常工作。
1.3使用的开发技术与平台
在Windows平台上,使用Java语言,eclipse集成开发环境,学习使用JavaFx、Socket变成、Jpcap扩展包等等,进行简单网络嗅探器的设计与实现。
通过到图书馆与网络上查阅相关资料进行学习,对课题有了系统的了解,明白网络嗅探器主要工作原理以及整个嗅探的大概过程。
研究网络嗅探器的捕获数据和分析数据包数据在各个层的基本功能,进行结构设计分为数据发送模块,数据获取模块,数据显示模块和图形用户界面模块。
了解其具体的运行过程,通过Java语言来编写实现它对截取的报文进行分析和处理的功能。
编写一个可以接收发送ARP、ICMP、TCP和UDP报文并且可以对特定IP与端口进行扫描的程序。
首先使用JavaFx进行图形用户界面的编写,其次使用Jpcap完成数据发送与接收模块的编写,最后编写数据显示模块将接收到的数据显示到用户界面。
之后进行调试与功能测试并进行修改。
对用户界面进行规整理,使界面井井有条。
对程序进行优化,将发送与接收模块进行多线程处理,提高程序运行速度与效率。
第2章相关协议与关键技术
2.1相关协议
2.1.1ARP协议
其全称为地址解析协议,该协议的主要功能是根据目的主机的IP地址获取其相应MAC地址并存储。
在局域网中通信最主要的信息就是MAC地址。
本地主机要向目的主机发送信息时,首先会在ARP缓存中查找目的IP与其MAC地址是否存在其中。
若有则直接向目的地址发送;若没有则首先获取其MAC地址。
获取MAC地址过程:
首先向局域网内全部IP广播ARP报文,报文中目的IP为要通信的IP,报文中MAC为ffffff。
所有主机均会收到该报文,之后对比目的IP与本机IP,不同则丢弃报文不做相应,若相同则返回响应报文告知发送IP自己的MAC地址。
发送主机接收到信息后将目的IP与MAC地址写入本地ARP缓存并保存一段时间,以备之后的通信。
ARP缓存中的信息可以直接使用ARP-a命令进行查看映射关系。
还可以对其进行添加与删除。
ARP协议基于局域网中主机合法可信,当主机收到ARP应答报文时,不会额外甄别信息来源,这给ARP欺骗带来了可能。
若黑客主机向两台主机分别发送ARP响应报文:
IP为对方主机而MAC地址为黑客主机,两台主机不经辨别将其存入ARP缓存。
之后黑客主机只需做好转发工作节课轻易窃取信息达成ARP欺骗[10,11]。
ARP扫描即在局域网中发送ARP报文,捕获响应报文,获取目的IP的MAC地址。
2.1.2ICMP协议
其全称为网络控制消息协议,该协议是从属于IP层的相当重要的一种无连接协议。
其报文内容主要包括类型、代码、检验和等,通过连接到IP报文确定源地址与目的地址。
该协议的主要做用是在网络中传递控制信息,通过本地主机发送询问报文,等待目的主机返回响应报文(差错报告报文)。
其返回信息包括终点是否可达、是否超时、重定向路由等等。
该协议并没有传递具体的数据信息,但不能否定其在网络传输控制中的巨大作用。
ICMP扫描即向目的主机发送询问报文,确定主机是否可达。
2.1.3TCP协议
其全称为传输控制协议,该协议是一种面向连接,基于字节流,安全可靠的传输层通信协议,在当今的网络生活中用途十分广泛。
每个TCP连接只能有两个端点(每个端点即一个Socket),即只能是一对一的(或者说点对点)。
TCP提供全双工通信,通信双方在连接后任何时间都能发送数据[12]。
TCP运输连接有三个阶段:
建立连接、数据传输、释放连接。
下图为具体过程。
图2-1TCP建立链接
建立连接:
首先,客户端向服务端发送SYN为true的TCP报文等待回应。
服务器接收到信息后,发回给客户端ACK、SYN均为true的TCP报文。
最后,客户端接收到服务器的响应报文后发送ACK为true的报文,完成链接的建立(三次握手),进行数据传输。
图2-2TCP释放链接
释放连接:
首先,客户端向服务器发送FIN为true的TCP报文,等待响应。
服务器接收后,返回ACK为true的报文,之后再发送FIN、ACK均为true报文(两次发送之间服务器仍可以传输数据)。
最后,客户端收到两次响应后发送ACK为true报文完成释放(四次握手)。
TCPconnect扫描就是与目的IP端口完成一次完整的TCP连接,若能完成则目的端口开启,否则就是关闭的。
TCPSYN扫描即只向目的地址发送TCP建立连接时第一步的SYN=1的报文,根据返回信息判断端口是否开启。
其效率远高于进行完整的TCP连接。
TCPFIN扫描即根据TCP释放连接时的第一步发送FIN=1的报文,根据响应报文判断。
相对隐蔽。
2.1.4UDP协议
其全称为用户数据报协议,该协议为一种无连接协议。
UDP不保证可靠的交付,在消息发送后不可能知道报文是否已安全地到达。
该协议首部开销小、面向报文但没有拥塞控制。
此外相比于TCP仅支持一对一的通信方式,UDP还支持多对一、一对多的通信方式。
虽然其资源消耗小且处理快速,但当网络环境很差时,UDP丢包非常严重。
由于这些种种特性,UDP协议在诸如网络视频通话、直播等等方面有大量应用[13]。
UDP扫描即向目的地址发送UDP报文,若无反应则认为端口开启,若返回ICMP错误报文,则目的IP不可达或端口未开启。
2.2相关技术
2.2.1winpacp
winpcap是用于Windows系统下的网络编程工具。
winpcap给开发人员提供了便于使用而且功能相当强大的编程接口,能够简单地实现所需功能。
此外,winpcap的监听器相当出色,可以直接捕获链路层数据帧。
winpcap也有着出色的可移植性,使用winpcap编写的程序也可以很方便地在各个操作系统之间进行移植[14]。
本设计在Windows平台下加以实现,winpcap的使用是必不可少的。
2.2.2Jpcap
java虽然在网络开发方面有着一定的能力,足够开发人员的一般使用,但在网络层之下的控制却不尽如人意。
Jpcap无疑弥补了这些不足。
Jpcap对于数据链路层的控制并不是直接进行了底层的实现,而是调用了winpcap/libpcap的相关功能。
Jpcap其结构整体上类似于wincap/libpcap,熟悉后两者的卡发人员能够很容易进行使用。
Jpcap有16个类以供使用,以下是的4个类。
(1)NetworkInterface
该类实例为网络设备,通常是网卡。
该类数据成员较少。
在本设计中主要是获取网卡设备及其信息以供后续开发的使用。
(2)JpcapCaptor
该类使用一组静态方法来实现各种基本功能。
该类可以对特定设备进行连接与控制,比如打开网卡,设置过滤信息,捕获数据包等。
在本设计中该类参与了发送、接收模块的实现。
(3)JpcapSender
该类专门用于控制数据包的传输。
本设计中与发送模块的实现密切相关。
(4)Packet
该类为其他数据包类的父类。
Jpcap包含的数据包主要有:
ARPPacket,ICMPPacket,IPPacket,TCPPacket,UDPPacket,DatalinkPacket,EthernetPacket。
本设计中各种需要构造的数据包均引用自该类。
2.2.3Socket套接字
Socket一种进程通信的方法,是TCP连接的端点,本质上是编程接口。
Socket是开发人员使用的抽象接口,用于实现不同主机相关端口进行连接和数据交换。
Socket是一个相对抽象的概念,其主要包括IP地址与端口号。
Socket的两个通信进程之间连接的主要连接方式是客户端/服务器模式。
连接大概分为下面三个步骤:
服务器监听,客户端请求,连接确认。
在本设计中Socket编程主要应用于TCPconnect扫描中的TCP建立连接功能。
2.2.4JavaFx
JavaFx是一种易于学习与使用的图形用户界面编辑工具。
开发人员能够很容易地进行设计、创建与调试。
在开发过程中,开发人员一般使用FXML脚本进行界面的设计与实现,该脚本能够将界面的开发与后端逻辑的开发分离开来,为开发人员提供了极大便利。
此外使用JavaFxSceneBuild工具能够通过拖拽控件的方式进行设计,更加直观且便利。
JavaFx还可以使用层叠样式表(CSS)来改善用户界面的外观。
开发人员可以更专注于代码的编写。
图形设计人员专门进行CSS的设计。
本设计中主要适用JavaFx进行用户界面的设计,对数据显示模块的实现也有着很大作用。
第3章总体设计
3.1需求分析
网络嗅探器的主要功能是检测目的主机是否存在,或目的主机的目的端口是否开启。
从而获取目的主机相关信息,一边进一步维护网络安全。
3.1.1功能性需求
本设计主要是编程实现一个在Windows系统下的网络嗅探器,依据用户输入的目标网段或目标端口,与选择的相应协议(扫描方式)和网卡,对目的主机或端口实现扫描并捕获数据包,将捕获的数据包的相关信息显示到图形用户界面上,用于开发人员进一步分析。
一下为主要的几个需要的功能。
(1)用户界面:
用户可以选择协议进行不同的扫描方式,用户可以选择使用的网卡,用户可以根据选择的协议输入要扫描的目的网段的起始IP与结束IP。
若是端口扫描,还可以输入起始端口和结束端口。
最后进行扫描的结果需要明显直观地显示在界面上。
确保输入合法,当IP或端口输入不正确弹出警告对话框。
根据不同的扫描需求获取相应的信息。
显示数据美观且清晰易懂,将最重要的信息显示到用户界面。
(2)ARP扫描:
ARP扫描的作用是扫描局域网内全部主机,若获取局域网内各个主机IP与其对应MAC地址。
向局域网内每一个IP广播发送ARP报文,若该主机存在则会返回一个ARP应答报文,获取该报文并分析,并将信息显示到用户界面。
(3)ICMP扫描:
该扫描目的是检验目的网段主机是否存在,要既可以扫描局域网,也可以扫描外部网站。
向目的IP发送ICMP询问报文,类型、代码为8、0。
若返回ICMP应答报文类型、代码为0、0则主机存在;若类型、代码为3、1则主机不可达。
将结果显示到用户界面。
(4)TCPconnect扫描:
该扫描为端口扫描,同目的主机目的端口完成一次TCP链接,判断目的端口是否开启。
将TCP建立连接与释放连接的完整过程中发送与接收到底数据包信息显示到用户界面。
(5)TCPSYN扫描:
相较于TCPconnect扫描更为快捷,SYN扫描仅需向目的端口发送SYN=1的一次TCP报文(建立连接的第一步),若返回ACK=1、SYN=1则目的端口开启,若返回ACK=1、RST=1则目的端口关闭。
将数据包捕获并将信息显示到用户界面。
(6)TCPFIN扫描:
与SYN扫描过程相似,但更加隐蔽。
FIN扫描向目的端口发送FIN=1的报文(释放连接的第一步),若无响应则认为端口开放,若返回ACK=1、RST=1认为端口关闭。
将信息显示到用户界面。
(7)UDP扫描:
端口扫描。
向目的端口发送UDP报文,当目的地址无响应时,可以认为端口开启(若目的主机存在),若返回ICMP报文类型为3、代码为3则认为端口不可达;类型为3、代码为1则认为主机不可达。
将返回信息显示到用户界面。
但UDP作为一种不可靠连接,有着很多不确定因素,且如果UDP报文发送过于频繁可能会引起丢包。
(8)优化程序:
为了确保程序正确且有效率地运行,需要将程序进行优化。
如将发送模块与接收模块分为两个线程同时运行,以确保运行效率同时防止延误接收数据包。
将用户界面设计进行优化改进并进行适当的美化。
3.1.2非功能性需求
(1)性能需求:
软件的运行速度、结果正确性、资源消耗等各种需求。
(2)可靠性需求:
软件对故障的修理能力、错误的可预见性等各种需求。
(3)易用性需求:
界面直观简洁,功能简单易用。
3.2可行性分析
3.2.1技术可行性
关于网络嗅探器的开发,其主要内容是实现报文的发送与接收,可以使用Jpcap完成这些功能。
其中的TCP链接扫描可以使用Socket编程加以实现。
而图形用户界面使用JavaFx实现。
这写足以完成应用程序所需要实现的各种功能,可以认为,技术上课可行。
3.2.2经济可行性
使用的开发工具为eclipse,JavaFxSceneBuilder,Jpcap模块都是网络提供的免费软件。
系统完成后,用户依照需求进行扫描并分析,有助于网络完全的维护。
3.3总体架构
该设计是在Windows10平台上使用java语言实现的网络嗅探器,主要流程与功能是根据用户选择协议与网卡输入目的IP或端口并进行扫描,之后将接收到的数据显示到用户界面。
下图为大概流程:
图3-1系统工作流程图
3.3.1模块划分
主要划分为四个模块:
数据发送模块,数据接收模块,图形用户界面模块,数据显示模块[15]。
下图为模块图:
图3-2模块图
(1)用户界面模块
用户界面是一个应用的门面,特别注重设计与规划。
用户最直观的感受就来源于主界面。
因此,从以下几个方面对主界面进行了设计。
在设计上简单直接字体适当。
在内容上,主界面应主要体现程序功能,满足扫描功能与显示数据的需求。
在操作上,简化繁杂的操作,删去无用的环节。
完成输入后选择协议网卡直接扫描。
功能上,要完整完成所需的各种功能,实现输入数据,选择协议,进行扫描,显示数据等功能。
(2)数据发送模块
主要功能为发送ARP、ICMP、TCP、UDP报文还可以进行TCP链接。
对外提供openDevices()用以开启网卡设备与初始化信息;getInfo()用以获取用户输入数据一共扫描使用。
重写run()函数实现多线程发送数据包。
要根据进行扫描时所选择的不同协议发送不同的数据包。
下图为基本流程图:
图3-3发送模块流程图
(3)数据接收模块
可以接收ARP、ICMP、TCP报文,其中ICMP扫描与UDP扫描接收均为ICMP报文。
提供接口与发送模块相近,其中openDevices()除用以开启网卡设备还需使用setFilter()设置数据包过滤。
重写run()函数实现多线程接收数据包。
根据所选协议接收数据包。
下图为基本流程图:
图3-4接收模块流程图
(4)数据显示模块
构造专门的类用于显示数据,使用JavaFx相关功能实现,具体查看下一章第4节。
第4章详细设计
4.1用户界面模块的实现
用户界面是使用者主要面对的操作界面,需要设计得简洁且易于使用,同时保证功能的齐全。
使用JavaFx实现,界面分为上下两部分,可操作部分与数据显示部分。
一下为具体设计。
具体界面可以参考附录1。
用户界面的设计与实现使用了FXML文件,将该文件关联到场景(sence)。
通过JavaFxSceneBuild工具直接进行拖拽完成页面的布局,简单直接。
4.1.1可操作部分
根据所需的扫描功能有以下设计:
(1)数据输入:
数据输入分为起始于结束IP,起始于结束端口。
四项输入均使用JavaFx中的TextField控件进行实现。
其中ARP扫描不需要输入,ICMP扫描只需输入起始于结束IP,TCPconnect扫描、TCPSYN扫描、TCPFIN扫描、UDP扫描需要全部输入。
输入后判断是否为有效IP和端口,若输入不正确就进行扫描会弹出警告对话框。
(2)协议与网卡选择:
用户可以选择使用的扫描方式(即协议)和使用的网卡。
两项使用JavaFx中的ChoiceBox实现。
协议包括可选择的六种扫描方式,默认时为ARP扫描。
获取网卡描述与地址由Jpcap实现。
Jpcap可以直接初始化获取网卡设备列表,将其信息存入ChoiceBox。
默认时为第一个网卡设备。
(3)开始扫描与停止:
开始与停止响应的扫描,由JavaFx中的Button实现。
按下开始扫描后,程序会根据选择的网卡打开设备,之后打开两个线程:
发送线程与接收线程,根据输入的信息与选择的协议进行扫描,并将接收到底数据包按个协议内容显示到用户界面。
两个线程的具体实现查看本章第2、节。
停止则相对简单,按下后程序按线程名称找到发送与接收的两个线程并将其中断,之后可以进行下一次扫描。
4.1.2数据显示部分
数据显示方面在比较了JavaFx中的几种控件后,最终选用TableView实现,接收到底数据包中的重要信息显示到TableView中的每一列中。
显示的具体实现查看本章第4节。
4.1.3控制器
所谓控制器就是用于配合FXML可以响应各种触发事件的一个Java类。
需要在FXML相应的位置写入控制器文件名,之后进行编写。
在本设计中,主要是完成网卡与协议的选择,扫描与停止按钮的功能实现。
(1)重写初始化函数。
使用getIems().add()函数将协议类型与网卡类型写入ChoiceBox并使用setValue()函数设定初始值。
(2)扫描按钮的功能实现。
使用getValue()函数获取网卡与协议选框中的值并确定扫描类型。
之后判断用户输入的源、目的IP是否正确,是否为IP地址(具体实现看本章第5节);判断源、目的端口是否正确,是否为数字;若不正确则弹出警告对话框。
最后根据所选的协议不同执行不同的扫描函数(每次扫描之前需要设置TableView中列与数据显示模块类中的数据的映射,具体见本章第4节)。
扫描函数内容为打开发送接收模块将选择网卡、协议与TableView实例传入,获取用户输入信息至发送接收模块,分别开启两个模块的线程进行扫描。
(3)停止按钮的功能实现。
使用ThreadGroup的相关功能获取当前运行的线程组及其名称,从中根据线程名称找到发送与接收模块,使用interrupt()函数将线程结束。
完成功能的实现。
4.2数据发送模块的实现
打开网卡函数openDevices()使用Jpcap中内置函数完成。
使用JpcapCaptor的getDeviceList()函数获取网卡设备列表,之后使用openDevice()打开需要的网卡。
使用JpcapCaptor实例的getJpcapSenderInstance()函数初始化JpcapSender的实例。
最后还可以完成相关数据的初始化。
获取信息函数getInfo()直接获取用户界面传递来的输入信息并保存以备之后使用。
本模块与接收模块的多线程实现使用runnable接口,通过重写run()函数完成功能的编写。
在该函数中根据选择的协议不同选择以下各种发送方式。
4.2.1发送ARP报文
首先,使用Jpcap打开网卡设备,获取需要信息。
同过网卡IP,获取其所在局域网IP网段范围,由网卡IP获得。
扫描该子网中的每