| # | モード |
|---|---|
| 0 | ストレート |
| 1 | 組み合わせ |
| 3 | ブルートフォース |
| 6 | ハイブリッド ワードリスト + マスク |
| 7 | ハイブリッド マスク + ワードリスト |
この攻撃パターンは「辞書攻撃」とも呼ばれています。言うことはありませんが、辞書が与えられた場合、hashcat は辞書の内容を行ごとに読み取り、各行のハッシュ値を計算し、ターゲットのハッシュ値と比較します。
例:
hashcat -a 0 -m 400 example400.hash example.dict
Baidu は、組み合わせは名詞で、「組み合わせ、コンソーシアム、パスワードの組み合わせ、ジャンプスーツ」を意味すると教えてくれました。この攻撃パターンは実は簡単で、2つのパスワード辞書の内容を組み合わせることです。この攻撃モードを使用するには、2つのパスワード辞書を指定する必要があります。2 つのパスワード辞書 dict1.txt と dict2.txt があるとします。その内容は次のとおりです:
hunting キティ レインボー
および
パリ rock
コマンド:
hashcat -m 0 -a 1 hash.txt dict1.txt dict2.txt
実際に試みた辞書は次のとおりです:
huntingparis ハンティングロック キティパリ キティロック レインボーパリ rainbowrock
dict1.txtの単語は左、dict2.txtの単語は右、合計3×2=6個です。
このモードに関連するパラメータは次のとおりです。
-j, --rule-left -k, --rule-right
-j の後のルールは左側に作用し、-k の後のルールは右側に作用します。パラメータ -j '$-' を追加すると、実際に試した辞書は次のとおりです:
hunting-paris ハンティングロック キティパリ キティロック rain-bowparis rain-bowrock
パラメータを追加 -j '^!',実際に試した辞書は、
です。ハンティングパリ !ハンティングロック !キティパリ !キティロック !レインボーパリ !rainbowrock
パラメータ -k '^>' を追加すると、実際に試した辞書は次のようになります:
hunting>paris 狩猟>岩 キティ>パリ キティ>ロック 雨>ボウパリス rain>bowrock
このルールはどんなルールなのでしょうか?「$」、「^」は正規表現と似たような使い方をしているので、正規なのでしょうか?実はそうではありません。hashcat のルールは自分で実装されています。これはまた大きなコンテンツです。詳細については、Rule-based Attack
を参照してください。与えられた文字セットのさまざまな組み合わせを試します。hashcat の公式 wiki によると、この方法は時代遅れであり、マスク攻撃に完全に置き換えられているため、研究は行われません。
これは比較的新しい攻撃方法です。例は次のとおりです。
hashcat -a 3 -m 0 MD5.hash ?l?l?l?l?l
「攻撃モード」表では、-A 3はブルートフォースに対応していますが、実際には、-A 3はマスク攻撃を使用しています。マスク攻撃は高度なブルートフォースと見なすことができます。
-m パラメータはハッシュ関数のタイプを指定するために使用されます。MD5.hash ファイルには MD5 値が格納されます。肝心なのは最後の文字列「?l?l?l?l?l?l?l」で、このような文字列をmaskと呼びます。
マスクは、いくつかのプレースホルダからなる文字列です。「?l」はプレースホルダーであり、「?」はキーワードであり、後続の「l」を修飾するために使用されます。「?l」は、「?l」に加えて、「?u」、「?d」、「?h」、「?h」、「?s」、「?a」、「?b」の文字セットを表します。以下の表に示します。
| ? | 文字セット |
|---|---|
| l | abcdefghijklmnopqrstuvwxyz |
| u | abcdefghijklmnopqrstuvwxyz |
| d | 0123456789 |
| H | 0123456789abcdef |
| H | 0123456789ABCDEF |
| s | !"#$%&'()*+,-./:;<=>?@[\]^_`~{|} |
| a | ?l?う?d?s |
| b | 0 – 0xff |
このようにして、「?l?l?l?l?l?l?l」は実際にはパスワード辞書と同等であることがわかります:
aaaaa ああああ ... zzzzz
同様に、「?l?u?d」はパスワード辞書に相当します:
aA0 aA1 ... bA0 ... zZ9
上の表の文字セットはhashcatに组み込まれており、文字セットを自分で指定することもできます。
--custom-charset1=文字セット1 --custom-charset2=文字セット2 --custom-charset3=文字セット3 --custom-charset4=文字セット4
パラメータ –custom-charsetN は -N と略すことができます。例えば、–custom-charset1 は -1 と略すことができます。-N で指定された文字のセットは、マスク内でプレースホルダ "?N" として指定されます。たとえば、
-1 abc123 ?1?1?1
はパスワード辞書に相当します。
aaa aab … aa3 … 333
-Nは、文字集合を表す文字列に加えて、文字集合が格納されている.hcchrで終わるファイルでもよい。hashcat には、インストール パッケージの charsets/ ディレクトリにある .hcchr ファイルが多数付属しています。
プレースホルダ「??」が表す文字の集合は「?」そのものです。さらに、残りの文字がプレースホルダとして使用される場合、文字自体を表します。たとえば、「?lwerner?d」はパスワード辞書に相当します:
awerner0 アワーナー1 … zwerner9
以上の知識があれば、mask を理解しやすい。マスクは複数のプレースホルダで構成され、各プレースホルダは文字セットであり、マスクはプレースホルダ文字セットの組み合わせです。プレースホルダの個数とパスワードの長さは等しい。このような設計は、単純に文字の集合とパスワードの長さを与えるよりも、どのようなメリットがあるのでしょうか。
誰かのパスワードが合計 7 桁であることがわかっているとします。最初の桁は大文字、次の 3 桁は小文字、最後の 3 桁は数字です。伝統的な暴力クラッキングの場合、文字セット A-Z、A-Z、0-9 が必要で、合計 62 文字で、最大 62^7=3 521 614 606 208 回の試行が必要で、兆レベルです。このパスワードをマスクで記述すると、「\u\l\l\l\d\d\d」となり、計算が簡単で、(26^4)×(10^3)=456 976 000の可能性があり、億レベルで、前の方法より4桁減少した。
一歩退いて言えば、たとえパスワードの分布が分からなくても、マスクを使えば従来の暴力クラッキングの効果を簡単にシミュレートできます。
今の問題は、マスクが固定されていることです。その中のプレースホルダーの数が死んでいます。パスワードの長さがわからない場合はどうすればよいですか。パスワードが長すぎるのはまだいいですが、もし人のパスワードが3桁しかなくて、私たちのプレースホルダーが4つあって、どうしても解けないのは損ではないでしょうか。まさか1から、それぞれの長さのマスクを一通り書くのでしょうか?それはどんなに面倒なことでしょう。
には 2 つの解決策があります。1 つは mask ファイルを使用して、1 つのファイルに複数の mask を書き込み、コマンド ラインでこのファイルを指定することです。マスクファイルは.hcmaskで終わる必要があることに注意してください。
test.hcmask の内容は次のとおりです。
?lさん ?l?lさん ?l?l?lさん ?l?l?l?l
次のコマンドを使用してファイルを使用します。
hashcat -m 0 -a 3 --show MD5.hash test.hcmask
もう 1 つの解決策は、パラメータ –increment を追加することです。このパラメータは、hashcat に指定されたマスクに従ってプレースホルダーを 1 つから試し、指定された長さまで 2 つ、3 つを試します。次のようにプレースホルダ「abc」を書き、次の文字列のmd5値を計算します。
A:0cc175b9c0f1b6a831c399e269772661 b:92eb5ffee6ae2fec3ad71c777531578f c:4a8a08f09d37b73795649038408b5f33 ab:187ef4436122d1cc2f40dc2b92f0eba0 ac:e2075474294983e013ee4dd2201c7a73 ba:07159c47ee1b19ae4fb9c40d480856c4 bc:5360af35bde9ebd8f01f492dc059593c ca:5435c69ed3bcc5b2e4d580e393e373d3 cb:d0d7fdb6977b26929fb68c6083c0b439 abc:900150983cd24fb0d6963f7d28e17f72 abc:900150983cd24fb0d6963f7d28e17f72 bac:79ec16df80b57696a03bb364410061f3 bca:b64eab8ce39e013604e243089c687e4f cba:3944b025c9ca7eec3154b44666ae04a0 cab:16ecfd64586ec6c1ab212762c2c38a90
「:」の前にハッシュ値を計算する元の文字列があり、「:」の後に計算されたhasn値があります。上記の内容をファイル MD5.hash に保存し、次のコマンドを実行します。
hashcat -m 0 -a 3< --show --username MD5.hash abc
パラメータ –username を追加するのは、各ハッシュ値の前に元の文字列があるためです。このパラメータを追加すると、hashcat は正しいハッシュ値が見つからないことを示します。このパラメータを追加すると、hashcat はハッシュ値の前の文字列がハッシュ値のユーザー名であると判断し、ハッシュ値をスムーズにロードできます。
実行した結果、ハッシュは 1 つだけ解決されました:
900150983cd24fb0d6963f7d28e17f72:abc
次にパラメータ –increment を追加し、再度実行します:
hashcat -m 0 -a 3 --show --increment --username MD5.hash abc
今回、さらに 2 つのハッシュが解けました:
0cc175b9c0f1b6a831c399e269772661:a 187ef4436122d1cc2f40dc2b92f0eba0:ab
–increment が働いていることがわかります。しかし同時に、このパラメータがあれば、hashcatはA、ab、abcを順番に試すだけで、プレースホルダを順番に並べて組み合わせたり、さまざまな可能性を試したりすることはないこともわかっています。
ハイブリッド攻撃は 2 つの辞書を組み合わせたコンビネーター攻撃と似ていますが、ハイブリッド攻撃は辞書とマスクをハイブリッド化します。
次のような辞书example.dictがすでにあるとします。
こんにちは werner
コマンド:
hashcat -m 0 -a 6 MD5.hash example.dict ?d?d
単に辞書を使用することに相当します:
こんにちは00 こんにちは01 … こんにちは99 ヴェルナー00 ヴェルナー01 … werener99
コマンド:
hashcat -m 0 -a 7 MD5.hash ?d? dexample.dict
単に辞書を使用することに相当します:
00hello 01こんにちは … 99こんにちは 00ヴェルナー 01ヴェルナー … >99werener