毕业设计论文半打开端口扫描技术的实现.docx

上传人:b****6 文档编号:12151083 上传时间:2023-06-04 格式:DOCX 页数:18 大小:31.17KB
下载 相关 举报
毕业设计论文半打开端口扫描技术的实现.docx_第1页
第1页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第2页
第2页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第3页
第3页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第4页
第4页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第5页
第5页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第6页
第6页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第7页
第7页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第8页
第8页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第9页
第9页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第10页
第10页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第11页
第11页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第12页
第12页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第13页
第13页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第14页
第14页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第15页
第15页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第16页
第16页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第17页
第17页 / 共18页
毕业设计论文半打开端口扫描技术的实现.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

毕业设计论文半打开端口扫描技术的实现.docx

《毕业设计论文半打开端口扫描技术的实现.docx》由会员分享,可在线阅读,更多相关《毕业设计论文半打开端口扫描技术的实现.docx(18页珍藏版)》请在冰点文库上搜索。

毕业设计论文半打开端口扫描技术的实现.docx

毕业设计论文半打开端口扫描技术的实现

半打开端口扫描技术的实现

摘要

随着互联网的飞速发展,网络入侵行为日益严重,网络安全日益成为人们关注的焦点。

端口扫描技术是网络安全扫描技术的重要技术之一。

对目标系统进行端口扫描,是网络系统入侵者进入目标系统的第一步。

本文对端口扫描技术的原理和应用进行了阐述,并设计了一个简单的基于windows平台上的端口扫描系统。

在论文中介绍了半打开扫描中的SYN探测技术,分析了这种扫描技术实现的原理和特点。

实际设计中采用了扫描安全性和可行性较好的SYN探测技术来实现端口扫描,并实现了端口列表自定义,扫描结果存储等几大模块化功能。

最后结合当前的实际情况对端口扫描的未来发展方向提出了一点个人的看法。

关键词:

网络安全;端口扫描;SYN探测

TheImplementationofaPort-scanningProgram

BasedonSemi-openedPortTechnology

Abstract

Withthequickdevelopmentoftheinternet,networkintrusionbehaviorbecomesmoreandmoreserious;Networksecuritybecomesthefocuswhichpeoplepayattentionto.Port-ScanningTechnologyisoneofthemostimportanttechnologiesofthesafescanningoninternet.Thefirststepthatnetworksystemintrudersenterthetargetsystemistheportscanningofthesystem.Thisessayexplainstheprincipleandapplicationoftheportscanningtechnology,andthendesignsasimpleport-scansystemwhichbasesontheWindowsplatform.ThepaperintroducestheSYNprobetechnologyofthesemi-openscantechnologies,analyzesitsimplementingprinciple,approachandcharacters.IntherealdesignitusetheSYNprobetechnologywhichhasabetterscanningsecurityandfeasibilitytoachievethePortScanning,thenrealizeuser-definedportlistfunction,recordingofthescanningresult,andsomeotherfunctionalmodules.Atlast,combinedwiththenowadaysactualsituation,thepaperbringsafewpersonalmindsforthefuturedirectionofthedevelopmentofthePort-Scanning.

Keywords:

Networksecurity;Portscanning;SYNprobe

论文总页数:

22页

1引言

1.1端口扫描概述

网络安全探测在网络安全中起着主动防御的作用,占有非常重要的地位。

网络安全探测的所有功能都是建立在端口扫描的基础上,所以对端口扫描技术的研究有着非常重要的现实意义。

每一个网络主机都相当于一个“房间”,黑客能否进入“房间”,取决于是否发现了打开的“门窗”。

也就是说,能否入侵网络主机,或者网络主机是否安全,关键在于能否查出网络主机的系统信息。

而端口是主机与外界通讯交流的数据出入口,即是“门窗”。

端口分为硬件端口和软件端口,所谓硬件端口又称为接口,包括:

USB端口、串行端口、并行端口等。

软件端口一般指网络中面向连接服务(TCP)和无连接服务(UDP)的通讯协议的端口。

一个端口就是一个潜在的通信通道,也就是一个入侵通道。

对目标计算机进行端口扫描,能得到许多有用的信息。

通过端口扫描,发现系统的安全漏洞。

它使系统用户了解系统目前向外界提供了哪些服务,从而为系统用户管理网络提供了一种手段。

1.2端口扫描技术的国内外研究现状

网络的安全状况取决于网络中最薄弱的环节,任何疏忽都可能引入不安全的因素,最有效的方法是定期对网络系统进行安全性分析,及时发现并修正存在的脆弱性,保证系统的安全。

国外安全扫描技术的历史可以追溯到20世纪90年代,当时因特网刚刚起步,但是在过去的十多年内,扫描技术飞速发展,迄今为止,其扫描技术己经非常完善,但是在全面性、隐蔽性和智能性上还有待提高。

而安全扫描器从最初专门为UNIX系统而编写的一些只有简单功能的小程序发展到现在,己经出现了可以运行在多个操作系统平台上的、具有复杂功能的系统程序。

国内的扫描技术是在国外扫描器基础上发展起来的。

其中有些专门从事安全技术的公司包括绿盟科技、启明星辰等等。

这些公司的扫描器以硬件为主,其特点是执行速度快,不像软件一样受到安装主机系统性能的限制。

然而对于更多的基于主机的端口扫描器而言,简单、实用、可靠才是它们的长处。

1.3端口扫描原理

端口扫描通常指用同一个信息对目标主机的所有需要扫描的端口进行发送探测数据包即扫描,然后,根据返回端口的状态来分析目标主机端口是否打开,是否可用。

端口扫描通过与目标主机的TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,收集目标主机相关信息,从而发现目标主机某些内在的安全弱点,并且确定该端口什么服务正在进行并获取该服务的信息。

端口扫描也可以通过捕获本地主机或服务器的流入流出IP数据包来监视本地主机的运行情况,它仅能对接收到的数据进行分析,帮助我们发现目标主机的某些内在的弱点,而不会提供进入一个系统的详细步骤。

1.4端口扫描技术概要

端口扫描途径主要是扫描器。

扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器可以不留痕迹的发现远程服务器的各种TCP端口的分配及提供的服务和它们的软件版本。

这就能让我们间接的或直观的了解到远程主机所存在的安全问题。

扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息。

扫描器有三项功能:

发现一个主机或网络的能力;一旦发现一台主机,有发现什么服务正运行在这台主机上的能力;通过测试这些服务,发现漏洞的能力。

为了理解扫描以及它的工作原理,首先应对TCP的三次握手机制有所了解。

TCP的报头包含一个序列号和一些起着特殊作用的标记位。

这里仅提到其中的四个标记位:

SYN(同步),ACK(确认),RST(复位)和FIN(完成)。

它们四个的作用与这里讨论的主题密切相关。

当系统间建立连接和释放连接时,就会用到所谓的握手机制。

本文中所提到的连接均指的是发生在两个IP地址间,有一定的端口号的连接。

它的工作原理大致如下:

握手的第一步,一台计算机首先请求和另外一台计算机建立连接,它通过发送一个SYN请求来完成,也即前面提到的SYN标记位置位。

两台计算机间每条信息都有一个由发送方产生的序列号,序列号的使用使得双方知道他们之间是同步的,而且还可以起到丢失信息时或接收顺序错误时发送警告信息的作用。

握手的第二步,接收到SYN请求的计算机响应发送来的序列号,它会将ACK标记位置位,同时它也提供自己的序列号。

到现在为止,发起连接建立请求的计算机认为连接已经建立起来,然而对方却并不这样认为,对方还要等到它自己的序列号有了应答后才能确认连接建立起来。

因此现在的状态称为“半连接”。

如果发起连接请求的计算机不对收到的序列号做出应答,那么这个连接就永远也建立不起来,而正因为没有建立连接,所以系统也不会对这次连接做任何记录。

握手的第三步,发起连接请求的计算机对收到的序列号作出应答,这样,两台计算机之间的连接才算建立起来。

两台计算机释放连接时的情况与此类似:

当一台计算机说没有更多的数据需要发送了,它发送一个FIN信号(将FIN标记位置位)通知另一端,接收到FIN的另一端计算机可能发送完了数据,也可能没发送完,但它会对此作出应答,而当它真正完成所有需要发送的数据后,它会再发送一个自己的FIN信号,等对方对此作出应答后,连接才彻底解除。

1.5SYN技术详解

1.5.1TCP包探测原理

高效的探测方法需要解决3个问题:

(1)用几个包判断主机和端口状态;

(2)占用双方的资源少;(3)准确的分组时延计算方法。

如果不建立完整的TCP连接,直接用TCP包来检测TCP应用服务端口的状态,会有效地提高探测效率和准确性。

对于问题

(1)和

(2),可以借鉴TCP端口扫描技术,发送特殊TCP包解决。

对于问题(3),可以在仿照Ping的方式在TCP某些字段或选项中嵌入时间戳来解决。

TCP端口扫描技术通过发送一些特殊的TCP包判断目标主机和端口状态。

端口扫描通过扫描目标主机的大量端口,发现系统的漏洞。

而服务器的地址和端口一般都是公开的,如果只探测服务器的工作端口,不用探测其余的端口,可以向工作端口发送特殊的TCP包,根据返回包判断目标状态。

绝大多数TCP/IP协议栈的实现遵循以下原则:

(1)当一个SYN或者FIN数据包到达一个关闭的端口,TCP丢弃数据包同时发送一个RST数据包。

(2)当一个包含ACK的数据包到达一个监听端口时,数据包被丢弃,同时发送一个RST数据包。

(3)当一个SYN数据包到达一个监听端口时,正常的三阶段握手继续,回答一个SYN|ACK数据包。

(4)当一个FIN数据包到达一个监听端口时,数据包被丢弃。

“FIN行为”(关闭的端口返回RST,监听端口丢弃包),在URG和PSH标志位置位时同样要发生。

所有的URG,PSH和FIN,或者没有任何标记的TCP数据包都会引起“FIN行为”。

一般TCP端口扫描根据以上方式的发包收包来判断主机与端口状态。

因为FIN包不能直接探测监听端口,所以通常选择使用SYN包或ACK包探测监听端口。

一些防火墙出于安全的考虑,将发现和拦截ACK与FIN探测包,但不会拦截SYN包。

通过网络上别人的一些测试和实验发现,对Internet中发布的60个HTTP代理服务器进行探测。

其中,97%的服务器对SYN包有应答,只有53%的服务器对ACK包有应答。

实验发现对SYN包无应答的主机对任何TCP包都无应答。

无论服务器有什么样的安全处理规则,根据方式

(1)

(2),SYN请求都会得到应答,所以选择SYN包作为探测包。

1.5.2SYN包探测

第一步:

客户端向服务器的工作端口发送SYN,服务器返回SYN|ACK包或RST包。

如果客户端收到SYN|ACK,则可以肯定服务器活动和端口开启。

收到RST包,则说明服务器活动但端口关闭,客户端不用执行第二步。

如果超时无应答,则认为包丢失。

第二步:

因为不需要建立正常的TCP连接,所以对应答ACK包的服务器发送RST包,保证服务器端关闭半连接。

因为只有少量报文对端口探测,不会引起安全系统的报警。

使用SYN包探测,可以检测服务器和端口的状态、分组时延、丢包率,又可以穿透防火墙,符合网络对安全的要求。

1.5.3分组时延

假如用定时器来计算分组往返的时间,大量的定时器会造成资源极大消耗。

虽然TCP协议规定了时间戳选项(类型8),用该选项中嵌入时间戳,服务器返回包的选项部分含有发送的时间戳。

然而,在具体TCP/IP协议实现中,有些TCP/IP协议栈会忽略该选项,或者选项值置0,无法得到往返时间。

如果能像Ping一样保证某一字段的数据在往返中不改变,就可以像Ping一样嵌入时间戳。

但TCP的各字段不能保证往返数据一致。

可以考虑用一种变通的方式嵌入时间戳。

对于客户机发送的SYN报文,设序号x,则服务主机返回报文的确认序号等于x+1。

利用发送序号和确认序号的关系来传递时间戳。

设置SYN包的发送序号为时间戳,收到的SYN|ACK包或RST包的确认序号减1即可得到发送包的时间戳。

用收到包的时间减去发送时间戳即得到分组时延。

1.6端口扫描实现方法

本文通过对基于半打开的端口扫描技术的实现来介绍了现在一些主流的端口扫描技术,通过对程序的开发加深了对端口扫描技术的认识。

经过对端口扫描技术的了解和认识,本文采用隐蔽性较好基于主机的SYN刺探技术来实现。

2需求分析

2.1端口扫描器的总体要求

2.1.1设计背景

该端口扫描器是面向普通用户使用,以期成为一个普通用户用来检测端口网络主机端口并有效地保护自己。

在采用SYN刺探方式进行扫描的基础上成为一个基于半打开的实用、简单、方便的端口扫描工具。

2.1.2用户特点

由于该端口扫描系统是一个基于半打开的端口扫描器,其面向的是普通的对于端口扫描有需求的用户,因此需要提供一个简洁、方便、高效的界面和功能。

2.1.3软件开发及运行环境

系统开发工具:

VisualC++6.0

2.2端口扫描器的需求分析

端口扫描器的一般需求:

(1)隐蔽性需求

作为扫描的一方来说,端口扫描除了要能扫出目标主机的端口信息以外,还需要能有一定的隐蔽性,以最大的可能不在目标主机留下访问信息。

如果仍然采用基于TCPconnect()的扫描则将很容易被目标主机记录,因此从隐蔽性上考虑SYN半打开扫描或者FIN扫描会是很好的选择。

(2)端口选择需求

当我们在使用扫描软件对目标主机进行扫描的时候,有的时候是有目的性地扫描目标主机的某一个端口,然而在大部分时候却需要扫描批量端口或者是一些重要的指定端口。

这个时候需要端口扫描系统具有自定义端口列表的功能。

(3)扫描结果存储需求

在进行完一次端口扫描之后,需要对结果进行保存。

无论是攻击还是检测,端口扫描器是需要与其他的一些工具配合到一起使用的,所以要求端口扫描器一定要具有存储结果的功能,以将扫描得到的目标主机端口信息保存下来。

3端口扫描器的实现

3.1功能模块简介

3.2程序实现流程

3.3SYN探测的实现

(5)原始套接字包发送完后,就可以接收目标主机的回应。

当发送原始套接字包时(如TCPSYN数据包),操作系统核心并不知道,也没有此数据发送或者连接建立的记录。

因此,当远端主机回应时,系统核心就把这些包都全部丢掉,从而到达不了应用程序上。

所以,程序中不能简单地使用接收函数来接收这些数据包。

要达到接收数据包的目的,必须采用嗅探,接收所有通过的数据包,然后进行筛选,留下符合需要的。

为此可以表示接收所有的数据。

通过设置原始套接字的I/0控制命令,便可以调用SIO_RCVALL接收返回的数据包,分析是不是扫描程序返回的。

DWORDWINAPIListeningFunc(LPVOIDlpvoid)

{//定义套接字rawsock,以连接应用程序和监听的本地网卡

SOCKETrawsock;SOCKADDR_INaddr_in={0};

intsettimeout=500;

INFORLISTEN*lp=(INFORLISTEN*)lpvoid;

intnum=lp->num;

******省略部分代码******

if((rawsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)

//建立原始IPPROTO_IP套接字

{

AfxMessageBox("SocketSetupError!

\n");

returnfalse;

}

addr_in.sin_family=AF_INET;

构造SYN包,最好选用较大的端口号作为发送端口,以免和应用程序正在使用的端口发生冲突。

在这里我们选用的是8288。

另外在构造TCP头的时候,还添加了TCP选项SACK,保证TCP连接请求被接受。

addr_in.sin_port=htons(8288);//设置接收的端口为8288

addr_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//监听所有的本地IP地址

//对rawsock绑定本机IP和端口,当系统收到目标的返回信息时,便可以通过rawsock传到应用程序当中。

intret=bind(rawsock,(structsockaddr*)&addr_in,sizeof(addr_in));

if(ret==SOCKET_ERROR)AfxMessageBox("bindfalse");

程序使用两次判断来过滤IP包。

首先判断IP头部,要求目的地址是本机、协议号是TCP协议。

然后再判断TCP头部,要求目的端口等于选用端口号,控制标志位为SYN|ACK或者RST。

因为监听套接字会接收到所有的IP包,要保证能尽快处理分组,如图4所示。

图4返回IP包的接收及过滤

设置SIO_RCVALL,包括延时和数据大小等信息,以接收所有的数据包。

在收到返回信息的时候接受并分析数据包是否为应用程序返回的信息。

setsockopt(rawsock,SOL_SOCKET,SO_RCVTIMEO,(char*)&settimeout,sizeof(int));

DWORDlpvBuffer=1;

DWORDlpcbBytesReturned=0;

//设置一个套接口的模式,接受所有数据

WSAIoctl(rawsock,SIO_RCVALL,&lpvBuffer,sizeof(lpvBuffer),NULL,

0,&lpcbBytesReturned,NULL,NULL);

******省略部分代码******

charRecvBuf[256]={0};

//接收数据包

ret=recvfrom(rawsock,RecvBuf,sizeof(RecvBuf),0,(structsockaddr*)&from,&size);

if(ret!

=SOCKET_ERROR)

{

//分析数据包

IPHEADER*lpIPheader;

lpIPheader=(IPHEADER*)RecvBuf;

这里从接受到的数据中分离出IP报头lpIPheader,接着又从IP报头中继续分离出源地址sourceip,并判断源地址是否在起始IP和结束IP的范围内和是否为远程开放端口返回的数据包。

if(lpIPheader->proto==IPPROTO_TCP&&ntohl

(lpIPheader->sourceIP)>=StartIP&&ntohl(lpIPheader->sourceIP)<=EndIP)

{

char*sourceip=inet_ntoa(*(structin_addr*)&from.sin_addr);

TCPHEADER*lpTCPheader=(TCPHEADER*)(RecvBuf

+sizeof(IPHEADER));

//判断是不是远程开放端口返回的数据包

if(lpTCPheader->th_seq!

=0&&lpTCPheader->th_flag==0x12)

{

CStringStrIP=sourceip;

******省略部分代码******

InsertToTree(hTree,StrIP,CSPort);

}

}

}

}

(6)在扫描完成以后,使用函数InsertToTree将结果插入到结果树中hTree,并在结果树中进行排序,使得结果按照选择的方式展开或合拢。

voidInsertToTree(CTreeCtrl*hTree,CStringCSIP,CStringCSPORT)

{

HTREEITEMA=hTree->InsertItem(CSIP,NULL,TVI_LAST);

hTree->InsertItem(CSPORT,A,TVI_LAST);

}

3.4端口扫描功能模块

3.4.1端口选择模块

选择从端口范围或默认端口列表中获取待扫描的端口,首先通过消息传递函数m_IsChecked来判断是否得到了选取端口范围的消息,如果是,则获取起始端口和结束端口的数据并判断起始端口是否不大于结束端口;如果没有传来消息,则尝试调用m_PortListTree.GetNextItem从自定义端口列表树中得到当前所选择的默认端口并从端口列表树中继续获得下一个端口。

BOOLCLScanPortDlg:

:

ReadPortToPortList()

{

UpdateData();

这里通过m_IsChecked获得选取端口范围的消息,然后就判断端口范围是否符合规则,即起始端口不应该大于结束端口。

if(m_IsChecked)

{

if(m_PortFrom>m_PortTo)

{

AfxMessageBox("起始端口不应该大于结束端口!

");

returnFALSE;

}

while(m_PortFrom<=m_PortTo)

{

PortList.Add(m_PortFrom);

m_PortFrom++;

}

}

该系统不仅可以提供端口范围选择,还可以让用户自定义端口列表,所以当用户选择自定义端口列表来扫描的时候,程序就通过一个循环从自定义端口列表树中获得用户勾选的端口等待扫描。

else

{

HTREEITEMA=m_PortListTree.GetRootItem();

if(A==NULL)

{

AfxMessageBox("端口列表不能为空!

");

returnFALSE;

}

while(A!

=NULL)

{

这里通过一个if循环来获得自定义端口列表中选取的端口。

首先将m_PortListTree中的端口信息传入到一个字符串CStringstr中,并读取端口列表地址。

如果没有选择端口列表,则返回错误信息。

3.4.2目标IP选取模块

选择IP范围以确定扫描的目标。

读取起始ip到m_StartIP,结束ip到m_EndIP中,并判断起始IP是否不大于结束IP,如果成功就返回true,否则返回false。

BOOLCLScanPortDlg:

:

InitIP()

{

CIPAddressCtrl*pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESSA);

if(pIP->IsBlank())

{

AfxMessageBox("IP地址不能为空!

");

ReturnFALSE;

}

******省略部分代码******

{

AfxMessageBox("IP地址不能为空!

");

ReturnFALSE;

}

pIP->GetAddress(m_EndIP);

最后使用if循环来判断m_StartIP和m_EndIP,当m_St

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2