▲阿里巴巴集團資深安全專家吳瀚清演講

吳瀚清,2001年,與朋友共同建立了號稱黑客組織的“幻影”。2005年加入阿里巴巴,2008年底加入了阿里云,現(xiàn)在在負責阿里云的云計算安全。

吳瀚清首先介紹到,在滲透測試里面遇到了這種情況(如下圖)時,一般都會抓狂??吹揭淮蟠?,可能是加密或者是數(shù)字,我們叫做密文。這些看起來很紛亂的密文是有編碼規(guī)律的,最常用兩種編碼方式Base 64和Hex,紅色這一串數(shù)字是16進制的編碼或者字符集。我們把它直接轉換成16進制之后可以得到密文,通過解碼知道密文到底是什么東西,而不是毫無意義的數(shù)字了。

流行應用的加密算法實現(xiàn)缺陷與利用

加密算法,密文長度有一定規(guī)律,如果使用流密碼可以是任意長度,如果看到密文的長度沒有任何規(guī)律,很可能使用的是流密碼,如果是分子組加密算法它的密文是有規(guī)律的,比如說8的整數(shù)倍或者16的整數(shù)倍,它的加密出來之后都變成了分組的整數(shù)倍,整出密文的長度就可以猜測出它的加密算法。

如果你知道明文的情況下,嘗試改變密文的字節(jié),看密文發(fā)生了什么變化,如果密文在一個分子長度之內,比如八字節(jié)發(fā)生了改變,后一個字節(jié)沒有改變,很可能使用的ECB,如果明文改變1字節(jié),密文完全改變,可能是別的分組加密模式。

開發(fā)者如何看待加密算法,對于他們來說加密算法使用的時候好不好用:

1、加密算法第三方實現(xiàn)Library?在滲透過程中遇到一些密文猜測加密算法,看它什么平臺使顯得,看Web語言里面有沒有比較好用的,公開的第三方的加密實現(xiàn)的library。

2、性能。這決定了大的應用網(wǎng)站決定他們不可能選用強度非常高的加密算法,比如使用交換密鑰加密整段密文這種方法肯定不能被接受的。開發(fā)者們需要選擇高性能的開發(fā)算法。

像DES算法可以在一天之內把它的密文破解出來,如果開發(fā)者選擇了DES算法就是不明智的算法。

3、安全—特指密鑰長度。加密算法如何安全?密鑰超度越長,越安全。對于他們來說選用加密算法的時候,只會簡單選擇加密算法的密鑰是否足夠長,加密算法攻擊過程中會有非針對長度的攻擊。我在后面會講到。

開發(fā)者常犯的錯誤:

1、使用哈希算法代替加密算法。

2、哈希算法不適用的場景。

3、使用時間函數(shù)代替?zhèn)坞S機數(shù)算法。

4、不了解一些密碼學攻擊,導致使用錯誤。

加密算法可以分為兩種:分組加密算法、流密碼。

加密算法有一個概念IV:初始化向量,一次一密,無須保密。

加密模式:ECB、CBC、CFB、OFB、CTR。后三種不是很常見的,ECB是性能最好,也是不安全的。CBC性能和安全性達到一定的程度。

分組長度:Blocksize,分組長度是固定的。

密鑰:KEY、須保密、有時對長度有要求。

在密碼學里面,針對加密算法的攻擊有這么幾種方式,就不展開講了,與今天講的內容沒有太直接的聯(lián)系,這些東西更多是在密碼學里面進行的分類。

攻擊分組加密算法,ECB模式,是一種非常簡單的加密模式,它將明文分成不同的組,每一組都進行加密使用相同的密鑰加密,加密之后出來密文,密文模 式又叫電碼簿模式。把明文密文交換,密文的分組也會自動的交換,如果攻擊者知道明文里面的敏感信息,可以替換密文,從而達到所要的效果,比如說支付的時候 付了一塊錢,可以改為一百塊,用一塊錢買到一百塊錢的東西。下面這張圖片點正是由ECB模式加密的,我們可以看到它隱隱約約滲透出來的一些信息。最右邊這 張圖采取鏈式的模式,信息就被掩蓋了,大量的統(tǒng)計情況下使用ECB的模式是不明確的,不能完全保護你的信息。

CBC模式常見的攻擊是Pading Oracle,Pading Oracle它實際上是一種變信道攻擊,像盲注一樣基于結果的預測,只需要知道揭秘之后結果是不是Pading Oracle正確,就可以推斷出算法的實踐是不是存在缺陷的。

流密碼攻擊在Web領域用的最多,因為它的性能非常好。流密碼一個字節(jié)一個字節(jié)加密,密鑰長度和明文長度是一樣長的,如果不一樣長怎么辦?把密鑰重 疊,再逐字節(jié)加密。加密結果有一個IV,IV和密鑰形成真正用于加密的程序密鑰,通過異或操作加密成密文。在流密碼里面存在Reused Key Attack,通過一組推導得出紅字表示的結論,密文和密文之間異或之后等于明文和明文之間異或,我們在已知三個數(shù)據(jù)的情況下,就可以推導出已知的。

我們知道PHPWind是國內著名的論壇,他有一個加密的函數(shù)使用的非常簡單的異或加密,關鍵的代碼是我下面標紅的一行。我們就使用這種攻擊破解 PHPwind驗證碼,它只有32個字符產生,生成的明文是這樣的數(shù)據(jù)結構,有一個時間戳,再有mdi,再加上時間戳。我們通過網(wǎng)絡獲取驗證碼,接下來通 過一定的算法把驗證碼破解出來。它的驗證碼實際上在Cookie里面設置了加密值,服務端比對加密的串。我們有這樣一個思路,已知了先自己構造一下抓一下 包,已知明文1就知道密文2,可以推導明文2。我們采用彩虹表就可以辯解出明文什么意思,這張彩虹表要自己做出來,這張彩虹表我們制作起來并不是特別困 難,因為它是有時間戳的。這里我貼了一張圖,通過了一千多次的訓練在886秒里面,我通過一個算法自動化破解了這張驗證碼的明文值,白色的地方就是破解出 來的明文值和驗證碼是完全一樣的。

第二種對于流密碼攻擊叫做Bit—Flipping Attack。比如說剛才的驗證碼,驗證碼里面加入時間戳的目的通過時間對用戶提交的驗證碼進行校驗,關鍵的判斷是通過服務器取當今時間再減去 cookie驗證過的時間是不是大于1800秒,我們自己構造一個超大時間,使得這個時間永不過期,讓時間相減的值小于1,這個時間判斷永遠是真的。我構 造了一個時間,計算機里面轉換時間是13多少多少,我寫了12多少,相減是負數(shù),通過網(wǎng)絡請求反饋結果,說明我們驗證碼是永遠通過的。

還可以講講Discuz authcode()函數(shù),Discuz authcode()也是用它加密cookie,這個函數(shù)相對比前面的函數(shù)好一點,它有很多東西保證它的安全。我們對authcode()做了分析,加密 的明文什么東西,會把明文進行處理。前十位是時間戳,如果是零的話,這個算法也是正確的,我們可以構造我們時間戳全部是零,然后加密密文。接下來的11— 16位,是一個HMAC,是用于防篡改的,接下來是明文。整個用于authcode()函數(shù),生成1的密鑰進行加密。相對authcode()比較安全 的,IV一次一密,導致無法攻擊成功。它使用了HMAC是防篡改的,導致無法構造任意密文。明文我們可以已知的,第二個因素是加密的密鑰,密鑰是未知的, 我們在未知密鑰的情況下無法構造出authcode()函數(shù)的密文的。但是authcode()存在一個弱點,它的默認當前Discuz!版本中是零,使 用窮舉法建立IV字典(a—Z0—9),當兩次加密IV相同時,加密密鑰也相同,在WEP破解中,24bitIV在5小時遍歷完,5小時之后IV不得不重 復。對于authcode()函數(shù)來說,一百多萬次以后,把所有的IV遍歷,IV不得不重復,不得不還原所有的明文。

POC是有兩個 2626、2630,我通過crack算法破解Cipher2加密之后,我希望它的結果和2630是一樣的,最后的計算結果收集了49000多對 Keys,花了64秒時間成功計算出了它的明文是2630,authcode()函數(shù)存在這個弱點,這個漏洞是Discuz還不知道。PHP的我已經告訴他了,因為我們已經收購他了。

收集這么多密鑰比較困難的,主要困難在網(wǎng)絡延時上面,通過不停發(fā)包,發(fā)網(wǎng)絡請求收IV。有一個小技巧叫做 Birthday Attack,3人中任意2人生日在特定一天(如11.8號)生日概率7.9%,如果任意2人生日相同,30個人里面接近70%。我們設計抓取IV的時候 就可以取巧了,通過不斷比對所有IV重復性來確定,來快速抓取相同的IV,這并是只存在于理論上的攻擊,我分別用兩個程序抓IV,很快就發(fā)現(xiàn)非常多重復的 IV,只要出現(xiàn)重新的IV,秋收可以還原明文了,攻擊條件就達成了。

如何攻擊authcode(),可以遍歷IV,找到相同的IV從而攻擊成功。如果在互聯(lián)網(wǎng)的開源的Web應用里面,你找到了它的加密算法存在缺陷,如果以前的安全者找到了類似的漏洞,PHPCMS cookie注射,通過構造明文注射,使用加密函數(shù)之后就可以進行cookie注射。今天的互聯(lián)網(wǎng)特別是開源軟件里面,可能存在非常多這樣的問題。

最終留下一些開發(fā)建議:不要使用ECB模式、不要使用流密碼;推薦使用CBC模式的AES—256或者Blowfish;不要使用相同的KEY做不同的事情;要注意IV的隨機性;要使用HMAC—SHA512代替MD5。

分享到

huanghui

相關推薦