大家好,我是木禾,第一次给信安之路投稿哈,因为中午刚好看到有关于 pydictor 的文章,咦,有用过。几个月前也在烦生成密码的问题,当时认真看过 pydictor 的代码,做了一些改进,因为这个生成工具没有办法实现的一个点:
如正常一个密码格式
password@123
,但我想随机生成如下几种密码 大写Password@123
替换p@ssw0rd@123
是没有办法,所以当时就通过对代码的编码方式进行改进,而达到这个效果。具体方法请看文章,嘿嘿。
如果有人问我,你会密码爆破吗?
相信你也会像我一样毫不犹豫地回答:会啊,很简单。
但是有一天,当我用几万个密码去爆破的时候还爆不出来的时候,我知道我错了。仔细想想,一直以来的密码爆破都是用常见弱口令字典,用 Top1000 之类去爆,而收集的一些信息,或者自己构思出来的一些密码组合,却不能很好地去实现。所以以本文之见,说说密码猜测。
固然,弱口令字典是爆破必备。而当你掌握了一定的信息之后,会开始思考,用户会怎么去组合一个密码呢?如果用户稍微会有点安全意识,会怎么去加强密码呢?比如一些企业对密码复杂度作了要求之后,至少都要 8 位,并且有特殊字符;比如一些比较有安全意识的人,密码会有大小写,不同的组合等等。这样的环境下,如何去猜测用户的密码呢?当然,这需要有一定的经验积累,我从以往接触过的密码来分析,不足之处,还望指点一二。
多个账户用同一套密码。
跟个人信息有关,如姓名,手机号,身份证后 6 位,出生年月等
首先看看现在企业一般是什么要求:
“口令复杂度策略为:口令长度至少为 8 位,并由数字、大小字母与特殊字符组成。”
很多企业的密码都有加强,一般是 6 位以上。
多与时间有关。
这里我们使用一个工具 —— pydictor 爆破字典生成指南
先给几个密码:
qyoa#123 abc@1234 j2ee@pkpk vm1234!@#$ root@#
看到这些密码,你大概可以看出他们的规律了吧,这些是一些企业的密码,用来登录服务器的。其形成原因,有两点:
第一点:一般是系统名开头。从来没见过直接特殊字符开头吧。
第二点:由系统名开始后,又因为企业对密码长度和字符的要求,会加入字符和数字,所以后面就有了 @123,或 #123,嘿嘿,懂了吧。
所以我们往下看:
通常我们的密码不超过四个模块,超三个模块最常见。可以看到上面的例子中,像 qyoa#123
,可以理解为由三个模块 qyoa
、 #
、 123
组成。由此类推其它例子。
而这四个模块里,也可以有一些规律。
模块1:通常是常见字符,如 admin、root、password、系统名等。
模块2:通常是特殊字符,如 @,@#,!@#$ 等。
模块3:第三个种类会多一点在,通常是个人信息,时间或数字。
模块4:通常是数字,代表序号。
这时我们可以使用 pydictor 来生成字典,pydictor 中有一个配置模式:
第一步:先想要组合怎么样的密码,比如现在要组合一个四个模块的密码,各个模块分别为常用字符、特殊字符、猜测用户名、序号。
第二步:配置 pydictor\funcfg
文件夹下 build.conf
文件,要把原来的那语句注释掉。
写入密码规则为 [admin,root,password]{1,1}<none>[!,@,#,$]{1,4}<none>liqiang[1,2,3]{1,1}<none>
。
第三步:执行 pydictor –conf
或 python pydictor -conf
可以看到在 result
文件夹下生成了字典:
嗯哼,内容正是我想要的。
除了上面的组合方法,我们再看看其它一些密码:
Dgdg@#123 P@ssw0rd Admin@ Pysy#@dm!n
你会发现像这样的,是基于原来的基础字符上做了变换,比如起始大写、形近字替换等。所以我们上一部分做的还不够,要在上一部分的基础上做一些变换。
在 pydictor 中有一个 leet 模式,可以做替换,不过不支持上面的配置模式。怎么办呢?我突然发现配置模式中的编码方式可以自定义,那我们就自己写吧。
首字母大写
1、添加代码:
在 \lib\fun\encode.py
最后部分,写入如下代码:
修改 encode type
不然会识别不出这个编码名。在 \lib\data\data.py
第225行,加入 , 'HeadUpper' : HeadUpper_encode
在 build.conf
处写入密码规则
[admin]{1,1}<HeadUpper>
:
2、执行命令 pydictor --conf
可以看到成功生成了首字母大写的密码:
形近字替换
按照上面的流程,我们做一个形近字替换:
在 \lib\fun\encode.py
添加代码
修改 encode type
在 \lib\data\data.py
第225行,加入 , 'leet' : leet_encode
在 \funcfg\leet_mode.conf
下配置你要做的替换
在 build.conf
处写入密码规则
[admin,password]{1,1}<leet>
:
执行命令 pydictor --conf
哈哈,得到了我们想要的替换结果了。
组合变换
如果同时要用到上面两种变换怎么办?很简单,加一个新的编码函数来调用上面这两个编码就行了。
最终最终,我们可以试试多模块加变换的效果:
运行之后生成:
嘿嘿,完美。