Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
pack — PACK (パスワード解析およびクラッキングキット) | Kitploit
ツール/GitHubGitHub/iphelix/pack
パスワードクラッキングパスワード攻撃ハッシュ分析ユーティリティとフレームワーク
GitHubiphelix/pack

pack

PACK (パスワード解析およびクラッキングキット)

リポジトリを見るウェブサイト
8901747年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Password Analysis and Cracking Kit by Peter Kacherginsky (iphelix)

PACK(Password Analysis and Cracking Toolkit)は、パスワードリストの分析を支援するために開発されたユーティリティのコレクションです。マスク、ルール、文字セット、その他のパスワード特性のパターン検出を通じて、パスワードクラッキングを強化することを目的としています。このツールキットは、Hashcatファミリーのパスワードクラッカー用の有効な入力ファイルを生成します。

注: このツールキット自体はパスワードを解読することはできませんが、パスワードクラッカーの操作をより効率的にするために設計されています。

分析のためのパスワードリストの選択

ツールキットを使用する前に、パスワードリストの選択基準を確立する必要があります。人々がどのようにパスワードを作成するかを分析したいため、できるだけ多くの漏洩パスワードのサンプルを入手する必要があります。そのような優れたリストの1つが、RockYou.comの侵害に基づくものです。このリストは、同様のサイト(例:ソーシャルネットワーキング)で使用される一般的なパスワードに対して良好な結果を提供する、大規模で多様なコレクションを提供します。このリストから得られた分析は、特定のパスワードポリシーを持つ組織には有効でない場合があります。そのため、サンプル入力の選択は、ターゲットにできるだけ近いものにする必要があります。また、既に解読されたパスワードに基づくリストの取得は避けてください。それは、実際のユーザーではなく、リストを解読した個人によって使用されたルールやマスクの統計的偏りを生むためです。

StatsGen

実行できる最も基本的な分析は、提供されたリスト内のパスワードの最も一般的な長さ、文字セット、およびその他の特性を単に取得することです。以下の例では、約1400万のパスワードを含む'rockyou.txt'を使用します。次のコマンドラインでstatsgen.pyを起動します。

root@kitploit:~
$ python statsgen.py rockyou.txt

以下は上記のコマンドの出力です。

root@kitploit:~
                       _
     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%未満の項目を表示しないようにし、外れ値を減らすことができます。

上記のリストからすぐにわかることは以下の通りです。

  • ほとんどのパスワードの長さは6〜10文字です。
  • パスワードの大部分は小文字+数字の文字セットです。
  • 明らかな最小または最大のパスワード複雑性はありません。
  • 分析されたパスワードは、「文字列の後に数字」という単純なマスクに従う傾向があります。

最後のセクション「Advanced Masks」には、Hashcat形式を使用した最も頻繁に出現するマスクが含まれています。各記号は次のように解釈できます。

root@kitploit:~
?l - 小文字1文字
?u - 大文字1文字
?d - 数字1文字
?s - 特殊文字1文字

例えば、最初のマスク"?l?l?l?l?l?l?l?l"は、すべての小文字アルファベットパスワードに一致します。サンプルサイズを考慮すると、約4%のパスワードを解読できることになります。ただし、初期出力を生成した後、フィルタを使用してパスワードデータを絞り込むことに興味があるかもしれません。

フィルタの使用

RockYouユーザーが「stringdigit」単純マスク(文字列の後に数字)を使用してパスワードを選択する傾向を見てみましょう。

root@kitploit:~
$ 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.]

注:同じクラスの複数のフィルターは、カンマ区切りリストとして指定できます。

root@kitploit:~
--simplemask="stringdigit,digitstring"

高度なマスクの保存

「Advanced Mask」セクションでは、全パスワードの1%を超えるパターンのみが表示されますが、以下のコマンドを使用して、特定の辞書に一致するパスワードマスクの完全なリストを取得して保存できます。

root@kitploit:~
$ python statsgen.py rockyou.txt -o rockyou.masks

すべてのパスワードマスクとその頻度は、指定されたファイルにCSV形式で保存されます。もちろん、フィルタを提供して、指定されたパラメータに一致するマスクファイルのみを生成することもできます。出力ファイルは、次のセクションで説明するMaskGenツールへの入力として使用できます。

MaskGen

MaskGenを使用すると、Hashcatファミリーのパスワードクラッカーへの入力用に、パターンベースのマスク攻撃を作成できます。このツールは、上記のstatsgenで'-o'フラグを使用して生成された出力を使用して、マスクの複雑性、出現頻度、またはその比率(最適指数)でソートされた最も最適なマスク攻撃を生成します。

MaskGenをStatGenの出力のみを引数として実行してみましょう。

root@kitploit:~
$ 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

留意すべき情報がいくつかあります。

  • 計算に使用されるデフォルトのクラッキング速度は1,000,000,000 keys/秒です。
  • デフォルトのソートモードは[optindex]で、これは--optindexフラグと同等です。
  • 146,578個のユニークなマスクが生成され、100%のカバレッジです。
  • 生成されたすべてのマスクの総実行時間は1年以上です。

ターゲット時間の指定

攻撃の作成と実行には通常時間制限があるため、maskgenでは攻撃に利用できる時間を指定でき、ソートモードに基づいて最も最適なマスクのコレクションを生成します。異なるソートモードとターゲット時間で少し試してみましょう。

root@kitploit:~
$ 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フラグを使用して見てみましょう。

root@kitploit:~
$ 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文字より大きいマスクのみを次のように生成できます。

root@kitploit:~
$ 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

当然、生成されたマスクのカバレッジは減少しましたが、これらのフィルタは、マスクの生成に使用されたものとは異なるパスワードリストを攻撃する際にマスクのコレクションを準備する場合に役立ちます。

以下は、使用できる追加のフィルタのリストです。

root@kitploit:~
  個別マスクフィルタオプション:
    --minlength=8       最小パスワード長
    --maxlength=8       最大パスワード長
    --mintime=3600      最小マスク実行時間(秒)
    --maxtime=3600      最大マスク実行時間(秒)
    --mincomplexity=1   最小複雑性
    --maxcomplexity=100
                        最大複雑性
    --minoccurrence=1   最小出現回数
    --maxoccurrence=100
                        最大出現回数

出現回数と複雑性のフラグは、異なるソートモードを使用して生成されたマスクを微調整するのに特に強力です。

生成されたマスクの保存

上記で生成されたマスクに満足したら、-oフラグを使用して保存できます。

root@kitploit:~
$ 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などの別の侵害されたリストに対してどの程度機能するかを比較してみましょう。

root@kitploit:~
$ 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つ以上のマスクのカバレッジを確認することもできます。

root@kitploit:~
$ 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'パラメータを使用します。

root@kitploit:~
$ 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

マスク攻撃や辞書攻撃の多くは、最小パスワード複雑性要件がある企業環境では失敗します。純粋なブルートフォース攻撃に頼る代わりに、既知または推測されたパスワード複雑性ルールを活用して、ポリシーに準拠していないパスワード候補を回避したり、逆に非準拠のパスワードのみを監査したりできます。PolicyGenを使用すると、パスワード複雑性に従ったマスクのコレクションを生成し、クラッキング時間を大幅に短縮できます。

以下は、少なくとも1つの数字、1つの大文字、および1つの特殊文字を必要とする環境に対して、有効なすべてのパスワードマスクを生成するサンプルセッションです。

root@kitploit:~
$ 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 フラグを指定して生成されたマスクを反転できます:

root@kitploit:~
$ 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 フラグを使用して、上記で生成された非準拠マスクの一部を見てみましょう:

root@kitploit:~
$ 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 フラグを使用して、攻撃を微調整するためにパスワードの最大複雑さを指定することもできます。たとえば、以下はパスワードポリシーを強制するが特殊文字を許可しないサンプルサイトです:

root@kitploit:~
$ 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 を生成するために使用されたルールと潜在的な元のワードを検出してみましょう:

root@kitploit:~
$ 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

この例で使用したいくつかのフラグは次のとおりです:

  • --password - 分析する単一のパスワードを指定します。
  • --verbose - 生成されたルールやパフォーマンス統計などの詳細情報を出力します。

パスワードファイルの処理については以下のセクションで説明しますが、最初に単一のパスワードを例にして利用可能ないくつかの微調整オプションについて説明します。

スペルチェックプロバイダー

元のワード検出に aspell Enchant モジュールを使用していることに注意してください。正確なスペルチェックエンジンは、次のように --provider フラグを使用して変更できます:

root@kitploit:~
$ 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 フラグで元のワードを指定することで完全に無効にできます:

root@kitploit:~
$ 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 フラグを使用してカスタムワードリストを指定できます。これは、以前の分析セッションから元のワードを再利用する場合に特に便利です:

root@kitploit:~
$ 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 フラグを使用して、最適な編集距離を超える可能性のあるワードとルールを生成します:

root@kitploit:~
$ 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 フラグを使用して、それらを無効にして違いを観察することができます(または問題が発生している場合)。これらのフラグをオンにしたときに元のワードとルールがどのように変化するかを見てみましょう:

root@kitploit:~
$ 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 を生成します:

root@kitploit:~
&~defcon
'#(4)\
August19681
'&a123456
10-D'Ann
~|Bailey
Krist0f3r
f@cebOOK
Nuclear$(
zxcvbn2010!
13Hark's
NjB3qqm
Sydney93?
antalya%]
Annl05de
;-Fluffy

次に、最初の引数としてパスワードファイルを指定するだけで rulegen.py の分析を観察します:

root@kitploit:~
$ 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' を使用して保存されます:

  • analysis.word - ソートされていない、ユニークではない元のワード
  • analysis-sorted.word - 出現回数でソートされ、ユニークな元のワード
  • analysis.rule - ソートされていない、ユニークではないルール
  • analysis-sorted.rule - 出現回数でソートされ、ユニークなルール

'#(4)\ や '&a123456 などのいくつかのパスワードは、処理に十分な特性がないためスキップされたことに注意してください。アルファベット文字数以外にも、プログラムはすべて数字のパスワードと非ASCII文字を含むパスワードをスキップします。後者はEnchantエンジンのバグによるもので、将来的に修正して多くの言語の単語処理を可能にしたいと考えています。

出力ベース名の指定

前述のように、rulegen.py はデフォルトで 'analysis' ベース名を使用して出力ファイルを保存します。次のように --basename フラグまたは -b フラグでファイルのベース名を変更できます:

root@kitploit:~
$ 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

ツールをダウンロード