
PACK(Password Analysis and Cracking Toolkit)は、パスワードリストの分析を支援するために開発されたユーティリティのコレクションです。マスク、ルール、文字セット、その他のパスワード特性のパターン検出を通じて、パスワードクラッキングを強化することを目的としています。このツールキットは、Hashcatファミリーのパスワードクラッカー用の有効な入力ファイルを生成します。
注: このツールキット自体はパスワードを解読することはできませんが、パスワードクラッカーの操作をより効率的にするために設計されています。
ツールキットを使用する前に、パスワードリストの選択基準を確立する必要があります。人々がどのようにパスワードを作成するかを分析したいため、できるだけ多くの漏洩パスワードのサンプルを入手する必要があります。そのような優れたリストの1つが、RockYou.comの侵害に基づくものです。このリストは、同様のサイト(例:ソーシャルネットワーキング)で使用される一般的なパスワードに対して良好な結果を提供する、大規模で多様なコレクションを提供します。このリストから得られた分析は、特定のパスワードポリシーを持つ組織には有効でない場合があります。そのため、サンプル入力の選択は、ターゲットにできるだけ近いものにする必要があります。また、既に解読されたパスワードに基づくリストの取得は避けてください。それは、実際のユーザーではなく、リストを解読した個人によって使用されたルールやマスクの統計的偏りを生むためです。
実行できる最も基本的な分析は、提供されたリスト内のパスワードの最も一般的な長さ、文字セット、およびその他の特性を単に取得することです。以下の例では、約1400万のパスワードを含む'rockyou.txt'を使用します。次のコマンドラインでstatsgen.pyを起動します。
$ python statsgen.py rockyou.txt
以下は上記のコマンドの出力です。
_
StatsGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected]
[*] Analyzing passwords in [rockyou.txt]
[+] Analyzing 100% (14344390/14344390) of passwords
NOTE: Statistics below is relative to the number of analyzed passwords, not total number of passwords
[*] Length:
[+] 8: 20% (2966037)
[+] 7: 17% (2506271)
[+] 9: 15% (2191039)
[+] 10: 14% (2013695)
[+] 6: 13% (1947798)
...
[*] Character-set:
[+] loweralphanum: 42% (6074867)
[+] loweralpha: 25% (3726129)
[+] numeric: 16% (2346744)
[+] loweralphaspecialnum: 02% (426353)
[+] upperalphanum: 02% (407431)
...
[*] Password complexity:
[+] digit: min(0) max(255)
[+] lower: min(0) max(255)
[+] upper: min(0) max(187)
[+] special: min(0) max(255)
[*] Simple Masks:
[+] stringdigit: 37% (5339556)
[+] string: 28% (4115314)
[+] digit: 16% (2346744)
[+] digitstring: 04% (663951)
[+] othermask: 04% (576324)
...
[*] Advanced Masks:
[+] ?l?l?l?l?l?l?l?l: 04% (687991)
[+] ?l?l?l?l?l?l: 04% (601152)
[+] ?l?l?l?l?l?l?l: 04% (585013)
[+] ?l?l?l?l?l?l?l?l?l: 03% (516830)
[+] ?d?d?d?d?d?d?d: 03% (487429)
...
注:--hiderareフラグを含めることで、出現頻度が1%未満の項目を表示しないようにし、外れ値を減らすことができます。
上記のリストからすぐにわかることは以下の通りです。
最後のセクション「Advanced Masks」には、Hashcat形式を使用した最も頻繁に出現するマスクが含まれています。各記号は次のように解釈できます。
?l - 小文字1文字
?u - 大文字1文字
?d - 数字1文字
?s - 特殊文字1文字
例えば、最初のマスク"?l?l?l?l?l?l?l?l"は、すべての小文字アルファベットパスワードに一致します。サンプルサイズを考慮すると、約4%のパスワードを解読できることになります。ただし、初期出力を生成した後、フィルタを使用してパスワードデータを絞り込むことに興味があるかもしれません。
RockYouユーザーが「stringdigit」単純マスク(文字列の後に数字)を使用してパスワードを選択する傾向を見てみましょう。
$ python statsgen.py ../PACK-0.0.3/archive/rockyou.txt --simplemask stringdigit -q --hiderare
[*] Analyzing passwords in [rockyou.txt]
[+] Analyzing 37% (5339556/14344390) of passwords
NOTE: Statistics below is relative to the number of analyzed passwords, not total number of passwords
[*] Length:
[+] 8: 23% (1267260)
[+] 7: 18% (981432)
[+] 9: 17% (939971)
[+] 10: 14% (750938)
[+] 6: 11% (618983)
[+] 11: 05% (294869)
[+] 12: 03% (175875)
[+] 13: 01% (103047)
[+] 14: 01% (65958)
[*] Character-set:
[+] loweralphanum: 88% (4720184)
[+] upperalphanum: 06% (325941)
[+] mixedalphanum: 05% (293431)
[*] Password complexity:
[+] digit: min(1) max(252)
[+] lower: min(0) max(46)
[+] upper: min(0) max(31)
[+] special: min(0) max(0)
[*] Simple Masks:
[+] stringdigit: 100% (5339556)
[*] Advanced Masks:
[+] ?l?l?l?l?l?l?d?d: 07% (420318)
[+] ?l?l?l?l?l?d?d: 05% (292306)
[+] ?l?l?l?l?l?l?l?d?d: 05% (273624)
[+] ?l?l?l?l?d?d?d?d: 04% (235360)
[+] ?l?l?l?l?d?d: 04% (215074)
...
出力の最上部には、分析された総パスワードの割合が指定されています。この場合、"stringdigit"マスクに一致するパスワードのみを解読することで、元の出力で表示された通り、全体の約37%しか回復できません。次に、このパスワードタイプのうち、小文字以外を使用しているのはわずか11%であることがわかります。したがって、このマスクに一致する小文字の文字列のみに集中するのが賢明です。最後に、「Advanced Mask」セクションでは、ほとんどの"stringdigit"パスワードが、その後に2桁または4桁の数字が続く文字列で構成されていることがわかります。上記の出力から得られた情報をもとに、ターゲットユーザーのパスワード生成パターンのイメージを作り始めることができます。
パスワードの長さ、マスク、および文字セット用に他にもいくつかのフィルタが利用可能です。
長さ: --minlength および/または --maxlength
単純マスク: --simplemask [numeric, loweralpha, upperalpha, mixedalpha, loweralphanum, etc.]
文字セット: --charset [digit, string, stringdigit, digitstring, digitstringdigit, etc.]
注:同じクラスの複数のフィルターは、カンマ区切りリストとして指定できます。
--simplemask="stringdigit,digitstring"
「Advanced Mask」セクションでは、全パスワードの1%を超えるパターンのみが表示されますが、以下のコマンドを使用して、特定の辞書に一致するパスワードマスクの完全なリストを取得して保存できます。
$ python statsgen.py rockyou.txt -o rockyou.masks
すべてのパスワードマスクとその頻度は、指定されたファイルにCSV形式で保存されます。もちろん、フィルタを提供して、指定されたパラメータに一致するマスクファイルのみを生成することもできます。出力ファイルは、次のセクションで説明するMaskGenツールへの入力として使用できます。
MaskGenを使用すると、Hashcatファミリーのパスワードクラッカーへの入力用に、パターンベースのマスク攻撃を作成できます。このツールは、上記のstatsgenで'-o'フラグを使用して生成された出力を使用して、マスクの複雑性、出現頻度、またはその比率(最適指数)でソートされた最も最適なマスク攻撃を生成します。
MaskGenをStatGenの出力のみを引数として実行してみましょう。
$ python maskgen.py rockyou.masks
_
MaskGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected]
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[*] Finished generating masks:
Masks generated: 146578
Masks coverage: 100% (14344390/14344390)
Masks runtime: >1 year
留意すべき情報がいくつかあります。
攻撃の作成と実行には通常時間制限があるため、maskgenでは攻撃に利用できる時間を指定でき、ソートモードに基づいて最も最適なマスクのコレクションを生成します。異なるソートモードとターゲット時間で少し試してみましょう。
$ python maskgen.py rockyou.masks --targettime 600 --optindex -q
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 779
Masks coverage: 56% (8116195/14344390)
Masks runtime: 0:11:36
$ python maskgen.py rockyou.masks --targettime 600 --complexity -q
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [complexity].
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 5163
Masks coverage: 31% (4572346/14344390)
Masks runtime: 0:10:01
$ python maskgen.py rockyou.masks --targettime 600 --occurrence -q
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [occurrence].
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 4
Masks coverage: 16% (2390986/14344390)
Masks runtime: 1:34:05
上記の実行はすべて、ターゲット時間が600秒(10分)で、異なるソートモードを使用しています。実験によると、OptIndexソートモードを使用して生成されたマスクは、約10分でRockYouパスワードの56%を解読できます。一方、Occurrenceソートモードを使用して生成されたマスクは、カバレッジがわずか16%と非常に弱いだけでなく、指定されたターゲット時間を1時間以上超過しています。
注:複雑性でソートされたマスクは、ポリシーベースのリストを攻撃する場合に非常に効果的です。
maskgenで生成されたマスクの一部を--showmasksフラグを使用して見てみましょう。
$ python maskgen.py rockyou.masks --targettime 43200 --optindex -q --showmasks
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[L:] Mask: [ Occ: ] [ Time: ]
...
[ 7] ?l?d?s?l?l?d?d [6 ] [ 0:00:00]
[ 8] ?s?l?l?l?l?l?l?s [3480 ] [ 0:05:36]
[ 9] ?l?l?l?l?d?d?d?d?s [1553 ] [ 0:02:30]
[ 8] ?d?l?d?d?d?l?l?l [47 ] [ 0:00:04]
[ 8] ?d?l?l?d?l?d?d?l [47 ] [ 0:00:04]
[ 8] ?d?l?l?d?d?l?d?l [47 ] [ 0:00:04]
[ 8] ?d?l?d?l?d?d?l?l [47 ] [ 0:00:04]
[ 8] ?d?d?l?l?d?l?d?l [47 ] [ 0:00:04]
[ 8] ?d?l?d?d?l?l?l?l [122 ] [ 0:00:11]
[ 8] ?u?u?d?u?d?d?d?d [18 ] [ 0:00:01]
[ 6] ?d?s?s?s?s?s [4 ] [ 0:00:00]
[10] ?l?l?l?l?l?l?l?l?d?d [213109 ] [ 5:48:02]
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 3970
Masks coverage: 74% (10620959/14344390)
Masks runtime: 16:10:38
表示されるマスクは、非常に直感的な形式に従っています。
[ 9] ?l?l?l?l?d?d?d?d?s [1553 ] [ 0:02:30]
\ \ \
\ _ 生成されたマスク \ _ マスク実行時間
\
_ マスク長 _ マスク出現回数
上記のサンプルでは、マスク生成に使用されるロジックの一部を見ることができます。たとえば、'?s?l?l?l?l?l?l?s'マスクはサンプル内で最も長い実行時間の1つ(5分)ですが、それでも'?l?l?l?l?d?d?d?d?s'よりも相対的に高い出現頻度を持つため、優先順位が高くなっています。同時に、'?l?d?s?l?l?d?d'はカバレッジがかなり低いものの、6文字マスクであるため非常に高速に実行されるため、他のマスクよりも優先順位が高くなります。
フィルタを使用して、生成されたマスク攻撃をさらに最適化できます。たとえば、8文字までのすべてのパスワードを単純にブルートフォースできるほど強力なハードウェアを持っている場合があります。その場合、--minlengthフラグを使用して、8文字より大きいマスクのみを次のように生成できます。
$ python maskgen.py rockyou.masks --targettime 43200 --optindex -q --minlength 8
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 585
Masks coverage: 41% (5905182/14344390)
Masks runtime: 15:50:36
当然、生成されたマスクのカバレッジは減少しましたが、これらのフィルタは、マスクの生成に使用されたものとは異なるパスワードリストを攻撃する際にマスクのコレクションを準備する場合に役立ちます。
以下は、使用できる追加のフィルタのリストです。
個別マスクフィルタオプション:
--minlength=8 最小パスワード長
--maxlength=8 最大パスワード長
--mintime=3600 最小マスク実行時間(秒)
--maxtime=3600 最大マスク実行時間(秒)
--mincomplexity=1 最小複雑性
--maxcomplexity=100
最大複雑性
--minoccurrence=1 最小出現回数
--maxoccurrence=100
最大出現回数
出現回数と複雑性のフラグは、異なるソートモードを使用して生成されたマスクを微調整するのに特に強力です。
上記で生成されたマスクに満足したら、-oフラグを使用して保存できます。
$ python maskgen.py rockyou.masks --targettime 43200 --optindex -q -o rockyou.hcmask
[*] Analyzing masks in [rockyou.masks]
[*] Saving generated masks to [rockyou.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 3970
Masks coverage: 74% (10620959/14344390)
Masks runtime: 16:10:38
これにより、'rockyou.hcmask'ファイルが生成されます。このファイルは、Hashcatスイートのツールで直接使用するか、それらをループするカスタムスクリプトの一部として使用できます。
生成されたマスクが既に解読されたリストに対してどの程度機能するかを確認することは、しばしば有用です。Maskgenは、あるパスワードリストからのマスクを別のリストに対して試行した場合にどれだけ機能するかを確認するために、マスクのコレクションを他のマスクと比較できます。RockYouリストから生成されたマスクが、Gawkerなどの別の侵害されたリストに対してどの程度機能するかを比較してみましょう。
$ python statsgen.py ../PACK-0.0.3/archive/gawker.dic -o gawker.masks
$ python maskgen.py gawker.masks --checkmasksfile rockyou.hcmask -q
[*] Analyzing masks in [gawker.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Checking coverage of masks in [rockyou.hcmask]
[*] Finished matching masks:
Masks matched: 1775
Masks coverage: 96% (1048889/1084394)
Masks runtime: 16:25:44
'--checkmasksfile'パラメータを使用して、先ほど生成した'rockyou.hcmask'ファイル内のマスクを、サンプル漏洩リスト'gawker.masks'からのマスクに対して実行しました。結果は良好な96%のカバレッジで、生成された3970個のRockYouベースのマスクのうち1775個がGawkerリストのマスクと一致しました。
また、次のようにコマンドラインで直接マスクを指定して、1つ以上のマスクのカバレッジを確認することもできます。
$ python maskgen.py gawker.masks --checkmasks="?u?l?l?l?l?l?d,?l?l?l?l?l?d?d" -q
[*] Analyzing masks in [gawker.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Checking coverage of the these masks [?u?l?l?l?l?l?d, ?l?l?l?l?l?d?d]
[*] Finished matching masks:
Masks matched: 2
Masks coverage: 1% (18144/1084394)
Masks runtime: 0:00:04
指定された両方のマスクは、わずか1%のカバレッジで一致しました。
正確なハードウェア仕様とターゲットハッシュによっては、計算中に使用するキー/秒の速度を増減したい場合があります。その場合は、'--pps'パラメータを使用します。
$ python maskgen.py rockyou.masks --targettime 43200 --pps 50000000 -q
[*] Analyzing masks in [rockyou.masks]
[*] Using 50,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 1192
Masks coverage: 61% (8754548/14344390)
Masks runtime: 12:17:31
'--pps'パラメータを実際のパフォーマンスに合わせて使用することで、ターゲット時間がより意味を持つようになります。
マスク攻撃や辞書攻撃の多くは、最小パスワード複雑性要件がある企業環境では失敗します。純粋なブルートフォース攻撃に頼る代わりに、既知または推測されたパスワード複雑性ルールを活用して、ポリシーに準拠していないパスワード候補を回避したり、逆に非準拠のパスワードのみを監査したりできます。PolicyGenを使用すると、パスワード複雑性に従ったマスクのコレクションを生成し、クラッキング時間を大幅に短縮できます。
以下は、少なくとも1つの数字、1つの大文字、および1つの特殊文字を必要とする環境に対して、有効なすべてのパスワードマスクを生成するサンプルセッションです。
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --minspecial 1 -o complexity.hcmask
_
PolicyGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected][*] Saving generated masks to [complexity.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
Pass Lengths: min:8 max:8
Min strength: l:1 u:1 d:1 s:1
Max strength: l:None u:None d:None s:None
[*] Generating [compliant] masks.
[*] Generating 8 character password masks.
[*] Total Masks: 65536 Time: 76 days, 18:50:04
[*] Policy Masks: 40824 Time: 35 days, 0:33:09
上記の出力から、指定された複雑さに適合する40824個のマスクが生成され、1,000,000,000 keys/秒の速度で約35日かかることがわかります。
単にパスワード監査を実行し、準拠していないパスワードだけを発見するタスクがある場合、--noncompliant フラグを指定して生成されたマスクを反転できます:
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --minspecial 1 -o noncompliant.hcmask -q --noncompliant
[*] Saving generated masks to [noncompliant.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
Pass Lengths: min:8 max:8
Min strength: l:1 u:1 d:1 s:1
Max strength: l:None u:None d:None s:None
[*] Generating [non-compliant] masks.
[*] Generating 8 character password masks.
[*] Total Masks: 65536 Time: 76 days, 18:50:04
[*] Policy Masks: 24712 Time: 41 days, 18:16:55
--showmasks フラグを使用して、上記で生成された非準拠マスクの一部を見てみましょう:
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --minspecial 1 -o noncompliant.hcmask -q --noncompliant --showmasks
[*] Saving generated masks to [noncompliant.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
Pass Lengths: min:8 max:8
Min strength: l:1 u:1 d:1 s:1
Max strength: l:None u:None d:None s:None
[*] Generating [non-compliant] masks.
[*] Generating 8 character password masks.
[ 8] ?d?d?d?d?d?d?d?d [l: 0 u: 0 d: 8 s: 0] [ 0:00:00]
[ 8] ?d?d?d?d?d?d?d?l [l: 1 u: 0 d: 7 s: 0] [ 0:00:00]
[ 8] ?d?d?d?d?d?d?d?u [l: 0 u: 1 d: 7 s: 0] [ 0:00:00]
[ 8] ?d?d?d?d?d?d?d?s [l: 0 u: 0 d: 7 s: 1] [ 0:00:00]
...
[ 8] ?s?s?s?s?s?s?s?d [l: 0 u: 0 d: 1 s: 7] [ 0:07:06]
[ 8] ?s?s?s?s?s?s?s?l [l: 1 u: 0 d: 0 s: 7] [ 0:18:28]
[ 8] ?s?s?s?s?s?s?s?u [l: 0 u: 1 d: 0 s: 7] [ 0:18:28]
[ 8] ?s?s?s?s?s?s?s?s [l: 0 u: 0 d: 0 s: 8] [ 0:23:26]
[*] Total Masks: 65536 Time: 76 days, 18:50:04
[*] Policy Masks: 24712 Time: 41 days, 18:16:55
ご覧のとおり、すべてのマスクには少なくとも1つのパスワード複雑さ要件が欠けています。興味深いことに、生成されるマスクが少ないほど、?s?s?s?s?s?s?s?s のような長時間実行されるマスクがあるため、攻撃により時間がかかります。
--maxlower、--maxupper、--maxdigit、--maxspecial フラグを使用して、攻撃を微調整するためにパスワードの最大複雑さを指定することもできます。たとえば、以下はパスワードポリシーを強制するが特殊文字を許可しないサンプルサイトです:
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --maxspecial 0 -o maxcomplexity.hcmask -q
[*] Saving generated masks to [maxcomplexity.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
Pass Lengths: min:8 max:8
Min strength: l:1 u:1 d:1 s:None
Max strength: l:None u:None d:None s:0
[*] Generating [compliant] masks.
[*] Generating 8 character password masks.
[*] Total Masks: 65536 Time: 76 days, 18:50:04
[*] Policy Masks: 5796 Time: 1 day, 20:20:55
rulegen.py は、Automatic Password Rule Analysis and Generation 論文で説明されているように、Hashcat パスワードクラッカーのためのパスワード分析とルール生成を実装しています。ルール分析と生成の理論に関する詳細な議論については、この文書を参照してください。
すでに解読されたパスワードから元のワードとワードマングリングルールを逆転させることは、まだ暗号化されたハッシュに対する攻撃を実行するのに非常に効果的です。生成されたルールとワードを継続的にリサイクル/拡張することで、より多くのパスワードを解読できる可能性があります。
rulegen.py を効果的に使用するには、いくつかの前提条件があります。このツールは Enchant スペルチェックライブラリを利用して、Aspell、MySpell などの多くのスペルチェックエンジンとインターフェースします。使用前にこれらのツールをインストールする必要があります。また、使用するスペルチェックエンジン用の辞書をインストールすることも重要です(代替として、カスタムワードリストを使用することも可能です)。最後に、便利なように PyEnchant をバンドルしています。これは Enchant の共有ライブラリと直接インターフェースするはずですが、問題がある場合は、バンドルされた 'enchant' ディレクトリを削除し、ディストリビューション用の PyEnchant をインストールしてください。
特定の Hashcat ルール構文の追加詳細については、Hashcat Rule Based Attack を参照してください。
rulegen.py の最も基本的な使用法は、単一のパスワードを分析してルールを自動的に検出することです。サンプルパスワード P@55w0rd123 を生成するために使用されたルールと潜在的な元のワードを検出してみましょう:
$ python rulegen.py --verbose --password P@55w0rd123
_
RuleGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected]
[*] Using Enchant 'aspell' module. For best results please install
'aspell' module language dictionaries.
[*] Analyzing password: P@55w0rd123
[-] Pas sword => {edit distance suboptimal: 8 (7)} => P@55w0rd123
[+] Password => sa@ ss5 so0 $1 $2 $3 => P@55w0rd123
[+] Passwords => sa@ ss5 so0 o81 $2 $3 => P@55w0rd123
[+] Passwords => sa@ ss5 so0 i81 o92 $3 => P@55w0rd123
[+] Passwords => sa@ ss5 so0 i81 i92 oA3 => P@55w0rd123
[+] Password's => sa@ ss5 so0 o81 o92 $3 => P@55w0rd123
[+] Password's => sa@ ss5 so0 o81 i92 oA3 => P@55w0rd123
[+] Password's => sa@ ss5 so0 i81 o92 oA3 => P@55w0rd123
この例で使用したいくつかのフラグは次のとおりです:
パスワードファイルの処理については以下のセクションで説明しますが、最初に単一のパスワードを例にして利用可能ないくつかの微調整オプションについて説明します。
元のワード検出に aspell Enchant モジュールを使用していることに注意してください。正確なスペルチェックエンジンは、次のように --provider フラグを使用して変更できます:
$ python rulegen.py --verbose --provider myspell --password P@55w0rd123 -q
[*] Using Enchant 'myspell' module. For best results please install
'myspell' module language dictionaries.
...
注意:プロバイダーエンジンの優先順位は、カンマ区切りのリストで指定できます(例:--provider aspell,myspell)。
元のワード検出エンジンの使用は、--word フラグで元のワードを指定することで完全に無効にできます:
$ python rulegen.py -q --verbose --word word --password P@55w0rd123
[*] Analyzing password: P@55w0rd123
[+] word => ^5 ^5 ^@ ^P so0 $1 $2 $3 => P@55w0rd123
異なる元のワードを指定することで、ルール生成エンジンを試して多くの楽しみを得ることができます。
標準のスペルチェックエンジンのワードリストを使用してルールを生成するだけでは不十分な場面に必ず遭遇するでしょう。--wordlist フラグを使用してカスタムワードリストを指定できます。これは、以前の分析セッションから元のワードを再利用する場合に特に便利です:
$ python rulegen.py -q --verbose --wordlist rockyou.txt --password 1pa55w0rd1
[*] Using Enchant 'Personal Wordlist' module. For best results please install
'Personal Wordlist' module language dictionaries.
[*] Analyzing password: 1pa55w0rd1
[+] password => ^1 ss5 so0 $1 => 1pa55w0rd1
カスタムワードリストは、スラングのように通常見つからない単語や、すでに解読されたパスワードを使用する場合に特に便利です。
rulegen.py は最適な元のワードとパスワードのみを生成して記録しようとしますが、より多くの結果が必要な場合もあります。--morewords フラグと --morerules フラグを使用して、最適な編集距離を超える可能性のあるワードとルールを生成します:
$ python rulegen.py -q --verbose --password '$m0n3y$' --morerules --morewords
[*] Using Enchant 'aspell' module. For best results please install
'aspell' module language dictionaries.
[*] Analyzing password: $m0n3y$
[+] money => ^$ so0 se3 $$ => $m0n3y$
[+] moneys => ^$ so0 se3 o6$ => $m0n3y$
[+] mingy => ^$ si0 sg3 $$ => $m0n3y$
[+] many => ^$ sa0 i43 $$ => $m0n3y$
[+] Mooney => sM$ o1m so0 se3 $$ => $m0n3y$
--maxworddist フラグと --maxwords フラグを使用して、生成されるワードをさらに拡張することが可能です。同様に、--maxrulelen フラグと --maxrules フラグを使用して、より多くのルールを生成できます。
rulegen.py には、より高品質なワードとルールを生成するためのいくつかの高度なエンジンが含まれています。--simplewords フラグと --simplerules フラグを使用して、それらを無効にして違いを観察することができます(または問題が発生している場合)。これらのフラグをオンにしたときに元のワードとルールがどのように変化するかを見てみましょう:
$ python rulegen.py -q --verbose --password '$m0n3y$' --simplewords --simplerules
[*] Using Enchant 'aspell' module. For best results please install
'aspell' module language dictionaries.
[*] Analyzing password: $m0n3y$
[-] Meany => {edit distance suboptimal: 5 (4)} => $m0n3y$
[+] many => i0$ o20 i43 i6$ => $m0n3y$
[+] mingy => i0$ o20 o43 i6$ => $m0n3y$
[+] money => i0$ o20 o43 i6$ => $m0n3y$
[+] mangy => i0$ o20 o43 i6$ => $m0n3y$
[+] manky => i0$ o20 o43 i6$ => $m0n3y$
生成されたワードとルールの品質が大幅に低下し、'manky' のような単語は実際の元のワード 'money' との関係が少なくなっていることに注意してください。同時に、生成されたルールは単純な挿入、削除、置換に減少しました。
これでさまざまなフラグとスイッチを習得したので、パスワードのコレクションに対してワードとルールを生成してみましょう。次のようなかなり複雑なテストパスワードを含むテキストファイル korelogic.txt を生成します:
&~defcon
'#(4)\
August19681
'&a123456
10-D'Ann
~|Bailey
Krist0f3r
f@cebOOK
Nuclear$(
zxcvbn2010!
13Hark's
NjB3qqm
Sydney93?
antalya%]
Annl05de
;-Fluffy
次に、最初の引数としてパスワードファイルを指定するだけで rulegen.py の分析を観察します:
$ python rulegen.py korelogic.txt -q
[*] Using Enchant 'aspell' module. For best results please install
'aspell' module language dictionaries.
[*] Analyzing passwords file: korelogic.txt:
[*] Press Ctrl-C to end execution and generate statistical analysis.
[*] Saving rules to analysis.rule
[*] Saving words to analysis.word
[*] Finished processing 16 passwords in 1.00 seconds at the rate of 15.94 p/sec
[*] Generating statistics for [analysis] rules and words.
[-] Skipped 0 all numeric passwords (0.00%)
[-] Skipped 2 passwords with less than 25% alpha characters (12.50%)
[-] Skipped 0 passwords with non ascii characters (0.00%)
[*] Top 10 rules
[+] ^3 ^1 o4r - 3 (2.00%)
[+] i61 i79 i86 i98 oA1 - 2 (1.00%)
[+] ^- ^0 ^1 i4' o5A - 2 (1.00%)
[+] sS1 i13 T2 - 1 (0.00%)
[+] i61 se9 i86 i98 oA1 - 1 (0.00%)
[+] o61 i79 i86 i98 oA1 - 1 (0.00%)
[+] ^- ^0 ^1 so' i5A - 1 (0.00%)
[+] D3 si0 i55 $e - 1 (0.00%)
[+] i61 i79 se6 i98 oA1 - 1 (0.00%)
[+] i3a o5y o6a i7% o8] - 1 (0.00%)
[*] Top 10 words
[+] Analyze - 1 (0.00%)
[+] defcon - 1 (0.00%)
[+] Kristen - 1 (0.00%)
[+] Bailey - 1 (0.00%)
[+] Augusts - 1 (0.00%)
[+] Annelid - 1 (0.00%)
[+] Hack's - 1 (0.00%)
[+] antlers - 1 (0.00%)
[+] antelope - 1 (0.00%)
[+] xxxv - 1 (0.00%)
すべてのデフォルト設定を使用して、いくつかの高品質なルールを生成できました。アプリケーションは上位10のルールとワードの統計を表示します。生成されたすべてのルールとワードは、デフォルトでベース名 'analysis' を使用して保存されます:
'#(4)\ や '&a123456 などのいくつかのパスワードは、処理に十分な特性がないためスキップされたことに注意してください。アルファベット文字数以外にも、プログラムはすべて数字のパスワードと非ASCII文字を含むパスワードをスキップします。後者はEnchantエンジンのバグによるもので、将来的に修正して多くの言語の単語処理を可能にしたいと考えています。
前述のように、rulegen.py はデフォルトで 'analysis' ベース名を使用して出力ファイルを保存します。次のように --basename フラグまたは -b フラグでファイルのベース名を変更できます:
$ python rulegen.py korelogic.txt -q -b korelogic
[*] Using Enchant 'aspell' module. For best results please install
'aspell' module language dictionaries.
[*] Analyzing passwords file: korelogic.txt:
[*] Press Ctrl-C to end execution and generate statistical analysis.
[*] Saving rules to korelogic.rule
[*] Saving words to korelogic.word
Hashcat パスワードクラッカーのルール生成で問題が発生する場合があります。rulegen.py には、hashcat 自体を --stdout モードで実行して生成されたワードとルールを検証する --hashcat フラグが含まれています。このモードを正しく動作させるには、最新バージョンの hashcat-cli をダウンロードし、ソース内の HASHCAT_PATH 変数を編集する必要があります。例えば、この記事の執筆時点では、hashcat-0.## フォルダを PACK ディレクトリに配置し、HASHCAT_PATH を 'hashcat-0.##/' と定義しています。
--debug フラグを使用して、ルール生成エンジンの内部動作を観察することもできます。特定のルールの失敗に関するメッセージを気にしないでください。これは、最適で有効な解決策を見つけようとする停止問題ソルバーの結果です。
このガイドでは、パスワードの分析、ルールの逆転、マスクの生成に関する多くの方法を紹介しましたが、まだ発見されるのを待っている多くのトリックがあります。カバーされたツールの珍しい使用方法や提案があれば、ぜひお聞かせいただけると嬉しいです。
それでは、良いクラッキングを!
-Peter