当前位置: 首页 > Linux

OpenVAS漏洞扫描插件工作原理分析

时间:2023-04-06 20:07:33 Linux

阅读本文前请先安装OSSIMv4.15。OpenVAS采用渗透测试的原理,利用Scanner模块中的脚本引擎对目标进行安全检测。OpenvasScanner的扫描性能取决于同时并发扫描进程的数量。在不同的硬件环境下可以设置的最有效并发扫描数是不同的。Openvas的扫描引擎设备可以在保证系统稳定性的前提下达到最佳性能。扫描性能好,采用标准设备部署,适用于大型网络,可大大降低安装和维护成本。脚本引擎根据用户提交的配置和需求,首先加载并调度脚本,依次调用脚本,解析执行,实现扫描功能。1、插件功能示例在/var/lib/openvas/plugins/目录下,分析cross_site_scriping.nasl脚本,本文重点讲解该文件,阅读前请准备脚本。跨站点脚本漏洞是Web应用程序中的常见漏洞。下面将开始分析cross_site_scriping.nasl脚本,总结一下该类漏洞的检测过程。第77行script_category(ACT_GATHER_INFO);设置脚本的类别,这些类别是:?ACT_GATH(信息收集脚本)?ACT_ATTACK(尝试获取远程主机权限脚本)?ACT_DENIAL(拒绝服务攻击脚本)?ACT_SCANNER(端口扫描脚本)Category它代表了脚本执行的优先级。这不是随机扫描。此优先级设置符合正常扫描过程。我们需要在扫描开始时收集目标主机的端口信息、系统信息和服务信息。基于这些已知信息,合理的进行后续测试。这个测试也是按照从弱到强的顺序执行的。为什么?如果先进行最强的漏洞扫描,就相当于进行了最危险的测试。一旦目标主机存在相应的漏洞,系统将立即崩溃,整个测试无法全面进行。后面会详细介绍NASL脚本的结构和参数。这里简单介绍一下脚本中的category参数。Category在脚本调度过程中起着非常重要的作用。类别表示脚本执行的优先级。通过宏定义各种类别值的优先级。NASL脚本按照下表中类别优先级从高到低执行,相同优先级按脚本id的顺序执行。这种优先级设置符合一般扫描流程的逻辑。在扫描的初始阶段,我们需要收集目标网络的端口信息、系统信息、服务信息等。测试过程也应该按照从弱到强的顺序进行。如果先进行高危测试,目标系统存在相应的漏洞,会导致系统崩溃,测试无法继续进行。在加载和调度NASL脚本的过程中,需要经过三个处理,每个处理定义一个满足要求的链表结构来保存脚本和相关信息。第32行include("revisions-lib.inc")添加引用的类库。第63行script_id(10815);添加openvasID。但有些脚本会同时出现script_cve_id("CVE-2010-2963","CVE-2010-3067"),即添加CVEID、CVE(CommonVulnerabilitiesandExposure)等例子,可以参考deb_2126_1.nasl脚本,如果你想要漏洞有一个CVE编号,可以在这个字段中给出。此外,script_bugtraq_id(33002)出现在freebsd_php5-gd.nasl脚本中。我们可以把CVE看成一本字典,它提供了很多交叉引用。现在有大量公司宣布他们的安全产品或数据库与CVE有关。兼容性,即能够使用CVE中的漏洞名称与其他CVE兼容产品进行交叉引用,为CVE中的每个漏洞分配一个唯一的名称,并在其他工具、网站、数据库和服务中检索它使用此名称的相关信息,以及它自己的有关漏洞的信息也可以被检索到。因此,在评估网络安全时,利用CVE可以找出修复漏洞的措施,CVE可以提供很好的指导。如果想具体查询这些ID信息,可以使用grep命令grep–ir“script_bugtraq_id”/var/lib/openvas/plugins/line78script_family("WebServers");设置脚本所属的系列。NASL对此没有明确规定,插件作者可以定义脚本所属的家族。Openvas使用的系列是:Debian本地安全检查Fedora本地安全检查Mandrake本地安全检查HP-UX本地安全检查Ubuntu本地安全检查CentOS本地安全检查Windows:微软公告FreeBSD本地安全检查RedHat本地安全检查Solaris本地安全检查CentOS本地安全检查Web应用程序滥用FreeBSD本地安全检查缓冲区溢出防火墙网络服务器RPC通用CiscoCISCO数据库无用服务默认帐户NmapNSEnet?远程获取shell?恶意软件?端口扫描器?IT-Grundschutz?SMTP问题?Gentoo本地安全检查?SuSE本地安全检查?FTP?拒绝服务?Windows?服务检测事实上,这些家族是主要的攻击类型。继续看下面第79行:line79script_copyright("Copyright(C)2001SecuriTeam,modifiedbyChrisSulloandAndrewHintz");设置脚本第80行的版权信息script_dependes("find_service.nasl","httpver.nasl");第80行的脚本显示了脚本依赖项。想要cross_site_scriping.nasl正常运行,必须依赖find_service.nasl"和httpver.nasl这两个脚本。第81行script_require_ports("Services/www",80);表示需要目标服务器的端口信息执行这个脚本;line95port=get_http_port(default:80);line123获取服务器端口if(get_port_state(port))判断端口是否开放line134req=http_get(item:url,port:port);发送攻击请求注意:nasl脚本主要是攻击的描述,只是攻击的步骤,不是通常意义上的攻击135行r=http_keepalive_send_recv(port:port,data:req,bodyonly:TRUE);接收响应行165set_Kb_item(name:string("www/",port,"/generic_xss"),value:TRUE);检查知识库中是否已经存在此漏洞信息。类扫描所需的相关信息,例如:?主机存活信息(Host/dead)?主机服务信息(ftp/no_mkdir)?端口扫描信息(services/ftp)?测试登录信息(SMB/loginSMB/password)脚本测试时,如果有用的信息是收集到的,会通过函数set_Kb_item()将相应的词条添加到知识库中;当需要调用知识库中的相关信息时,会使用函数get_Kb_item()读取Pick。2.NASL常用函数介绍?open_sock_tcp()、open_sock_udp(),分别用于打开一个TCP或UDP套接字。?close(),关闭一个端口。?forge_ip_packet(),该函数构造一个新的IP包。?forge_tcp_packet(),构造一个TCP数据包。?set_tcp_elements(),可以修改TCP数据包的内容。?forge_udp_packet(),构造UDP数据包。?send_packet(),发送数据包的函数。?pcap_next(),该函数将从上次使用的接口读取数据包。?this_host(),获取运行脚本的主机IP地址,不带参数。?get_host_name(),获取当前测试主机的主机名,无参数。?get_host_ip(),获取当前测试主机的IP地址,不带参数。?get_host_open_port(),获取远程主机打开的第一个端口号,不带参数。?get_port_stat(),获取端口的状态。此外,还有大量的正则表达式函数,这里就不一一列举了。3、OpenVAS脚本加载过程分析如果需要开发插件,需要了解的一个关键问题是OpenVAS启动时,所有的脚本都是由openvassd进程加载的(/var/lib下的*.nasl脚本)/openvas/plugins/),存储为argiist结构(可变参数列表指针);根据客户端传过来的配置信息,选择需要的脚本,加载为scheduler_plugin结构体;最后根据选中脚本的类别对脚本进行分组,整理脚本的执行顺序,保存到plugins_scheduler-struct结构中。OpenVAS的脚本管理设计的非常合理。初始加载脚本是保存的argiist链表的内容,可以在后面选择脚本和组织脚本执行顺序时调用,可以有效减少内存占用,提高工作效率。在脚本引擎的工作中,将脚本执行收集到的信息存储在知识库中,可以有效避免重复扫描,减少不必要的资源浪费,提高工作效率。知识库中的条目结构定义如下:Structkb_item{charname;/知识库词条名称*/char类型;/项目的类型int或string/union{char*v_str;intv_int;}V;/<知识库中条目的值/structkbitemnext;/指针指向下一个条目*/};知识库中存储的信息包括各种扫描信息,如:?宿主存活信息(Host/dead)。?主机提供的服务信息(ftp/no_mkdir)。?端口扫描信息(Services/ftp)。?测试登录信息(SMB/login;SMB/password)。?用户检测时进行的系统设置信息。在脚本执行过程中,如果收集到有用的信息,就会通过set_kb_item()函数将相应的条目添加到知识库中;如果需要调用知识库中的相关信息,使用get_kb_item()函数读取。如果脚本在执行过程中有依赖的系统环境、端口状态等信息,它会查询知识库,并根据查询结果进行合理的操作。例如:执行某个脚本需要打开目标主机的80端口。通过知识库查询,发现目标的80端口被关闭,则放弃脚本的执行,关闭脚本对应的线程;如果发现目标的80端口是在开启的,脚本就会顺利执行,检测到目标。通过对知识库中的信息进行查询和判断,可以有效提高脚本的执行效率,过滤掉一些无意义的扫描。更多OSSIM内容,请关注我2019年最新作品。