判斷是否支持Heartbeat的NSE腳本
服務端支持heartbeat是存在heartbleed漏洞的必要條件,如果判斷出某SSL端口不支持heartbeat,那基本上就可以排除風險了。
在SSL握手階段,如果Client Hello里聲明了客戶端支持heartbeat,那么服務端會在Server Hello中聲明自己是否也支持heartbeat。
在ssl-enum-ciphers.nse的基礎上,改了一個nse腳本(http://pan.baidu.com/s/1pJ37kF5),來根據上述特征判斷SSL是否支持Heartbeat,該腳本在nmap 6.40下正常工作,貌似在5.x下會出錯,一些定義有沖突。
[kussa@Kussa scripts]$ nmap --script ssl-heartbeat -p 443 passport.baidu.com
Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-10 09:59 CST
Nmap scan report for passport.baidu.com (61.135.185.194)
Host is up (0.0039s latency).
PORT STATE SERVICE
443/tcp open https
|_ssl-heartbeat: no[kussa@Kussa scripts]$ nmap --script ssl-heartbeat -p 443 login.taobao.com
Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-10 10:00 CST
Nmap scan report for login.taobao.com (42.156.184.11)
Host is up (0.030s latency).
PORT STATE SERVICE
443/tcp open https
|_ssl-heartbeat: yes
這個腳本可能對我們這樣使用閉源方案比較多的公司比較有用,主要是為了借用nmap比較成熟的掃描機制,可以對公司做一次全網掃描,以排除潛在的風險,然后對掃描出的支持hearbeat的端口再做重點排查。
nmap --script ssl-heartbeat -Pn -p 443,993,995 -iL ip.txt -oN hb.txt
當然對腳本后面再加一個heartbeat的請求,就和那個python的PoC一樣了……
PS(下面的說法沒有經過嚴格驗證):
1.現在的那個python的PoC貌似在處理有些服務器發來的Server Hello請求時會出錯,服務端明明發回了Server Hello,但因為格式不兼容這個腳本而被忽略,就卡在等待Server Hello這一步了,根本沒發heartbeat包。所以用那個PoC檢測出有問題的一定是有問題,但檢測沒問題的不一定沒問題。
2.這個腳本恰恰相反。
3.貌似無論是客戶端還是服務端,微軟的產品都不支持heartbeat,除非特別引入了OpenSSL的。