普遍的入侵行為需要進行端口掃描,這是多數(shù)
黑客的熟練技巧。大多數(shù)的端口掃描就是讓我們能夠達到這樣的目的:
1、讓我們能夠大致判斷目標是什么操作系統(tǒng)
2、目標到底在運行些什么
服務當然,要掃描得到這些東西還是最后為了讓我們能夠知道哪些可能拿來利用,可能存在的
漏洞,對目標主機的操作系統(tǒng)類型識別,更能夠方便地讓我們?nèi)ダ貌僮飨到y(tǒng)對應的
漏洞實施攻擊。很多工具提供的掃描也可能就直接得到什么操作系統(tǒng)了,或者相對應的端口使用的是什么程序,程序是什么版本的等等。不過,這些都是由那些工具自己做了,不討論這個,我們應該去想想這些工具到底是怎么去實現(xiàn)的。
對目標主機操作系統(tǒng)識別的目的,正如Fyodor(nmap的作者)在他的
《Remote OS detection via TCP/IP Stack FingerPrinting》中講解那樣,進行主機識別有兩個主要作用,第一,很多系統(tǒng)
漏洞是同OS密切相關(guān)的,還有就是社會學(social engineering)問題,你能夠在非常了解對方的系統(tǒng)之后,冒充軟件提供商給目標發(fā)送“補丁”。按照我們上面提到的高級掃描方式,直接進行的端口掃描,能夠賦予我們繞過防火墻的能力,而且可以盡可能地隱藏
自己等等,但是,我們能夠得到的信息也是有限的,也許對是否開放一個端口并不是那么直接地感興趣,比如一個21端口,我們真正感興趣的是這個端口被用來作什么了,運行地什么版本的程序,而不是僅僅打開一個21端口就滿意了。也就是說,我們對下面得到地這個東西更感興趣(關(guān)系到IP的地方,我都用X代替了):
C:>ftp XXX.XXX.XXX.XXX
Connected to XXX.XXX.XXX.XXX.
220 XXXXX X2 WS_FTP Server 1.0.5 (1327846197)
User (XXX.XXX.XXX.XXX:(none)):
其實,這就是一種最簡單和最直接的判別方式,獲得程序版本變相地也讓我們能夠估計到目標的操作系統(tǒng)類別。我們可以對每個打開的端口進行相應的連接,通常這些
服務程序就會非常高興地顯示自己的“banner”,也就讓我們能夠直接得到他是什么版本了。甚至,我們能夠得到更好的東西:
C:>telnet XXX.XXX.XXX.XXX
Red Hat Linux release 7.1 (Seawolf)
Kernel 2.4.2-2 on an i686
login:
這讓我們對操作系統(tǒng)版本一覽無余了。正象這些只對80端口感興趣的“
黑客”一樣,通過對80端口的連接,我們也能得到足夠多的信息。
C:>telnet XXX.XXX.XXX.XXX 80
HEAD / HTTP/1.1
HTTP/1.1 200 OK
Via: 1.1 ADSL2000
Content-Length: 97
Date: Thu, 24 Jan 2002 13:46:56 GMT
Content-Type: text/html
Server: Apache/1.3.20 (Unix) PHP/4.0.6
Last-Modified: Wed, 26 Dec 2001 09:22:54 GMT
ETag: "8715f-61-3c2996ee"
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100
可以注意到:Server: Apache/1.3.20 (Unix) PHP/4.0.6,這里很明白地“貢獻”出WEB
服務器的軟件版本。
這樣直接的連接探測方式,對于這些banner開放的,簡直是太容易了,當然,負責的管理員也會屏蔽或者修改掉這些BANNER。
還有一種粗劣而且簡單的判別主機操作系統(tǒng)類型的辦法就是通過Ping,然后分析得到的TTL值,當然,稍微準確點可以同時在配合Tracert來確定主機原始的TTL值,不過,這種辦法很容易被欺騙,比如,在WINDOWS系統(tǒng)中,對注冊表的修改:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters
Key: DefaultTTL
通過對DefaultTTL的修改,比如:修改成為255,偽裝成為一臺UNIX主機,就能夠造成探測者的錯誤判斷。
對主機使用端口的分析,同樣也能夠進行操作系統(tǒng)識別,一些操作系統(tǒng)使用特殊的端口,比如:WINDOWS的137、139,WIN2K的445,而且一些
網(wǎng)絡設備比如入侵檢測系統(tǒng)、防火墻等等也都有廠商自己的端口開放。
上面的這些識別方式也是那些負責管理員能夠簡單應付的方式,這里,我們可以看看高級的主機識別
技術(shù),這些
技術(shù)主要分為兩類:主動協(xié)議識別和被動協(xié)議識別,都是利用各種操作系統(tǒng)在
網(wǎng)絡協(xié)議通訊中使用不同的協(xié)議內(nèi)容(各個廠商有自己的規(guī)定),然后對這些不同之處進行分析進行的識別。
Nmap這個強大的掃描工具在遠程主機判斷上也使用了很多
技術(shù),來實現(xiàn)更高級的主機系統(tǒng)檢測。這主要是通過主動的TCP/IP協(xié)議辨識來實現(xiàn)的,每種操作系統(tǒng)在TCP交流中總是使用一些具有特性的標志,這些標志在TCP IP
數(shù)據(jù)包的頭中表現(xiàn)出來。比如window、ACK序號、TTL等等的不同反應,通過大量的
數(shù)據(jù)分析,然后精確地判斷主機系統(tǒng)。這些系統(tǒng)的協(xié)議特性包括(這只是一小部分):
FIN識別:發(fā)送一個只有FIN標志位的TCP
數(shù)據(jù)包給一個打開的端口并等待回應。正確的RFC793行為是不響應,但有些系統(tǒng),例如 MS Windows, BSDI, CISCO, HP/UX,MVS,和IRIX 發(fā)回一個RESET。
DF位識別:許多操作系統(tǒng)在送出的一些包中設置IP的DF(不分片)位。
WINDOW大?。簷z查返回包的窗口大小。特定操作系統(tǒng)反應的窗口大小基本是常數(shù),例如,AIX 是唯一用0x3F25的),Microsoft 以及OpenBSD 與FreeBSD用的是0x402E。
ACK 序號識別:不同實現(xiàn)中ACK的值是不同的。例如,如果你送了一個FIN|PSH|URG 到一個關(guān)閉的TCP 端口。大多數(shù)實現(xiàn)會設置ACK 為你的初始序列數(shù),而Windows 和一些傻打印機會送給你序列數(shù)加1。
在之后,F(xiàn)yodor 和Ofir又分析和收集利用ICMP協(xié)議的操作系統(tǒng)特性來進行的主機系統(tǒng)判別,這種主動的識別方式都經(jīng)過了大量的分析,原理和上面的TCP/IP協(xié)議識別相同,比如:用ICMP的地址掩碼請求來探測SUN操作系統(tǒng),對于ICMP地址掩碼請求,只有少數(shù)操作系統(tǒng)會產(chǎn)生相應的應答,這些系統(tǒng)包括ULTRIX OpenVMS, Windows 95/98/98 SE/ME,
NT below SP 4, 和 SUN Solaris機器。但SUN對分片ICMP地址掩碼請求的應答同其他操作系統(tǒng)不相同,這樣就可以來識別SUN主機操作系統(tǒng)。
和主動的協(xié)議識別原理相同,Lance Spitzner在《Passive Fingerprinting》中提出了被動的協(xié)議識別,同樣用來判別主機系統(tǒng)。這種辦法主要集中考慮:
1、TTL的設置
2、WINDOW SIZE:操作系統(tǒng)設置的窗口大小
3、DF:操作系統(tǒng)是否設置分片位
4、TOS:操作系統(tǒng)設置的
服務類型
對于TTL,對于一個操作系統(tǒng)來說一般是固定的,比如LINUX Kernel 2.2.x & 2.4.x的 TTL 字段值為 64,
FreeBSD 4.1, 4.0, 3.4; Sun Solaris 2.5.1, 2.6, 2.7, 2.8;的 TTL為 255 Windows NT,Windows 2000 的為 128等,同時將配合其他需驗證的內(nèi)容,比如:LINUX的窗口值是0x7D78,Solaris2.6-2.7的窗口值有幾種0x2328,0x2238等等。我們以WIN2000為例,它的TTL為“128”,窗口大小在“17000-18000”這個范圍內(nèi),并且設置分片位,即DF為1,
而操作系統(tǒng)設置的
服務類型TOS為“0”,如果我們對接收的原始
數(shù)據(jù)分析得到這樣的結(jié)果,那么我們可以判斷這是一個WIN2000的操作系統(tǒng)。
當然被動協(xié)議識別操作系統(tǒng)也需要分析各個操作系統(tǒng)的不同反饋屬性,然后根據(jù)得到的信息同收集的屬性相比較。比如多數(shù)系統(tǒng)使用DF位設置,但是有些系統(tǒng)如SCO和OPENBSD不使用這個DF標志,這樣就可以用來識別一些沒有設置DF位的操作系統(tǒng)。被動協(xié)議識別也可以用來判斷遠程代理防火墻,因為代理防火墻重建對客戶的連接,它有它自身的特征代碼,也可以用這樣的辦法來分析。
主動協(xié)議識別和被動協(xié)議識別需要進行大量的統(tǒng)計分析,雖然比最開始介紹的那些簡單識別方法準確些,但是也并不能保證一定能夠識別得到準確的操作系統(tǒng)類型。同時這兩種方法主要區(qū)別就在于一個是主動,而一個是被動的,主動識別方式需要主動發(fā)送
數(shù)據(jù)包,因此相對于那些安全設備來說,也比較容易識別這些
數(shù)據(jù)包,同被動識別比較起來,隱蔽性稍微差些。
Reference:
1、《X - Remote ICMP Based OS Fingerprinting Techniques》
2、Phrack #57《ICMP based remote OS TCP/IP stack fingerprinting techniques》
3、Fyodor《Remote OS detection via TCP/IP Stack FingerPrinting》
4、Lance Spitzner《Passive Fingerprinting》