漏洞扫描器的总体目标是构造一个运行于Unix操作系统平台的基于浏览器/服务器(B/S)结构的,可以扫描Unix操作系统安全漏洞的主机漏洞扫描器。整个扫描器的结构如图1所示。
图1 Unix主机漏洞扫描器的结构
由于主机扫描模块需要模拟一些系统管理员的行为,所以必须在被扫描的目标主机上运行,而且需要超级用户的权限。主机扫描模块驻留于目标主机,它接受系统管理员通过控制平台服务器传来的启动命令及配置参数,根据用户的要求完成扫描功能,之后,将扫描结果通过控制平台服务器反馈给系统管理员,以便系统管理员做出响应。控制平台服务器是一个Web服务器,它可以与驻留于多个目标主机的主机扫描模块进行交互。
主机扫描模块的工作原理
整个主机漏洞扫描器的核心部件是主机扫描模块,主机扫描模块完成扫描的全部功能,其工作原理如图2所示。
其中,主机扫描引擎对目标主机进行扫描,获取扫描信息,然后由匹配机将扫描信息与主机系统配置规则库中的标准配置规则进行匹配比较,从而发现违反安全策略的配置行为,并进行相应的漏洞报警。在漏洞扫描器的实现中,主机扫描引擎、主机系统配置规则库和匹配机构成主机扫描模块,而漏洞报警被传送至控制平台服务器。
图2 主机扫描模块的工作原理
主机扫描模块与控制平台之间的通信
由于控制平台和目标主机不在同一台机器上,所以必须考虑主机扫描模块以何种方式同控制平台进行通信。在进行原型设计时,曾采用远程登录的方式:从控制平台输入管理员的账号和密码后登录到目标主机,再在目标主机上启动主机扫描模块。这样的方式在原型设计阶段是很适合的,因为用Perl语言和一些现成的包来实现Telnet是比较方便的,而且在字符界面下,目标主机的扫描结果可以通过Telnet协议返回到虚拟终端上,无需做专门的处理。
但是在***成型阶段,这样的结构就具有一些缺点了:首先从实现上来讲,用C语言来实现Telnet的协商过程是一个很复杂的工作,而且扫描结果要在***的图形界面显示出来,又需要一个相对复杂的处理;最重要的是,作为一个网络安全的软件,本身的安全是很重要的,而Telnet方式是以明码方式在网络上传递超级用户的账号和密码的,这一点将使软件本身具有一个很大的安全隐患。所以***我们采用了浏览器/服务器结构。
整个主机扫描模块的采用的是浏览器/服务器结构。浏览器通过一个JavaScript请求模块把用户输入的目标主机的地址提取出来,加上一个特定的端口号,再作为一个完整的请求发送出去。浏览器对这个端口发出的请求是按照Http协议的格式发送的,如果在服务器端程序里再做一个类似于协议分析器的工具来分析到达的Http请求将会使实现变得非常复杂。其实利用套接字的原理就能方便地解决这个问题。
套接字是服务器端特定端口和客户端特定端口建立连接后的一个通道,此通道具有唯一性,因为它是由一个唯一的四元组来确定的:服务器端的IP地址和端口号、客户端的IP地址和端口号。当浏览器和服务器相应端口的连接建立以后,服务器端向该套接字发送的所有信息都将送到客户端的浏览器。
根据Web浏览器软件的特点和Http协议的特点,从服务器端来的信息如果只是ASCII信息,浏览器将缺省地把它归为text/plain类,当作文本直接显示,如果发送的信息再加上一些HTML的标记,浏览器则会把它看作text/html类显示,这样我们不仅能方便地把服务器端的输出结果显示到客户端的浏览器上,还能利用HTML的特点对显示加以控制。
所以我们只需在服务器端创建一个套接字,并绑定到特定的端口,然后程序在该特定端口监听。当有信息到达时,根据套接字的唯一性,程序不作其他考虑,认定它是从客户端来的扫描请求,马上启动主机扫描模块,而不用作复杂的Http协议请求分析;并实时地把扫描结果向该套接字输出,这样就能直接返回给浏览器并呈现给用户。
【编辑推荐】