hashcatの概要
hashcatはパスワードクラックのツールです。
hashcatで行うパスワードクラックは稼働しているシステムに対してアカウントがロックされるまでログイン試行を行うようなものではなく、パスワードのハッシュ値から元のパスワードを割り出すものです。
一般的にシステム上のパスワードに関しては平文で保持されるケースは稀で、NISTのガイドラインにおいても「パスワードは適切な一方向鍵導出関数を用いてソルト付きでハッシュ化されなければならない(SHALL)。」と記載されているため、パスワードの保存に関して平文での保存は認めていません。
hashcatによるパスワードクラック
hashcatはブルートフォース攻撃以外にもパスワードクラックの手法が実装されています。
辞書攻撃
辞書攻撃はパスワードの候補のリストを指定し、その中の単語を1つずつ試していく方法です。リストの例としては、「rockyou.txt」等があります。
コンビネーター攻撃
2つの単語をつなげたパスワードに対する攻撃です。
マスク攻撃
特定の形式のパスワードに対する攻撃です。
先頭が大文字で6文字の小文字が続き、末尾は数字1つといった形式を指定することが可能です。
ルールベース攻撃
対象のパスワードの構成に当たりがつく際に選択する攻撃手法です。
ブルートフォース攻撃
総当たりで試行する攻撃です。
なお、hashcatでは「-a」オプションで上記攻撃モードが指定できます。
オプション | モード名 | 内容 |
0 | Straight | 辞書攻撃 |
1 | Combination | コンビネーション攻撃 |
3 | Brute-force | ブルートフォース攻撃 |
6 | Hybrid Wordlist + Mask | 辞書+マスク |
7 | Hybrid Mask + Wordlist | マスク+辞書 |
hashcatでZipファイルのパスワードを解読する
実際にhashcatでパスワード付きZipファイルを解読してみます。
今回はKali Linux上で以下の操作を実行しました。
パスワード付きZIPの作成
以下のコマンドでパスワードが「pass」と設定したZipファイルを作成します。
echo "Hello!" > Hello.txt
zip -e --password=pass Hello.txt.zip Hello.txt
Zipからハッシュ値を取得の解読
johnの中に含まれるzip2johnを使ってZipファイルよりハッシュ値を取得します。
zip2john Hello.txt.zip | cut -d ":" -f 2 > Hello.txt.zip.hash
上記コマンドにより以下のようなハッシュ値が取得できます。
root@kali:~# cat Hello.txt.zip.hash
$pkzip2$1*2*2*0*13*7*b042d89e*0*43*0*13*b042*ab66*c354e2c6e579378c0784e27df319185a18104b*$/pkzip2$
取得したハッシュ値の形式を以下のサイトで確認します。
今回はpkzipに該当するもの(17200)を確認します。
ハッシュ値の探索
hashcatを使ってハッシュ値を探索します。以下のようなコマンドで実行します。
hashcat -m 17210 -a 3 Hello.txt.zip.hash --increment '?a?a?a?a'
- -m:ハッシュ形式の指定
- -a:アタックモードの指定
- --increment:あとに続くマスク形式'?a?a?a?a'の文字数に至るまで一文字ずつ増やす設定(この例では4文字まで実行)
- '?a?a?a?a':マスク指定
マスクの文字設定
オプション | 概要 | 内容 |
?l | アルファベット小文字 | abcdefghijklmnopqrstuvwxyz |
?u | アルファベット大文字 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
?d | 数字 | 0123456789 |
?s | 記号 | !”#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
?a | ?l?u?d?sと同じ | |
?b | 16進数 | 0x00 – 0xff |
上記を実行すると1分もしないうちに以下の結果が表示されます。
$pkzip2$1*2*2*0*13*7*b042d89e*0*43*0*13*b042*ab66*c354e2c6e579378c0784e27df319185a18104b*$/pkzip2$:pass
ここまでで、Zipファイルに設定したパスワードを解析できました。