#1 初心者でも簡単に使えるhashcatの使い方

# hashcatについての紹介

## あいさつ

初めまして。この環境では「あまねみさ」という名前を借りて、情報を発信していこうと思っています。現在、ペンテスターとして働いていますが、技術系の記事は初心者にとって難解で、実際の使い方がよくわからないものも多いと感じています。（自分も最初は調べることから躓きましたｗ）

そこで、これから自分の知識整理も兼ねて、初心者でもわかりやすい形でツールや技術の使い方をシンプルにまとめていきます。よろしくお願いします。

## hashcatとは

hashcatは、hash値を使ってパスワードを解析するためのツールです。要するに、特定のhash値から対応するパスワードを見つけることができます。

# 下準備

## hashcatを使用するために必要なもの

1.hash値
2.PC（GPUを使ったほうが解析速度が速い）
3.忍耐力＝かなり時間かかることもあるため、特に複雑なパスワードでは推測をしていくことで解析時間を短くする方法が必要です。

## Installの手順
1.インストールコマンドの実行

```
$ sudo apt update && sudo apt install hashcat
```

## hashcatの基本の使い方

```
$ hashcat -m 0 -a 0 hash.txt word.txt'
```

基本的な使い方は上のような使い方です。
上のコマンドの詳細を説明していきます。

＊ `hash.txt`の中にviコマンドなどを使って自分が解析をしたいhash値を入れてください。
＊ `word.txt`は解析に使う辞書ファイルです。詳細は後程説明します。

# オプション

## hashcatの`-m`とは

`-m`とはhash typeを指定するオプションです。

＊hash typeとはhashcatでhash値を解析するときにhash値のタイプを自分で指定しないといけません。

ではどのようにしてhash値のタイプを知ることができるのでしょうか？？

> A. `hashid hash.txt`

これを実行すればhash typeを知ることができます。
hashcatはJohn the Ripperのように自動でハッシュタイプを判定する機能がないため実行時にhash typeを自分で指定する必要があります。
よく使うものを下に載せときます。

|ハッシュタイプ|特徴|-mで指定する値|
|---|---|---|
|MD5|32文字の16進数|-m 0|
|SHA-1|40文字の16進数|-m 100|
|SHA-256|64文字の16進数|-m 1400|
|bcrypt|Blowfish-based|-m 3200|
|NTLM|Windows パスワード|-m 1000|
|MySQL 5.x|SHA-1|-m 300|
|WPA/WPA2|Wi-Fi|-m 22000|
|SHA-512||-m 1800|
|Kerberos 5 TGS-REP|チケット|-m 13100|
|LM Hash|Windows古い形式|-m 3000|

詳細はこちらをご覧ください。
https://hashcat.net/wiki/doku.php?id=example_hashes

## hashcatの`-a`とは
`-a`とは攻撃モードを指定するオプションです。
でも、攻撃モードと言ってもわからない方も多いかと思われます。
hashcatには５つのアタックモードがあります。

|攻撃手法|-aで指定する値|
|---|---|
|辞書攻撃|-a 0|
|辞書の組み合わせ攻撃|-a 1|
|ブルートフォース攻撃|-a 3|
|辞書とマスクの組み合わせ攻撃|-a 5|
|マスクと辞書の組み合わせ攻撃|-a 7|

これらを完璧に説明することは難しいですができるだけわかりやすく説明してみます。

### 1.辞書攻撃

辞書攻撃とは辞書ファイル内の単語をハッシュ値と照合します。

```
$ hashcat -m 1500 -a 0 hash.txt rockyou.txt
```

裏を返せば辞書内にあるワードしかhashcatを使い解析をすることができません。
有名なところでいうと```rockyou.txt```です。
CTFではよく使われたりしています。
https://github.com/praetorian-inc/Hob0Rules/blob/master/wordlists/rockyou.txt.gz

### 2.辞書の組み合わせ攻撃

辞書の組み合わせ攻撃とは二つの辞書の単語を組み合わせて攻撃します。

```
$ hashcat -m 0 -a 1 hash.txt wordilst-1.txt wordlist-2.txt
```

例えば以下のような辞書1,辞書2があったとします。

```txt:辞書１
hellow
see
```

```txt:辞書２
good
other 
```

このような場合は

```
hellowgood
hellowother
seegood
seeother
```

このような感じで辞書の組み合わせ攻撃が行われます。

### 3.ブルートフォース攻撃
ブルートフォース攻撃とは総当たりで全組み合わせを試す攻撃です。そのため別名総当たり攻撃です。

```
$ hashcat -a 3 -m 0 hash.txt ?a?a?a?a?a?a?a?a
```

現実的ではないため最終手段になります。そのため相当の時間がかかるので高性能なGPUを積んだPCを使い攻撃をするまたは、下で説明する辞書とマスクの組み合わせ攻撃、マスクと辞書の組み合わせ攻撃で選択肢を狭めることをお勧めします。
`＊?a?a?a?a?a?a?a?a`
　これはフォーマットを自分で指定しています。

### 番外編

#### マスク攻撃とは？
マスク攻撃とは特定のパターンに基づいてパスワードの候補を生成する攻撃方法です。

```
?l: 小文字（a-z）
?u: 大文字（A-Z）
?d: 数字（0-9）
?s: 特殊文字（!@#$%^&*, etc.）
?a: 任意の文字（小文字、大文字、数字、特殊文字のすべて）
?b: 8ビットASCII文字
?1, ?2: カスタム文字
```

マスク自体は文字がどの形なのかを指定しているのでもしどれかわからないときは`?a`またはカスタム文字を指定して使うようにしましょう。

#### カスタム文字の使い方

```
$ hashcat -a 3 -m 0 hash.txt -1 '?l?d' '?1?1?1?1?1?1'
```

このように定義をすると小文字または数字で６文字の文字列に対してブルートフォースします。

やり方は実にシンプルで`-1`を箱として考えてください。（カスタムマスクは最大4つまで定義でき、`-2 xxx -3 xxx -4 xxx`のように定義できます。）
そして箱の中には何が入るかを定義します。今回は小文字と数字として定義しました。

そして最後にそのカスタム文字が何文字か（?1で一塊なので文字数分書く）を定義します。
今回は６文字ですので`'?1?1?1?1?1?1'``になりましたが５文字なら`'?1?1?1?1?1'`としても可能です。
そして５文字のカスタム文字と６文字目は特殊文字のみ！という定義も可能です。
やり方としては`'?1?1?1?1?1?s'`
これにより５文字の数字または小文字と６文字目の特殊文字という形式でパスワードの解析がされます。

マスクを使うために覚えといてほしいことは**カスタム以外は文字数がわかっているのならそのままフォーマットを指定する。もしカスタム文字を使うのなら先に箱を作り定義をする。**

以上を覚えておけば簡単に使えると思います。


ちなみに、パスワードが８文字以上で何文字かは予想できる文字列があるという推測できていると想定して考えてみようと思います。

#### 文字数の制限

単刀直入に言うと

```
$ hashcat -m 0 -a 3 hash.txt --increment --increment-min 8 --increment-max 15 '?d?d?d?d'
```

これで最低８文字目から１５文字目まで解析をすることができます。(00000000~999999999999999)
上で説明したように`?d`を`?a`に変えることですべての文字、数字に対応することができます。

### 4.辞書とマスクの組み合わせ攻撃
辞書とマスクの組み合わせ攻撃とは辞書ファイルの単語に対してマスクを適用します。
```
$ hashcat -m 0 -a 6 -o cracked.txt hash.txt wordlist.txt　'?l?u?d?l?l'
```

wordlist.txtの中身が`hellow`だった場合
このようなコマンドを実行すると`hellowaA1aa`のようなものが生成されます。
要するにwordlist.txtの中身とマスクで定義したものの組み合わせが辞書の単語の後に生成されます。

### 5.マスクと辞書の組み合わせ攻撃
マスクと辞書の組み合わせ攻撃とは辞書ファイルの単語に対してマスクを適応します。

```
$ hashcat -m 0 -a 7 -o cracked.txt hash.txt wordlist.txt　'?l?u?d?l?l'
```

wordlist.txtの中身が`hellow`だった場合
このようなコマンドを実行すると`aA1aahellow`のようなものが生成されます。
要するにwordlist.txtの中身とマスクで定義したものの組み合わせが辞書の単語の前にマスクが適用されます。逆になっているだけですね。

# 最後に

今回初めてQiitaに投稿してみました。
仕事をするにあたり頻繁に使用するツールの使い方を自分なりに初心者でもわかりやすく理解しやすいをモットーに投稿していこうと思うのでよろしくお願いします。