開始閱讀此文以前請安裝好OSSIM v4.15
OpenVAS釆用滲透測試原理,利用Scanner模塊中的腳本引擎對目標進行安全檢測。Openvas的Scanner的掃描性能依賴於同時進行掃描的併發進程數,不一樣的硬件環境上可設置的最有效併發掃描數各不相同,Openvas的掃描引擎設備可在保證系統穩定的前提下達到最佳的掃描性能,對於大型網絡使用標準設備進行部署可大大下降安裝和維護成本。
腳本引擎根據用戶提交的配置與要求,首先對腳本進行加載與調度,按照順序依次調用腳本並解析執行,實現掃描功能。php
1.插件功能舉例正則表達式
在/var/lib/openvas/plugins/目錄下,分析cross_site_scriping.nasl腳本,本文重點對該文件進行講解,請你們在閱讀以前準備好腳本。跨站腳本漏洞是Web應用的常見漏洞,下面將開始對cross_site_scriping.nasl腳本分析,總結此類漏洞檢測過程。shell
77行script_category(ACT_GATHER_INFO);設置腳本的類別,這些類別有:
ACT_GATH (信息採集類腳本)
ACT_ATTACK (嘗試獲取遠程主機權限腳本)
ACT_DENIAL(拒絕服務攻擊腳本)
ACT_SCANNER(端口掃描腳本)
Category表明了腳本執行的優先級,不是隨便掃描,這種優先級的設定符合常規掃描過程,咱們在掃描初期須要對目標主機的端口信息,系統信息,服務信息進行收集,根據這些已知信息合理的進行後續測試,這種測試也是按照由弱到強的順序執行,爲何呢?若是首先就進行最強的漏洞掃描,至關於進行最危險的測試,一旦目標主機存在相應漏洞,當即系統就會崩潰,整個測試就沒法全面進行。
NASL腳本的結構與參數在後面內容將會進行詳細介紹,此處先對腳本中category參數進行簡單描述,category在腳本調度的過程當中具備很是重要的做用,category表明了腳本執行的優先級,經過宏對各種category值的優先級進行定義,NASL腳本按照下表中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端口處於開啓狀態,那麼該腳本將順利執行,對目標進行檢測。經過對知識庫中信息的查詢判斷,可有效提升腳本執行的效率,一些無心義的掃描將被過濾。
更多OSSIM的內容請你們關注個人2019年最新做品。網絡