[一种端口扫描器的设计思路和实现步骤]漏洞扫描器

  随着科学技术的飞速发展,20世纪人类两大科学技术成果――计算机技术和网络技术,均已深入到人类社会的各个领域,Interact把“地球村”的居民紧密联系在一起。然而。网络技术的发展在给我们带来便利的同时也带来了巨大的安全隐患,尤其是Internet和Intranet的飞速发展对网络安全提出了前所未有的挑战。事实已经表明,随着互联网的日趋普及,在互联网上的犯罪活动也越来越多,特别是Internet大范围的开放以及金融领域网络的接入,使得越来越多的系统遭到入侵攻击的威胁。但是,不管入侵者是从外部还是从内部攻击某一网络系统,攻击机会都是通过挖掘操作系统和应用服务程序的弱点或者缺陷来实现的。目前,对付破坏系统企图的理想方法是建立一个完全安全的没有漏洞的系统。但从实际上看,这根本是不可能的。因此,一个实用的方法是,建立比较容易实现的安全系统,同时按照一定的安全策略建立相应的安全辅助系统,漏洞扫描器就是这样一类系统。如果我们能够根据具体的应用环境,尽可能早地通过网络扫描来发现这些漏洞,并及时采取适当的处理措施进行修补,就可以有效地阻止入侵事件的发生。因此,网络扫描非常重要和必要。
  漏洞扫描器是一种自动检测远程或本地主机安全性弱点的程序。通过使用漏洞扫描器,系统管理员能够发现所维护的Web服务器的各种TCP端口的分配、提供的服务、Web服务软件版本和这些服务及软件呈现在Internet上的安全漏洞。本文针对目前TCP/IP网络和各种网络主机的安全现状,设计并实现了一个网络漏洞扫描器,实用性非常强。
  
  一、端口扫描器的设计与实现
  
  端口,不是计算机硬件的110端口,而是软件形式上的概念。服务器可以向外提供多种服务,比如,一台服务器可以同时是WEB服务器,也可以是FTP服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务,比如:WEB采用80端口,FTP采用21端口等。这样,通过不同端口,计算机与外界进行互不干扰的通信。
  因特网上最流行的协议是TCP/IP协议,需要说明的是,TCP/IP协议在网络层是无连接的(数据包只管往网上发,如何传输和到达以及是否到达由网络设备来管理)。而我们一旦谈“端口”,就已经到了传输层。协议里面低于1024的端口都有确切的定义,它们对应着因特网上常见的一些服务。这些常见的服务可以划分为使用TCP端口(面向连接如打电话)和使用UDP端口(无连接如写信)两种。
  根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。
  
  二、端口扫描器的原理和作用
  
  端口扫描是一种攻击者用来发现他们可以进入服务器的很常用的侦察技术,所有局域网内通过Modem连接到Internet上的机器运行了很多监听常用和非常用端口的服务。攻击者通过端口扫描发现可用的端口(正处于监听状态的端口)。事实上,端口扫描是向每个端口一次发送一个消息的过程,根据端口的回应来确定端口是否可用和进一步检查它的漏洞。
  “端口扫描”通常指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标计算机的端口是否打开、是否可用。“端口扫描”行为的一个重要特征是:在短时期内有很多来自相同的信源地址传向不同的目的地端口的包。
  
  三、具体实现过程
  
  1.总体设计
  本程序所设计的漏洞扫描器主要有五个部分:扫描主机端口的开放情况,扫描正在运行服务的端口,查看IP地址的版本号及类别,通过IP地址查询主机名,获得主机的MAC地址。
  2.程序实现思路
  用JAVA语言编写本程序时,应用多线程技术提高扫描速率是本程序的主要特征。所谓多线程就是说同时在本地系统开辟多个socket连接,在同一时间内扫描多个服务器,这样做的优点是节省时间,因为它可以大幅提高扫描速度,根据系统资源的配置高低,线程数字也可以自行设定(设定太高容易造成系统崩溃)。在进行端口扫描时,扫描者可以根据扫描主机的配置情况和扫描的范围自定义扫描所开启的线程数,开启多个线程同时对目标主机端口进行探测;并且程序添加了扫描端口并检查有什么服务正运行在这台主机上,更进一步还能测试这些服务,发现系统漏洞。测试发现,在单线程情况下扫描一个端口平均需要1.5s,在开启50个线程时扫描一个端口平均只需要100ms,扫描速率大概提高了几十倍。
  一般而言,支持TCP/IP协议的主机和设备,都是以开放端口来提供服务的,端口可以说是系统对外的一个窗口,系统的弱点也就往往通过端口暴露出来。每台计算机都有65535个端口,对一个IP地址段内多台主机的大量端口进行扫描是比较耗时的。为了提高扫描速率,端口扫描程序的实现也采用了多线程技术,同时启动多个线程并行执行,各个线程分别调用Connect()函数连接同一主机的不同端口,并试图在开放端口接收相关服务信息。在多线程中采用临界区同步技术保证各个线程扫描到同一主机选定范围内所有的端口并且不重复。
  3.程序实现步骤
  (1)创建一个类型为socket套接字。
  调用Connect()进行连接,根据返回值判断端口是否开放。
  对于开放端口调用Select()判断套接字状态。
  对于来自开放端口的可读信息调用Receive()接收信息并显示结果。.
  关闭套接字。
  (2)建立界面
  (3)添加控制变量
  (4)添加函数
  (5)为扫描程序添加函数
  
  四、结束语
  
  端口扫描是一种攻击者用来发现他们可以进入服务器的很常用的侦察技术,通过端口扫描可以对网络实施有效的安全保护。
  
  参考文献
  [1]辛运帏,饶一梅,张钧JAVA程序设计.清华大学出版社.
  [2]网络漏洞扫描器的设计与实现.分类号:TP393.08.文献标识码:A.

推荐访问:扫描器 端口 步骤 思路