Nessus安全测试插件编写教程(2)
生活随笔
收集整理的這篇文章主要介紹了
Nessus安全测试插件编写教程(2)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
5.總結(jié)
這是NASL Reference Guide的第一部分,主要介紹了NASL的各種函數(shù)。在下一部分我們將系統(tǒng)地介紹如何編寫Nessus安全測試插件。'
1.怎樣編寫一個高效的Nessus安全測試插件
在Nessus安全測試系統(tǒng)中,所有的安全測試都是由nessusd進(jìn)程發(fā)動的。在測試期間,一個好的測試插件必須能夠有效地利用其它測試插件的測試結(jié)果。例如:一個測試插件需要打開一個到FTP服務(wù)器的連接,而在這之前它應(yīng)該首先檢查端口掃描測試插件的結(jié)果,確定FTP端口是否打開。在一般情況下,這樣只會節(jié)約一點點時間,但是如果被測試主機(jī)位于防火墻之后,這樣做會節(jié)省由于防火墻丟棄到21端口的TCP報文造成的漫長等待時間。
1.1.確定端口是否打開
get_port_state(〈portnum〉)函數(shù)用于獲得端口的狀態(tài)。如果端口為開,這個函數(shù)就返回TRUE;反之,則返回FALSE;如果這個端口沒有被掃描過,也就是其狀態(tài)為未知(unknown),函數(shù)也將返回TRUE。這個函數(shù)只消耗很少的CPU資源,因此你可以盡可能地使用它,來提高測試插件的效率。
1.2.基礎(chǔ)信息(Knowledge Base,KB)
在測試過程中,Nessus會為每個主機(jī)維護(hù)一份由掃描測試插件獲得的基本信息(Knowledge Base,這個詞本來應(yīng)該是基礎(chǔ)知識的意思,但是這里似乎翻譯作基本信息更為恰當(dāng)^_^)。各種其它的測試插件應(yīng)該盡可能地利用這些信息,以提高測試效率。實際上,端口的狀態(tài)就保存在這里。
KB被分為好幾類。Service類包含每個已知的服務(wù)和為其分配的端口號。例如,在大多數(shù)情況下,Server/smtp的值為25。但是,如果遠(yuǎn)程主機(jī)的SMTP服務(wù)被隱藏于2500端口,這個值就改為2500。
有關(guān)基本信息各個元素的細(xì)節(jié)請參考附錄B。
在NASL中,有兩個有關(guān)節(jié)本信息(KB)的函數(shù)。使用get_kb_item(〈name〉)函數(shù)可以獲得基本信息的〈name〉項的值,這個函數(shù)是匿名函數(shù);而函數(shù)set_kb_item(name:〈name〉,value:〈value〉)能夠把〈name〉項的值設(shè)置為〈value〉。
注意:你不能獲得剛剛加入的基本信息條目的值。例如,以下代碼將無法象你所期待的那樣執(zhí)行:
set_kb_item(name:"attack",value:TRUE);
if(get_kb_item("attack"))
{
#這里的代碼不可能執(zhí)行
#因為attack基本信息項并沒有更新
}
之所以會這樣,是出于安全和代碼穩(wěn)定性的考慮。在安全測試期間,Nessus服務(wù)器會為每個安全測試插件維護(hù)一份基本信息(KB)拷貝,安全測試插件只是從自己的基本信息(KB)拷貝中獲得信息。而set_kb_item()函數(shù)只更新原始的基本信息(KB)拷貝,不對當(dāng)前安全測試插件使用的拷貝進(jìn)行更新操作。
2.NASL腳本結(jié)構(gòu)
每個安全測試插件需要向Nessus服務(wù)器進(jìn)行注冊后,才能使用。注冊信息包括名字、描述、作者等。每個NASL腳本都需要有以下結(jié)構(gòu):
#
#NASL基本基本結(jié)構(gòu)
#
if(description)
{
#這里是注冊信息
#
#這里可以叫做注冊部分(register section)
#
exit(0);
}
#
#這里是腳本代碼。我們可以稱為***部分(attack section)
#
description是一個全局變量,值可以是TRUE或者FALSE,取決于腳本是否需要注冊。
2.1.注冊部分
在腳本的注冊部分,必須調(diào)用以下函數(shù):
script_name(language1:〈name〉,[...])
設(shè)置在Nessus客戶程序窗口中顯示的名稱。
script_description(language1:〈desc〉,[...])
設(shè)置在Nessus客戶程序中顯示的描述信息。
script_summary(language1:〈summary〉,[...])
設(shè)置總結(jié)信息,必須在一行之內(nèi)總結(jié)描述信息的內(nèi)容。
script_category(〈category〉)
設(shè)置腳本的類別。必須是ACT_ATTACK、ACT_GATHER_INFO、ACT_DENIAL和ACT_SCANNER之一。
ACT_GATHER_INFO
信息采集類腳本。這種腳本率先啟動,不會對遠(yuǎn)程主機(jī)造成傷害。
ACT_ATTACK
這類腳本會嘗試獲得遠(yuǎn)程主機(jī)的某些權(quán)限,可能會危害遠(yuǎn)程主機(jī)(例如,如果運(yùn)行緩沖區(qū)溢出測試插件)
ACT_DENIAL
這種腳本會發(fā)起拒絕服務(wù)***,試圖造成遠(yuǎn)程主機(jī)宕機(jī)。
ACT_SCANNER
端口掃描腳本。
script_copyright(language1:〈copyright〉,[...])
設(shè)置腳本的版權(quán)信息。
script_family(language1:〈family〉,[...])
設(shè)置腳本所屬的族(family)。NASL對此沒有明確的規(guī)定,你可以任意定義腳本所屬的族,例如:nixe0n's PowerTools",不過我不建議這樣做。當(dāng)前使用的族名有:
Backdoors
CGI abuses
Denial of Service
FTP
Finger abuses
Firewalls
Gain a shell remotely
Gain root remotely
Misc
NIS
RPC
Remote file access
SMTP problems
Useless services
你可能注意到了,以上所有的函數(shù)都有一個叫做language1的參數(shù)。這個參數(shù)用于提供多語言支持。使用NASL編寫的腳本都需要支持英語,因此這些函數(shù)的確切語法是:
script_fuction(english:english_text,[francais:french_text,deutsch:german_text,...]);
除了以上函數(shù),還有一個用于解決安全測試插件依賴關(guān)系的函數(shù)script)dependencies()。它告訴nessusd服務(wù)器在某些腳本之后啟動當(dāng)前腳本。如果當(dāng)前腳本需要其它腳本獲得的結(jié)果,就需要使用這個函數(shù)。其原型為:
script_dependencies(filename1 [,filename2,...,filenameN]);
filename參數(shù)是腳本文件名。
2.2.***部分
腳本的***部分可以包括所有用于***測試的代碼。一旦***完成,你可以使用security_warning()和security_hole()函數(shù)報告是否存在此類安全問題。這兩個函數(shù)的用途基本相同,security_warning()用于***成功,但是問題不大的情況。它們的原型如下:
security_warning(〈port〉 [,protocol:〈proto〉]);
security_hole(〈port〉 [,protocol:〈proto〉]);
security_warning(port:〈port〉,data:〈data〉 [,protocol:〈proto〉]);
security_hole(port:〈port〉,data:〈data〉 [,protocol:〈proto〉]);
在上面的第一種情況下,客戶程序顯示的內(nèi)容是腳本注冊時script_description()函數(shù)提供的。由于能夠支持多語言,因此非常方便。
在第二種情況下,客戶程序?qū)@示data參數(shù)的內(nèi)容。如果你需要顯示動態(tài)獲得的數(shù)據(jù),就必須使用這種形式。
2.3.CVE兼容性
CVE是麻省理工學(xué)院維護(hù)的一個數(shù)據(jù)庫,主要是對安全相關(guān)的問題提供一個一般的描述。
詳情請參考[url]http://cve.mitre.org[/url]。
Nessus和CVE完全兼容,如果你要測試一個CVE定義過的安全問題,就可以在插件腳本的描述部分調(diào)用script_cve_id()函數(shù)。其原型如下:
script_cve_id(string);
例如:
script_cve_id("CVE-1999-0991");
如果使用了這個函數(shù),Nessus客戶程序在生成報告時,會自動引用相關(guān)的CVE記錄。
2.4.示例
除了安全測試外,NASL也可以用來編寫一些用于維護(hù)的腳本。下面就是一個例子,用戶可以使用這個腳本檢查那些主機(jī)正在提供SSH服務(wù)。
#
#檢查SSH
#
if(description)
{
script_name(english:"Ensure the presence of ssh");
script_description(english:"This script makes sure that ssh is running");
script_summary(english:"connects ont remote tcp port 22");
script_category(ACT_GATHER_INFO);
script_family(english:"Admiminstration toolbox");
script_copyright(english:"This script was Writtern by Joe U.");
exit(0);
}
#
#SSH服務(wù)可能隱藏在別的端口
#因此我們需要依賴于find_service插件獲得的結(jié)果
#
port=get_kb_item("Services/ssh");
if(!port)port=22;
#首先聲明SSH沒有安裝
ok=0;
if(get_port_state(port))
{
soc=open_sock_tcp(port);
if(soc)
{
#檢查端口是否是由TCP_Wrapper封裝的。
data=recv(socket:soc,length:200);
if("SSH"〉〈data)ok=1;
}
close(soc);
}
#
#報告不提供SSH服務(wù)的主機(jī)
#
if(!ok)
{
report="SSH is not running on this host!";
security_warning(port:22,data:report);
}
3.腳本優(yōu)化
在安全測試期間,nessusd服務(wù)器將啟動200多個腳本。如果所有腳本編寫的都不好,這個測試就會浪費大量的時間。因此,你必須盡量提高腳本的效率。
3.1.只在必要時運(yùn)行
對于優(yōu)化腳本,最有效的方法是告訴nessusd服務(wù)器什么時候不要啟動它。例如,假設(shè)你的腳本需要建立到遠(yuǎn)程主機(jī)123/TCP端口的連接,如果nessusd知道這個端口已經(jīng)被關(guān)閉,就沒有必要啟動你的腳本了。script_require_ports()、script_require_keys()和script_exclude_keys()就是用來實現(xiàn)上述目的。這些腳本需要在描述部分調(diào)用:
script_require_ports(〈port1〉,〈port2〉,...)
參數(shù)中的至少一個端口開放才啟動腳本。參數(shù)可以是數(shù)字,也可以是基本信息(KB)中定義的符號,例如:"Services/www"。注意:如果端口的狀態(tài)是未知的(例如:還沒有進(jìn)行過端口掃描),這個腳本也會執(zhí)行。
script_require_keys(〈key1〉,〈key2〉,...)
只有參數(shù)中的關(guān)鍵詞在基本信息(KB)都有定義時,才執(zhí)行腳本。例如:
script_require_keys("ftp/anonymous","ftp/writeable_dir");
表示只有遠(yuǎn)程FTP主機(jī)支持匿名用戶以及存在可以寫的目錄時,才啟動當(dāng)前腳本。
script_exclude_keys(〈key1〉,〈key2〉,...)
參數(shù)表示的關(guān)鍵詞至少有一個在基本信息(KB)中有定義,才執(zhí)行當(dāng)前腳本。
3.2.充分利用其它腳本的結(jié)果
充分利用基本信息拷貝中的信息,可以使腳本更高效。例如,如果在調(diào)用open_sock_tcp()函數(shù)之前,先調(diào)用get_port_state()函數(shù),就可以避免由于目標(biāo)端口是關(guān)閉的帶來的時間上的浪費。
4.如何分享你的新腳本
如果你想讓別人分享自己的成果,在編寫測試腳本時要遵循以下原則:
你的腳本不能存在任何與用戶交互的操作
NASL安全測試腳本是在服務(wù)器端運(yùn)行的,因此用戶看不到任何的輸出信息。
一個腳本只能測試一個漏洞
如果你知道如何測試好幾個漏洞,那就為每個漏洞都編寫自己的測試腳本。
你的腳本最好歸入現(xiàn)有的種類
如果你計劃分享自己的成果,最好避免建立Joe's Power Tools這樣的新插件種類,盡量把插件劃入已有的插件種類。
查詢CVE中是否有相關(guān)漏洞的定義
如果你能夠注意腳本的兼容性,可以節(jié)省Nessus維護(hù)者的很多時間。
把成果發(fā)給Nessus維護(hù)者
Nessus的維護(hù)者就是本文的作者。如果你不象獨享自己的成果,就把它發(fā)給Nessus維護(hù)者。如果你的腳本被采用,它就會被分配一個唯一的ID。
5.結(jié)論
希望你能夠喜歡這個教程。學(xué)習(xí)這個語言不會占用你太多的時間,你需要多多練習(xí)。在使用過程中,你會發(fā)現(xiàn)NASL解釋器的一些BUGS,希望你能夠及時把這些BUGS報告給我。
附錄A.基本信息(Knowledge base)
所謂的基本信息是一些關(guān)鍵詞,里面包含其它測試插件獲得的信息。使用script_dependencies()、get_kb_item()和set_kb_item()函數(shù),可以幫助你避免沒有必要的重復(fù)測試。附錄A中將羅列出這些關(guān)鍵詞。
在基本信息(KB)中,每個項可以有幾個值。例如,遠(yuǎn)程主機(jī)運(yùn)行兩個FTP服務(wù):一個在端口21,另一個在端口2100。這樣關(guān)鍵詞Services/ftp就等于21和2100兩個端口。在這種情況下,測試腳本將執(zhí)行兩次:第一次,get_kb_item("Services/ftp")函數(shù)將返回21,第二次這個函數(shù)將返回2100。不過,這是自動進(jìn)行的,無須人工干預(yù)。對于腳本編寫者來說,相當(dāng)于每個基本信息關(guān)鍵詞只有一個值。有些關(guān)鍵詞目前沒有多大用處,好多我就沒有用過,但是有備無患。
Host/OS
定義文件:queso.nasl、nmap_wrapper.nasl
類型:字符串
含義:遠(yuǎn)程操作系統(tǒng)的類型
Host/dead
定義文件:ping_host.nasl和所有的DoS插件
類型:boolean
含義:遠(yuǎn)程主機(jī)關(guān)閉。如果這個項被設(shè)置,nessusd將終止針對這個主機(jī)的所有測試。
Services/www
定義文件:find_service.nes
類型:端口號
含義:目標(biāo)主機(jī)WEB服務(wù)器監(jiān)聽的端口號。如果沒有發(fā)現(xiàn)WEB服務(wù)器,就返回0。
Services/auth
定義文件:find_service.nes
類型:端口號
含義:identd服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/echo
定義文件:find_service.nes
類型:端口號
含義:echo服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/finger
定義文件:find_service.nes
類型:端口號
含義:finger服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/ftp
定義文件:find_service.nes
類型:端口號
含義:ftp服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/smtp
定義文件:find_service.nes
類型:端口號
含義:smtp服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/ssh
定義文件:find_service.nes
類型:端口號
含義:ssh服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/http_proxy
定義文件:find_service.nes
類型:端口號
含義:HTTP代理服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/imap
定義文件:find_service.nes
類型:端口號
含義:imap服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/pop1
定義文件:find_service.nes
類型:端口號
含義:pop1服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/pop2
定義文件:find_service.nes
類型:端口號
含義:pop2服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/pop3
定義文件:find_service.nes
類型:端口號
含義:pop3服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/nntp
定義文件:find_service.nes
類型:端口號
含義:nntp服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/linuxconf
定義文件:find_service.nes
類型:端口號
含義:linuxconf服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/swat
定義文件:find_service.nes
類型:端口號
含義:SWAT服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/wild_shell
定義文件:find_service.nes
類型:端口號
含義:shell服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/telnet
定義文件:find_service.nes
類型:端口號
含義:telnet服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/server
定義文件:find_service.nes
類型:端口號
含義:realserver服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/netbus
定義文件:find_service.nes
類型:端口號
含義:NetBus服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
bind/version
定義文件:bind_version.nasl
類型:字符串
含義:遠(yuǎn)程BIND監(jiān)控程序的版本
rpc/bootparamd
定義文件:bootparamd.nasl
類型:字符串
含義:bootparam RPC服務(wù)正在運(yùn)行
Windows compatible
定義文件:ca_unicenter_file_transfer_service.nasl、ca_unicenter_transport_service.nasl、mssqlserver_detect.nasl和windows_detect.nasl
類型:boolean
含義:遠(yuǎn)程主機(jī)好象運(yùn)行一種Windows兼容操作系統(tǒng)(只有相關(guān)的端口開放才進(jìn)行這個測試)
finger/search.**@host
定義文件:cfinger_search.nasl
類型:boolean
含義:使用**進(jìn)行finger查詢能夠得到用戶列表。
finger/0@host
定義文件:finger_0.nasl
類型:boolean
含義:使用0進(jìn)行finger查詢能夠得到用戶列表
finger/.@host
定義文件:finger_dot.nasl
類型:boolean
含義:使用.進(jìn)行finger查詢能夠獲得用戶列表
finger/user@host1@host2
定義文件:finger_0.nasl
類型:boolean
含義:finger監(jiān)控程序能夠用于重定向***
www/frontpage
定義文件:frontpage.nasl
類型:boolean
含義:遠(yuǎn)程WEB服務(wù)器使用frontpage擴(kuò)展
ftp/anonymous
定義文件:ftp_anonymous.nasl
類型:boolean
含義:遠(yuǎn)程FTP服務(wù)器可以匿名登錄
ftp/root_via_cmd
定義文件:ftp_cwd_root.nasl
類型:boolean
含義:使用CWD命令可以獲得遠(yuǎn)程FTP服務(wù)器的root權(quán)限。參看CVE-1999-0082
ftp/microsoft
定義文件:ftp_overflow.nasl
類型:boolean
含義:遠(yuǎn)程主機(jī)是Micro$oft FTP服務(wù)器,不能處理太長的參數(shù)
ftp/false_ftp
定義文件:ftp_overflow.nasl
類型:boolean
含義:遠(yuǎn)程主機(jī)經(jīng)過TCP封裝,或者FTP端口開放而連接關(guān)閉。
附錄B.nasl工具
libnasl軟件包中有一個單獨的解釋器nasl,可以用于腳本的調(diào)試。更多細(xì)節(jié)可以參考man nasl。
中國.Net俱樂部轉(zhuǎn)載此文。讓我們一起進(jìn)步,共享人類技術(shù)資源。[[url]www.chinaaspx.com[/url]]
這是NASL Reference Guide的第一部分,主要介紹了NASL的各種函數(shù)。在下一部分我們將系統(tǒng)地介紹如何編寫Nessus安全測試插件。'
1.怎樣編寫一個高效的Nessus安全測試插件
在Nessus安全測試系統(tǒng)中,所有的安全測試都是由nessusd進(jìn)程發(fā)動的。在測試期間,一個好的測試插件必須能夠有效地利用其它測試插件的測試結(jié)果。例如:一個測試插件需要打開一個到FTP服務(wù)器的連接,而在這之前它應(yīng)該首先檢查端口掃描測試插件的結(jié)果,確定FTP端口是否打開。在一般情況下,這樣只會節(jié)約一點點時間,但是如果被測試主機(jī)位于防火墻之后,這樣做會節(jié)省由于防火墻丟棄到21端口的TCP報文造成的漫長等待時間。
1.1.確定端口是否打開
get_port_state(〈portnum〉)函數(shù)用于獲得端口的狀態(tài)。如果端口為開,這個函數(shù)就返回TRUE;反之,則返回FALSE;如果這個端口沒有被掃描過,也就是其狀態(tài)為未知(unknown),函數(shù)也將返回TRUE。這個函數(shù)只消耗很少的CPU資源,因此你可以盡可能地使用它,來提高測試插件的效率。
1.2.基礎(chǔ)信息(Knowledge Base,KB)
在測試過程中,Nessus會為每個主機(jī)維護(hù)一份由掃描測試插件獲得的基本信息(Knowledge Base,這個詞本來應(yīng)該是基礎(chǔ)知識的意思,但是這里似乎翻譯作基本信息更為恰當(dāng)^_^)。各種其它的測試插件應(yīng)該盡可能地利用這些信息,以提高測試效率。實際上,端口的狀態(tài)就保存在這里。
KB被分為好幾類。Service類包含每個已知的服務(wù)和為其分配的端口號。例如,在大多數(shù)情況下,Server/smtp的值為25。但是,如果遠(yuǎn)程主機(jī)的SMTP服務(wù)被隱藏于2500端口,這個值就改為2500。
有關(guān)基本信息各個元素的細(xì)節(jié)請參考附錄B。
在NASL中,有兩個有關(guān)節(jié)本信息(KB)的函數(shù)。使用get_kb_item(〈name〉)函數(shù)可以獲得基本信息的〈name〉項的值,這個函數(shù)是匿名函數(shù);而函數(shù)set_kb_item(name:〈name〉,value:〈value〉)能夠把〈name〉項的值設(shè)置為〈value〉。
注意:你不能獲得剛剛加入的基本信息條目的值。例如,以下代碼將無法象你所期待的那樣執(zhí)行:
set_kb_item(name:"attack",value:TRUE);
if(get_kb_item("attack"))
{
#這里的代碼不可能執(zhí)行
#因為attack基本信息項并沒有更新
}
之所以會這樣,是出于安全和代碼穩(wěn)定性的考慮。在安全測試期間,Nessus服務(wù)器會為每個安全測試插件維護(hù)一份基本信息(KB)拷貝,安全測試插件只是從自己的基本信息(KB)拷貝中獲得信息。而set_kb_item()函數(shù)只更新原始的基本信息(KB)拷貝,不對當(dāng)前安全測試插件使用的拷貝進(jìn)行更新操作。
2.NASL腳本結(jié)構(gòu)
每個安全測試插件需要向Nessus服務(wù)器進(jìn)行注冊后,才能使用。注冊信息包括名字、描述、作者等。每個NASL腳本都需要有以下結(jié)構(gòu):
#
#NASL基本基本結(jié)構(gòu)
#
if(description)
{
#這里是注冊信息
#
#這里可以叫做注冊部分(register section)
#
exit(0);
}
#
#這里是腳本代碼。我們可以稱為***部分(attack section)
#
description是一個全局變量,值可以是TRUE或者FALSE,取決于腳本是否需要注冊。
2.1.注冊部分
在腳本的注冊部分,必須調(diào)用以下函數(shù):
script_name(language1:〈name〉,[...])
設(shè)置在Nessus客戶程序窗口中顯示的名稱。
script_description(language1:〈desc〉,[...])
設(shè)置在Nessus客戶程序中顯示的描述信息。
script_summary(language1:〈summary〉,[...])
設(shè)置總結(jié)信息,必須在一行之內(nèi)總結(jié)描述信息的內(nèi)容。
script_category(〈category〉)
設(shè)置腳本的類別。必須是ACT_ATTACK、ACT_GATHER_INFO、ACT_DENIAL和ACT_SCANNER之一。
ACT_GATHER_INFO
信息采集類腳本。這種腳本率先啟動,不會對遠(yuǎn)程主機(jī)造成傷害。
ACT_ATTACK
這類腳本會嘗試獲得遠(yuǎn)程主機(jī)的某些權(quán)限,可能會危害遠(yuǎn)程主機(jī)(例如,如果運(yùn)行緩沖區(qū)溢出測試插件)
ACT_DENIAL
這種腳本會發(fā)起拒絕服務(wù)***,試圖造成遠(yuǎn)程主機(jī)宕機(jī)。
ACT_SCANNER
端口掃描腳本。
script_copyright(language1:〈copyright〉,[...])
設(shè)置腳本的版權(quán)信息。
script_family(language1:〈family〉,[...])
設(shè)置腳本所屬的族(family)。NASL對此沒有明確的規(guī)定,你可以任意定義腳本所屬的族,例如:nixe0n's PowerTools",不過我不建議這樣做。當(dāng)前使用的族名有:
Backdoors
CGI abuses
Denial of Service
FTP
Finger abuses
Firewalls
Gain a shell remotely
Gain root remotely
Misc
NIS
RPC
Remote file access
SMTP problems
Useless services
你可能注意到了,以上所有的函數(shù)都有一個叫做language1的參數(shù)。這個參數(shù)用于提供多語言支持。使用NASL編寫的腳本都需要支持英語,因此這些函數(shù)的確切語法是:
script_fuction(english:english_text,[francais:french_text,deutsch:german_text,...]);
除了以上函數(shù),還有一個用于解決安全測試插件依賴關(guān)系的函數(shù)script)dependencies()。它告訴nessusd服務(wù)器在某些腳本之后啟動當(dāng)前腳本。如果當(dāng)前腳本需要其它腳本獲得的結(jié)果,就需要使用這個函數(shù)。其原型為:
script_dependencies(filename1 [,filename2,...,filenameN]);
filename參數(shù)是腳本文件名。
2.2.***部分
腳本的***部分可以包括所有用于***測試的代碼。一旦***完成,你可以使用security_warning()和security_hole()函數(shù)報告是否存在此類安全問題。這兩個函數(shù)的用途基本相同,security_warning()用于***成功,但是問題不大的情況。它們的原型如下:
security_warning(〈port〉 [,protocol:〈proto〉]);
security_hole(〈port〉 [,protocol:〈proto〉]);
security_warning(port:〈port〉,data:〈data〉 [,protocol:〈proto〉]);
security_hole(port:〈port〉,data:〈data〉 [,protocol:〈proto〉]);
在上面的第一種情況下,客戶程序顯示的內(nèi)容是腳本注冊時script_description()函數(shù)提供的。由于能夠支持多語言,因此非常方便。
在第二種情況下,客戶程序?qū)@示data參數(shù)的內(nèi)容。如果你需要顯示動態(tài)獲得的數(shù)據(jù),就必須使用這種形式。
2.3.CVE兼容性
CVE是麻省理工學(xué)院維護(hù)的一個數(shù)據(jù)庫,主要是對安全相關(guān)的問題提供一個一般的描述。
詳情請參考[url]http://cve.mitre.org[/url]。
Nessus和CVE完全兼容,如果你要測試一個CVE定義過的安全問題,就可以在插件腳本的描述部分調(diào)用script_cve_id()函數(shù)。其原型如下:
script_cve_id(string);
例如:
script_cve_id("CVE-1999-0991");
如果使用了這個函數(shù),Nessus客戶程序在生成報告時,會自動引用相關(guān)的CVE記錄。
2.4.示例
除了安全測試外,NASL也可以用來編寫一些用于維護(hù)的腳本。下面就是一個例子,用戶可以使用這個腳本檢查那些主機(jī)正在提供SSH服務(wù)。
#
#檢查SSH
#
if(description)
{
script_name(english:"Ensure the presence of ssh");
script_description(english:"This script makes sure that ssh is running");
script_summary(english:"connects ont remote tcp port 22");
script_category(ACT_GATHER_INFO);
script_family(english:"Admiminstration toolbox");
script_copyright(english:"This script was Writtern by Joe U.");
exit(0);
}
#
#SSH服務(wù)可能隱藏在別的端口
#因此我們需要依賴于find_service插件獲得的結(jié)果
#
port=get_kb_item("Services/ssh");
if(!port)port=22;
#首先聲明SSH沒有安裝
ok=0;
if(get_port_state(port))
{
soc=open_sock_tcp(port);
if(soc)
{
#檢查端口是否是由TCP_Wrapper封裝的。
data=recv(socket:soc,length:200);
if("SSH"〉〈data)ok=1;
}
close(soc);
}
#
#報告不提供SSH服務(wù)的主機(jī)
#
if(!ok)
{
report="SSH is not running on this host!";
security_warning(port:22,data:report);
}
3.腳本優(yōu)化
在安全測試期間,nessusd服務(wù)器將啟動200多個腳本。如果所有腳本編寫的都不好,這個測試就會浪費大量的時間。因此,你必須盡量提高腳本的效率。
3.1.只在必要時運(yùn)行
對于優(yōu)化腳本,最有效的方法是告訴nessusd服務(wù)器什么時候不要啟動它。例如,假設(shè)你的腳本需要建立到遠(yuǎn)程主機(jī)123/TCP端口的連接,如果nessusd知道這個端口已經(jīng)被關(guān)閉,就沒有必要啟動你的腳本了。script_require_ports()、script_require_keys()和script_exclude_keys()就是用來實現(xiàn)上述目的。這些腳本需要在描述部分調(diào)用:
script_require_ports(〈port1〉,〈port2〉,...)
參數(shù)中的至少一個端口開放才啟動腳本。參數(shù)可以是數(shù)字,也可以是基本信息(KB)中定義的符號,例如:"Services/www"。注意:如果端口的狀態(tài)是未知的(例如:還沒有進(jìn)行過端口掃描),這個腳本也會執(zhí)行。
script_require_keys(〈key1〉,〈key2〉,...)
只有參數(shù)中的關(guān)鍵詞在基本信息(KB)都有定義時,才執(zhí)行腳本。例如:
script_require_keys("ftp/anonymous","ftp/writeable_dir");
表示只有遠(yuǎn)程FTP主機(jī)支持匿名用戶以及存在可以寫的目錄時,才啟動當(dāng)前腳本。
script_exclude_keys(〈key1〉,〈key2〉,...)
參數(shù)表示的關(guān)鍵詞至少有一個在基本信息(KB)中有定義,才執(zhí)行當(dāng)前腳本。
3.2.充分利用其它腳本的結(jié)果
充分利用基本信息拷貝中的信息,可以使腳本更高效。例如,如果在調(diào)用open_sock_tcp()函數(shù)之前,先調(diào)用get_port_state()函數(shù),就可以避免由于目標(biāo)端口是關(guān)閉的帶來的時間上的浪費。
4.如何分享你的新腳本
如果你想讓別人分享自己的成果,在編寫測試腳本時要遵循以下原則:
你的腳本不能存在任何與用戶交互的操作
NASL安全測試腳本是在服務(wù)器端運(yùn)行的,因此用戶看不到任何的輸出信息。
一個腳本只能測試一個漏洞
如果你知道如何測試好幾個漏洞,那就為每個漏洞都編寫自己的測試腳本。
你的腳本最好歸入現(xiàn)有的種類
如果你計劃分享自己的成果,最好避免建立Joe's Power Tools這樣的新插件種類,盡量把插件劃入已有的插件種類。
查詢CVE中是否有相關(guān)漏洞的定義
如果你能夠注意腳本的兼容性,可以節(jié)省Nessus維護(hù)者的很多時間。
把成果發(fā)給Nessus維護(hù)者
Nessus的維護(hù)者就是本文的作者。如果你不象獨享自己的成果,就把它發(fā)給Nessus維護(hù)者。如果你的腳本被采用,它就會被分配一個唯一的ID。
5.結(jié)論
希望你能夠喜歡這個教程。學(xué)習(xí)這個語言不會占用你太多的時間,你需要多多練習(xí)。在使用過程中,你會發(fā)現(xiàn)NASL解釋器的一些BUGS,希望你能夠及時把這些BUGS報告給我。
附錄A.基本信息(Knowledge base)
所謂的基本信息是一些關(guān)鍵詞,里面包含其它測試插件獲得的信息。使用script_dependencies()、get_kb_item()和set_kb_item()函數(shù),可以幫助你避免沒有必要的重復(fù)測試。附錄A中將羅列出這些關(guān)鍵詞。
在基本信息(KB)中,每個項可以有幾個值。例如,遠(yuǎn)程主機(jī)運(yùn)行兩個FTP服務(wù):一個在端口21,另一個在端口2100。這樣關(guān)鍵詞Services/ftp就等于21和2100兩個端口。在這種情況下,測試腳本將執(zhí)行兩次:第一次,get_kb_item("Services/ftp")函數(shù)將返回21,第二次這個函數(shù)將返回2100。不過,這是自動進(jìn)行的,無須人工干預(yù)。對于腳本編寫者來說,相當(dāng)于每個基本信息關(guān)鍵詞只有一個值。有些關(guān)鍵詞目前沒有多大用處,好多我就沒有用過,但是有備無患。
Host/OS
定義文件:queso.nasl、nmap_wrapper.nasl
類型:字符串
含義:遠(yuǎn)程操作系統(tǒng)的類型
Host/dead
定義文件:ping_host.nasl和所有的DoS插件
類型:boolean
含義:遠(yuǎn)程主機(jī)關(guān)閉。如果這個項被設(shè)置,nessusd將終止針對這個主機(jī)的所有測試。
Services/www
定義文件:find_service.nes
類型:端口號
含義:目標(biāo)主機(jī)WEB服務(wù)器監(jiān)聽的端口號。如果沒有發(fā)現(xiàn)WEB服務(wù)器,就返回0。
Services/auth
定義文件:find_service.nes
類型:端口號
含義:identd服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/echo
定義文件:find_service.nes
類型:端口號
含義:echo服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/finger
定義文件:find_service.nes
類型:端口號
含義:finger服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/ftp
定義文件:find_service.nes
類型:端口號
含義:ftp服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/smtp
定義文件:find_service.nes
類型:端口號
含義:smtp服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/ssh
定義文件:find_service.nes
類型:端口號
含義:ssh服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/http_proxy
定義文件:find_service.nes
類型:端口號
含義:HTTP代理服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/imap
定義文件:find_service.nes
類型:端口號
含義:imap服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/pop1
定義文件:find_service.nes
類型:端口號
含義:pop1服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/pop2
定義文件:find_service.nes
類型:端口號
含義:pop2服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/pop3
定義文件:find_service.nes
類型:端口號
含義:pop3服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/nntp
定義文件:find_service.nes
類型:端口號
含義:nntp服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/linuxconf
定義文件:find_service.nes
類型:端口號
含義:linuxconf服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/swat
定義文件:find_service.nes
類型:端口號
含義:SWAT服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/wild_shell
定義文件:find_service.nes
類型:端口號
含義:shell服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/telnet
定義文件:find_service.nes
類型:端口號
含義:telnet服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/server
定義文件:find_service.nes
類型:端口號
含義:realserver服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
Services/netbus
定義文件:find_service.nes
類型:端口號
含義:NetBus服務(wù)使用的端口。如果沒有這個服務(wù),就返回0。
bind/version
定義文件:bind_version.nasl
類型:字符串
含義:遠(yuǎn)程BIND監(jiān)控程序的版本
rpc/bootparamd
定義文件:bootparamd.nasl
類型:字符串
含義:bootparam RPC服務(wù)正在運(yùn)行
Windows compatible
定義文件:ca_unicenter_file_transfer_service.nasl、ca_unicenter_transport_service.nasl、mssqlserver_detect.nasl和windows_detect.nasl
類型:boolean
含義:遠(yuǎn)程主機(jī)好象運(yùn)行一種Windows兼容操作系統(tǒng)(只有相關(guān)的端口開放才進(jìn)行這個測試)
finger/search.**@host
定義文件:cfinger_search.nasl
類型:boolean
含義:使用**進(jìn)行finger查詢能夠得到用戶列表。
finger/0@host
定義文件:finger_0.nasl
類型:boolean
含義:使用0進(jìn)行finger查詢能夠得到用戶列表
finger/.@host
定義文件:finger_dot.nasl
類型:boolean
含義:使用.進(jìn)行finger查詢能夠獲得用戶列表
finger/user@host1@host2
定義文件:finger_0.nasl
類型:boolean
含義:finger監(jiān)控程序能夠用于重定向***
www/frontpage
定義文件:frontpage.nasl
類型:boolean
含義:遠(yuǎn)程WEB服務(wù)器使用frontpage擴(kuò)展
ftp/anonymous
定義文件:ftp_anonymous.nasl
類型:boolean
含義:遠(yuǎn)程FTP服務(wù)器可以匿名登錄
ftp/root_via_cmd
定義文件:ftp_cwd_root.nasl
類型:boolean
含義:使用CWD命令可以獲得遠(yuǎn)程FTP服務(wù)器的root權(quán)限。參看CVE-1999-0082
ftp/microsoft
定義文件:ftp_overflow.nasl
類型:boolean
含義:遠(yuǎn)程主機(jī)是Micro$oft FTP服務(wù)器,不能處理太長的參數(shù)
ftp/false_ftp
定義文件:ftp_overflow.nasl
類型:boolean
含義:遠(yuǎn)程主機(jī)經(jīng)過TCP封裝,或者FTP端口開放而連接關(guān)閉。
附錄B.nasl工具
libnasl軟件包中有一個單獨的解釋器nasl,可以用于腳本的調(diào)試。更多細(xì)節(jié)可以參考man nasl。
中國.Net俱樂部轉(zhuǎn)載此文。讓我們一起進(jìn)步,共享人類技術(shù)資源。[[url]www.chinaaspx.com[/url]]
轉(zhuǎn)載于:https://blog.51cto.com/billowg/64448
總結(jié)
以上是生活随笔為你收集整理的Nessus安全测试插件编写教程(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。