密码列表生成

信息安全 密码 攻击 密码破解 字典
2021-08-28 10:34:26

在最近的许多笔测试中,我发现公司会使用类似的密码

c0mp4ny@b(

对于一家名为“company abc”的公司

是否有任何快速简便的方法可以根据尽可能多的“leet speak”字母生成密码列表?

所以输入将是

美国广播公司

输出将是

c0mpanyabc

c0mpany4bc

C0mpany4bc1

等等....

大写、下划线、末尾添加的数字/特殊字符等的排列都是在哪里生成的?

4个回答

我使用 Javascript 制作了一个答案,因为这是我习惯的,并且没有指定语言。我相信你可以用你喜欢的任何其他语言找到/创建一个模拟。

首先,我从这个答案中偷了一个函数来创建一个笛卡尔积。笛卡尔积的解释实际上并不在这个问题的范围内,但足以说它将可能的字符数组组合成可能的字符串数组(非常简单化)。

好的,所以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执行e.join("").

再次编辑:另请注意,您可以轻松扩展它以将其他突变应用于密码。例如,如果您想在字符串末尾添加一个 0 到 99 之间的数字,您可以将一个额外的数组推送到结果的末尾,其中包含["0","1","2",...,"99"]. 您可以在此数组中包含一个空元素 ( "") 以输出不包括数字后缀的可能性。可以使用相同的逻辑来添加前缀。本质上,您正在结果数组中构建可能字符的数组,因此您可以包含您能想到的任何突变。

我的工具箱中用于生成置换词表的第一个工具是RSMangler到目前为止,我还没有找到更好的工具。

它是用 Ruby 编写的,它是开源的,超级容易修改和扩展,有很多选项,并且它在CC BY-SA UK下获得许可。

您可以轻松扩展leet_swap数组。例如

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

它会自动在每个字符串之前和之后添加数字,甚至可以选择将一些常用单词附加到数组中的单词列表中common_words

默认情况下启用所有选项,因此当您设置选项时,--common您将禁用常用词功能。其他选项也是如此。

我强烈建议禁用该--perms选项,因为它会创建一个极其详尽的排列列表。当我说“非常详尽”时,我并没有夸大其词。我的非变异词表已扩展至近900GB 的词表

我制作了一个名为 PassGen 的工具,它可以完成您所说的工作。你可以看看这里

这个想法是你可以传入一个目标词并使用常见的替换生成一个密码列表。如果您想更高级一点,您还可以使用该工具触发 HTTP 请求,以查看是否有任何密码有效。

对于您的示例,您将输入如下内容:

python passgen.py -f companyabc

请注意,密码列表会很快变大。上面的示例生成 147456 个密码。

使用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(@ 符号后有一个空格):

@