◆李維峰
(中國飛行試驗研究院 陜西 710089)
現代大型公司往往都有自己的內部辦公網絡,根據公司業務的規模及分布,有的辦公網絡集中于某個地區,有的則跨省跨國。使用計算機網絡的地方就必須考慮安全問題,這是計算機網絡發展多年以來大家早已達成的共識。面對公司規模龐大、主機眾多的網絡,我們怎么能夠快速檢查,找到那些存在安全隱患的主機?這是網絡管理員躲避不了的問題。目前人們對于內網安全的研究比較廣泛,總結起來大致是三個方面:(1)加強員工安全意識教育;(2)提高終端安全管理水平;(3)完善終端安全防護措施[1]。筆者認為除了正面防御之外,還應考慮檢查手段,不然無法驗證我們的防御手段是否有效。考慮到完整的滲透測試未必適用于每個公司,因此本文提出利用端口掃描進行終端合規性檢查的辦法,并舉例說明。希望以點帶面、拋磚引玉,促進網絡管理人員對內網安全的思考。
端口只是一種軟件中的抽象概念,用于區分通信信道。這與IP地址用于識別網絡上的計算機的方式類似,端口用來標識在單個計算機上使用的特定應用程序。例如,你的Web瀏覽器將默認連接到HTTP URLs中的TCP端口80。如果您指定安全的HTTPS協議,瀏覽器將默認嘗試端口443。
端口掃描是遠程測試多個端口以確定它們處于什么狀態的行為。通常我們最感興趣的狀態是open,這意味著應用程序正在偵聽并接受端口上的連接。雖然許多端口掃描程序傳統上將所有端口都集中到open或closed狀態,但我們將要使用的工具Nmap更加精細,它將端口劃分為六個狀態。這些狀態不是端口本身的固有屬性,而是描述Nmap如何看待它們。例如,來自于統一目標的網絡的Nmap掃描可能會將端口135/tcp顯示為open,而同時使用來自Internet的相同選項的掃描可能會將該端口顯示為filtered。
在真實環境中有時我們會需要從一個網絡中快速找出某個TCP端口開放的主機[2]。例如:在Microsoft IIS的漏洞曝光后,我們很想知道網絡中的這些主機上哪一臺的TCP 80端口是打開的,并且還在運行著該服務;或者,當你發現一臺被攻陷的主機上黑客留下的后門在端口31337上運行,你會希望快速掃描網絡,找到其他被攻陷的主機,等等。
要解決上面的問題,最直接的辦法就是運行下面的命令:
#nmap -Pn -p
這是一個搜索4096個IP的Web服務器(端口80打開)的具體示例:
#nmap -Pn -p80 -oG logs/pb-port80scan-%D.gnmap 216.163.128.0/20
文件名中的“%D”將替換為掃描運行的數字日期(例如,2007年9月1日為“090107”)。盡管此掃描命令有效,但做一些選項上的優化會大大減少掃描時間。
#nmap-T4-Pn-p80--max-rtt-timeout 200ms--initial-rtt-timeout 150ms --min-hostgroup 512 -oG logs/pb-port80scan-%D.gnmap 216.163.128.0/20
我們發現大部分時間都花在了反向DNS解析上。通過在上面的命令行中添加-n來禁止DNS解析,可以大大減少等待的時間。
上面的命令將grepable格式結果存儲在指定的文件中。然后,再用一個簡單的egrep命令將找到端口80打開的機器(圖1):
egrep‘[^0-9]80/open’logs/pb-port80scan-%D.gnmap

圖1用一個簡單的egrep命令將找到端口80打開的機器
egrep模式前面帶有[^0-9],以避免虛假匹配端口(例如3180)。由于我們僅掃描端口80,因此當然不可能發生,但是這在進行多端口掃描時是一種好習慣。如果只需要IP地址,則使用egrepawk'{print$2}’。
有時,故事是理解決策的最佳方法,在實際例子中我們才能更好地理解如何決定在解決方案中使用哪些命令行。例如,在一家公司里,大約有4096臺終端,公司對這些終端上能夠使用的應用程序有明確的要求,其中有一條“用戶終端不得提供web服務”,但面對數量如此龐大的終端數,網絡管理員不可能進行普查,即使逐臺進行檢查,你也無法保證之后不會有人違規。運行web服務器的主機通常會開放TCP 80端口,盡管理論上此類服務器可以偵聽任何端口,但可能性最大的還是80端口。因此,我們可以通過找到網絡中80端口開放的終端來確定那些違反公司規定的員工(圖2)。

圖2通過找到網絡中80端口開放的終端來確定違反公司規定的員工
為了優化掃描的效果,我們先對網絡延遲進行了測量,平均延遲60毫秒。考慮平均延遲影響之后,我們使用如下選項:--max-rtt-timeout 200ms--initial-rtt-timeout 150ms。然后再使用一個更加積極的時間模板-T4。
由于我們重視整個掃描的完成時間,而不是最小化返回第一批主機結果之前的時間,因此,選項--min-hostgroup 512設定每次并行掃描512臺主機。使用精確的子地址塊能夠避免出現低效的掃描子塊,就像本例中的4096臺主機如果用--min-hostgroup 500,最后就會出現96臺主機的掃描子塊。
由于一次ping需要花費的時間與單端口掃描本身消耗的時間相同,因此無須在先前的ping階段浪費時間。因此,指定了-Pn以禁用該階段。通過使用-n參數跳過反向DNS解析,可以節省大量時間。否則,在禁用ping掃描的情況下,Nmap會嘗試查找所有4096個IP。由于我們是要尋找web服務器,所以將端口設定為80。當然,這樣的設置會錯過在非標準端口(例如81或8080)上運行的所有HTTP服務器。也不會找到使用443端口的SSL服務器。你也可以把這些端口加到選項-p之后,但是即使是多加一個端口也會讓掃描時間翻倍,這大致與掃描的端口數成正比。
最后一個選項是-oG,后跟要存儲grepable結果的文件名。Gordon將目標網絡添加到命令的最后,然后按下enter鍵開始掃描。如例6所示:
例1:開始掃描
Nmap會在大約三分鐘內掃描所有4096個IP。正常輸出顯示一堆處于過濾狀態的端口。這些IP中的大多數可能不是活動主機(端口僅顯示為已過濾),因為Nmap沒有收到對其SYN探針的響應。我們使用egrep命令,從輸出文件中獲得web服務器的列表。如例7所示:
例2:egrep命令查詢開放80端口的主機
在經過所有努力之后,發現了在4096個IP中有兩臺主機的80端口開放。比起一臺主機一臺主機的排查,使用端口掃描的效率明顯更高。當然,如果出現了極端的用戶,例如:故意躲避掃描;修改web服務端口;設置本地防火墻策略等,我們目前使用的辦法效果就會大打折扣,不過有這種技術的用戶本身在公司里應該就很顯眼吧。
終端合規性檢查這個話題的范圍其實挺大,并不僅僅只有應用程序檢查這一個方面。本文以檢查終端TCP 80端口開放的終端為例,介紹了端口掃描技術在此方面的應用。當然,沒有一種技術能夠單獨解決終端合規性檢查的問題,我們還需要綜合利用其他手段,擴大檢查范圍,提高檢查效率,減輕網絡管理人員的工作負擔。