2010年3月12日 星期五

[駭客]駭客攻擊前的準備

駭客攻擊前的準備
Operation System fingerprinting
文/圖 Nicholas

「知已知彼,百戰不殆」,駭客在進行攻擊時會先對目標進行了解,藉以尋求最佳的攻擊方式,本文作者將介紹一些常見的資訊收集方式,讓讀者能有一定的了解,進而小心防範以避免遭受進一步的攻擊。


在說明OS fingerprinting前需要先了解駭客的做法與步驟,因為這個步驟是駭客進行攻擊前重要的一環。如果偵測的結果不正確,就會導致無法成功攻擊目標主機。因此,在這裡列出一般在弱點掃描時或滲透測試時會進行的幾個動作:

1. 確認主機是否「存活」。
2. 檢查主機開放的port(通訊埠)。
3. 依據開放的port定義出該主機啟用的服務有哪些。
4. 依據偵測到作業系統的banner,找出該主機作業系統類型。
5. 開始進行弱點掃描。
6. 依據偵測到的主機系統繪出網路示意圖。
7. 弱點報表會顯示被偵測主機的有哪些弱點及其嚴重性、修補方式等說明。
8. 利用弱點即可進行已知的弱點,執行攻擊。

透過上述的動作,攻擊者得以取得攻擊目標的相關資訊,才能選擇以最適合的方式進行入侵。


駭客為什麼要作OS fingerprint呢?
在做網路弱點掃描評估或滲透測試時,常會使用一些偵測掃描的工具來達到目的。不過在使用這些工具前,必須先知道目標標的物的範圍,才適合開始著手進行偵測的動作。因此,瞭解標的物主機的作業系統類型,是相當重要的。若無法正確偵測出遠端主機的作業系統版本,即無法知道該主機有哪些弱點,也就無法利用這個方式進行攻擊。弱點掃描執行前會先辨識出作業系統類型,再根據目前駭客、資安研究人員或資安廠商發現到的作業系統相關應用程式、主機提供特定服務的弱點,或者是可以利用不正確的安全組態設定,來進行攻擊。一般駭客的作法會進一步利用這些經過弱點掃描工具所掃出來的部份,找出可攻擊的進入點,接著再做提升權限的動作,取得目標主機的最高管理權限。

不過近二年來,駭客的目標已經轉移至利用已發現的應用程式或主機作業系統弱點,進行大規模散佈惡意連結至各個知名網站或有SQL injection的站台。一般使用者在毫不知情的情形下,便可能瀏覽已經遭駭客攻擊成功、並注入含有新弱點攻擊程式的惡意連結網站,該使用者此時即已經遭受攻擊,並且被植入木馬後門程式。


Fingerprint技術介紹
OS fingerprint(作業系統指紋)就是利用各種作業系統版本對於接收到的封包所產生不同回應封包內容的特性,來區分辨識作業系統的類型或版本。舉例來說,較常看到的就是利用nmap分辨不同版本的UNIX:Solaris、HPUX或AIX,還能夠辨識出不同版本的Linux Kernel或其他作業系統,像是Windows平台。常見的TCP/IP Protocol Stack Fingerprint技術大致可以分為下列幾種。


TCP FIN flag偵測

當我們送出一個TCP FIN flag封包(或是任何不包含ACK或SYN flag的封包),目的地是open port,接下來會等待封包的回應。在RFC793文件規範中,正確行為是不會對這個封包有任何的回應,但是目前很許多的作業系統,像是MS Windows、BSDI、CISCO、HP/UX、MVS與IRIX,會回傳RESET封包。值此之故,目前有許多的工具都是使用這類技術偵測對方的作業系統版本。


BOGUS flag偵測

它是利用在TCP SYN封包的TCP header中設定一個未定義的TCP "flag"。在Linux 2.0.35前的舊有版本會在回應的封包裏保留" flag ",而其它的作業系統則是在收到SYN+BOGUS封包後,將目前的連線中斷,然後再重新連線。Queso就是利用這種封包行為方式辨識作業系統。


TCP ISN Sampling

此種方式是利用系統回應連線需求時,找出ISN(initial sequence numbers)的模式。粗略可分為:傳統的64K(老式的UNIX機器)、隨機遞增(新版的Solaris、IRIX、FreeBSD、Digital UNIX與Cray,還有其他大多數作業系統)與完全隨機(Linux 2.0.*、OpenVMS、新版本的AIX等等)。

而Windows機器(與其他少數作業系統類型)則是使用「依時間遞增」的方式,ISN會在每個時間週期中固定遞增,不過這個方式與古老的64K模式一樣很容易導致偵測失敗。最好的偵測技術是使用「常數」,利用固定的ISN,才能準確偵測出作業系統類型,例如3Com集線器(使用0x083值)和Apple LaserWrite印表機(使用0xC7001值)都是使用固定的ISN值。


Don't Fragment bit

許多作業系統開始在傳送的部份封包裡設定"Don't Fragment"位元來偵測作業系統。但這個技術無法偵測Solaris機器,也就是說並非所有的作業系統皆能有相同的結果。不過,可以利用這個位元,我們還是可以收集更多關於目標作業系統類型的資訊。


TCP Initial Window

這個技術是利用檢查回傳的封包中設定的Window size判定作業系統。在某些舊掃描工具中,會使用RST回應的non-zero Windows size,來判別作業系統為BSD 4.4。但較新的掃描工具 - 例如queso與nmap則會持續追蹤確切的Windows size。事實上,在不同的作業系統會產生不同的值,基本上只有Windows size值是固定的。從這些測試中可以得到相當多的資訊,像是部份作業系統可以單獨只從Windows size辨識出來,舉例來說,AIX就是唯一使用0x3F25(此為十六進位表示法,十進位值161658)的作業系統,但像是微軟的Widnows使用0x402E(此為十六進位表示法,十進位值16430),它與OpenBSD和FreeBSD所用的Windows size就完全一樣。


ACK Value

透過偵測不同的狀況會有不同的ACK欄位回應值,以此作為標準。例如,當我們送出FIN|PSH|URG的封包結束目前的TCP port連線時,在大部分的情形下會將TCP ACK的設定值設定為與你的ISN值相同。但Windows和某些印表機則會傳送ISN+1的值。因此當傳送SYN|FIN|URG|PSH去開啟通訊埠時,對Windows平台而言回傳的值並是不固定的。不過這個論點在Windows平台上並不一致:有時會傳回你的seq number,但有時候則會回傳給你seq +1的值。甚至有時候回應的是隨機數值。對於微軟這麼善變的程式碼,比較難在這裏得到一個可以遵循的規則,得到相對應的作業系統版本。


ICMP Error Message Quenching

部份作業系統會遵循RFC 1812文件的建議,限制不同的錯誤訊息的回傳比率。例如在Linux核心作業系統上 - 也就是在 /usr/src/kernels/”kernel-version”/include/net/icmp.h裡,限制4秒內只能有80個目的地無法抵達的訊息產生。當超過上限時就會停止1/4秒。所以你就可以透過下列方式測試:利用傳送許多封包到random high UDP port,並且計算無法抵達目的主機的回應封包,利用這種每個作業系統皆有不同的回傳比率規則,來辨識作業系統版本。


ICMP Message Quoting

在RFC 1122文件規範了ICMP的錯誤訊息需包含幾個ICMP錯誤訊息造成的原因。對於一個無法到達通訊埠的訊息,大部分的作業系統都只會傳回必要的IP header+8位元組。但是Solaris與Linux則會傳回更多的訊息。NMAP即是利用這個方式來辨識Solaris與Linux作業系統版本。


ICMP Error message echoing integrity

在傳送封包給目的主機時,主機必須回傳部份的原始訊息和通訊埠無法到達的錯誤訊息,但有些主機會在開始處理回應時,利用傳送的封包header作為' scratch space ',因此會接收到已經被修改過的回應封包。例如AIX和BSDI回傳IP total length欄位的大小會高於20個位元組。而有些像是BSDI、FreeBSD、 OpenBSD、ULTRIX和VAXen這些作業系統,則會欺騙傳送IP ID的欄位。因此當checksum值因TTL的變化而改變時,有些主機(AIX、FreeBSD等)會傳回不一致或0 checksum值。 相同的狀況也會發生在UDP的checksum值。NMAP即是利用ICMP九種不同的測試來找出不同作業系統間的差異做為辯識的方式之一。


Type of Service

從ICMP port unreachable messages訊息中觀察回傳的封包中的Type of Service (TOS) 值。在這個錯誤訊息中,幾乎所有的作業系統都是使用0,但在Linux作業系統上的TOS值則會使用0xC0,若它的值改成0,我們就可以以此為依據認為它是較舊的作業系統版本,依此辨識新舊版本的不同。


Fragmentation Handling

這個技術主要是利用自不同的作業系統中,對於處理IP fragments的overlapping的不同作法,來辨識作業系統版本。例如,有些作業系統會在發生IP fragments的overlapping的情形下,用新封包將舊封包覆蓋掉,而有些則是會將新封包丟棄,但保留舊的封包。有很多不同的偵測方式可以知曉如何重組封包,詳細資訊可以參考 http://en.wikipedia.org/wiki/IP_fragmentation_attacks#IP_fragment_overlapped 網站資料。


SYN Flood Resistance

在傳送了過多偽造的SYN封包到遠端主機作業系統上時,它會停止接受新的連線。偽造封包會讓作業系統的kernel持續耗費許多效能在執行重新連線上,因此有許多作業系統在同一時間只能處理八個封包。新版本的Linux kernel作業系統則使用了不同的方式處理此類問題。例如使用SYN cookies方式,阻止大量的連線造成嚴重的效能問題。就因為不同的作業系統在處理過多的TCP SYN封包時,方式皆有所不同,所以我們才可以利用這個模式辯識作業系統版本。

上述各種技術都有工具可以「製造」或摸擬出相對應的封包 - 不過這些工具大部分只能在Linux或FreeBSD平台上使用,由於這些工具存在攻擊性意圖,為避免有心人濫用或不當使用來攻擊他人主機,此處不提供這類工具的介紹。若你需要驗證產生出來的封包是否正確,筆者推薦使用wireshark (http://www.wireshark.org - for Windows平台)或tcpdump(http://www.tcpdump.org,for UNIX或Linux平台)工具程式,錄下封包內容、執行封包比對。


OS fingerprinting的兩種類型
fingerprinting以是否有直接受測端主機直接接觸為分類而分成Active Stack fingerprinting與Passive fingerprinting兩種類型:


Active Stack fingerprinting

主要利用傳送偽造或異常的封包給遠端主機,分析遠端主機所回應的封包內容。一般常見的方式是利用傳送不同類型的假造TCP封包給受測的遠端主機,並從該遠端主機不同的回應封包中,透過分析工具辨識出特定的作業系統類型。好處是能夠大量處理,並快速偵測出遠端主機的作業系統型態,缺點是很容易讓遠端主機管理者發現我們在嘗試偵測或攻擊,積極的系統管理者會及早防範阻擋該行為。常見的Active fingerprinting工具如下:

.Xprobe2 (http://www.darknet.org.uk/2008/05/xprobe2-active-os-fingerprinting-tool/)
.SinFP (http://www.darknet.org.uk/2006/05/sinfp-next-generation-os-detection-tool/)
.nmap http://nmap.org/
nmap指令如範例1。

範例1



Passive fingerprinting

不會直接對遠端主機做偵測的動作,可以避免被察覺。以其它方式連線至遠端主機,透過特定工具分析回應的封包。主要是利用遠端主機與Internet連線的特性,利用連線的封包分析該主機的作業系統類型。或者利用網路上的資訊,得到你想知道的主機訊息。例如http://www.netcraft.com/就能提供網站資訊的查詢,資訊包括有:主機作業系統類型、使用的Web伺服器版本以及IP等資訊。常見的Passive fingerprinting 工具:

.P0f (http://secure2s.net/en/os-detectors/p0f/84/)
.httprint (http://www.net-square.com/httprint/httprint_paper.html)
.Miart HTTP header (http://www.aboutlyrics.com/Software/Download/Miart-HTTP-Header-Tool.php)
除了上述提供的工具以外,網路上還有很多網站可以查詢到目標主機的OS版本,例如可以透過http://www.netcraft.com/網站查詢而得知。


nmap網站資訊,包含IP、OS、Web Server version等。



google網站資訊。



對於作業系統偵測的防禦
對於駭客利用類似NMAP(http://nmap.org)這類型的工具做攻擊前偵測動作時,都可以利用IPS(Intrusion prevention system)設備進行阻擋,大部分的IPS設備皆有提供關於OS dectation的特徵碼進行偵測甚至進行阻擋動作。舉例來說,常見的Snort IDS(http://www.snort.org/,亦提供inline mode建置方式)也有提供免費的rules,供有需要的使用者下載並套用。



【原文刊載於RUN!PC雜誌:2009年11月號】
  文章來源網址:http://www.runpc.com.tw/content/main_content.aspx?mgo=190&fid=G02

相關文章 :

0 意見: