引言
Http指紋識別現在已經成為應用程序安全中一個新興的話題,Http服務器和Http應用程序安全也已經成為網絡安全中的重要一部分。從網絡管理的立場來看,保持對各種web服務器的監視和追蹤使得Http指紋識別變的唾手可得,Http指紋識別可以使得信息系統和安全策略變的自動化,在基于已經設置了審核策略的特殊的平臺或是特殊的web服務器上,安全測試工具可以使用Http指紋識別來減少測試所需要的配置。本文將介紹現有的Http指紋識別技術,同時也將討論所遇到的一些問題并且拿出可行的解決方案。
一 指紋識別理論
指紋的定義是這樣的:1是指任何表面上的指尖印象或者是在指尖上蘸上墨水而在紙上留下的的墨水印象;2是指可以用來識別的東西: 如特色、痕跡或特性等揭露起源的東西,表示物體或物質的特色的證據。指紋識別可以分為兩步,一是對指紋進行收集和分類; 二是將未知的指紋同被儲存在數據庫中的指紋進行比較,從而找出最符合的。當采集指紋的時候,對物體的所有主要特性的抓取是必要的。 采集較多的細節,可以對第二步產生很大的幫助。當比較指紋的時候,很有可能有幾個指紋是被不合適的匹配的,因為可指紋之間微小的差別很容易使識別產生錯誤,這也要求指紋識別需要很高的技術。指紋識別技術現在已經是網絡安全的已知技術。操作系統指紋識別在任何的網絡評估中是一件通常的工作,現在也有很多操作系統指紋識別技術。操作系統指紋識別為什么能成功?那是因為每個操作系統實現TCP/IP協議時有微小的差別,當前比較流行的是利用TCP/IP堆棧進行后操作系統識別,相關工具比如Nmap;還有的是利用ICMP進行操作系統識別,代表工具如Xprobe。Http指紋識別的原理大致上也是相同的:記錄不同服務器對Http協議執行中的微小差別進行識別。Http指紋識別比TCP/IP堆棧指紋識別復雜許多,理由是定制Http服務器的配置文件、增加插件或組件使得更改Http的響應信息變的很容易,這樣使得識別變的困難;然而定制TCP/IP堆棧的行為需要對核心層進行修改,所以就容易識別。
二 Banner獲取
查看Http應答頭信息是Http指紋識別中最簡單也是最基礎的,我們可以通過一個Tcp客戶端比如netcat來實現,一般我們用的比較多的是telnet到80端口,然后發送命令來得到響應信息,這里我們以netcat來做例子,以下是三個不同Http服務器的響應信息:
1:Apache 1.3.23 server:
Http/1.1 200 OK
Date: Mon, 08 Sep 2003 17:10:49 GMT
Server: Apache/1.3.23
Last-Modified: Mon, 08 Sep 2003 03:48:19 GMT
ETag: “32417-c4-3e5d8a83”
Accept-Ranges: bytes
Content-Length: 196
Connection: close
Content-Type: text/html
2:Microsoft IIS 5.0 server:
Http/1。1 200 OK
Server: Microsoft-IIS/5.0
Expires: Mon, 08 Sep 2003 01:41:33 GMT
Date: Mon, 08 Sep 2003 16:41:33 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 08 Sep 2003 15:32:21 GMT
ETag: “b0aac0542e25c31:89d”
Content-Length: 7369
3:Netscape Enterprise 4.1 server:
Http/1.1 200 OK
Server: Netscape-Enterprise/4。1
Date: Mon, 08 Sep 2003 16:19:04 GMT
Content-type: text/html
Last-modified: Mon, 08 Sep 2002 15:37:56 GMT
Content-length: 57
Accept-ranges: bytes
Connection: close
三 模糊服務器Banner信息
在很多情況下,獲取Banner被證明是一種很好的Http指紋識別方法。但是,網絡管理員會選擇通過配置或者是增加插件來更改或者是模糊服務器的Banner信息。當然,這樣的設置確實是自動的阻止了很多對Http服務器的攻擊。要讓服務器返回不同的Banner信息的設置是很簡單的,象Apache這樣的開放源代碼的Http服務器,用戶可以在源代碼里修改Banner信息,然后重起Http服務就生效了;對于沒有公開源代碼的Http服務器比如微軟的IIS或者是Netscape,可以在存放Banner信息的Dll文件中修改,相關的文章有討論的,這里不再贅述,當然這樣的修改的效果還是不錯的。另一種模糊Banner信息的方法是使用插件,這些插件可以提供自定義的Http應答信息。比如ServerMask這個商業軟件就可以提供這樣的功能,它是IIS服務器的一個插件,ServerMask不僅模糊了Banner信息,而且會對Http應答頭信息里的項的序列進行重新組合,從而來模仿Apache這樣的服務器,它甚至有能力扮演成任何一個Http服務器來處理每一個請求。這個軟件可以在以下地址找到:
Http://www.port80software.com/products/servermask
下面就是一個被自定義Banner信息的Http服務器的例子,Apache服務器被自定義成了未知服務器:
Http/1.1 403 Forbidden
Date: Mon, 08 Sep 2003 02:41:27 GMT
Server: Unknown-Webserver/1.0
Connection: close
Content-Type: text/html; charset=iso-8859-1
下面是一個使用了ServerMask插件的IIS服務器的例子:
Http/1.1 200 OK
Server: Yes we are using ServerMask
Date: Mon, 08 Sep 2003 02:54:17 GMT
Connection: Keep-Alive
Content-Length: 18273
Content-Type: text/html
Set-Cookie: It works on cookies
too=82.3S3.O12.NT2R0RE,4147ON3P,.4OO.; path=/
Cache-control: private
從上面的例子我們可以看到,僅僅從Banner信息來判斷Http服務器類型是遠遠不夠的。
四 協議行為
在執行Http協議時,幾乎所有的Http服務器都具有它們獨特的方法,如果Http請求是合法并且規則的,Http服務器返回的應答信息是符合RFC里的描述的。但是如果我們發送畸形的Http請求,這些服務器的響應信息就不同了,不同服務器對Http協議行為表現的不同就是Http指紋識別技術的基本根據和原理。大家還是喜歡看例子,那就讓我們來舉幾個不同的例子吧,我們將分析3種不同Http服務對不同請求所返回的響應信息,這些請求是這樣的:
1:HEAD / Http/1.0 發送基本的Http請求
2:DELETE / Http/1.0 發送那些不被允許的請求,比如Delete請求
3:GET / Http/3.0 發送一個非法版本的Http協議請求
4:GET / JUNK/1.0 發送一個不正確規格的Http協議請求
Exp1:基本的Http請求
我們先發送請求HEAD / Http/1.0,然后分析Http響應頭里的信息,對頭信息里項的排序進行分析。發送的請求命令如下:
C:>nc apache.example.com 80 //回車,下同
HEAD / Http/1.0 //輸入后回車,下同
響應信息:
1:Apache 1.3.23
Http/1.1 200 OK
Date: Mon, 08 Sep 17:10:49 GMT
Server: Apache/1.3.23
Last-Modified: Thu, 27 Feb 2003 03:48:19 GMT
ETag: “32417-c4-3e5d8a83”
Accept-Ranges: bytes
Content-Length: 196
Connection: close
Content-Type: text/html
2:IIS 5.0
Http/1.1 200 OK
Server: Microsoft-IIS/5.0
Content-Location: Http://iis。example。com/Default。htm
Date: Mon, 08 Sep 20:13:52 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 08 Sep 2003 10:10:50 GMT
ETag: W/“e0d362a4c335be1:ae1”
Content-Length: 133
3:Netscape Enterprise 4.1
Http/1.1 200 OK
Server: Netscape-Enterprise/4.1
Date: Mon, 08 Sep 2003 06:01:40 GMT
Content-type: text/html
Last-modified: Mon, 08 Sep 2003 01:37:56 GMT
Content-length: 57
Accept-ranges: bytes
Connection: close
比較結果: Apache頭信息里的Server和Date項的排序是不同的。
Exp2:Http DELETE請求
這次,我們將發送DELETE / Http/1.0請求,我們將分析不同Http服務器對非法請求的應答信息的不同。發送的請求命令:
C:>nc apache。example。com 80
DELETE / Http/1.0
響應信息:
1:Apache 1.3.23
Http/1.1 405 Method Not Allowed
Date: Mon, 08 Sep 2003 17:11:37 GMT
Server: Apache/1.3.23
Allow: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS,
PATCH, PROPFIND, PROPPATCH,
MKCOL, COPY, MOVE, LOCK, UNLOCK, TRACE
Connection: close
Content-Type: text/html; charset=iso-8859-1
2:IIS 5.0
Http/1.1 403 Forbidden
Server: Microsoft-IIS/5.0
Date: Mon, 08 Sep 2003 20:13:57 GMT
Content-Type: text/html
Content-Length: 3184
3:Netscape Enterprise 4.1
Http/1.1 401 Unauthorized
Server: Netscape-Enterprise/4.1
Date: Mon, 08 Sep 2003 06:03:18 GMT
WWW-authenticate: Basic realm=“WebServer Server”
Content-type: text/html
Connection: close
比較結果: Apache響應的是"405 Method Not Allowed",IIS響應的是"403 Forbidden",Netscape響應的是 “401 Unauthorized”,發現對Delete請求,響應的信息是完全不同的。
Exp3:非法Http協議版本請求
這次我們將發送非法的Http協議版本請求,比如GET / Http/3。0請求,事實上Http 3.0是不存在的,發送請求命令:
C:>nc apache。example。com 80
GET / Http/3.0
響應信息:
1:Apache 1.3.23
Http/1.1 400 Bad Request
Date: Mon, 08 Sep 2003 17:12:37 GMT
Server: Apache/1.3.23
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
2:IIS 5.0
Http/1.1 200 OK
Server: Microsoft-IIS/5。0
Content-Location: Http://iis。example。com/Default。htm
Date: Mon, 08 Sep 2003 20:14:02 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 08 Sep 2003 20:14:02 GMT
ETag: W/“e0d362a4c335be1:ae1”
Content-Length: 133
3:Netscape Enterprise 4.1
Http/1.1 505 Http Version Not Supported
Server: Netscape-Enterprise/4.1
Date: Mon, 08 Sep 2003 06:04:04 GMT
Content-length: 140
Content-type: text/html
Connection: close
比較結果:Apache響應的是"400 Bad Request",IIS忽略了這個請求,響應信息是OK, 還返回了網站根目錄的HTML數據信息,Netscape響應的是"505 Http Version Not Supported"。
Exp4: 不正確規則協議請求
這次測試主要是對GET / JUNK/1.0. 請求的響應,發送請求命令:
C:>nc apache.example.com 80
GET / JUNK/1.0
響應信息:
1:Apache 1.3.23
Http/1.1 200 OK
Date: Sun, 15 Jun 2003 17:17:47 GMT
Server: Apache/1.3.23
Last-Modified: Thu, 27 Feb 2003 03:48:19 GMT
ETag: “32417-c4-3e5d8a83”
Accept-Ranges: bytes
Content-Length: 196
Connection: close
Content-Type: text/html
2:IIS 5.0
Http/1。1 400 Bad Request
Server: Microsoft-IIS/5.0
Date: Fri, 01 Jan 1999 20:14:34 GMT
Content-Type: text/html
Content-Length: 87
3:Netscape Enterprise 4.1
Bad request
Your browser sent a query this server could not understand。比較結果:在這里,Apache忽視了不規則的協議"JUNK",還返回了200 “OK” 和根目錄的一些信息,IIS響應的是"400 Bad Request",Netscape幾乎沒有返回Http頭信息,相反的卻返回了HTML格式的信息來表明這是個錯誤請求。
測試小結:我們下面列了一個表,我們可以很簡單的辨別不同的Http服務器。
服務器 頭信息項排序 Delete請求 非法版本 不規則協議
Apache/1.3.23 Date, Server 405 400 200
MS-IIS/5.0 Server, Date 403 200 400
Netscape4.1 Server, Date 401 505 no header
五 指紋識別工具
這里我們將介紹一個Http指紋識別工具Httprint,它通過運用統計學原理,組合模糊的邏輯學技術,能很有效的確定Http服務器的類型。它可以被用來收集和分析不同Http服務器產生的簽名,什么是Http簽名呢?Http簽名通過16進制轉為ASCII碼如下:
Microsoft-IIS/5.0
CD2698FD6ED3C295E4B1653082C10D64811C9DC594DF1BD04276E4BB811C9DC5
0D7645B5811C9DC52A200B4C9D69031D6014C217811C9DC5811C9DC52655F350
FCCC535BE2CE6923E2CE6923F2454256E2CE69272576B769E2CE6926CD2698FD
6ED3C295E2CE692009DB9B3E6ED3C2956ED3C2956ED3C2956ED3C295E2CE6923
6ED3C295
Apache/1.3.x
9E431BC86ED3C295811C9DC5811C9DC5050C5D32505FCFE84276E4BB630A04DB
0D7645B5970EE6BB811C9DC5CD37187C11DDC7D78398721EB06FE5D78A91CF57
FCCC535B6ED3C295FCCC535B811C9DC5E2CE69272576B769E2CE69269E431BC8
6ED3C295E2CE69262A200B4C811C9DC5811C9DC5811C9DC5811C9DC5811C9DC5
811C9DC5
Httprint先把一些Http簽名信息保存在一個文檔里,然后分析那些由Http服務器產生的結果。當我們發現那些沒有例在數據庫中的簽名信息時,我們可以利用Httprint產生的報告來擴展這個簽名數據庫,而當Httprint下一次運行時,這些新加的簽名信息也就可以使用了。Httprint可以圖形界面運行和命令行下運行,可以運行在Windows、Linux和Mac OS X平臺上。
以下是命令行下的幫助文件:
D:>Httprint
Usage: Httprint {-h | -i } -s [… options]
-h 可以是ip地址ip范圍,或者是url地址
-i 一個包含測試地址的文件,默認文件是input。txt
-s 一個包含Http簽名的文件,默認是signatures。txt
Options:
-o 默認的報告文件是"Httprintoutput。html"。可以
自己定義
-tp Ping超時時間,默認是1000 ms。 最大是30000 ms。
-t 連接和讀取超時時間,默認是10000 ms。 最大是100000 ms。
-r 重復時間。 默認是3次。 最大是30次。
-P0 指紋識別前不Ping主機。
-? 幫助信息。
例子:
Httprint -h http://www.target.com/ -s signatures.txt
Httprint -h Https://www.target.com -s signatures.txt
Httprint -h Http://www.target.com:8080/ -s signatures.txt
Httprint -h 10.0.1.1-10.0.1.254 -s signatures.txt -o 10_0_1_x.html
Httprint -i input.txt -s signatures.txt -o output.html
使用方法是很簡單的,下面是Httprint的一次輸出結果:
D:>Httprint -h Http://www.Target.com -s signatures.txt
Host: http://www.target.com/ is alive…
Finger Printing on Http://www.target.com:80/
Derived Signature:
Apache/1.3.26 (Unix)
9E431BC86ED3C295811C9DC5811C9DC5050C5D32505FCFE84276E4BBC184CB92
0D7645B5811C9DC52A200B4C811C9DC511DDC7D78398721E811C9DC5811C9DC5
E2CE6923E2CE6923E2CE6923811C9DC568D17AAE2576B769E2CE6926811C9DC5
E2CE6923E1CE67B1811C9DC5E2CE6920E2CE69206ED3C2956ED3C295E2CE6920
E2CE69206ED3C295811C9DC568D17AAEE2CE6923
Banner Reported: Apache/1.3.26 (Unix)
Banner Deduced: Apache/1.3.26
Scores:
Microsoft-IIS/4.0: 47
Microsoft-IIS/5.0: 57
Microsoft-IIS/5.0 ASP。NET: 57
Microsoft-IIS/5.1: 57
Microsoft-IIS/6.0: 75
… //略去一些
Apache/2。0。x: 70
Apache/1。3。27: 79
Apache/1。3。26: 80
Apache/1。3。[4-24]: 78
… //略去一些
Com21 Cable Modem: 49
在上面的例子中,Httprint顯示了被測服務器的簽名信息,然后將這些信息同數據庫中已有的簽名進行比較,然后對每一個指紋進行評分,分數最高的也就是最符合的。 在這個例子里, "Apache/1.3.26"是最適合的。以下是圖形界面的抓圖:
圖片
Httprint會產生一個HTML格式的報告,這個報告將對以后的分析產生很大的作用,下面是一個報告:
圖片
Httprint的功能是強大的,盡管大家可以用ServerMask這樣的軟件來模糊指紋,但是仍然可以被Httprint這樣利用統計學原理進行識別的的軟件打敗,下面是一個例子:
D:>Httprint unknown.example.com
Reported signature:
Protected by ServerMask
CD2698FD6ED3C295811C9DC5811C9DC5811C9DC594DF1BD04276E4BB811C9DC5
0D7645B5811C9DC5811C9DC59D69031D6014C217811C9DC5811C9DC580FF2CD2
FCCC535BE2CE6923E2CE6923811C9DC5E2CE69272576B769E2CE69262CEAB43E
6ED3C295FCCC535B811C9DC56ED3C2956ED3C2956ED3C2956ED3C295E2CE6923
6ED3C295
Best Match: Microsoft-IIS/5.0,Microsoft-IIS/5.1
Scores:
Microsoft-IIS/4.0: 86
Microsoft-IIS/5.0: 101
Microsoft-IIS/5.1: 101
Microsoft-IIS/6.0: 56
…
Apache/1.3.27: 35
Apache/1.3.26: 36
Apache/1.3.x: 34
…
MiniServ/0.01: 15
盡管服務器使用ServerMask迷惑了響應信息, 但是Httprint仍然精確的判斷出它是Microsoft-IIS/5.0或5.1
圖片
-END-
作者簡介:風隨水
一個從事十五年測試和質量管理者
曾經深圳乃至全國最大最活躍軟件測試QQ群群主
致力于質量管理和體系規范