web-dev-qa-db-ja.com

パスワードリストの生成

最近の多くのペンテストで、企業が次のようなパスワードを使用することがわかりました

c0mp4ny @ b(

「company abc」という会社の場合

可能な限り多くの「リートスピーク」文字に基づいてパスワードのリストを生成する迅速かつ簡単な方法はありますか?

したがって、入力は

会社abc

そして出力は

c0mpanyabc

c0mpany4bc

C0mpany4bc1

等....

キャップ、アンダースコア、末尾に追加されたnum /特殊文字などの順列がすべて生成される場所はどこですか?

7
NULLZ

並べ替えた単語リストを生成するためのツールボックスの最初のツールは RSMangler です。これまでのところ、より良いツールを見つけることができませんでした。

それはRubyで書かれており、オープンソースであり、変更と拡張が非常に簡単で、オプションが豊富で、 CC BY-SA UK の下でライセンスされています。

leet_swap配列は簡単に拡張できます。例えば

leet_swap = {
  'a' => '@',
  'C' => '(',
}

各文字列の前後に自動的に数字を追加します。配列common_wordsの単語リストにいくつかの一般的な単語を追加することもできます。

すべてのオプションはデフォルトで有効になっているため、オプション--commonを設定すると、一般的な単語機能が無効になります。他のオプションについても同様です。

--permsオプションを無効にすると、非常に完全な置換リストが作成されるため、このオプションを無効にすることを強くお勧めします。私が「非常に徹底的」と言うとき、私はそれを誇張していません。私の非変異ワードリストは、ほぼ900GBワードリストに拡張されました。

2
Adi

Javascriptを使用して回答を作成しました。これは、私が慣れていることであり、言語が指定されていないためです。あなたが好きな他の言語でアナログを見つけたり作成したりできると私は確信しています。

最初に、デカルト積を作成するために この答え から関数を盗みました。デカルト積の説明は、実際にはこの質問の範囲内ではありませんが、可能な文字の配列を可能な文字列の配列に結合している(非常に単純化されている)と言えば十分です。

OK、それでckozlの関数は:

_function cartProd(paramArray) {

  function addTo(curr, args) {

    var i, copy, 
        rest = args.slice(1),
        last = !rest.length,
        result = [];

    for (i = 0; i < args[0].length; i++) {

      copy = curr.slice();
      copy.Push(args[0][i]);

      if (last) {
        result.Push(copy);

      } else {
        result = result.concat(addTo(copy, rest));
      }
    }

    return result;
  }


  return addTo([], Array.prototype.slice.call(paramArray));
}
_

そして私は:

_function findSubs(string) {
        //create a linked list of sub characters
        //expect lower case input
        subs={
                "p":["p","P"],
                "a":["a","A","4","@"],
                "s":["s","S","$","5"]
        }
        //create an (initially empty) array to store possible characters in each position
        result=[]
        for (var i=0;i<string.length;i++) {
                result[i]=subs[string.charAt(i)]; //Would be more robust if you added logic here to handle it not being a key in the subs object. 
        }
        /*
        so result might look like:
        [
                ["p","P"],
                ["a","A","4","@"],
                ["s","S","$","5"],
                ["s","S","$","5"]
        ]
        for an input of "pass"
        */
        return cartProd(result)
}
_

正直なところ、ckzolの機能は、ここでの重労働をすべて実行します。使用する前にsubs配列を具体化する必要がありますが、これは文字列の最後に文字を追加することを処理しません(それは一種の恣意的なように見えるため)。

また、引数をオーバーロードする複数の配列ではなく、配列の配列を入力パラメータとして渡すことができるように、cartProd関数を少しだけ変更したことにも注意してください。

編集:戻り値は配列の配列であることにも注意してください。そのため、要素ごとにe do e.join("")を反復処理する必要があります。

もう一度編集します。これを簡単に拡張して、他の変更をパスワードに適用することもできます。たとえば、0〜99の数値を文字列の末尾に追加する場合は、_["0","1","2",...,"99"]_を含む追加の配列を結果の末尾にプッシュできます。この配列に空の要素(_""_)を含めて、数値の接尾辞を含まない可能性も出力できます。同じロジックを使用して、プレフィックスを追加できます。基本的に、結果の配列で可能な文字の配列の配列を構築しているので、考えられるすべての変異を含めることができます。

4
Chris O'Kelly

私はあなたが話していることをするPassGenと呼ばれるツールを作りました。あなたはそれを見ることができます ここ

目的は、ターゲットのWordを渡し、一般的な置換を使用してパスワードリストを生成できることです。少し高度になりたい場合は、ツールを使用してHTTPリクエストを発行し、パスワードが機能するかどうかを確認することもできます。

あなたの例では、次のようにsometningと入力します。

python passgen.py -f companyabc

パスワードリストがすぐに大きくなる可能性があることに注意してください。上記の例では、147456個のパスワードが生成されます。

0
Abe Miessler

l33tpasspro.rule を指定すると、このhashcatコマンドはこれらのパスワードc0mpanyabc、c0mpany4bc、C0mpany4bc1を生成します。

hashcat64.exe -a 0 dict.txt -r purge_space.rule -r l33tpasspro.rule --stdout | sort | uniq | hashcat64.exe -r rules/hybrid/append_s_passthrough.rule -r rules/best64.rule --stdout

purge_space.rule(@記号の後にスペースがあります):

@