首先我沒有修過密碼學的課XD, 因此這篇文章應該不需要專業背景知識

前半段主要在說明一些解密的基本觀念

後半段主要在實戰用 hashcat 解 md5

先談談 md5 的用途

先不談hash, 解密, 讓我們先談談生活中什麼東西會被 hash, 或者我們常聽到的加密

  • 將明碼轉成暗碼, 還記得之前做一個案子, 我們直接將 password 存入 db, 對方就在開會的時候要求要先 md5 才進 db, 一是不想讓開發人員以肉眼辨識出密碼,二是預防 db 被 dump
  • 線上博奕網站,為了能讓用戶確認網站沒有作假,先將骰子的結果以 md5 加密, 而後將加密後變成暗碼的骰子結果送給用戶, 以便在開啟骰鐘的時候確認網站並未以各用戶下注結果來影響開盤, 通常為了防止那幾秒內用戶可能暴力破解 md5, 會將 md5 加上 salt 以防止 brute-force, 這部份後面會提到
  • 這是主要用途, 由於 md5 具有兩個特性, 1. 加密非常快速 2. 明碼一點點的修改就會影響整個 hash 結果, 所以常常用在檔案確認, 比如我傳了一個很大的檔案給別人, 傳輸完成時, 雙方將各自的檔案做 md5, 然後比較 hash 結果就可以知道是否有損毀, 而不是用一些千奇百怪的方式比對檔案

上面都看不懂也沒關係, 只要知道今天就是教各位如何將 8fb744b51a1f14e5e8cda4e4aec68e2f 轉回去 gordon

什麼是 oclHashcat ?

最近在玩 oclHashcat, 有別于 JTR 是 based on CPU 所開發出來的, oclHashcat 是一個 based on GPU 開發出來的解密軟體, 以下的文章主要是針對 md5 & md5crypt 解密來撰寫

md5 & md5crypt 這個 hash 本身的介紹我可能之後再補充說明, 基本上只需要知道 md5 & md5crypt 是個 不可逆的hash 就可以了, 另外 md5crypt 就是為了增加 md5 的強度, 所以連做 1000 次 md5

什麼是不可逆的 hash ?

為了要說明 不可逆的hash, 我講一個規則請大家照著做:

  1. 心理想著一個神秘數字
  2. 把這個數字乘以三
  3. 開三次方根
  4. 取前五位數
  5. 成以四
  6. 開四次方根
  7. 取前四位數

好! 我的答案是 1946

大家知道我原本心理面想什麼數字嗎?

應該不知道吧, ( 我的 hash 很不嚴謹啦, 基本上一個好的 hash 會有一些性質, 比如防止碰撞, 或者修改一個數字會讓整個 hash 面目全非之類的), 我想表達的是, 我們無法經由數學的方法去推論原本 hash 前的數字是什麼就是 不可逆的hash

如何對付不可逆的 hash

面對 不可逆的hash, 就是用暴力, 解密的做法就是 比誰 hash 比較快, hash 比較快的軟體就可以多多嘗試, 因此看到這類的工具都在強調自己用了什麼方法達到高速的 hash, 而不僅僅是強調自己是解密神器

打個比方, 某天我朋友 gordon 給了我一段訊息, 我的手機密碼用 md5crypt 加密知後是”$1$G9tXgHBN$ZsSy3hyxQ4sz74oppF9WP0”但是我忘記惹, 拜託幫幫我 我該怎麼辦呢?

我有以下條件在手上

  • $1$G9tXgHBN$ZsSy3hyxQ4sz74oppF9WP0 是不可逆的, 我沒有任何方法可以得知是什麼東西加密知後會變成 $1$G9tXgHBN$ZsSy3hyxQ4sz74oppF9WP0
  • 這是 gordon 平常自己用的密碼 經過 md5crypt hash 出來的
  • gordon 忘記他的密碼惹
  • 基於安全問性的問題, 系統把 明碼 ( gordon 平常自己打的密碼 ) 變成 暗碼 ( $1$G9tXgHBN$ZsSy3hyxQ4sz74oppF9WP0 )

我現在只知道 gordon的密碼 -> md5crypt -> $1$G9tXgHBN$ZsSy3hyxQ4sz74oppF9WP0, 那接下來我該怎麼辦?

  • 試試看他的生日 -> md5crypt -> 看看對不對
  • 試試看他的家電 …
  • 試試看無腦的0000 …
  • 試試看無腦的1234 …
  • 試試看無腦的5555 …
  • 試試看無腦的1379 …
  • 試試看…

總而言之就是試試看啊, 電腦比我們都更腦殘, 電腦哪知道 gordon 的生日多少阿, 所以電腦的方法就是瘋狂嘗試, 從 1 試到 100, 從 100 試到 1000

記得我有一次忘記腳踏車的四位數密碼鎖, 我決定每天試 500 個, 從 0000 到 9999 全部試試看, 果然總有一天被我試到答案了ㄏㄏ, 而且 20 天內, 根本輕輕鬆鬆阿, 這就是 BF, 喔不是 brute-force

現實生活中的解密

噢我當然知道你會說手機會鎖住, 聽說有人鎖好幾年喔, 沒錯你答對了, 所以我當然不會這樣去弄爆 gordon 的手機, 上面只是舉例啦ㄏㄏ

正常來說都是先 dump (痾我也不知道中文, 基本上就是透過 SQL injection 把別人的 db 整個弄出來) 出整個 db, 然後再自己慢慢的解密 db 裡面加密過的內容, 比如之前很嚴重的 SONY 內部資料外洩, Ashley Madison 大量個資外洩, 這些資料外洩後都是需要解密的

兩種 attack-modes

然而就算想要像上面那樣嘗試來嘗試去也得跟電腦說一個規則, 電腦才能慢慢嘗試, 以下是兩個我目前在用的方法

  • brute-force (暴力法)
  • dictionary (字典法)

brute-force ( 暴力法 )

主要就是從 a~z A~Z 0~9 就跟數數一樣一路往上數, 基本上就跟我解腳踏車鎖的邏輯一樣, 我一個一個往上嘗試,總有一天會猜到吧

dictionary ( 字典法 )

像查字典那樣, 試試看 gordon 會不會對, 再試試看 gordon123, amy, apple, book, java, jack123, 照著人類的規律去猜測, 就跟猜女朋友的密碼一樣, 照著生日, 喜好… 簡而言之依照著人類的邏輯去嘗試

目前我自己在測試的解密都是用字典, 字典如同上述是依照人類的慣用字去嘗試的, 所以安全等級較高的密碼看起來都是亂碼且位數很長

  • 亂碼的用意主要就是避免字典法, 因為字典查不到亂碼, 強迫你用暴力法
  • 位數很長的話大家可以試想一下叫你從 0 數到 100 比較久還是從 0 數到 1000000, 電腦也是一樣

密碼學中的 salt ( 加鹽 )

順帶一提有些網站會將客戶的密碼加上一串salt, salt是中文的 顧名思義就是加料的意思, 舉例來說:

  • 沒有 salt
    • gordon123 ( 字典查的到 )
  • 加上 salt ( salt 規則 SDFJDSH + 密碼 + DLSKFJHFD )
    • SDFJDSHgordon123DLSKFJHFD ( 變成我們上面說的亂碼了, 字典查不到, 長度又很長 )

好的hash ( Computer Science 的觀點 )

好的 hash 是個微妙的平衡, 好的hash不能太快也不能太慢

  • hash太慢
    • 假設有 100 個人想要登入, 每一次 hash 要 0.1 秒, 0.1 * 100 = 10, 光要處理完全部的登入就要十秒了,
  • hash太快
    • 一秒可以 hash 一兆次, 密碼會被輕易的破解

hashcat 破解 md5 來囉

安裝 hashcat

我用的系統如下

  • CentOS 7.2.1511
  • CPU Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
  • GPU Nvidia Tesla M2090
  1. 直接去 github clone 最新的 hashcat
  2. 進入 hashcat 資料夾底下
  3. 下載 OpenCL-Headers

    1
    2
    $ mkdir -p deps/OpenCL-Headers
    $ git clone https://github.com/KhronosGroup/OpenCL-Headers deps/OpenCL-Headers/CL
  4. make

    1
    $ make
  5. make install

    1
    $ make install

好了完成了超快ㄏㄏ

超簡單的 md5 解密

讓我們先製造一個簡單的 md5, 妳可以去這裡製造一個md5

我用 gordon 經過 md5 hash 之後變成 8fb744b51a1f14e5e8cda4e4aec68e2f

該是 hashcat 的表演時間囉, 請在 command line 輸入

1
$ ./hashcat -m 0 -a 3 "8fb744b51a1f14e5e8cda4e4aec68e2f"

說明:

./hashcat 執行 hashcat

-m 0 hashcat 支援超多種解密, -m 後面要告訴 hashcat 想要解的 hash type, md5 的代碼是 0

-a 3 -a 代表著 attack-mode, 總共五種, 前面所說的 brute-force 也就是暴力法代號是 3

8fb744b51a1f14e5e8cda4e4aec68e2f 最後就是我們的 hash

解密結果

將將將結果出來啦, gordon 解密時間比我家的 ping 還要低, 另外每秒嘗試的量到達 117.4M, 差不多是一億次嘗試

Imgur

真是太感動了 QQ

TODO

下次跟大家說說 md5 & md5crypt 是怎麼做的