目錄
2.2.4 使用Nmap進行操作系統探測..
一般性探測
指定網絡掃描類型.
設置掃描條件
推測結果.
2.2.5 使用Xprobe2進行操作系統探測
2.2.6 使用p0f進行操作系統探測
2.2.7 使用miranda進行操作系統探測
小結
2.2 操作系統指紋識別
識別目標主機的操作系統,首先,可以幫助我們進一步探測操作系統級別的漏洞從而可以從這一級別進行滲透測試。其次,操作系統和建築在本系統之上的應用一般是成套出現的,例如LAMP或者LNMP。操作系統的版本也有助於我們准確定位服務程序或者軟件的版本,比如windows server 2003 搭載的IIS為6.0,windows server 2008 R2 搭載的是IIS7.5。
操作系統指紋識別技術多種多樣,這里我簡要介紹我所知道的幾種常用技術,不會具體深入到細節中,若您感興趣可自己查閱資料。
2.2.1 Banner抓取
Banner抓取是最基礎、最簡單的指紋識別技術,而且在不需要其他專門的工具的情況下就可以做。操作簡單,通常獲取的信息也相對准確。
嚴格的講,banner抓取是應用程序指紋識別而不是操作系統指紋識別。Banner信息並不是操作系統本身的行為,是由應用程序自動返回的,比如apathe、exchange。而且很多時候並不會直接返回操作系統信息,幸運的話,可能會看到服務程序本身的版本信息,並以此進行推斷。
凡事皆有利弊,越是簡單的方法越容易被防御,這種方法奏效的成功率也越來越低了。
先來看一個直接Banner抓取的例子。
在上圖中,直接telnet 80端口,在返回的服務器banner信息中,看到“Server: Microsoft-HTTPAPI/2.0”的字樣。
在IIS中使用ISAPI擴展后,經常會看到這樣的Banner。下表可以幫助我們識別操作系統:
Server Header Value |
Windows Server Version |
Microsoft-HTTPAPI/2.0 |
Windows 2003 Sp2, Windows 7, Windows 2008, Windows 2008 R2 |
Microsoft-HTTPAPI/1.0 |
Windows 2003 |
如果沒有ISAPI攔截,我們可能會看到如下圖的信息,
准確的IIS版本,會幫助我們更准確的判斷操作系統,可以參考下表:
IIS Version |
Windows Server Version |
IIS 5.0 |
Windows 2000 |
IIS 5.1 |
Windows XP |
IIS 6.0 |
Windows 2003 |
IIS 7.0 |
Windows 2008, Windows Vista |
IIS 7.5 |
Windows 2008 R2, Windows 7 |
對於asp.net站點,通常會看到“X-Powered-By”字樣,會指示.net 版本,但是這對判斷操作系統版本幫助不大。
其他web服務器如apache、nginx,除非直接輸出操作系統版本,否則根據服務程序版本無法推斷操作系統版本。配置不當的服務可能會輸出如下信息:
HTTP/1.1 200 OK
Date: Mon, 16 Jun 2003 02:53:29 GMT
Server: Apache/1.3.3 (Unix) (Red Hat/Linux)
Last-Modified: Wed, 07 Oct 1998 11:18:14 GMT
ETag: "1813-49b-361b4df6"
Accept-Ranges: bytes
Content-Length: 1179
Connection: close
Content-Type: text/html
有經驗的管理員都會修改banner或者禁止輸出banner信息,比如下面的測試:
我們可以看到圖中目標站點並未輸出任何banner信息。
除了web服務器程序,很多ftp、smtp服務也會返回banner信息。在2.3節《服務程序指紋識別》一節中,還會講解Banner抓取,本節就簡要介紹到這里。
2.2.2 TCP 和 ICMP 常規指紋識別技術
正常而言,操作系統對TCP/IP的實現,都是嚴格遵從RFC文檔的,因為必須遵從相同的協議才能實現網絡通信。但是在具體實現上還是有略微的差別,這些差別是在協議規范之內所允許的,大多數操作系統指紋識別工具都是基於這些細小的差別進行探測分析的。
如果您不熟悉TCP/IP協議,那么可以查詢資料或者跳過這一部分,不影響對工具的使用。
為了節省篇幅,不影響實踐學習,我只是簡單列出使用的技術,並未深入。
TCP數據報格式
tcp 頭
中間的標志位(flags)就是用於協議的一些機制的實現的比特位大家可以看到有6比特,它們依次如下:
URG、ACK、PSH、RST、SYN、FIN。
URG表示緊急指針字段有效;
ACK置位表示確認號字段有效;
PSH表示當前報文需要請求推(push)操作;
RST置位表示復位TCP連接;
SYN用於建立TCP連接時同步序號;
FIN用於釋放TCP連接時標識發送方比特流結束。
源端口(Sequence Number)和目的端口:各為16比特,用於表示應用層的連接。源端口表示產生數據包的應用層進程,而目的端口則表示數據包所要到達的目的進程。
序列號:為32比特,表示數據流中的字節數。序列號為首字節在整個數據流中的位置。初始序列號隨機產生,並在連接建立階段予以同步。
確認號:表示序號為確認號減去1的數據包及其以前的所有數據包已經正確接收,也就是說他相當於下一個准備接收的字節的序號。
頭部信息:4比特,用於指示數據起始位置。由於TCP包頭中可選項的長度可變,因此整個包頭的長度不固定。如果沒有附加字段,則TCP數據包基本長度為20字節。
窗口:16位,表示源端主機在請求接收端等待確認之前需要接收的字節數。它用於流量控制,窗口大小根據網絡擁塞情況和資源可用性進行增減。
校驗位:16位。用於檢查TCP數據包頭和數據的一致性。
緊急指針:16位。當URG碼有效時只向緊急數據字節。
可選項:存在時表示TCP包頭后還有另外的4字節數據。TCP常用的選項為最大數據包(並非整個TCP報文)MSS。每一個TCP段都包含一個固定的20字節的段頭。TCP段頭由20字節固定頭和一些可選項組成。實際數據部分最多可以有65495(65535-20-20=65495)字節。
ICMP首部格式
icmp首部
對於上圖中的Data部分,不同的ICMP類型,會拆分成不同的格式,這里就不一一介紹了。
TTL與TCP窗口大小
下表是幾個典型的操作系統的TTL和TCP窗口的大小數值。
Operating System |
Time To Live |
TCP Window Size |
Linux (Kernel 2.4 and 2.6) |
64 |
5840 |
Google Linux |
64 |
5720 |
FreeBSD |
64 |
65535 |
Windows XP |
128 |
65535 |
Windows Vista and 7 (Server 2008) |
128 |
8192 |
iOS 12.4 (Cisco Routers) |
255 |
4128 |
產生上表中數據差別的主要原因在於RFC文檔對於TTL和滑動窗口大小並沒有明確的規定。另外需要注意的是,TTL即時在同一系統下,也總是變化的,因為路由設備會修改它的值。
基於TTL與TCP窗口大小的操作系統探測需要監聽網絡,抓取數據包進行分析,這種方法通常被稱之為被動分析。
FIN探測
在RFC793中規定FIN數據包被接收后,主機不發送響應信息。但是很多系統由於之前的固有實現,可能會發送一個RESET響應。比如MS Windows, BSDI, CISCO, HP/UX, MVS, 和IRIX。
BOGUS flag 探測
發送一個帶有未定義FLAG的 TCP SYN數據包,不同的操作系統會有不同的響應。比如Linux 2.0.35之前的系統會在響應包中報告未定義的FLAG。
TCP ISN 抽樣
TCP連接的初始序列號(ISN),是一個隨機值,但是不同的操作系統的隨機方式不一樣,還有的操作系統每次的ISN都是相同的。針對ISN做多次抽樣然后比對規律可以識別操作系統類型。
IPID 抽樣
IP標識是用來分組數據包分片的標志位,和ISN一樣,不同的操作系統初始化和增長該標識值的方式也不一樣。
TCP Timestamp
有的操作系統不支持該特性,有的操作系統以不同的更新頻率來更新時間戳,還有的操作系統返回0。
ACK值
在不同場景下,不同的請求,操作系統對ACK的值處理方式也不一樣。比如對一個關閉的端口發送數據包,有的操作系統ACK+1,有的系統則不變。
ICMP錯誤信息
ICMP錯誤信息是操作系統指紋識別的最重要手段之一,因為ICMP本身具有多個類型,而錯誤信息又是每個操作系統在小范圍內可以自定義的。
DHCP
DHCP本身在RFC歷史上經歷了1541、2131、2132、4361、4388、4578多個版本,使得應用DHCP進行操作系統識別成為可能。
2.2.3 數據包重傳延時技術
之所以把數據包延時重傳技術單獨拿出來,是因為相對於上面說的技術,它屬於新技術,目前大多數系統都沒有針對該方法做有效的防御。但是基於該技術的工具也不是很成熟,這里希望引起讀者的重視或者激發你對該技術的熱情。
對於在2.2.2節中介紹的技術,很大程度上受到網絡環境、防火牆、入侵檢測系統的影響。那么數據包重傳延時技術能解決這些問題嗎?
由於數據包丟失,或者網絡阻塞,TCP數據包重傳屬於正常情況。為了識別重復的數據包,TCP協議使用相同的ISN和ACK來確定接收的數據包。
包重傳的延時由重傳定時器決定,但是確定一種合適的延時算法比較困難,這是源於以下原因:
確認信號的延遲在實際網絡環境中是可變的;
傳輸的分段或確認信號可能丟失,使得估計往返時間有誤。
TCP采用了自適應的重傳算法,以適應互連網絡中時延的變化.該算法的基本思想是通過最近的時延變化來不斷修正原有的時延樣本,RFC中並沒有明確具體如何執行。
由於不同操作系統會選擇采用自己的重傳延遲算法,這就造成了通過分析各系統重發包的延遲來判斷其操作系統類型的可能性,如果各操作系統的重傳延遲相互存在各異性,那么就很容易將它們彼此區分開來。
由於此種技術,采用標准的TCP數據包,一般情況下可以有效的躲過防火牆和入侵檢測系統。但是目前基於此種技術的工具還很少。
2.2.4 使用Nmap進行操作系統探測
一般性探測
使用Nmap進行操作系統識別最簡單的方法為使用-O參數,如下是我對內網掃描的幾個數據。
nmap -O 192.168.1.1/24
上面的命令表示對192.168.1.1 所在網段的C類255個ip進行操作系統版本探測。
對192.168.1.1的掃描結果(1.1是Tp-link路由器):
MAC Address: A8:15:4D:85:4A:30 (Tp-link Technologies Co.)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.23 - 2.6.38
Network Distance: 1 hop
對192.168.1.101的掃描結果(實際為android系統手機):
MAC Address: 18:DC:56:F0:65:E0 (Yulong Computer Telecommunication Scientific(shenzhen)Co.)
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=6.40%E=4%D=12/27%OT=7800%CT=1%CU=39712%PV=Y%DS=1%DC=D%G=Y%M=18DC5
OS:6%TM=52BD035E%P=x86_64-unknown-linux-gnu)SEQ(SP=100%GCD=1%ISR=109%TI=Z%C
OS:I=Z%II=I%TS=7)OPS(O1=M5B4ST11NW6%O2=M5B4ST11NW6%O3=M5B4NNT11NW6%O4=M5B4S
OS:T11NW6%O5=M5B4ST11NW6%O6=M5B4ST11)WIN(W1=7120%W2=7120%W3=7120%W4=7120%W5
OS:=7120%W6=7120)ECN(R=Y%DF=Y%T=40%W=7210%O=M5B4NNSNW6%CC=Y%Q=)T1(R=Y%DF=Y%
OS:T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=
OS:R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T
OS:=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=
OS:0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(
OS:R=Y%DFI=N%T=40%CD=S)
從上面的結果可以看出,nmap對android系統識別率不高。
對192.168.1.102的結果如下(實際系統為windows 7 sp1):
Device type: general purpose
Running: Microsoft Windows 7
OS CPE: cpe:/o:microsoft:windows_7::- cpe:/o:microsoft:windows_7::sp1
OS details: Microsoft Windows 7 SP0 - SP1
對192.168.1.106的探測結果如下(實際系統為ios 5.0):
MAC Address: CC:78:5F:82:98:68 (Apple)
Device type: media device|phone
Running: Apple iOS 4.X|5.X|6.X
OS CPE: cpe:/o:apple:iphone_os:4 cpe:/a:apple:apple_tv:4 cpe:/o:apple:iphone_os:5 cpe:/o:apple:iphone_os:6
OS details: Apple Mac OS X 10.8.0 - 10.8.3 (Mountain Lion) or iOS 4.4.2 - 6.1.3 (Darwin 11.0.0 - 12.3.0)
對192.168.1.106的探測結果如下(實際為蘋果一體機、windows7 sp1):
MAC Address: 7C:C3:A1:A7:EF:8E (Apple)
Too many fingerprints match this host to give specific OS details
對192.168.1.119的探測結果如下(實際為windows server 2008 r2,vmware虛擬機):
MAC Address: 00:0C:29:AA:75:3D (VMware)
Device type: general purpose
Running: Microsoft Windows 7|2008
OS CPE: cpe:/o:microsoft:windows_7::- cpe:/o:microsoft:windows_7::sp1 cpe:/o:microsoft:windows_server_2008::sp1 cpe:/o:microsoft:windows_8
OS details: Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, or Windows 8
Network Distance: 1 hop
對192.168.1.128探測結果如下(centOS 6.4,VMware虛擬機):
MAC Address: 00:0C:29:FE:DD:13 (VMware)
Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS details: Linux 3.0 - 3.9
指定網絡掃描類型
nmap支持以下掃描類型:
l -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon
l -sN/sF/sX: TCP Null, FIN, and Xmas
l --scanflags <flags>: Customize TCP scan flags
l -sI <zombie host[:probeport]>: Idlescan
l -sO: IP protocol scan
l -b <ftp relay host>: FTP bounce scan
比如要使用TCP SYN掃描,可以使用如下的命令:
nmap –sS -O 192.168.1.1/24
設置掃描條件
采用--osscan-limit這個選項,Nmap只對滿足“具有打開和關閉的端口”條件的主機進行操作系統檢測,這樣可以節約時間,特別在使用-P0
掃描多個主機時。這個選項僅在使用 -O
或-A
進行操作系統檢測時起作用。
如:
nmap -sS -O --osscan-limit 192.168.1.119/24
推測結果
從上面的掃描示例,我們也能看出,Nmap默認會對無法精確匹配的結果進行推測的。按官方文檔的說法,使用--osscan-guess; --fuzzy選項,會使推測結果更有效,實際測試沒有任何區別。
2.2.5 使用Xprobe2進行操作系統探測
Xprobe2是一款使用ICMP消息進行操作系統探測的軟件,探測結果可以和Nmap互為參照。但是該軟件目前公開版本為2005年的版本,對老的操作系統探測結果較為准確,新系統則無能為力了。
下面命令為xprobe2簡單用法:
xprobe2 -v www.iprezi.cn
結果如下:
2.2.6 使用p0f進行操作系統探測
p0f是一款被動探測工具,通過分析網絡數據包來判斷操作系統類型。目前最新版本為3.06b。同時p0f在網絡分析方面功能強大,可以用它來分析NAT、負載均衡、應用代理等。
p0f的命令參數很簡單,基本說明如下:
l -f fname指定指紋數據庫 (p0f.fp) 路徑,不指定則使用默認數據庫。
l -i iface 指定監聽的網卡。
l -L 監聽所有可用網絡。
l -r fname 讀取由抓包工具抓到的網絡數據包文件。
l -o fname 附加之前監聽的log文件,只有同一網卡的log文件才可以附加合並到本次監聽中來。
l -d 以后台進程方式運行p0f ;
l -u user 以指定用戶身份運行程序,工作目錄會切換到到當前用戶根目錄下;
l -p 設置 –i參數指定的網卡為混雜模式;
l -S num 設置API並發數,默認為20,上限為100;
l -m c,h 設置最大網絡連接數和同時追蹤的主機數 (默認值: c = 1,000, h = 10,000).
l -t c,h 設置連接超時時間
下面使用如下命令進行測試:
p0f -i eth0 –p
上面命令的含義為監聽網卡eth0,並開啟混雜模式。這樣會監聽到每一個網絡連接,部分結果摘錄如下:
p0f監聽結果1
p0f監聽結果2
在p0f監聽結果2圖中,檢測的結果我windows7或8,對比下nmap的結果為windows7,實際該機器系統為 windows7 sp1。
nmap檢測結果
p0f監聽結果3
在p0f監聽結果3圖中,捕獲的數據是瀏覽器發送的請求數據,我們可以看到瀏覽器請求信息中“Windows NT 6.1; WOW64; Trident/7.0; rv:11.0”的字樣,從這段UserAgent中,可以看出發出請求的系統為windows7 64位,IE11。
2.2.7 使用miranda進行操作系統探測
miranda工具是一個通過UPNP功能來探測主機信息的工具,並不限於探測操作系統。下面我們通過一個實例,演示如何使用miranda。
在終端輸入如下命令:
miranda -v -i eth0
上面的命令是指定打開網卡eth0,返回結果如下:
miranda提示輸入開啟upnp的主機,現在我們不知道哪台主機開啟了upnp,輸入命令“msearch”,會自動搜索upnp主機,
接着我們會看到掃描到的upnp主機:
按 CTRL +C終止掃描,輸入host list。
可以看到搜集的主機列表,然后使用host get [index]命令可以查看該主機的upnp設備列表。
使用host info [index]查看主機詳細信息。
從上圖信息可以看到,這是一台TP-Link路由器。同樣的方法,查看一台windows 7主機。
小結
本節大致羅列了操作系統識別的常用技術和典型工具。因為本書是實踐性質的,所以沒有對指紋識別技術做深入的講解。
基於數據包延時重傳技術的工具,筆者只知道RING和Cron-OS,但是這兩款工具沒有集成到Kali Linux 中,同時也很久沒有更新,故沒有做介紹。
2.3節--《服務程序指紋識別》。
更多相關文章 www.xuanhun521.com,原文鏈接
ps:對此文章或者安全、安全編程感興趣的讀者,可以加qq群:Hacking:303242737;Hacking-2群:147098303;Hacking-3群:31371755;hacking-4群:201891680;Hacking-5群:316885176