這算是第三篇 (前兩篇 這裡 跟 這裡) 跟破解密碼有關的文章了,可能也研究出興趣來了。用 CPU 破解密碼算是比較不高級的做法,現在流行的是用顯卡,也就是 GPU 來做這事。 GPU 的速度因其架構的優勢,在破密碼、做科學運算有很廣泛的應用和很好的效率。本篇我們要介紹的就是用這套 Hashcat,配合上 NVIDIA 顯卡來做密碼的破解。
NVIDIA CUDA
人工智慧現在火紅大家都知道,有一大部份都是用顯卡來運算執行。Nvidia 的 GPU 運算技術稱為 CUDA,而我們使用的 Hashcat 可以很好的跟 Nvidia 顯卡做配合。除了 Nvidia 的顯卡外, Hashcat 也支援 Intel / AMD 的 GPU。
Nvidia 的顯卡只需要安裝官方驅動即可,已經內含GPU運算工具了。記得要使用官方下載的,不要用 Windows 內建的。
本文所使用的顯卡是 NVIDIA GeForce GTX 650 Ti,這是張蠻舊的卡了,但比起 CPU 運算,速度硬是快上了很多。
驅動程式下載安裝
請上官網下載,選擇適合自己的顯卡與作業系統,下載後安裝即可。
Hashcat 下載
Hashcat 程式請至其官網下載,檔案包含了 Windows 32/64、Linux 32/64 版的工具,一包打死。
Hashcat 破解密碼原理
(感謝網友 kgame 指証,Hash 的確不存在檔案裡,以下原理請當做聽聽我來設計的做法好了…)
這部份是我自己推敲的,有錯還請指正。一般壓縮檔加密時,會把密碼的Hash(雜湊值)存在檔案內。這樣在解壓縮時,把使用者輸入的密碼也轉成Hash值,比較兩者就可以知道輸入的密碼對不對,以提供使用者比較好的操作體驗。
也許有人會想,解壓縮完使用者自己就會知道知道對不對。如果要解壓縮的檔案是好幾Gigabyte,解完才說解錯了,似忽有點不好用。或者忘記了,要試好幾次,這樣每次解壓個好幾GB,變的有點不友善。因此,快速驗証密碼的機制,還是有需求。
Hash 是把數值A經過一翻計算後,轉換成B,而從B並沒有快速的的辦法能推導出A。若要找出A,只能把所有的可能性都經過轉換,再跟B比較看看,才有法找出A來。
而把加密檔的B找出來,並算出A,就是這個破解的過程,一般就是用窮舉法。
這機制就是不安全!
把密碼HASH放在檔案裡聽起來,就是給人攻擊的機會。但在已前科技沒這麼強之前,要找出 HASH 的原始值是件很困難的事,動輒要幾千幾萬年的。但誰也沒料想到,科技進步太快,現在的 PC 一秒可以算出 400萬個 MD5 Hash,而顯卡一秒可算出上千億個,這都是以前難以想像的。
好在,更複雜的 HASH 方式已經被提出了,顯卡相對於CPU算密碼還是快,但也是變成每秒上千個而已,難度相差了一億倍。在可預見的未來,這個加密檔的存取方式應該還會是如此。
那加密檔還能破嗎
「制度沒問題,有問題的是人!」一般人還是在用不安全的加密方式,或者用一些很簡單的密碼。所以,破解總是有些機會的,只是「能破,是賺到。不能破,是正常的」。
Hashcat 使用
本文是使用 64 bit 的版本,也就是 hashcat64.exe。若你是用 32bit 的 Windows,請執行 hastcat32.exe。
Hashcat 支援非常多種的 hash 計算,可以下達 hashcat –help 就可看到非常完整的列表。一般比較常用的包括 MD5, WinZIP, 7-Zip, RAR, PDF 都有支援。個人會用到的是 MD5 和 WinZIP 的部份,在本文中會舉例如何使用。而 HASH 字串所要求的格式,也可以參考這裡。
效能測試
在實際使用前,可以透過程式提供的 benchmark 功能,看看各種解碼的速度,來評估是否有”希望“可以破解出來。如果速度太慢,就別抱太大的期望了。測試命令的格式如下。主要就是 -b 參數指定要進行效能測試,而 -m 參數指定要測的 HASH 種類。 0 為 MD5, 13600 則是 ZIP 檔用 AES 加密時的所用的方式。
1 2 3 4 |
REM HASH種類 REM 0 ===> MD5 REM 13600 ===> WinZIP hashcat64 -b -m HASH種類 |
MD5 測試
MD5 在以往是種常用的 HASH 方法,用在Linux上密碼的儲存 。但這種太好破的HASH現在已比較少用了,從測試結果來看,一秒可以執行 1469M 次,也就是 14億次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
D:\hashcat-5.1.0>hashcat64.exe -b -m 0 hashcat (v5.1.0) starting in benchmark mode... OpenCL Platform #1: NVIDIA Corporation ====================================== * Device #1: GeForce GTX 650 Ti, 512/2048 MB allocatable, 4MCU Benchmark relevant options: =========================== * --optimized-kernel-enable Hashmode: 0 - MD5 Speed.#1.........: 1469.3 MH/s (88.41ms) @ Accel:512 Loops:256 Thr:256 Vec:2 |
WinZIP 測試
在 破解 ZIP 密碼 – John the Ripper 這篇裡面有提到,用 AES 加密的密碼很難破解,當時用 CPU 一秒只能算出 8000 個左右。而在這裡用顯卡來算,可以得到每秒 65000 個。速度增加了8倍,算是有效的提升了速度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
D:\hashcat-5.1.0>hashcat64 -b -m 13600 hashcat (v5.1.0) starting in benchmark mode... OpenCL Platform #1: NVIDIA Corporation ====================================== * Device #1: GeForce GTX 650 Ti, 512/2048 MB allocatable, 4MCU Benchmark relevant options: =========================== * --optimized-kernel-enable Hashmode: 13600 - WinZip (Iterations: 1000) Speed.#1.........: 65700 H/s (57.55ms) @ Accel:64 Loops:62 Thr:256 Vec:1 |
WinZIP AES 加密實測
講這麼多,還是要來實測一下密碼恢復。有用才有用~~~
為了取得 AES 加密ZIP檔的 HASH,我們需要透過一個叫 zip2john 的程式來取得。這支程式在 破解 ZIP 密碼 – John the Ripper 這篇文章裡面也有用到,但是當時使用的版本比較舊,產生出的 HASH 檔無法給 hashcat 使用。因此,需要下載最新的測試版本。最新的版本,請在這裡下載 。
假設解壓縮在 D:\JtR_Custom,所需要的執行檔會位於 D:\JtR_Custom\run下。
取得 ZIP 檔 HASH 值
我們把已AES加密過的zip檔,也放置在 D:\JtR_Custom\run,並命名為 test.zip。然後用以下命令,來產生 hash 檔案。
1 2 3 |
cd/d d:\JtR_Custom\run zip2john test.zip > hashtmp (for /f "tokens=1,2 delims=:" %a in (hashtmp) do @echo %b) > hash.txt |
這個 hash 是個很長的內容,跟官網所指定的格式不太一樣。不過沒關係,實測後是可以使用的。
開始用 HASHCAT 破解 HASH
有了 HASH 檔後,就可以使用下列命令破解了。這個檔案的加密密碼是 123456,即使這麼簡單的密碼,用暴力法破解也是難以破解,最差的情況下要24天才能破解。
1 |
hashcat64 -a 3 -m 13600 d:\JtR_Custom\run\hash |
參數 -a 3 是指定用暴力法破解, -m 13600 如之前講過的,是指定要算 AES ZIP的 Hash。最後一個參數則是儲存 Hash 的檔案位置。
然後畫面上就會顯示,破解的進度。
比較有用的訊息是
- Guest Mask: 直接看最後的[4],它正在用暴力法破解4位數以內的密碼。前面那些問號,是指每個字元的類型(數字, 大小寫英文…)。
- Speed: 每秒破解的速度。 這裡是 57661 H/s,也就是每秒破解 57661 個 Hash。
- Progress: 這僅是參考用,應該是指目前 MASK 下還要多久完成。沒破解成功,就要進行更多字數的嚐試。
指定破解字元
如果我們已經知道可能的密碼類型,可以直接指定要嚐試的內容。以我們的例子,知道是六位數的數字密碼,就可以直接指定嚐試數字就好。
1 |
hashcat64 -a 3 -m 13600 d:\JtR_Custom\run\hash.txt ?d?d?d?d?d?d |
上面的例子 “?d?d?d?d?d?d” 就是指定用六個數字,123456的密碼,在3秒內就能破解。
密碼若被順利破解,會先印出HASH值,最後會接著對應的密碼,Status 也會變成 “Cracked”。這時若要再破解一次,則會叫你直接用 “–show” 來顯示結果。可以把 “hashcat.potfile” 檔案刪除,就可以重來再破一次。
利用字典檔破解
hashcat 當然也支援使用字典檔破解,把最後的參數加入字典檔的路徑即可。這裡我們直接使用 John the Ripper 提供的字典檔,123456 是統計最熱門的密碼,當然也有在字典檔裡。
1 |
hashcat64 -a 3 -m 13600 d:\JtR_Custom\run\hash.txt d:\JtR_Custom\run\password.lst |
若要使用更大的字典檔,可以參考 壓縮檔密碼恢復好工具 – 公用字典檔 裡的字典檔。裡面有15億組密碼,使用顯卡約7小時可以試完所有的字。
結語
GPU 對破解速度的幫助,是顯而易見的。如果你本錢夠厚,如這篇文章 8 張 NVIDIA GTX 1080,可以達到本篇文章所用的 GTX 650Ti 144 倍的速度 (以MD5為比較基礎)。至於要不要花這麼多錢去搞個效能怪獸,就看資料對你重不重要了。
還有一點很遺憾的, hashcat 並不支援傳統的 ZipCrypto 加密方式,不然破解速度的增加,肯定是相當驚人的。
已经拜读了3篇文章,有很大收获。
个人觉得 Hashcat比JTR(John the Ripper)使用简单些,但支持的格式要少些,JTR官方升级很慢,但是有其它的版本更新很快,见下面的连接。
https://ci.appveyor.com/project/claudioandre-br/johntheripper/history
JTR 使用较复杂特别是那个rules,在john.conf 中的配置很不容易理解,目前我还没有弄明白,能不能做个简单的教程。
謝謝您的讚賞。這幾篇文章,主要還是自己使用上一時的興趣,實用上自己也只用來破解過2次。ZipCrypto可能是實際應上比較能破解,但偏偏HashCat又不支持,實在是有點無奈。其它常見的壓縮法 RAR / 7-ZIP,Hash 法其實也已經相當複雜,靠暴力法要破解真的需要一點好運。所以,才會找出字典法並上網搜了個15億筆密碼的檔案,死馬當活馬醫。
由於沒有特別深入研究破解各式密碼,可能就不再另外花時間研究JtR的設定檔了,在此跟您說聲抱歉了。
哦,谢谢了
为啥我跑五千个md5两分钟就跑完了字典是10万的也太快了吧,这是不是有什么问题
速度感覺還合理,md5本來就快,在 i5-4440 上一秒可以跑1000萬次。
痾 下面的原理跟機制解說完全錯誤,如果HASH是存在ZIP內部,解壓前比較的話,直接攔截記憶體就可以了,根本不需要暴力測試。所以HASH根本不在ZIP內部,而是HASH才是真正的加密的密碼,因為加密演算法要求金鑰(key)必須是固定長度,HASH計算結果的長度剛好是符合加密演算法的要求,使用者任意自訂長度的密碼(password)給HASH後成為固定長度的金鑰(key),好後續加密使用。
剛才查了一下 ZIP(PKZIP) 的密碼驗証機制(http://manpages.ubuntu.com/manpages/trusty/man1/fcrackzip.1.html),的確是有類似的加快驗証方法,但也不是把 HASH 直接存在裡面。謝謝kgame的賜教,這方面的確是我自己想的,看來是不正確。
作為工程師,建議資訊安全和密碼學知識也要加強一下比較好。
做為工程師,的確要學的還很多~~~
你好,請問你有1.8版的JtR嗎?目前最新版1.9 zip2john取出的hash無法給hashcat使用,1.8版網路也下載不到了…
目前 openwall.com 連不上,所以我也不太確定您的狀況。我文章裡的 1.8 Windows 特制版,文章裡面有 google drive 的連結了。