OpenVAS漏洞掃描插件工做原理淺析

在我之前的博客在介紹過OpenVAS釆用***測試原理,利用Scanner模塊中的腳本引擎對目標進行安全檢測。今天這篇文章重點講述其掃描插件的工做原理,Openvas的Scanner的掃描性能依賴於同時進行掃描的併發進程數,不一樣的硬件環境上可設置的最有效併發掃描數各不相同,Openvas的掃描引擎設備可在保證系統穩定的前提下達到最佳的掃描性能,對於大型網絡使用標準設備進行部署可大大下降安裝和維護成本。
腳本引擎根據用戶提交的配置與要求,首先對腳本進行加載與調度,按照順序依次調用腳本並解析執行,實現掃描功能。php

0.掃描流程

Openvas掃描過程分爲兩個階段,首先是端口掃描,在該階段openvas對掃描範圍內全部目標判斷是否在線,而後掃描端口,下面是探測階段,在該階段openvas須要肯定目標操做系統類別和開發服務器和應用類別,最後再調用相應漏洞插件對其進行深度掃描,下面接下來交代漏洞插件以前你們要具有NASL的關鍵知識點。
OpenVAS漏洞掃描插件工做原理淺析
圖1 掃描流程html

1.什麼是NASL腳本

NASL腳本語言是起初針對網絡安全掃描工具Nessus開發的,該腳本語言具備方便快捷,靈活性強,安全性高的特色,便於用戶根據新出現的漏洞特性,寫出有針對性的檢測腳本。
NASL(Nessus Attack Scripting Language)腳本具備其特定的格式要求,其腳本內容可分析兩個部分,第一個部分是腳本的註冊信息,包含腳本名稱、CVE-ID、漏洞描述信息、腳本類型,依賴的腳本或端口等信息。第二部分是針對相應漏洞的檢測代碼,此部分是腳本內容的核心,包含添加引用的庫,腳本初始化,腳本執行及檢測返回信息等操做。
NASL腳本書寫格式大體以下所示。python

if(description)
{
/*註冊信息:包含腳本名稱、CVE-ID、漏洞描述信息、腳本類型,依賴的腳本或端口等*/
Script-name
CVE-ID;
exit(0)
}
/*腳本代碼*/

NASL腳本語言功能強大,用於設計安全檢測腳本足以。該腳本語言的語法相似於C語言,可是比C要簡單許多,在使用NASL腳本語言時,沒必要考慮對象的類型,內存的分配與釋放,變量聲明等問題,只要認真設計漏洞的檢測方法便可。因爲漏洞掃描需在網絡環境中進行,因此NASL語言提供了豐富的網絡相關函數,包括套接字相關函數,用戶可根據檢測須要建立套接字,與目標主機進行通訊;原始報文處理函數,用戶可根據掃描需求構建檢測報文,並對返回信息進行分析,提取重要內容;NASL語言還提供了一些工具參數來簡化檢測腳本的書寫,例如對目標主機系統、端口等信息的提取函數。
NASL語言還提供了豐富的字符串處理函數。NASL語言容許使用=、<和>等操做符以及正則表達式對字符串進行模式匹配,而且提供多種實現模式匹配功能的函數。NASL語言包含字符串長度計算,內容複製,數據類型轉換、大小寫轉換等功能函數,方便腳本書寫。linux

2.插件功能舉例****

在/var/lib/openvas/plugins/目錄下,分析cross_site_scriping.nasl腳本,本文重點對該文件進行講解,請你們在閱讀以前準備好腳本。跨站腳本漏洞是Web應用的常見漏洞,下面將開始對cross_site_scriping.nasl腳本分析,總結此類漏洞檢測過程。web

76  script_summary("Determine if the remote host is vulnerable to Cross Site Sc    ripting vulnerability");
 77  script_category(ACT_GATHER_INFO);
 78  script_family("Web Servers");

77行script_category(ACT_GATHER_INFO);設置腳本的類別,這些類別有:
 ACT_GATH (信息採集類腳本)
 ACT_ATTACK (嘗試獲取遠程主機權限腳本)
 ACT_DENIAL(拒絕服務***腳本)
 ACT_SCANNER(端口掃描腳本)
Category表明了腳本執行的優先級,不是隨便掃描,這種優先級的設定符合常規掃描過程,咱們在掃描初期須要對目標主機的端口信息,系統信息,服務信息進行收集,根據這些已知信息合理的進行後續測試,這種測試也是按照由弱到強的順序執行,爲何呢?若是首先就進行最強的漏洞掃描,至關於進行最危險的測試,一旦目標主機存在相應漏洞,當即系統就會崩潰,整個測試就沒法全面進行。正則表達式

NASL腳本的結構與參數在後面內容將會進行詳細介紹,此處先對腳本中category參數進行簡單描述,category在腳本調度的過程當中具備很是重要的做用,category表明了腳本執行的優先級,經過宏對各種category值的優先級進行定義,NASL腳本按照下表中category優先級由高到低執行,相同優先級按照腳本id順序執行。spring

這種優先級的設定符合通常掃描過程的邏輯,咱們在掃描初期,須要對目標網絡的端口信息、系統信息、服務信息等進行收集,根據這些已知信息,合理進行後續的測試,並且再測試過程當中也要按照由弱到強的順序執行,若是首先進行高危測試,且目標系統存在相應漏洞,則會致使系統崩潰,測試沒法繼續進行。NASL腳本在完成加載調度的過程當中,須要通過三次處理,每次處理都定義了符合要求的鏈表結構對腳本及相關信息進行保存。shell

32 include("revisions-lib.inc");
33 tag_summary = "The remote web server seems to be vulnerable to a Cross Site Scripting
32行 include(「revisions-lib.inc」) 添加引用的類庫。數據庫

63 script_id(10815);
64 script_version("$Revision: 41 $");
65 script_tag(name:"last_modification", value:"$Date: 2013-11-04 20:00:12 +010 0 (Mon, 04 Nov 2013) $");
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編號,能夠再這個字段給出。
OpenVAS漏洞掃描插件工做原理淺析
一樣在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/
OpenVAS漏洞掃描插件工做原理淺析![]
78 script_family("Web Servers");
79 script_copyrigcript_summary("Determine if the remote host is vulnerable to Cross Site Sc ripting vulnerability");
78行 script_family("Web Servers");設置腳本所屬的族(family)。
NASL對此沒有明確規定,插件做者能夠本身定義腳本所屬的族,在Openvas中所使用的族有包括如下內容:centos

  • 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"這兩個腳本。
    80  77  script_category(ACT_GATHER_INFO);
    81  78  script_family("Web Servers");t("Copyright (C) 2001 SecuriTeam, modified     by Chris Sullo and Andrew Hintz");
    82  script_dependencies("find_service.nasl", "httpver.nasl");
    83  script_require_ports("Services/www", 80);
    84  if (revcomp(a: OPENVAS_VERSION, b: "6.0+beta5") >= 0) {
    85    script_tag(name : "summary" , value : tag_summary);
    86  }
    87  exit(0);
    88 }
    89 
    90 #
    91 # The script code starts here
    92 #
    93 
    94 include("http_func.inc");
    95 include("http_keepalive.inc");
    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腳本主要是對的描述,只是說明的的步驟。

136     req = http_get(item:url, port:port);
137     r   = http_keepalive_send_recv(port:port, data:req, bodyonly: TRUE);
135行 r= http_keepalive_send_recv(port:port, data:req, bodyonly: TRUE); //接收響應
165行 set_Kb_item(name:string("www/", port, "/generic_xss"), value: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()函數進行讀取。

3.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>),獲取端口的狀態。
除此以外還有大量的正則表達式函數這裏就不一一舉例。

4.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端口處於開啓狀態,那麼該腳本將順利執行,對目標進行檢測。經過對知識庫中信息的查詢判斷,可有效提升腳本執行的效率,一些無心義的掃描將被過濾。

5.插件同步過程

在OSSIM命令行中輸入命令「openvas-nvt-sync」,如下爲顯示爲輸出結果。

[i] This script synchronizes an NVT collection with the 'OpenVAS NVT Feed'.

[i] The 'OpenVAS NVT Feed' is provided by 'The OpenVAS Project'.

[i] Online information about this feed: 'http://www.openvas.org/openvas-nvt-feed.html'.

[i] NVT dir: /var/lib/openvas/plugins

[i] Will use rsync

[i] Using rsync: /usr/bin/rsync

[i] Configured NVT rsync feed: rsync://feed.openvas.org:/nvt-feed

OpenVAS feed server - http://www.openvas.org/

This service is hosted by Intevation GmbH - http://intevation.de/

All transactions are logged.

Please report synchronization problems to openvas-feed@intevation.de.

If you have any other questions, please use the OpenVAS mailing lists

or the OpenVAS IRC chat. See http://www.openvas.org/ for details.

receiving incremental file list

deleting gb_openssl_38562.nasl.asc

deleting gb_openssl_38562.nasl

./

COPYING

588 100%  574.22kB/s    0:00:00 (xfer#1, to-check=13347/13355)

COPYING.GPLv2

18002 100% 17.17MB/s 0:00:00 (xfer#2, to-check=13346/13355)
COPYING.files

1819904 100% 1.77MB/s 0:00:00 (xfer#3, to-check=13345/13355)
DDI_Directory_Scanner.nasl

32957 100% 32.74kB/s 0:00:00 (xfer#4, to-check=13342/13355)
DDI_Directory_Scanner.nasl.asc

198 100%    0.20kB/s    0:00:00 (xfer#5, to-check=13341/13355)

... ...

同步數萬個插件時間比較長,消耗資源不大,能夠去喝杯咖啡啦。

6.插件更新過程

Tips:如下命令操做佔用CPU資源比較多

#perl /usr/share/ossim/scripts/vulnmeter/updateplugins.pl migrate / 比較消耗CPU和磁盤I/O /

2018-09-07 07:27:33 Framework profile has been found...

2018-09-07 07:27:33 Deleting all tasks in 192.168.11.150 ...

2018-09-07 07:27:33 updateplugins: configured to not updateplugins

2018-09-07 07:27:33 updateplugins: configured to not repair DB

2018-09-07 07:27:33 BEGIN - DUMP PLUGINS

2018-09-07 07:29:01 FINISH - DUMP PLUGINS [ Process took 88 seconds ]

2018-09-07 07:29:01 BEGIN - IMPORT PLUGINS

2018-09-07 07:30:00 FINISH - IMPORT PLUGINS [ 40473 plugins - Process took 59 seconds ]

2018-09-07 07:30:00 BEGIN - UPDATE CATEGORIES

2018-09-07 07:30:00 FINISH - UPDATE CATEGORIES [ Process took 0 seconds ]

2018-09-07 07:30:00 BEGIN - UPDATE FAMILIES

2018-09-07 07:30:00 FINISH - UPDATE FAMILIES [ Process took 0 seconds ]

2018-09-07 07:30:00 BEGIN - UPDATE OPENVAS_PLUGINS

2018-09-07 07:30:03 FINISH - UPDATE OPENVAS_PLUGINS [ Process took 3 seconds ]

2018-09-07 07:30:03 BEGIN - UPDATE NESSUS_PREFERENCES

2018-09-07 07:30:03 show tables like "vuln_nessus_preferences_defaults"

2018-09-07 07:30:03 updateprefs: Getting plugin preferences

2018-09-07 07:30:05 FINISH - UPDATE NESSUS_PREFERENCES [ Process took 2 seconds ]

2018-09-07 07:30:06 Creating Deep profile...

2018-09-07 07:30:06 Filling categories...............

2018-09-07 07:30:06 Done

2018-09-07 07:30:06 Filling families.............................................................

2018-09-07 07:30:06 Done

2018-09-07 07:30:06 Filling plugins...

2018-09-07 07:30:13 Filling preferences in Alienvault DB...

2018-09-07 07:30:14 Done

2018-09-07 07:30:14 Deep profile inserted

2018-09-07 07:30:15 Creating Default profile...

2018-09-07 07:30:15 Filling categories...............

2018-09-07 07:30:15 Done

2018-09-07 07:30:15 Filling families.............................................................

2018-09-07 07:30:15 Done

2018-09-07 07:30:15 Filling plugins...

2018-09-07 07:30:23 Filling preferences in Alienvault DB...

2018-09-07 07:30:24 Done

2018-09-07 07:30:24 Default profile inserted

2018-09-07 07:30:24 Creating Ultimate profile...

2018-09-07 07:30:24 Filling categories...............

2018-09-07 07:30:24 Done

2018-09-07 07:30:24 Filling families.............................................................

2018-09-07 07:30:24 Done

2018-09-07 07:30:24 Filling plugins...

2018-09-07 07:30:32 Filling preferences in Alienvault DB...

2018-09-07 07:30:33 Done

2018-09-07 07:30:33 Ultimate profile inserted

2018-09-07 07:30:33 BEGIN - UPDATE PORT SCANNER

2018-09-07 07:30:35 FINISH - UPDATE PORT SCANNER [ Process took 2 seconds ]

Updating plugin_sid vulnerabilities scanner ids

plugins fetched

Updating...

Script id:94151, Name:IT-Grundschutz M4.288: Sichere Administration von VoIP-Endger?ten, Priority:0

Script id:703073, Name:Debian Security Advisory DSA 3073-1 (libgcrypt11 - security update), Priority:1

Script id:804624, Name:Adobe Reader Plugin Signature Bypass Vulnerability (Windows), Priority:2

Script id:868149, Name:Fedora Update for kernel FEDORA-2014-9959, Priority:5

Script id:95048, Name:IT-Grundschutz M5.145: Sicherer Einsatz von CUPS, Priority:0

Script id:842216, Name:Ubuntu Update for linux USN-2616-1, Priority:4

Script id:105036, Name:Open××× Detection, Priority:0

Script id:868005, Name:Fedora Update for audacious-plugins FEDORA-2014-8183, Priority:1

Script id:869350, Name:Fedora Update for springframework FEDORA-2018-6862, Priority:5

… …

Script id:105084, Name:Multiple ManageEngine Products Arbitrary File Upload Vulnerability, Priority:3

Script id:867751, Name:Fedora Update for python-keystoneclient FEDORA-2014-5555, Priority:3

Script id:882209, Name:CentOS Update for nss CESA-2018:1185 centos6, Priority:2

Script id:842209, Name:Ubuntu Update for libmodule-signature-perl USN-2607-1, Priority:5

大約通過一刻鐘等待終於更新完成。注意,該過程須要一鼓作氣,中途不能強制退出。

7. 測試NASL腳本

將本身寫的插件複製到openvas插件庫目錄:
/var/lib/openvas/plugins
加載插件:
openvassd
OpenVAS漏洞掃描插件工做原理淺析

8. 重建插件庫

openvasmd –rebuild
注意:參數「rebuild」表明從一個正在運行的掃描器(openvassd)中重建數據庫信息。

9.開始Openvas掃描

必要條件:首先必須由足夠大的內存,其次升級補丁工做建議在系統剛架設完畢就作,而後升級Openvas插件。而後確保Sensor傳感器是可用狀態,Nmap進程運行正常。
• 注意,掃描前要確保服務器和客戶機的時鐘要保持一致。
操做步驟:
 定義掃描目標,能夠是IP地址、網段地址;
 建立新任務,選擇掃描目標、掃描方式;
 運行新建立的掃描任務;
 等待掃描結束,而後查看掃描報告。
OSSIM 平臺下操做過程:
(1)選擇Anaylysis→Vulnerabilities ,而後點擊"New scan job"按鈕,開始建立一個新的掃描任務;
(2)從上到下依次輸入任務名稱,例如「Server1」,選擇關聯引擎,若是是分佈式系統就要選擇相應的傳感器,而後選擇掃描方式選項包括當即執行,天天/每週執行,系統提供了很是詳細的計劃任務列表,圖2所示。
OpenVAS漏洞掃描插件工做原理淺析
圖 2 操做過程
建議不要掃描過多的主機(以本書第一章推薦的服務器配置爲基準,建議每次掃描主機數量,以不超過30臺,在系統/etc/openvas/openvassd.conf配置文件中,定義最大主機數爲5臺,每臺主機同時檢查插件數爲10條),如圖3所示。
OpenVAS漏洞掃描插件工做原理淺析
圖3
(3)最後對任務進行掃描檢測以確保如下要求:掃描檢查結果包含目標IP和主機名,傳感器是否啓用,漏洞掃描庫是否準備好,Nmap是否可用這幾個參數,如圖4~圖5所示。
OpenVAS漏洞掃描插件工做原理淺析
圖4
OpenVAS漏洞掃描插件工做原理淺析
圖5
掃描前選取系統資源時,注意要從Assets資源池中選取,而不能手工輸入IP地址的方式,不然會報錯。
OSSIM 5之後的系統Web UI 發生較大變化,其Web漏洞掃描菜單路徑爲:Environment→ Vulnerabilities,如圖6-7所示
OpenVAS漏洞掃描插件工做原理淺析
圖6 選擇掃描範圍

OpenVAS漏洞掃描插件工做原理淺析
圖7 選擇傳感器
不管哪一個版本的OSSIM掃描時,都會消耗服務器的大量資源(內存)。一般狀況下建議掃描機器不宜過多,以25臺左右爲宜,可根據機器配置狀況作適量增減。在配置文件/etc/openvas/openvassd.conf中能夠適當改變這個數值。
OpenVAS漏洞掃描插件工做原理淺析
圖8 掃描過程當中
若是你們在OpenVAS操做過程當中遇到各類困惑,能夠關注個人2019年最新做品《開源安全運維平臺OSSIM疑難解析--入門篇》《開源安全運維平臺OSSIM疑難解析--提升篇》,也能夠加入OSSIM技術討論羣你們一塊兒學習,共同進步。
OpenVAS漏洞掃描插件工做原理淺析

相關文章
相關標籤/搜索