目次
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を使ったパスワードクラックの例
hashcatを使ったパスワードクラックの操作について以下に記載します。
1.pwdump形式のパスワードクラック
pwdumpとは
pwdumpは、SAMデータベース等からアカウントのLMおよびNTLMのパスワードハッシュを出力するWindowsのプログラムの名称です。
この形式で出力されたファイルは以下のようになります。
上記「Jon」の例でみてみると以下のような構成になります。
- 「Jon」:ユーザー名
- 1000:相対識別子 (500 は管理者、502はKerberosアカウント等)
- aad3b435b51404eeaad3b435b51404ee:LMハッシュ
- ffb43f0de35be4d9917ac0cc8ad57f8d:NTLMハッシュ
pwdump形式のパスワードクラック
上記のJonの内容をそのままファイルに貼り付けて保存(以下の例では「jonorg」とします)し、以下のコマンドで解析を行います。
hashcat -m 1000 -a 0 ./jonorg rockyou.txt
オプションの説明
- -m 1000 :ハッシュタイプ(この場合はNTLM)を指定します。
- -a 0 :攻撃モード(この場合は辞書攻撃)を指定します。
- ./jonorg :解析したいハッシュが含まれるpwdump形式のファイルです。
- rockyou.txt :使用する辞書ファイルです。
なお、hashcatは一度解析したパスワードハッシュ値を「hashcat.potfile」として記録し、一度解析したハッシュ値を解析対象から除外します。
ご参考:ファイルのパス
~/.local/share/hashcat/hashcat.potfile
そのため、過去の解析分を削除し、新たに解析を行うには、Hashcatが生成したhashcat.potfileファイルを削除または「--potfile-disable」のオプションを指定して実行します。
2.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ファイルに設定したパスワードを解析できました。
その他:hash形式の特定方法
hash値を取得しても、それがどの形式なのかわからないことがあります。
以下はhash形式の識別方法を記載します。
hash-identifier
上記コマンドを実行し、 HASH:に求めたいハッシュ値を入力します。
hashid
hashidの引数にハッシュ値を渡して実行します。引数にはファイル名も指定できます。
ご参考:Hack The Boxでの利用例
オンラインでセキュリティスキルの勉強ができるHack The Box(HTB)で実際にhashcatを使用したマシンの記事を以下に記載します。
【Hack The Box】Sunday - 家studyをつづって
【Hack The Box】node - 家studyをつづって
【Hack The Box】Previse - 家studyをつづって
【Hack The Box】Delivery - 家studyをつづって
【Hack The Box】Armageddon - 家studyをつづって