[パスワードはなぜ複雑なものが必要か？] パスワードクラッキングの方法を解説!(macbook, john the ripper, hash-identifier)

## ハッシュ値とは

パスワードがDBなどに保存されるときに、パスワードをそのままの形で保存しておくと万が一パスワードが盗まれた場合、すぐにパスワードがわかってしまいます。

そのため、万が一DBからデータが流出した場合でもすぐにパスワードが使われないように、パスワードの保管にはハッシュ値を保管します。

基本的にログインの認証の際に、入力されたパスワードにハッシュの演算を行い、ハッシュ値同士を比較します。

基本的にハッシュ値から元のパスワードを復元することはできません。

しかし、パスワードリストをハッシュ化し、そのハッシュ値同士を照合することで、パスワードクラッキングが可能です。

今回はその手法を解説します。

### ハッシュ値生成サイト
こちらのサイトを使用して、パスワードとハッシュ値を生成してみます。

http://webadmin.jp/toolhash/

今回はpassword:test1
hash:b16ed7d24b3ecbd4164dcdad374e08c0ab7518aa07f9d3683f34c2b3c67a15830268cb4a56c1ff6f54c8e54a795f5b87c08668b51f82d0093f7baee7d2981181
アルゴリズム:SHA512

という結果を使用します。

このpasswordをハッシュ値から取得します。

nanoコマンドでhash値を格納するテキストファイルを作成します。

```terminal
% nano hash.txt
```

ファイルを開いたら解析するハッシュ値をペーストして、
「Control+O」で保存し
「Control+X」で編集を終了します。

### ハッシュ値の種類
ハッシュ値を生成するアルゴリズムはいくつかあるため、その種類を調べるために「hash-identifier」を使用します

https://github.com/blackploit/hash-identifier

こちらのgithub repositoryをクローンします。

```terminal
% git clone git@github.com:blackploit/hash-identifier.git
```

クローンできたらフォルダに移動し、hash-id.pyを実行します。

```terminal
% cd hash-identifier
```


```terminal
% python3 hash-id.py b16ed7d24b3ecbd4164dcdad374e08c0ab7518aa07f9d3683f34c2b3c67a15830268cb4a56c1ff6f54c8e54a795f5b87c08668b51f82d0093f7baee7d2981181
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------

Possible Hashs:
[+] SHA-512
[+] Whirlpool

Least Possible Hashs:
[+] SHA-512(HMAC)
[+] Whirlpool(HMAC)
--------------------------------------------------
 HASH: 

```

ハッシュの種類はSHA-512かWhirlpoolの可能性が高いという結果が出ました。


### パスワードクラッキング

では実際にパスワードクラッキングを行います。
今回はjohn the ripperというツールを使用します。

windowsでは"john the ripper"と検索して出てくるものを使えば良いですが、macだとなかったので、ターミナルからhomebrewを使用してjohn-jumboをインストールします

```terminal
% brew install john-jumbo
```

まずはjohnで使用できるフォーマットを調べます

```terminal
% john --list=formats | grep SHA
PBKDF2-HMAC-MD4, PBKDF2-HMAC-MD5, PBKDF2-HMAC-SHA1, PBKDF2-HMAC-SHA256, 
PBKDF2-HMAC-SHA512, PDF, PEM, pfx, pgpdisk, pgpsda, pgpwde, phpass, PHPS, 
RACF-KDFAES, radius, RAdmin, RAKP, rar, RAR5, Raw-SHA512, Raw-Blake2, 
Raw-Keccak, Raw-Keccak-256, Raw-MD4, Raw-MD5, Raw-MD5u, Raw-SHA1, 
Raw-SHA1-AxCrypt, Raw-SHA1-Linkedin, Raw-SHA224, Raw-SHA256, Raw-SHA3, 
Raw-SHA384, ripemd-128, ripemd-160, rsvp, Siemens-S7, Salted-SHA1, SSHA512, 
HMAC-MD5, HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384, HMAC-SHA512, 
PBKDF2-HMAC-MD5-opencl, PBKDF2-HMAC-SHA1-opencl, rar-opencl, RAR5-opencl, 
OpenBSD-SoftRAID-opencl, PBKDF2-HMAC-SHA256-opencl, 
PBKDF2-HMAC-SHA512-opencl, pem-opencl, pfx-opencl, pgpdisk-opencl, 
raw-MD4-opencl, raw-MD5-opencl, raw-SHA1-opencl, raw-SHA256-opencl, 
raw-SHA512-free-opencl, raw-SHA512-opencl, salted-SHA1-opencl, sappse-opencl, 
wpapsk-pmk-opencl, XSHA512-free-opencl, XSHA512-opencl, ZIP-opencl, dummy, 
```

この中にあるRaw-SHA512を使用します。

クラッキングには考えられるすべての文字列の組み合わせを試すブルートフォース（総当たり）とよくあるパスワードをまとめたものを使用する辞書攻撃があります。

今回は辞書攻撃で試します。

過去に流出したパスワードをまとめたrockyouというテキストファイルをとってきます。

https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt

ちなみに中身はこんな感じです

![スクリーンショット 2023-05-24 0.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706631/48462604-e34b-15de-6c9d-ce3f4557e436.png)

コマンドには
- フォーマット
- 辞書ファイル
- ハッシュ値のファイルを指定します

```terminal
% john --format=Raw-SHA512 --wordlist=rockyou.txt hash.txt

Using default input encoding: UTF-8
Loaded 1 password hash (Raw-SHA512 [SHA512 128/128 ASIMD 2x])
Press 'q' or Ctrl-C to abort, almost any other key for status
test1            (?)
1g 0:00:00:00 DONE (2023-05-24 00:14) 33.33g/s 4049Kp/s 4049Kc/s 4049KC/s thehunter..taunton
Use the "--show" option to display all of the cracked passwords reliably
Session completed
```

test1というパスワードが表示されていますね。

このようによくあるパスワードや、総当たりでも解析可能なパスワードを設定しまうと、万が一DBなどからハッシュ値が流出した場合、パスワードを特定される可能性があります。

気をつけましょう！

もしよかったらいいねやTwitterのフォローをしてもらえると嬉しいです
https://twitter.com/js_manabitai

## 参考

https://www.youtube.com/watch?v=eco_Ovvn8ao