| # | Mode |
|---|---|
| 0 | Straight |
| 1 | Combination |
| 3 | Brute-force |
| 6 | ハイブリッド ワードリスト + マスク |
| 7 | ハイブリッド マスク + ワードリスト |
この攻撃パターンは「辞書攻撃」とも呼ばれます。言うことはありませんが、辞書が与えられた場合、hashcat は辞書の内容を行ごとに読み取り、各行のハッシュ値を計算し、ターゲットのハッシュ値と比較します。
例:
hashcat -a 0 -m 400 example400.hash example.dict
Baidu によると、Combination は名詞で、「組み合わせ、コンソーシアム、パスワードの組み合わせ、ジャンプスーツ」を意味します。この攻撃パターンは実は簡単で、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-bowrock
パラメータを追加 -j ‘^!’,実際に試した辞書は、
です。ハンティングパリ !ハンティングロック !キティパリ !キティロック !レインボーパリ !rainbowrock
パラメータ -k ‘^>’ を追加すると、実際に試みた辞書は次のとおりです。
hunting>paris 岩狩り キティ キティ パリ キティ ロック 雨>ボウパリ rain>bowrock
このルールってどんなルールなの?「$」、「^」は正規表現と似たような使い方をしているので、正規なのでしょうか?実はそうではありません。hashcat のルールは自分で実装されています。これはまた大きなコンテンツです。詳細については、Rule-based Attack
を参照してください。与えられた文字セットのさまざまな組み合わせを試します。hashcat の公式 wiki によると、この方法は時代遅れであり、完全に Mask-Attack に置き換えられているため、研究は行われません。
これは比較的新しい攻撃方法です。例は次のとおりです。
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」の文字セットを表します。以下の表に示します。
| ? | Charset |
|---|---|
| l | abcdefghijklmnopqrstuvwxyz |
| u | abcdefghijklmnopqrstuvwxyz |
| d | 0123456789 |
| H | 0123456789abcdef |
| H | 0123456789abcdef |
| s | !"#$%&'()*+,-./:;<=>?@[\]^_`~{|} |
| a | ?l?う?d?s |
| b | 0 – 0xff |
このようにして、「?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
以上の知識があれば、マスクを理解しやすい。マスクは複数のプレースホルダで構成され、各プレースホルダは文字セットであり、マスクはプレースホルダ文字セットの組み合わせです。プレースホルダの個数とパスワードの長さは等しい。このような設計は、単純に文字の集合とパスワードの長さを与えるよりも、どのようなメリットがあるのでしょうか。
誰かのパスワードが 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
もう一つの解決策は、パラメータ –increment を追加することです。このパラメータは、hashcat に指定されたマスクに従ってプレースホルダーから試し、指定された長さまで 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
は単に辞書を使用することに相当します:
hello00 はい01 ... ハロー99 ヴェルナー00 ヴェルナー01 ... werener99
コマンド:
hashcat -m 0 -a 7 md5.hash ?d? dexample.dict
は単に辞书を使うことと同じです。
00こんにちは 01こんにちは ... 99どうも ヴェルナー 01ヴェルナー ... 99ウェレナー