2017年7月10日 星期一

【弱點那些事】CRIME TLS/SSL attack




最近不小心遇到了這個東西,才發現還真是對它完全不熟 =.=

而且nccgroup技術文件我看不懂哈哈..

當初為了要驗證這個弱點,找了一大堆工具來測,測出來結果竟然一半一半!?!? (一半說有這弱點一半說沒有)

最終證明公信力強的工具測出來皆不是誤判,會讓你感覺到誤判了其實是驗證的工具設定沒有對所以沒測出來。(別再說服自己已經修了!)





弱點說明:

Compression Ratio Info-leak Made Easy (CRIME),這是一個針對Web cookie的攻擊,若網站有使用HTTPSSPDY(Google開發的類似HTTP協定)則允許data compression(資料壓縮)

CRIMEClient端的攻擊,但也可透過Server端來防禦。只要Server端不支援compression(CRIME來說是Deflate compression),就可以解決此問題。

CRIME的防禦在於停用compression,無論是Client端瀏覽器在傳送HTTPS/SPDY Request時停用compression,還是ServerTLS停用data compression

最簡單的解決方式是Server直接改為僅允許使用TLS 1.2,因為其提供的compression method只有'NONE'一種(no compression)

通常在建立連線之時,Client會發送一系列的Client Hello,包含其支援的compression method

Server收到Client Hello後,只能選擇Client提供的其中一種compression方式包進Server Hello做回覆。

因此若TLS 1.2僅有compression method: NONE,那麼Server也只能對此種方式做回應,便不會對資料進行compression

CRIME是一種普遍性攻擊,因為它可以攻擊很多種協定,如SPDY(通常對Request Headercompression)TLS(可能會對Recordcompression)HTTP(可能會對Responsecompression)


-
嚴重性:中風險
影響:導致可取得SSL加密的敏感資料,最直觀的攻擊方式是透過此漏洞取得受害者的cookie並以此受害者身分登入
CVE: CVE-2012-4929
CWE: CWE-310




檢測方式:

工具一:Acunetix (SSL_Audit.script)


本來當初就是被Acunetix找到,但怕是誤判總是要多試幾個工具。






工具二:SSL Labs (線上)


SSL/TLS compression Yes INSECURE 代表有弱點!






工具三:TestSSLServer (支援Windows, Linux, OS X)


TestSSLServer2.exe <target>:<port>




這一隻是OWASP提到的測試工具,當掃描結果出現Server compression support: yes(以及WARN[CP001]: Server supports compression)代表有CRIME

官方說明:

CP001: Server supports compression.
Compression makes data length depend on data contents, thereby leaking information, since encryption does not hide length. This can be leveraged in some contexts to reveal secret values (attack "CRIME"). SSL/TLS-level compression should be disabled. Compression, if used at all in a protocol, should be applied at the application level (e.g. HTTP compression), with great care.





工具四:sslyze

sslyze --compression <target>:<port>

(吃本機OpenSSL注意!)
錯誤訊息:utils.ctSSL.errors.ctSSLFeatureNotAvailable - Could not enable Zlib compression: OpenSSL was not built with Zlib support ?
(懶懶的跳過不測了)





工具五:testssl.sh

./testssl.h -C <target>:<port>

(吃本機OpenSSL注意!)
錯誤訊息:Local problem: /usr/bin/openssl lacks zlib support

自己包一隻OpenSSL就可解決錯誤訊息。






工具六:sslscan (會誤判)

sslscan --no-failed <target>:<port>


(我猜他應該也是吃本機OpenSSL,不過測試失敗不會有錯誤訊息反而直接顯示Compression disable,哀傷)






工具七:OpenSSL (有前提)

openssl s_client -connect <target>:<port>

前提:要能送出有compression method: DEFLATERequest (可自己make,參考補充2)

若結果出現Compression: NONE,代表沒問題,Compression: zlib compression代表有問題。


Kali內建的OpenSSL為例,透過WireShark查看封包,發現此版本OpenSSL無法驗證此弱點,因其送出的Client Hello只有一個null compression method



然而若使用自製的OpenSSL,確實可進行CRIME測試:




還有一種測法是:(沒試成功過)

openssl s_client -connect <target>:<port>

CONNECTED(00000003)

[skip certificate info]

GET / HTTP/1.1  [Enter]

Host: google.com [Enter]

Accept-Encoding: compress, gzip [Enter, Enter]

若回應有出現Content-Encoding: gzip,表示有問題。

但同樣的,此種方法也只是多送出Application Data而已,若OpenSSL一開始便無法送出指定DEFLATE compression method的封包就沒有用。





補充(1):用WireShark查看Compression Method DEFLATE

這邊用TestSSLServer來跑看看,可以看到本機送出了一堆Client Hello,裡面有要求DEFLATE Compression


Filter: ip.addr==<target ip> && ssl



Server Hello也確實回應:






補充(2):自製可測CRIMEOpenSSL (參考)

這邊我首先去抓一隻最新版的OpenSSL source (),解tar之後進去執行config,重點是要設定enable-compenable-zlib

./config enable-comp enable-zlib --prefix=/usr/local/openssl-1.0.2l --openssldir=/usr/local/openssl
make
make test
make install





修補建議:

停用SSL/TLS compressionHTTP compression

Apache為例:

[Disable SSL Compression]

版本2.4以上,支援SSLCompression flag,預設為on,改為off就好。

版本2.2可用mod_ssl這個Patch

[Disable HTTP Compression] (參考)

可用mod_deflate

設定export OPENSSL_NO_DEFAULT_ZLIB=1





結論:

其實用前三個工具就足矣。

不過測SSL的工具真是百百種,有興趣可以看看這個XD









2017年6月14日 星期三

【弱點那些事】SSL/TLS Renegotiation (SSL/TLS會談重建)



本次使用工具為sslscan, openssl, sslyze, testssl.sh 以下筆記:

SSLSCAN

指令:sslscan --no-failed <target:port>

[不支援Renegotiation]

[支援Secure Renegotiation]




OPENSSL

指令:openssl s_client -connect <target:port>

 注意需使用LinuxOpenSSL且版本需大於0.9.8m (因此版本後預設才是使用Secure Renegotiation)


[不支援Secure Renegotiation但未Renegotiation成功(handshake failure),不算有問題]

[支援 Secure Renegotiation]

[不支援Secure Renegotiation但未Renegotiation成功(write:errno=104),不算有問題]



SSLYZE

指令:sslyze <target:port> --reneg


[支援 Secure Renegotiation、支援Client但無法判定Secure]

[支援 Secure Renegotiation、不支援Client]

[不支援 Secure Renegotiation、支援Client但無法判定Secure]




TESTSSL.SH

指令:./testssl.sh -R <target:port>

[支援 Secure Renegotiation、不確定是否支援Secure Client但大概沒問題]
[支援 Secure Renegotiation、不支援Secure Client]
不過弔詭的是這個站在SSLLabs測的結果是Secure Client YES, Insecure Client NO,所以是…? (ㄏㄏ
//官方說明//

[支援 Secure Renegotiation、支援Secure Client]
[不支援 Secure Renegotiation、支援Secure Client]


-
總結:

這個弱點要成立的條件
1.       支援Renegotiation
2.       不支援Secure Renegotiation


支援測試
sslscan
Openssl
sslyze
testssl.sh
SSLLabs (線上)
Secure Renegotiation (CVE-2009-3555)
v
v
v
v
v
Secure Client-initiated Renegotiation


(只能測Client但無法得知是否Secure)
v
v
備註

1.       先確認Secure Renegotiation NOT Supported
2.       再確認Rwork 才代表有問題





---
SSLScan 1.10.5-static
OpenSSL 1.0.1k
SSLyze v0.6 beta
testssl.sh 2.8
---
參考資料: