作者:
insight-labs
·
2014/10/15 14:11
0x00 背景
POODLE攻擊是針對SSLv3中CBC模式加密演算法的一種padding oracle攻擊。這個攻擊方式和之前的BEAST攻擊方式很像,可以讓攻擊者獲取SSL通訊中的部分資訊的明文,比如cookie。和BEAST不同的是,它不需要對明文內容的完全控制,所以操作起來更加貼近實戰。
從根本上說,這是SSL設計上的問題,就像 Lucky13 和 Vaudenay's two atacks 這些漏洞裡面描述的一樣,SSL的加密和認證過程搞反了,SSL先進行認證之後再加密。
0x01 細節
首先考慮這個明文HTTP請求, 我把它分成了 8位元組的塊,就像3DES加密,但是這個方法對16位元組的AES塊加密一樣適用:
最後一個塊裡包含了7個位元組的填充(padding),用·來表示,最後一個位元組7是填充長度,我用了虛構的8位元組MAC校驗碼。在傳輸前,這些資料都會被3DES或者AES加密。現在來回顧下CBC解密的過程,這張圖來自wikipedia:
攻擊者可以控制HTTP請求中的路徑和主體,從而讓請求的內容滿足如下條件:
後面的padding填充部分填充了一整個block
cookie的第一個位元組正好在某個塊的末尾的位元組
攻擊者需要做的是把包含cookie第一個位元組(出現在這個塊的末尾,例如塊中的內容是 Cookie:a,a正好在8位元組塊的末尾)的那個塊,替換padding的那個塊傳送給接收者(伺服器)。
一般來說,伺服器會拒絕這段密文,因為CBC校驗失敗了,攻擊者需要重新傳送,平均來說,每256個請求中有一個會被伺服器接受,只要伺服器接受了,根據CBC的解密過程,攻擊者就知道了cookie的第一個位元組(明文)的和上一個塊最後一個位元組的密文 XOR 後是 7或者15(分別對應塊長度8或16)。
作為中間人,我們可以看到任何一段密文,所以
P XOR K = C
C XOR K = P
三個變數我們只要知道了兩個就可以解密出另一個,所以 Cookie第一位元組 XOR 密文最後一個位元組 = 15
我們只要把 15 XOR 密文最後一個位元組就知道了cookie的第一個位元組。
因為可以解密的視窗大小隻有1位元組(前面任意一個塊的最後一個位元組),所以需要透過js控制HTTP請求路徑的長度,比如 GET/, GET /A, GET /AA...把需要解密的cookie的位置逐漸頂到解密視窗中,每次解密一個位元組平均需要256次請求,攻擊者就可以用256*n次構造的請求來解密SSLv3中任意位置的明文。
這個漏洞的主要成因是因為SSLv3沒有規定padding填充塊位元組的內容,只校驗填充塊最後一個位元組,因為TLS會檢查填充塊的內容所以在TLS上同樣的攻擊方式成功率只有2^-64或者2^-128。
0x02 解決方式
把SSLv3關了,SSLv3已經過期用了15年了。
參考: https://www.imperialviolet.org/2014/10/14/poodle.html https://www.openssl.org/~bodo/ssl-poodle.pdf
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!