共计 4565 个字符,预计需要花费 12 分钟才能阅读完成。
OpenVAS 釆用渗透测试原理,利用 Scanner 模块中的脚本引擎对目标进行安全检测。Openvas 的 Scanner 的扫描性能依赖于同时进行扫描的并发进程数,不同的硬件环境上可设置的最有效并发扫描数各不相同,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 在脚本调度的过程中具有非常重要的作用,category 代表了脚本执行的优先级,通过宏对各类 category 值的优先级进行定义,NASL 脚本按照表 9 - 4 中 category 优先级由高到低执行,相同优先级按照脚本 id 顺序执行。
这种优先级的设定符合一般扫描过程的逻辑,我们在扫描初期,需要对目标网络的端口信息、系统信息、服务信息等进行收集,根据这些已知信息,合理进行后续的测试,而且再测试过程中也要按照由弱到强的顺序执行,如果首先进行高危测试,且目标系统存在相应漏洞,则会导致系统崩溃,测试无法继续进行。NASL 脚本在完成加载调度的过程中,需要经过三次处理,每次处理都定义了符合要求的链表结构对脚本及相关信息进行保存。
32 行 include(“revisions-lib.inc”) 添加引用的类库。
63 行 script_id(10815); 添加 openvas ID。
但有些脚本会同时出现 script_cve_id(“CVE-2010-2963”、”CVE-2010-3067”)这代表添加 CVE ID,CVE(Common Vulnerabilities and Exposure)这类例子大家可以参看 deb_2126_1.nasl 脚本,如果该漏洞有 CVE 编号,可以再这个字段给出。同样在 freebsd_php5-gd.nasl 脚本里还出现了 script_bugtraq_id(33002),我们可以把 CVE 看作是一个词典,它提供了许多的交叉引用,现在大量公司都宣布他们的安全产品或数据库都和 CVE 相兼容,也就是能够利用 CVE 中漏洞名称同其它 CVE 兼容的产品进行交叉引用,通过 CVE 中为每个漏洞分配一个唯一的名称,在其它使用了这个名称的工具、网站、数据库以及服务中检索到相关信息,同时自身关于该漏洞的信息也能够被检索到。所以在网络安全评估时,利用 CVE 可以找出修补漏洞的措施,CVE 可以提供很好的指导。大家如果要具体查询这些 ID 信息可以用 grep 命令
grep –ir“script_bugtraq_id”/var/lib/openvas/plugins/
78 行 script_family(“Web Servers”); 设置脚本所属的族(family)。
NASL 对此没有明确规定,插件作者可以自己定义脚本所属的族。Openvas 使用的族有:
Debian Local Security Checks
Fedora Local Security Checks
Mandrake Local Security Checks
HP-UX Local Security Checks
Ubuntu Local Security Checks
CentOS Local Security Checks
Windows : Microsoft Bulletins
FreeBSD Local Security Checks
Red Hat Local Security Checks
Solaris Local Security Checks
CentOS Local Security Checks
Web application abuses
FreeBSD Local Security Checks
Buffer overflow
Firewalls
Web Servers
RPC
General
CISCO
Databases
Useless services
Default Accounts
Nmap NSE net
Gain a shell remotely
Malware
Port scanners
IT-Grundschutz
SMTP problems
Gentoo Local Security Checks
SuSE Local Security Checks
FTP
Denial of Service
Windows
Service detection
实际上这些族就是主要的攻击种类。
下面继续看 79 行内容:
79 行 script_copyright(“Copyright (C) 2001 SecuriTeam, modified by Chris Sullo and Andrew Hintz”);
设置脚本的版权信息
80 行 script_dependendes(“find_service.nasl”, “httpver.nasl”);
第 80 行脚本说明脚本依赖关系,如果要让 cross_site_scriping.nasl 正常运行,必须依赖 find_service.nasl”、”httpver.nasl” 这两个脚本。
81 行 script_require_ports(“Services/www”, 80);
表明执行此脚本所需的目标服务器的端口信息;
95 行 port = get_http_port(default:80); 获取服务器端口
123 行 if(get_port_state(port)) 判断端口是否打开
134 行 req = http_get(item:url, port:port); 发送带有攻击性的请求
• 注意:nasl 脚本主要是对攻击的描述,只是说明的攻击的步骤,不是通常意义上的攻击
135 行 r= http_keepalive_send_recv(port:port, data:req, bodyonly: TRUE); 接收响应
165 行 set_Kb_item(name:string(“www/”, port, “/generic_xss”), value:TRUE);
查看知识库中是否已存在此漏洞信息,知识库中保存了各类扫描所需相关信息,例如:
主机存活信息(Host/dead)
主机提供服务的信息(ftp/no_mkdir)
端口扫描信息(services/ftp)
测试登录信息(SMB/login SMB/password)
在脚本测试过程中,如果收集到有用的信息,将通过 set_Kb_item()这个函数,在知识库中增加相应条目;当需要对知识库中的相关信息进行调用时,则利用 get_Kb_item()函数进行读取。
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(<portnum>),获取端口的状态。
除此之外还有大量的正则表达式函数这里就不一一举例。
3.OpenVAS 脚本加载过程分析
如果你需要开发插件对于,需要了解的一个重点问题是,当启动 OpenVAS 时,由 openvassd 进程加载所有的脚本(/var/lib/openvas/plugins/ 下的 *.nasl 脚本),存储为 argiist 结构 (数量可变的参数列表指针);根据客户端传递的配置信息,选取需要的脚本,加载为 scheduler_plugin 结构;最后根据选取脚本的 category 将脚本分组,组织脚本的执行顺序,保存到 plugins_scheduler-struct 结构。
OpenVAS 关于脚本管理设计的非常合理,初始的加载脚本是保存的 argiist 链表内容,供后面进步一选取脚本及组织脚本执行顺序时调用,可有效减少内存的使用,提高工作效率。在脚本引擎的工作中,将脚本执行收集到的信息保存在知识库中,可有效避免重复扫描,减少不必要的资源浪费,提高工作效率。知识库中条目结构定义如下:
Struct kb_item
{
char name; / 知识库中条目名称 */
char type; / 条目的类型 int 或 string /
union
{
char *v_str;
int v_int;
} V;/< 知识库中条目的值 /
struct kb item next; / 指针指向下一条目 */
};
知识库中保存的信息包含各类扫描信息例如:
主机存活信息 (Host/dead)。
主机提供的服务信息(ftp/no_mkdir)。
端口扫描信息(Services/ftp)。
测试登录信息(SMB/login; SMB/password)。
用户检测时进行的系统设置信息。
在脚本执行过程中,如果收集到有用信息,将通过 set_kb_item()函数,在知识库中增加相应条目;如果需要对知识库中的相关信息进行调用,则使用 get_kb_item()函数进行读取操作。
脚本在执行时如果有依赖的系统环境、端口状态等信息,会到知识库中查询,并根据查询结果做出合理的操作。例如:某脚本的执行需要目标主机的 80 端口打开,通过知识库查询,发现目标的 80 端口是关闭的,那么此脚本的执行将放弃,且该脚本对应线程关闭;如果发现目标的 80 端口处于开启状态,那么该脚本将顺利执行,对目标进行检测。通过对知识库中信息的查询判断,可有效提高脚本执行的效率,一些无意义的扫描将被过滤。