隨著相關組織公布的安全漏洞接踵而來,多數企業都面臨著發現自身系統中的安全隱患重大壓力。為了滿足企業的這种需要,許多商業公司和開放源代碼組織都為發現安全漏洞的自動化做了很多努力,并最終開發出了各种各樣的安全評估工具。這些安全評估工具又稱為掃描器(scanners),其种類繁多,性能各异。本章將簡要介紹這些工具的用法及其使用場合,并就如何選取合适的掃描工具做一些探討,以幫助讀者在場永無休止的网絡戰爭中立于不敗之地
掃描器的歷史
掃描器的歷史要追溯到20世紀90年代,當時internet剛剛起步并在各大學校園中得到迅速發展,CERT也很快建立并運作起來,Gopher在万維网中仍然處于研究階段﹔在計算机安全領域,各厂商能夠解決大多數的安全問題,UNIX管理員也開始領略到黑客的狡猾了,我們今天所實踐的internet安全正處于幼儿時期,但現代安全工具的藍圖卻正在逐步繪制起來。
1992年,一名名叫Chris Klaus的計算机科學系學生在做internet安全試驗時,編寫了一种掃描工具——internet Security Scanner(ISS),該工具可以遠程探測UNIX系統的各种通用漏洞。Chris這樣寫到﹕
ISS項目使我開始對計算机安全產生了濃厚的興趣。我以前就听說過許多有關黑客和駭客入侵到NASA和大學网絡的事儿,于是我想找出這些安全問題的深層原因,以及這些人為何能夠訪問到那些我們認為很安全計算机中。我通過internet搜索這些相關的信息,包括Phrack和CERT等咨詢机构。
很多信息都是含糊其詞的,并沒有解釋入侵者為何能夠訪問這些系統。多數信息一般都是警告管理員要嚴密保護好各种口令,并及時地打上供應商提供的補丁程序,而并沒有入侵者如何探測某個网站并進憲入侵等內容。在請教了許多安全領域的專家、閱讀了CERT咨詢机构的大量文章之后,我開始在我的領域內尋找各种各樣的安全漏洞。
令我感到惊訝的是,許多机器的安全保護都做的很好,但有一個域內的机器卻有明顯的漏洞,任何人都可以通過這些漏洞入侵到這台計算机上,并進而訪問這個域內的其他計算机。——Chris Klauw(摘自ISS 1.0中的readme文件,1993年)。
ISS是internet上用來進行遠程安全評估掃描的最早的工具之一,它能能別出几十种常見的安全漏洞,并將這些漏洞做上標記以便日后解決。雖然有些人擔心該工具的強大功能可能會被用于非法目的,但多數管理員對這個工具卻很歡迎。
几年以后,Dan Farmer(以COPS聞名)和Wietse Venema(以TCP_Wrapper聞名)編寫了一個類似的工具,稱為SATAN(Security Administrator Tool for Analyzing Networks,系統管理員网絡分析工具)。SATAN本質上与ISS相同,但有一些优點﹕具有一個更加成熟的掃描引擎、基于Web的界面,并能進行分類檢查。然而与ISS不同的是,SATAN的發布引起了媒体的极大關注﹕1995年4月該產品發布時,《時代》雜志發表了一篇關于SATAN和Dan Farmer的文章,CERT還評論了該工具的能力(CA-1995-06)。許多人甚至擔心SATAN的發布會給internet帶來混亂。
事實并非像預料中的那樣混亂,只是由于几天以后人們紛紛下載SATAN而造成了网絡有點擁塞而已。
注意 奇怪的是,Farmer因為SATAN丟掉了他在SGI的工作,然而Klaus卻利用ISS創辦了一個擁有几百万資產的网絡安全公司——Internet Security Systems(ISS)。
從那時起,安全評估技術就得了不斷的發展并日趨成熟。今天,業界已經出現了十几种掃描器,每种都有其优點,也有其弱點﹔但自從ISS和SATAN問世以來,相關的基本理論和基本概念卻沒有改變多少。
掃描器的工作原理
大家可能注意到,与Windows和UNIX相關的漏洞有很多,但這些操作系統漏洞基本上可以分為兩類﹕一類是一些本地漏洞(host-level,主机級),另一類是一些遠程漏洞(remote-level,遠程級)。
對于遠程漏洞,我們可以使用多种方法來完成漏洞自動掃描的任務。例如,一种方法是使用諸如nmap的端口掃描工具識別出操作系統的類型,然后記錄下所有處理監听狀態的端口﹔這樣,用戶就會得到一系列端口(如21、25、53、80等等)和操作系統的類型(如Linux kernet2.2)。然而,這种方法也有一定的缺陷﹕雖然用戶得到了不少數据(即端口信息),但卻無法得到諸如究竟哪些服務存在安全漏洞等細節,用戶得到的只是關于自己系統的一些概要信息﹔至于如何識別那些處于監听狀態的服務,以及這些服務是否存在有漏洞,所有這些工作只能由用戶自己來完成。例如,如果通過數据得知識算机X運行的操作系統是Linux 2.2 kernet,在端口21有一個服務正處理監听狀態,我們往往難以确定這樣的系統是否會有wu-ftpd緩沖區溢出等問題﹔事實上,我們甚至連該系統上是否運行有wu-ftpd都不清楚(可能正運行有ProFTPd或glftpd等)。因此,即使掃描到了哪些端口是開放的,我們仍然需要﹕
a)識別該端口上有哪些服務正處于監听狀態。
b)識別這些服務的版本。
c)研究与該服務及其版本相關的已知漏洞
盡管這种方法對于十几台机器是可行的,但對于擁有數百台机器听中大型企業,這种方法卻几乎是不可能實現的。
更實際一點的解決方法是,在前面的端口掃描和操作系統識別的基礎上再添加某种識別監听服務類型和版本的机制。回到前面wu-ftpd緩沖區溢出的例子上,識別了服務的版本以后,我們現在可以得知。
a)服務器運行的操作系統是Linux Kernel 2.2。
b)端口21正處于監听狀態。
c)該監听服務的類型和版本號。
假定由上述過程,我們得知正在使用的服務器是wu-ftpd 2.4.2版本﹔這樣,我們的工作又進了一步,現在只需要研究wu-ftpd 2.4.2版本都有哪些漏洞就可以了。
注意 讀者需要注意端口掃描(port scanning)和漏洞掃描(vulnerability scanning)的區別。盡管多數漏洞掃描器也需要掃描開放的TCP和UDP端口,但這只是它們的一項功能。相反,盡管諸如nmap之類的端口掃描器也有某些其他功能(如操作系統識別),但一般不包含漏洞數据庫。簡言之,多數漏洞掃描器所做的工作都比端口掃描器所做的工作更進了一步。
漏洞掃描的最后一步就是研究對應版本的監听服務都有哪些漏洞。在很大程度上,這個過程与黑客的攻擊過程非常類似﹕掃描、查詢、研究、攻擊。在這個階段,我們會得知wu-ftpd 2.4.2版本的确存在著漏洞。
根据所有已知的產品漏洞(目前估計有2000到3000种之多)來建立一個完整的系統,并正确識別和跟蹤這些產品漏洞是一項相當艱巨的任務。這些漏洞數据的采集和管理也為建立這种自動化的工具帶來了极大的難度。
盡管實現的細節各不相同,但基于上述分析,我們可以推斷出多數掃描方法所共有的一些部件﹕
•漏洞數据 漏洞評估掃描器一般都具有內部的漏洞信息數据庫,以便精确地識別遠端系統的漏洞。
•掃描机制 掃描的技術關鍵在于它能正确識別出對應的服務、子系統以及漏洞。根据掃描器實現方法的不同,有些掃描器在掃描大范圍的机器時可能效率不是很高。
•報告机制 查找問題是一回事,精确地報告這些問題則完全是另一回事儿。有些產品能夠更清晰地報告掃描結果。
有的掃描器可能不太符合上述要求,但這樣例外的掃描器畢竟是少數。
注意 一种更加徹底也更加危險的方法是,找到了這些漏洞以后對這些漏洞實施攻擊。SNI在其最初的Ballista產品中試圖這樣做過。從理論上講,這肯定會找出某些診斷錯誤的漏洞(也稱為假陽性,false positives)。然而,這种方法也會帶來极大的混亂。例如,攻擊諸如BIND NXT等漏洞會破坏掉DNS服務器,如果這种攻擊成功的話,所有運行有BIND漏洞版本的DNS服務器都會被破坏掉﹗