网络漏洞扫描器Word下载.docx
- 文档编号:21779456
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:19
- 大小:205.95KB
网络漏洞扫描器Word下载.docx
《网络漏洞扫描器Word下载.docx》由会员分享,可在线阅读,更多相关《网络漏洞扫描器Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
这就能让我们间接的或直观的了解到远程主机所存在的安全问题。
这是最基本的TCP扫描。
用系统提供的connect()方法探测,用来与每一个感兴趣的目标计算机的端口进行连接。
如果端口处于侦听状态,那么connect()就能成功。
否则,这个端口是不能用的,即没有提供服务。
这个技术的一个最大的优点是,你不需要任何权限。
系统中的任何用户都有权利使用这个调用。
另一个好处就是速度。
如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,可以通过动态数组动态调节,从而加速扫描。
二.设计目的
随着互连网的日趋普及,在互连网上的犯罪活动也越来越多,特别是Internet大范围的开放以及金融领域网络的接入,使得越来越多的系统遭到入侵攻击的威胁。
但是,不管入侵者是从外部还是从内部攻击某一网络系统,攻击机会都是通过挖掘操作系统和应用服务程序的弱点或者缺陷来实现的。
目前,对付破坏系统企图的理想方法是建立一个完全安全的没有漏洞的系统。
但从实际上看,这根本是不可能的。
因此,一个实用的方法是,建立比较容易实现的安全系统,同时按照一定的安全策略建立相应的安全辅助系统,漏洞扫描器就是这样一类系统。
就目前系统的安全状况而言,系统中存在着一定的漏洞,也就存在着潜在的安全威胁,但是,如果我们能够根据具体的应用环境,尽可能地早地通过网络扫描来发现这些漏洞,并及时采取适当的处理措施进行修补,就可以有效地阻止入侵事件的发生。
所以,网络扫描非常重要和必要。
三.设计内容
1网络漏洞扫描器的设计
网络扫描器的总体结构
我们设计的漏洞扫描器基于浏览器/服务器(B/S)结构,整个扫描器实现于一个Linux、UNIX和Windows操作系统相混合的TCP/IP网络环境中,其总体结构如图1所示,其中运行Linux的工作站作为发起扫描的主机(称为扫描主机),在其上运行扫描模块和控制平台,并建有漏洞库。
扫描模块直接从扫描主机上通过网络以其他机器为对象(称为目标主机,其上运行的操作系统可以是UNIX、Linux、Windows)进行扫描。
而控制平台则提供一个人机交互的界面。
网络漏洞扫描器通过远程检测目标主机TCP/IP不同端口的服务,记录目标给予的回答。
通过这种方法,可以搜集到很多目标主机的各种信息。
在获得目标主机TCP/IP端口和其对应的网络访问服务的相关信息后,与网络漏洞扫描系统提供的漏洞库进行匹配,如果满足匹配条件,则视为漏洞存在。
此外,通过模拟黑客的进攻手法,对目标主机系统进行攻击性的安全漏洞扫描,如测试弱势口令等,也是扫描模块的实现方法之一。
如果模拟攻击成功,则视为漏洞存在。
在匹配原理上,该网络漏洞扫描器采用的是基于规则的匹配技术,即根据安全专家对网络系统安全漏洞、黑客攻击案例的分析和系统管理员关于网络系统安全配置的实际经验,形成一套标准的系统漏洞库,然后再在此基础之上构成相应的匹配规则,由程序自动进行系统漏洞扫描的分析工作。
四.设计过程
整个网络漏洞扫描器的核心部分是扫描模块,它是由很多子模块组成的,其结构如图2所示。
在设计时加入该模块的目的是在调用扫描主模块之前探测主机是否在线,以避免不必要的空扫描。
该模块的实现原理和常用的ping命令相似,方法是向目标主机发送ICMP回显报文请求,根据返回值来分析判断主机是否在线。
所有安装了TCP/IP协议的在线网络主机,都会对这样的ICMP回显报文请求给与答复。
虽然现在有些主机装了个人防火墙,可以屏蔽掉这样的ICMP回显报文请求,但是我们这个扫描系统的对象是提供网络服务的网络主机,而这样的主机是不应该屏蔽掉ICMP回显报文请求的,因为这样会让一些用户误认为该主机不在线,从而丧失了作为网络服务器的意义。
为了降低网络拥塞导致丢包的可能性,在实现中重复四次向目标主机发送ICMP回显请求包。
该模块不只探测主机是否在线,而且能根据ICMP回显应答报文的TTL(TTL是位于IP首部中的生存时间字段)值来粗略分辨出目标主机操作系统,为下一步的扫描提供依据,特别是在扫描模块的调用和漏洞库的选择上。
该模块在实现中和其他模块不同的一个最大特点是:
其他扫描模块是针对应用层的,用一般的套接字即能完成网络连接;
而该模块是针对于网络层的,使用一种叫原始套接字的技术来实现。
原始套接字(rawsocket)提供了一些使用TCP和UDP套接字不能实现的功能:
可以访问ICMP和IGMP等协议的数据包,可以读写内核不处理的IP数据包,可以创建自定义的IP数据首部。
使用原始套接字可以编写基于IP协议的高层网络协议。
当基本信息探测子模块得知目标主机在线时,端口扫描子模块即被调用。
该模块将根据传来的参数相应的扫描TCP的1~1024或者1~65535端口。
扫描方式是利用TCP的完全连接方式,即利用TCPconnect扫描技术来设计扫描模块,这是最基本的TCP扫描。
通常通过调用套接口函数connect()连接到目标计算机上,完成一次完整的三次握手过程。
如果端口处于侦听状态,那么connect()就能成功返回。
否则,这个端口不可用,即没有提供服务。
这个技术的一个最大的优点是不需要任何权限。
另外的一个优点就是比其他扫描方式(如SYN扫描和FIN扫描等等)更稳定可靠。
但这种方法的一个缺陷是:
扫描方式不隐蔽。
通常作为一个扫描器软件的应用,TCP的connect会重复且大量地被集中使用,在被扫描的一端则会很容易发现这种扫描行为,目标计算机的log文件会显示一连串的连接和连接是否出错的服务消息,并且能很快地使它关闭;
而且大多数防火墙也能屏蔽这种扫描,随着防火墙技术的快速发展,其他的一些曾经被认为是很隐蔽的扫描方式也可能被防火墙发现并屏蔽掉。
所以相对而言,TCPconnect扫描方式的这个缺陷已经被淡化了。
而且,我们开发的扫描系统是从系统管理员的角度出发,因此上述的问题都是不存在的,除非他/她非法扫描他人网站主机。
图2扫描模块的结构
而我们在设计实现该漏洞扫描系统时则从另一个角度出发,保证在达到同等目的的前提下,尽量少占用网络、主机以及时间资源,提高资源的利用率和扫描系统的效率。
基本思想是:
避免不必要的模块调用,根据不同的实际情况来调用相应的扫描子模块。
扫描模块在工作时,首先进行初始化,在初始化阶段,主要是读取所需的参数。
比如从基本信息探测子模块得到操作系统类型,由此来决定在扫描中需要使用的漏洞库;
还有一些用户自己配置的参数。
除了读取参数外,还要建立一些文件以供以后使用。
初始化后,建立非阻塞socket并连接,然后根据得到的相关端口及对应的服务,来调用相应的漏洞扫描子模块(包括CGI漏洞扫描子模块、POP漏洞扫描子模块、FTP漏洞扫描子模块、SSH漏洞扫描子模块、HTTP漏洞扫描子模块、SMTP漏洞扫描子模块和IMAP漏洞扫描子模块以及三种类型的入侵扫描子模块),当所有的端口都已经扫描完以后,调用后门扫描子模块和其他漏洞扫描子模块。
由于这两个扫描子模块并不是针对某一个端口或网络服务的,所以没有像其他的漏洞扫描子模块一样在端口扫描过程中被调用。
但有一点是和其他子模块是一致的,即这两个子模块的调用形式也是通过创建子进程来完成的。
一个网络漏洞扫描系统的灵魂就是它所使用的系统漏洞库,漏洞库信息的完整性和有效性决定了扫描系统的功能,漏洞库的编制方式决定了匹配原则,以及漏洞库的修订、更新的性能,同时影响扫描系统的运行时间。
通过大量的多方收集,主要是对www.cert.org、、及中国绿色联盟等反黑权威网站漏洞信息进行分类整理,我们对存在漏洞的主要的网络服务逐一建立了三级漏洞描述文件,作为各个漏洞扫描子模块的访问库体。
在每个漏洞库文件中,每条漏洞信息占一行,行首用"
!
"
标示漏洞级别,叹号的个数代表漏洞危险级别。
A级危害以"
标示,B级以"
标示,C级以"
标示。
接下来是漏洞的特征字符串,当特征字符串不止一个时,用一个不容易引起混淆的(~)字符加以隔离。
漏洞形成的原因形形色色、不一而足,在我们设计开发的漏洞库中,主要包含以下类型的漏洞:
CGI脚本漏洞、POP3漏洞、FTP漏洞、SSH漏洞、HTTP漏洞、SMTP漏洞、IMAP漏洞、后门漏洞、RPC漏洞、DNS漏洞等。
下面我们将以CGI脚本漏洞和SMTP漏洞为例来简单说明漏洞库的编制。
(1)CGI脚本漏洞
CGI脚本是实现Web交互功能的重要手段。
Shell脚本、Perl程序和C可执行程序是CGI脚本最常采用的形式。
由于程序编写上的疏忽,很多CGI脚本都存在漏洞,根据我们所收集的漏洞信息,CGI漏洞的危害主要有三种:
缓冲区溢出攻击
这种攻击实质是不遵守规则、歪曲或违反页面中建立的某个限制或约束。
大部分CGI脚本是作为HTML表单的后台运行的,负责处理由用户输入的信息并提供某种定制的输出。
因为在这种情况下,大部分CGI脚本编写时都等待某种特定格式的数据。
然而,黑客可以有许多方法绕过这些预定义的格式而给脚本发送一些看起来是随机的数据。
此时,由于CGI脚本可能在对输入数据的有效性的判定上存在不足,缺少全面的输入验证和净化,导致攻击者能够将特殊的字符和本地系统命令结合起来,作为参数输入,从而使得Web服务器执行该命令。
(2)SMTP漏洞
SMTP(SimpleMailTransferProtocol,简单邮件传输协议)是用来发送邮件的协议,其服务守护程序是Sendmail。
Sendmail因为大而复杂,配置又十分麻烦,所以一度曾是Unix上的漏洞最多的程序,著名的蠕虫病毒就是利用Sendmail旧版本上的一个"
DEBUG"
命令的漏洞而从一个系统传播到另一个系统的。
又如:
利用ETRN命令可使Sendmail停止响应(即拒绝服务)。
当Sendmail接收到ETRN命令时,它将调用fork()。
此时子进程将代替父进程发送响应输出,而父进程将不再响应send()/write()错误。
因此攻击者可发送大量ETRN命令,然后中断连接,这会使父进程连续地调用fork()和sleep(5),而无法恢复正常的响应。
四.设计代码
网络扫描器采用B/S模式进行软件开发,B/S模式是指软件的主体部分都在服务器端,用户只需使用浏览器发出扫描服务的请求,由服务器执行对扫描目标的扫描操作,并将最终扫描结果以脆弱性报告形式发送到客户端。
1WindowsSockets编程
Socket存在于通信区域中是网络通信基本构件,是可以被命名和寻址的通信端点,网络编程中各套接字都有相关进程与其类型对应。
下面仅就网络扫描器开发过程中用到的WindowsSocket的一些共性操作加以说明。
(1)设置服务器地址和连接端口
structsockaddr_insad;
//获得主机地址的结构
structhostent*ptrh;
//指向主机入口的指针
ptrh=NULL;
sad.sin_port=htons(21);
//如设定连接端口为21
sad.sin_addr.s_addr=inet_addr(host->
ip);
//扫描目标主机IP地址
sad.sin_family=AF_INET;
//地址类型规范
(2)创建WindowsSocket套接字
套接字类型可根据通信特征进行分类。
WindowsSockets1.1支持两种套接字:
流套接字SOCK_STREAM和数据报套接字SOCK_DGRAM。
具体实现如下:
SOCKETsd;
//定义sd为Socket
sd=socket(PF_INET,SOCK_STREAM,0);
//创建TCPSocket套接字
if(sd<
0){returnFALSE;
}//sd<
0表示本地创建Socket失败,返回值为假
Socket套接字
套接字类型可根据通信特征进行分类。
socket(intaf,inttype,intprotocol)指定地址族、数据类型和协议描述符及相关资源。
指定地址族、数据类型和协议描述符及相关资源。
(3)套接字建立连接与数据的收发
connect(SOCKETs,conststructsockaddrFAR*name,intnamelen)参数s是套接字描述符,name是套接字地址结构指针,namelen说明套接字地址长度。
在TCP协议中数据发送与接收函数为send和recv,UDP协议中为sendto和recvfrom,使用时调用程序要提供超时控制。
参数s是套接字描述符,name是套接字地址结构指针,namelen说明套接字地址长度。
send(SOCKETs,constcharFAR*buf,intlen,intflags);
recv(SOCKETs,charFAR*buf,intlen,intflags);
sendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);
//UDP协议中数据发送函数
//UDP协议中数据发送函数
recvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen);
//UDP协议中数据接受函数
2数据结构
检测系统存在的安全漏洞是不断被发现与升级的,这要求网络扫描器的开发应具有很强扩展性,通过准实时的增加扫描功能或扩展扫描插件可较好解决这一问题,插件的开发利用MicrosoftVisualC++6.0编译链接后生成DLL文件。
为便于统一管理,将文件的扩展名修改为NFS,由NFS的调用模块调用执行,编写的插件源代码包括如下两个数据结构:
structRECORD
{charclassname[50];
//插件所属的类型名
charID[10];
//标名插件的类及成员关系
charmembername[50];
//插件的成员名称
charfilename[50];
//插件对应的文件名(不含路径)
charrisk[10];
//标名风险的等级
chardescription[300];
//该插件对应的文字描述
charadvice[300];
//该插件提供的一些建议
boolmark;
//标识该插件是否被某一模板选中
}record;
//建立信息说明数据库,内容包括插件所属的类型名、插件的类及成员关系、插件对应的文件名、风险的等级、提供的建议等。
优点是主调模块可自动加载插件文字说明部分,存储到数据库中,便于主程序快速调用,易于开发人员的管理和配置。
建立信息说明数据库,内容包括插件所属的类型名、插件的类及成员关系、插件对应的文件名、风险的等级、提供的建议等。
structHOST
{charip[15];
//目标主机的IP地址
intmark;
//标示buff的类别
charbuff[200];
//动态返回信息
inttimeout;
//超时控制变量
}host;
//指定了插件运行的参数,包括目标主机IP地址、动态返回信息及标示类别与超时控制变量,主机IP和超时控制参数由主调模块传递。
优点是使插件富有灵活性和扩展性。
两个标准函数:
extern"
C"
__declspec(dllexport)BOOLInitFunc(structRECORD*record)
指定了插件运行的参数,包括目标主机IP地址、动态返回信息及标示类别与超时控制变量,主机IP和超时控制参数由主调模块传递。
__declspec(dllexport)BOOLInitFunc(structRECORD*record)和extern"
__declspec(dllexport)BOOLApplFunc(structHOST*host)前者便于插件管理和使用,后者根据不同参数实现相关功能。
3编程示例
在设计方案中依照扫描内容将插件分为20多类,这里对具有普遍性和代表性的例子加以分析说明(篇幅所限仅列出插件中主要函数部分代码)。
(1)检测MicrosoftSQLServer是否有DDoS漏洞
extern"
__declspec(dllexport)BOOLInitFunc(structRECORD*record)
{strcpy(record->
advice,"
过滤发向端口1433的数据包。
);
//建议
strcpy(record->
classname,"
DDoS"
//类型
description,"
SQLserver接收连续0信号TCP包时被非法关闭"
filename,"
mssqlserver_dos.nfs"
ID,"
6XX"
//编号
membername,"
mssqlserver_dos"
risk,"
严重"
//等级
record->
mark=true;
returntrue;
}
__declspec(dllexport)BOOLApplFunc(structHOST*host)
{structsockaddr_insad;
//structuretoholdserver'
saddress
//pointertohostentry
charbuf[6];
memset(buf,0,6);
memset((char*)&
sad,0,sizeof(sad));
//clearsockaddrstructure
sad.sin_port=htons(1433);
//SQL通信端口号1433
//TCP连接
if(connect(sd,(structsockaddr*)&
sad,sizeof(sad))<
0)
{closesocket(sd);
returnFALSE;
buf[0]=0x00;
buf[1]=0x00;
buf[2]=0x00;
buf[3]=0x00;
buf[4]=0x00;
buf[5]=0x00;
send(sd,buf,sizeof(buf),0);
closesocket(sd);
Sleep(2000);
//等待
//再次建立连接
returntrue;
}//连接失败,则发生拒绝服务
}
简要说明:
Mic
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 漏洞 扫描器