彩虹表破解開機密碼、MD5演算法等的原理
http://www.91ri.org/7593.html 自己發到91ri的,部落格備份下。
前言
或許對於大多數人來說,實際中並不需要了解這些理論,能夠使用現成的工具就行,但是我個人覺得了解了這些可以將工具使用的更好,更何況理論研究中思維的碰撞也是一種樂趣
一、 簡介
彩虹表技術以時空折中理論為基礎,即增大儲存空間的開銷縮短密碼破解所需要的時間,時空折中的相關理論在密碼學中應用很廣,最初是在1980年,公鑰密碼學的提出者之一Hellman針對DES演算法提出的一種攻擊方式,經過不斷地改進,2003年瑞典的Philippe Oechslin 在Making a Faster Cryptanalytic Time-Memory Trade-Off一文中提出了一種高效破解windows開機密碼的時空折中演算法,並命名為彩虹表,當然當時是針對Windows Xp開機認證的LM-HASH演算法。除了破解開機密碼,彩虹表目前還應用於雜湊密碼如SHA、MD4、MD5等演算法的破譯,速度快、效率高、療效有保證,Philippe的論文中提到:“1.4G的彩虹表可以在13.6s內破解99.9%的數字字母混合型的Windows密碼”,具有很強的實用性。
二、 彩虹表的原理
設想一下這種情況:你已經拿到了一臺伺服器的Shell,並且通過HashDump工具獲取了主機儲存的密碼的Hash值,怎麼據此得到明文的使用者密碼搞定管理員許可權呢(當然提權方法很多,如直接扔進線上解密網站或是用wce、minikazi之類的工具直接搞到原始明文密碼,或者乾脆繞過密碼提權,這裡只是做個示例),有兩種很容易想到的方法:一種是字典破解,二是暴力窮舉,這兩種方式應用的都非常廣,字典破解儲存常用的使用者名稱密碼和其對應的密碼Hash值,破解時只需根據需要破解的密碼找到對應的明文密碼即可,破解速度快,但是破譯效率依賴於字典的構造,並且經常需要大量的儲存空間存放字典檔案;暴力破解法一般比較盲目,常見的形式就是依次計算1-N位字串的密碼值與需破解的密碼進行比較,成功率全靠人品。這兩種方法分別對空間和時間的要求比較大,久之,人類開始尋找折中的方法,彩虹表就是時空折中的典型,下面我就以彩虹表的生成和查表這兩個步驟來介紹彩虹表破解的原理。
2.1 造表過程
此處僅介紹彩虹表的原理,對Hellman等人對時空折中演算法的研究就不做詳細介紹了,有興趣的可以看一下Hellman在1980年發表的論文:A cryptanalytic time-memory trade-off,對理解彩虹表的構造過程會有很大幫助,Philippe Oechslin這人只是在Hellman的基礎上做了稍微改進。
彩虹表實質上還是屬於字典破解的一種,不過不再是簡單的明文—密碼的對應,為了節省字典儲存空間,彩虹表省去了能通過計算得出的資料,達到這點的關鍵在於設計出一個函式族Rk(k=1、2、3、4……)將hash密文空間映射回明文的字元空間。
這麼說很高階大氣,一般沒人聽的懂,我當時也沒懂神馬對映、空間啥的,其實就是把hash密文再按照一定的規則轉化成普通字串的轉化函式,例如字串qshud的32位MD5密文e978c6b019ac22a3fd05b14d36621852,最簡單的轉化處理就是直接擷取第一個字元e。因為e也可能是某些人的口令哦,再對字元e進行32位MD5運算得到密文e1671797c52e15f763380b45e841ec32,再取前兩位字元e1,繼續MD5運算得到cd3dc8b6cffb41e4163dcbd857ca87da,再取前三位cd3……,這時轉換的函式族Rk其實就是擷取密文的前k位,k=1、2、3、4…….照此法動作若干次(次數不限、本例為8次),得到5626cf5e6f1093c2840a16512f62c3b5,再取前八個字元 5626cf5e.
好了,下面我們就只需要儲存字串qshud和 5626cf5e就齊活了,剛才中間的字元資料e、e1、cd3… d989670就不用管了,它們屬於可以通過qshud計算出的資料,不必進行儲存,需要的話稍微花些時間計算即可,親們必須先記著這種只儲存首尾字串的儲存方式,下一節查表過程會繼續講到這種儲存如何配合查表過程的。
上一段的例子只是針對MD5演算法最簡單的一種彩虹表,彩虹表可以處理的hash演算法很多,進行的hash運算我們就記為H,函式族Rk(k=1、2、3、4……)都可以自定義,最初開始處理的明文再多選取一些,如圖1中第一列的wikipedia、abcdefgh…passwd等,依次計算就得到了圖1中的幾條字串鏈。
圖1 簡化的彩虹表造表流程圖
Ps:一條條的鏈並列的形狀就像是彩虹的色帶,這就是彩虹鏈(表)的由來。
圖1的例子使用的是自定義的R1、R2、R3函式,注意可不是上例提到的擷取前幾個字元形式的Rk函式,只是為了便於說明圖1中的彩虹表虛構出的,具體轉換方式不必深究。我們最後儲存的只有wikipedia-rootroot、abcdefgh-myname…passwd-linux23,這就是彩虹表造表的大致過程,為了便於說明,示例比較簡單,在實際造表中還需要考慮更多的因素,如最重要的Rk系列函式構造、每一條鏈的長度、造表需要的空間、儲存格式等等。
2.1 查表過程
如果已經有了上文圖一中生成的彩虹表,怎樣找到hash函式H的一條密文re3xes對應的明文呢?解釋這個破解過程需要明確一點:如果re3xes對應的明文屬於彩虹表中的某條鏈,那麼就有可能找到其對應的明文,注意這裡的“屬於某條鏈”不僅僅是指屬於彩虹表的一條鏈中存放的頭尾兩個字串,還包括這兩個字串中的中間資料,圖一中中間計算的明文資料secret、jimbo也算是屬於彩虹表的第一條鏈中,同理bernie、zurich屬於第二條鏈,culture、crypto屬於最後一條鏈,雖然彩虹表中只儲存了每條鏈的鏈首鏈尾兩個字串,但是這些中間資料是可以根據鏈首字串重新計算出來的。來看一下re3xes的破解過程,先猜測下密碼re3xes對應的明文資料是某條鏈中間計算出資料的最後一個,注意第一、二條鏈的中間資料中的最後一個明文口令jimbo、zurich,依次經過H-R3運算得到儲存的鏈尾字串rootroot、myname,那麼密文re3xes經過R3轉換之後得到的資料就是某條鏈的鏈尾字串,這點應該不難理解,如密文v0d$x對應的明文jimbo是第一條鏈最後一箇中間明文資料,則v0d$x經過R3轉換得到鏈尾字串rootroot,但是密文re3xes經過R3函式轉換之後得到的rambo並不是表中儲存的任一條鏈的鏈尾字串,這就說明re3xes對應的明文資料並不是某條鏈中間計算出資料的最後一個,猜測不成立,繼續猜測re3xes對應的明文資料可能是某條鏈中間計算出資料的倒數第二個,同樣可以很容易推出re3xes依次經過R2-H-R3轉換之後得到的資料是某條鏈的鏈尾字串,計算出re3xes經R2-H-R3轉換的結果為linux23,通過搜尋彩虹中存放的鏈尾字串,得到linux23恰好是最後一條鏈的鏈尾,O(∩_∩)O~,到了這一步已經成功了一大半,下面就來根據儲存的最後一條鏈鏈首的passwd重新計算出密文re3xes對應的明文吧,既然re3xes經R2-H-R3轉換之後得到鏈尾的linux23,那麼鏈首的passwd經H-R1-H運算後的結果culture就是re3xes對應的明文啦,小功告成~(≧▽≦)/~,流程圖見下圖2。
圖2彩虹表破解密碼示意圖
注意:經過這種運算能得到鏈尾字串的話只是成功了大半,還是有一小半人品不好的情況額,如果Rk函式設計的不好,存在一個密文字串qshud和re3xes經過R2-H-R3運算後都能得到linux23,那麼在破解密文qshud的時候也會得出明文為culture,這種錯誤的情況稱為“假警”,因為實際應用中的資料量都比較大,所以出現這種情況也是很正常的,這是隻需要簡單計算一下hash驗證下即可,從另一個角度看資料量大的同時也能保證彩虹表的明文覆蓋率更大,破解效果更好,出現“假警”情況的話就繼續查表過程直至找到正確的明文或是找完整個表也沒找到明文╮(╯_╰)╭……
ps:彩虹表類似於用大量隨機字串來保證對明文的覆蓋率,所以Rk系列函式的構造直接影響能破解密碼的範圍。
三、 彩虹表的不足與改進
3.1 不足:加鹽情況處理不好
現在很多加密方法計算密碼Hash時,會在待處理的明文字串後面加上一串隨機的字串再進行加密操作,開始密碼驗證時會先在使用者輸入的密碼後加上相同的隨機字串進行加密,結果再與儲存的Hash進行比較。如明文口令是qshud,則附加上一段隨機字串再計算hash,正確口令的hash儲存時也是這樣的處理過程,這樣做的一個好處就是可以在一定程度上防止彩虹表破譯,假設隨機字串為“!@#¥”之類的特殊符號,在造表的過程中設計R函式就需要考慮到映射回這些特殊符號,這就大大增大了造表的空間和難度。
3.2 不足:不能保證100%破解
造表過程中可以很明顯的看出,只有明文字串屬於彩虹表的某條鏈上才能保證這條明文對應的Hash可以被破解,然而設計的再好也不能保證能夠破解所有對應的Hash密碼,實際中破解率99%以上就已經很實用了。
3.3 改進:破解率100%的雷表
上文已經提到了破解的效率並不能達到100%,而雷表就是對這點的改進,據稱可以達到100%的破譯,但是涉及的技術會更加複雜。目前這項技術還未被公開,網上也找不到詳細的介紹。
3.4 改進:顯示卡並行程式設計加速造表過程
利用顯示卡多核的特點,設計並行的造表演算法(CUDA並行程式設計),一般情況下能將造錶速度提至7倍(以我一個很水的實現為起點~囧)或更高。
四、 彩虹表下載及相關工具
免費彩虹表下載:
Free Rainbow Tables:http://www.freerainbowtables.com/en/tables/,提供了LM、NTLM、MD5、SHA1等彩虹表下載。
工具:
Opcrack:有自己獨特的彩虹表結構,支援LM,NTLM破解。
RainbowCrack:可以自己造表,支援LM, NTLM, MD5, SHA1, MYSQLSHA1, HALFLMCHALL, NTLMCHALL的破解。
Cain:由Oxid.it開發的一個針對Microsoft作業系統的免費口令恢復工具。號稱窮人使用的L0phtcrack……