▲阿里巴巴集團(tuán)資深安全專家吳瀚清演講
吳瀚清,2001年,與朋友共同建立了號(hào)稱黑客組織的“幻影”。2005年加入阿里巴巴,2008年底加入了阿里云,現(xiàn)在在負(fù)責(zé)阿里云的云計(jì)算安全。
吳瀚清首先介紹到,在滲透測(cè)試?yán)锩嬗龅搅诉@種情況(如下圖)時(shí),一般都會(huì)抓狂??吹揭淮蟠?,可能是加密或者是數(shù)字,我們叫做密文。這些看起來很紛亂的密文是有編碼規(guī)律的,最常用兩種編碼方式Base 64和Hex,紅色這一串?dāng)?shù)字是16進(jìn)制的編碼或者字符集。我們把它直接轉(zhuǎn)換成16進(jìn)制之后可以得到密文,通過解碼知道密文到底是什么東西,而不是毫無意義的數(shù)字了。
加密算法,密文長(zhǎng)度有一定規(guī)律,如果使用流密碼可以是任意長(zhǎng)度,如果看到密文的長(zhǎng)度沒有任何規(guī)律,很可能使用的是流密碼,如果是分子組加密算法它的密文是有規(guī)律的,比如說8的整數(shù)倍或者16的整數(shù)倍,它的加密出來之后都變成了分組的整數(shù)倍,整出密文的長(zhǎng)度就可以猜測(cè)出它的加密算法。
如果你知道明文的情況下,嘗試改變密文的字節(jié),看密文發(fā)生了什么變化,如果密文在一個(gè)分子長(zhǎng)度之內(nèi),比如八字節(jié)發(fā)生了改變,后一個(gè)字節(jié)沒有改變,很可能使用的ECB,如果明文改變1字節(jié),密文完全改變,可能是別的分組加密模式。
開發(fā)者如何看待加密算法,對(duì)于他們來說加密算法使用的時(shí)候好不好用:
1、加密算法第三方實(shí)現(xiàn)Library?在滲透過程中遇到一些密文猜測(cè)加密算法,看它什么平臺(tái)使顯得,看Web語言里面有沒有比較好用的,公開的第三方的加密實(shí)現(xiàn)的library。
2、性能。這決定了大的應(yīng)用網(wǎng)站決定他們不可能選用強(qiáng)度非常高的加密算法,比如使用交換密鑰加密整段密文這種方法肯定不能被接受的。開發(fā)者們需要選擇高性能的開發(fā)算法。
像DES算法可以在一天之內(nèi)把它的密文破解出來,如果開發(fā)者選擇了DES算法就是不明智的算法。
3、安全—特指密鑰長(zhǎng)度。加密算法如何安全?密鑰超度越長(zhǎng),越安全。對(duì)于他們來說選用加密算法的時(shí)候,只會(huì)簡(jiǎn)單選擇加密算法的密鑰是否足夠長(zhǎng),加密算法攻擊過程中會(huì)有非針對(duì)長(zhǎng)度的攻擊。我在后面會(huì)講到。
開發(fā)者常犯的錯(cuò)誤:
1、使用哈希算法代替加密算法。
2、哈希算法不適用的場(chǎng)景。
3、使用時(shí)間函數(shù)代替?zhèn)坞S機(jī)數(shù)算法。
4、不了解一些密碼學(xué)攻擊,導(dǎo)致使用錯(cuò)誤。
加密算法可以分為兩種:分組加密算法、流密碼。
加密算法有一個(gè)概念I(lǐng)V:初始化向量,一次一密,無須保密。
加密模式:ECB、CBC、CFB、OFB、CTR。后三種不是很常見的,ECB是性能最好,也是不安全的。CBC性能和安全性達(dá)到一定的程度。
分組長(zhǎng)度:Blocksize,分組長(zhǎng)度是固定的。
密鑰:KEY、須保密、有時(shí)對(duì)長(zhǎng)度有要求。
在密碼學(xué)里面,針對(duì)加密算法的攻擊有這么幾種方式,就不展開講了,與今天講的內(nèi)容沒有太直接的聯(lián)系,這些東西更多是在密碼學(xué)里面進(jìn)行的分類。
攻擊分組加密算法,ECB模式,是一種非常簡(jiǎn)單的加密模式,它將明文分成不同的組,每一組都進(jìn)行加密使用相同的密鑰加密,加密之后出來密文,密文模 式又叫電碼簿模式。把明文密文交換,密文的分組也會(huì)自動(dòng)的交換,如果攻擊者知道明文里面的敏感信息,可以替換密文,從而達(dá)到所要的效果,比如說支付的時(shí)候 付了一塊錢,可以改為一百塊,用一塊錢買到一百塊錢的東西。下面這張圖片點(diǎn)正是由ECB模式加密的,我們可以看到它隱隱約約滲透出來的一些信息。最右邊這 張圖采取鏈?zhǔn)降哪J?,信息就被掩蓋了,大量的統(tǒng)計(jì)情況下使用ECB的模式是不明確的,不能完全保護(hù)你的信息。
CBC模式常見的攻擊是Pading Oracle,Pading Oracle它實(shí)際上是一種變信道攻擊,像盲注一樣基于結(jié)果的預(yù)測(cè),只需要知道揭秘之后結(jié)果是不是Pading Oracle正確,就可以推斷出算法的實(shí)踐是不是存在缺陷的。
流密碼攻擊在Web領(lǐng)域用的最多,因?yàn)樗男阅芊浅:谩A髅艽a一個(gè)字節(jié)一個(gè)字節(jié)加密,密鑰長(zhǎng)度和明文長(zhǎng)度是一樣長(zhǎng)的,如果不一樣長(zhǎng)怎么辦?把密鑰重 疊,再逐字節(jié)加密。加密結(jié)果有一個(gè)IV,IV和密鑰形成真正用于加密的程序密鑰,通過異或操作加密成密文。在流密碼里面存在Reused Key Attack,通過一組推導(dǎo)得出紅字表示的結(jié)論,密文和密文之間異或之后等于明文和明文之間異或,我們?cè)谝阎齻€(gè)數(shù)據(jù)的情況下,就可以推導(dǎo)出已知的。
我們知道PHPWind是國(guó)內(nèi)著名的論壇,他有一個(gè)加密的函數(shù)使用的非常簡(jiǎn)單的異或加密,關(guān)鍵的代碼是我下面標(biāo)紅的一行。我們就使用這種攻擊破解 PHPwind驗(yàn)證碼,它只有32個(gè)字符產(chǎn)生,生成的明文是這樣的數(shù)據(jù)結(jié)構(gòu),有一個(gè)時(shí)間戳,再有mdi,再加上時(shí)間戳。我們通過網(wǎng)絡(luò)獲取驗(yàn)證碼,接下來通 過一定的算法把驗(yàn)證碼破解出來。它的驗(yàn)證碼實(shí)際上在Cookie里面設(shè)置了加密值,服務(wù)端比對(duì)加密的串。我們有這樣一個(gè)思路,已知了先自己構(gòu)造一下抓一下 包,已知明文1就知道密文2,可以推導(dǎo)明文2。我們采用彩虹表就可以辯解出明文什么意思,這張彩虹表要自己做出來,這張彩虹表我們制作起來并不是特別困 難,因?yàn)樗怯袝r(shí)間戳的。這里我貼了一張圖,通過了一千多次的訓(xùn)練在886秒里面,我通過一個(gè)算法自動(dòng)化破解了這張驗(yàn)證碼的明文值,白色的地方就是破解出 來的明文值和驗(yàn)證碼是完全一樣的。
第二種對(duì)于流密碼攻擊叫做Bit—Flipping Attack。比如說剛才的驗(yàn)證碼,驗(yàn)證碼里面加入時(shí)間戳的目的通過時(shí)間對(duì)用戶提交的驗(yàn)證碼進(jìn)行校驗(yàn),關(guān)鍵的判斷是通過服務(wù)器取當(dāng)今時(shí)間再減去 cookie驗(yàn)證過的時(shí)間是不是大于1800秒,我們自己構(gòu)造一個(gè)超大時(shí)間,使得這個(gè)時(shí)間永不過期,讓時(shí)間相減的值小于1,這個(gè)時(shí)間判斷永遠(yuǎn)是真的。我構(gòu) 造了一個(gè)時(shí)間,計(jì)算機(jī)里面轉(zhuǎn)換時(shí)間是13多少多少,我寫了12多少,相減是負(fù)數(shù),通過網(wǎng)絡(luò)請(qǐng)求反饋結(jié)果,說明我們驗(yàn)證碼是永遠(yuǎn)通過的。
還可以講講Discuz authcode()函數(shù),Discuz authcode()也是用它加密cookie,這個(gè)函數(shù)相對(duì)比前面的函數(shù)好一點(diǎn),它有很多東西保證它的安全。我們對(duì)authcode()做了分析,加密 的明文什么東西,會(huì)把明文進(jìn)行處理。前十位是時(shí)間戳,如果是零的話,這個(gè)算法也是正確的,我們可以構(gòu)造我們時(shí)間戳全部是零,然后加密密文。接下來的11— 16位,是一個(gè)HMAC,是用于防篡改的,接下來是明文。整個(gè)用于authcode()函數(shù),生成1的密鑰進(jìn)行加密。相對(duì)authcode()比較安全 的,IV一次一密,導(dǎo)致無法攻擊成功。它使用了HMAC是防篡改的,導(dǎo)致無法構(gòu)造任意密文。明文我們可以已知的,第二個(gè)因素是加密的密鑰,密鑰是未知的, 我們?cè)谖粗荑€的情況下無法構(gòu)造出authcode()函數(shù)的密文的。但是authcode()存在一個(gè)弱點(diǎn),它的默認(rèn)當(dāng)前Discuz!版本中是零,使 用窮舉法建立IV字典(a—Z0—9),當(dāng)兩次加密IV相同時(shí),加密密鑰也相同,在WEP破解中,24bitIV在5小時(shí)遍歷完,5小時(shí)之后IV不得不重 復(fù)。對(duì)于authcode()函數(shù)來說,一百多萬次以后,把所有的IV遍歷,IV不得不重復(fù),不得不還原所有的明文。
POC是有兩個(gè) 2626、2630,我通過crack算法破解Cipher2加密之后,我希望它的結(jié)果和2630是一樣的,最后的計(jì)算結(jié)果收集了49000多對(duì) Keys,花了64秒時(shí)間成功計(jì)算出了它的明文是2630,authcode()函數(shù)存在這個(gè)弱點(diǎn),這個(gè)漏洞是Discuz還不知道。PHP的我已經(jīng)告訴他了,因?yàn)槲覀円呀?jīng)收購他了。
收集這么多密鑰比較困難的,主要困難在網(wǎng)絡(luò)延時(shí)上面,通過不停發(fā)包,發(fā)網(wǎng)絡(luò)請(qǐng)求收IV。有一個(gè)小技巧叫做 Birthday Attack,3人中任意2人生日在特定一天(如11.8號(hào))生日概率7.9%,如果任意2人生日相同,30個(gè)人里面接近70%。我們?cè)O(shè)計(jì)抓取IV的時(shí)候 就可以取巧了,通過不斷比對(duì)所有IV重復(fù)性來確定,來快速抓取相同的IV,這并是只存在于理論上的攻擊,我分別用兩個(gè)程序抓IV,很快就發(fā)現(xiàn)非常多重復(fù)的 IV,只要出現(xiàn)重新的IV,秋收可以還原明文了,攻擊條件就達(dá)成了。
如何攻擊authcode(),可以遍歷IV,找到相同的IV從而攻擊成功。如果在互聯(lián)網(wǎng)的開源的Web應(yīng)用里面,你找到了它的加密算法存在缺陷,如果以前的安全者找到了類似的漏洞,PHPCMS cookie注射,通過構(gòu)造明文注射,使用加密函數(shù)之后就可以進(jìn)行cookie注射。今天的互聯(lián)網(wǎng)特別是開源軟件里面,可能存在非常多這樣的問題。
最終留下一些開發(fā)建議:不要使用ECB模式、不要使用流密碼;推薦使用CBC模式的AES—256或者Blowfish;不要使用相同的KEY做不同的事情;要注意IV的隨機(jī)性;要使用HMAC—SHA512代替MD5。