在我之前的博客在介紹過OpenVAS釆用***測試原理,利用Scanner模塊中的腳本引擎對目標進行安全檢測。今天這篇文章重點講述其掃描插件的工做原理,Openvas的Scanner的掃描性能依賴於同時進行掃描的併發進程數,不一樣的硬件環境上可設置的最有效併發掃描數各不相同,Openvas的掃描引擎設備可在保證系統穩定的前提下達到最佳的掃描性能,對於大型網絡使用標準設備進行部署可大大下降安裝和維護成本。
腳本引擎根據用戶提交的配置與要求,首先對腳本進行加載與調度,按照順序依次調用腳本並解析執行,實現掃描功能。php
Openvas掃描過程分爲兩個階段,首先是端口掃描,在該階段openvas對掃描範圍內全部目標判斷是否在線,而後掃描端口,下面是探測階段,在該階段openvas須要肯定目標操做系統類別和開發服務器和應用類別,最後再調用相應漏洞插件對其進行深度掃描,下面接下來交代漏洞插件以前你們要具有NASL的關鍵知識點。
圖1 掃描流程html
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
在/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編號,能夠再這個字段給出。
一樣在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");
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
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()函數進行讀取。
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>),獲取端口的狀態。
除此以外還有大量的正則表達式函數這裏就不一一舉例。
若是你須要開發插件對於,須要瞭解的一個重點問題是,當啓動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端口處於開啓狀態,那麼該腳本將順利執行,對目標進行檢測。經過對知識庫中信息的查詢判斷,可有效提升腳本執行的效率,一些無心義的掃描將被過濾。
在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)
... ...
同步數萬個插件時間比較長,消耗資源不大,能夠去喝杯咖啡啦。
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
大約通過一刻鐘等待終於更新完成。注意,該過程須要一鼓作氣,中途不能強制退出。
將本身寫的插件複製到openvas插件庫目錄:
/var/lib/openvas/plugins
加載插件:
openvassd
openvasmd –rebuild
注意:參數「rebuild」表明從一個正在運行的掃描器(openvassd)中重建數據庫信息。
必要條件:首先必須由足夠大的內存,其次升級補丁工做建議在系統剛架設完畢就作,而後升級Openvas插件。而後確保Sensor傳感器是可用狀態,Nmap進程運行正常。
• 注意,掃描前要確保服務器和客戶機的時鐘要保持一致。
操做步驟:
定義掃描目標,能夠是IP地址、網段地址;
建立新任務,選擇掃描目標、掃描方式;
運行新建立的掃描任務;
等待掃描結束,而後查看掃描報告。
OSSIM 平臺下操做過程:
(1)選擇Anaylysis→Vulnerabilities ,而後點擊"New scan job"按鈕,開始建立一個新的掃描任務;
(2)從上到下依次輸入任務名稱,例如「Server1」,選擇關聯引擎,若是是分佈式系統就要選擇相應的傳感器,而後選擇掃描方式選項包括當即執行,天天/每週執行,系統提供了很是詳細的計劃任務列表,圖2所示。
圖 2 操做過程
建議不要掃描過多的主機(以本書第一章推薦的服務器配置爲基準,建議每次掃描主機數量,以不超過30臺,在系統/etc/openvas/openvassd.conf配置文件中,定義最大主機數爲5臺,每臺主機同時檢查插件數爲10條),如圖3所示。
圖3
(3)最後對任務進行掃描檢測以確保如下要求:掃描檢查結果包含目標IP和主機名,傳感器是否啓用,漏洞掃描庫是否準備好,Nmap是否可用這幾個參數,如圖4~圖5所示。
圖4
圖5
掃描前選取系統資源時,注意要從Assets資源池中選取,而不能手工輸入IP地址的方式,不然會報錯。
OSSIM 5之後的系統Web UI 發生較大變化,其Web漏洞掃描菜單路徑爲:Environment→ Vulnerabilities,如圖6-7所示
圖6 選擇掃描範圍
圖7 選擇傳感器
不管哪一個版本的OSSIM掃描時,都會消耗服務器的大量資源(內存)。一般狀況下建議掃描機器不宜過多,以25臺左右爲宜,可根據機器配置狀況作適量增減。在配置文件/etc/openvas/openvassd.conf中能夠適當改變這個數值。
圖8 掃描過程當中
若是你們在OpenVAS操做過程當中遇到各類困惑,能夠關注個人2019年最新做品《開源安全運維平臺OSSIM疑難解析--入門篇》《開源安全運維平臺OSSIM疑難解析--提升篇》,也能夠加入OSSIM技術討論羣你們一塊兒學習,共同進步。