
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