社会工程学密码字典是破解密码的基础,一份好的字典可以在数据破解的过 程中起到事半功倍的效果。利用搜集到的信息,并依据人们设定密码的规律和习 惯,生成的社会工程学字典在破解的过程中效果显著。在美剧《黑客军团》中, 主角Elliot在获取私人账户信息时,用得最多的就是社会工程学密码字典。
7.1.1 字典的生成
社会工程学密码字典的内容主要分为两个部分:
· 常见的用户密码和默认密码。
·利用管理员信息自动生成的密码。
假设我们获取到了目标系统的管理员名字叫“ 张伟” ,我们可以通过搜索引擎 以及目标的社交网络查询到他的基本信息。然后可以新建一个名为
person_information的文件来存放个人的信息,内容如图7-1所示。
图7-1 个人信息示例
此处所展现的部分信息只是用于演示,在实际情况下,读者可以搜集更多与 目标有关的信息。搜集到的信息越多,得到的字典中所包含正确的密码概率就越 大。同时,我们还需要一份热门的常用密码字典,里面除了包含经常使用的密码 外,还有包含许多服务以及软件的默认密码。读者可以访问公众号链接7-1下载各 种类型的密码字典文件,如图7-2所示。
这里选用的是名为darkweb2017-top10000.txt的字典文件,将它下载到本地并 重命名为TopPwd 。此时就有了2个文件,一个是包含目标个人信息的文件
person_information ,另一个是包含常用密码和默认密码的文件TopPwd。
图7-2 密码字典下载列表
使用Python来编写生成密码字典的脚本需要用到itertools模块。这个模块是 Python 内置的,用法简单且功能强大。下面先介绍itertools ,这个模块里提供了很 多函数,此处主要讲解3个需要用的函数:
·permutation(iterable ,r ):返回iterable 中元素所有组合长度为r 的项目序 列,r省略则默认取iterable 中项目的数量。例如itertools.Permutations('abc' ,3), 从“abc” 中按顺序排列组合长度为3进行输出,即abc ,acb ,bac ,bca ,cab ,cba。
·product(*iterables[ ,repeat]):可以获得多个循环器的笛卡儿积。例如
product( "123" ,"abc" ),得到的结果是1a ,1b ,1c ,2a ,2b ,2c ,3a ,3b ,3c。
·repeat(object[ ,times]):这个函数的作用就是重复元素,未指定times则会 一直重复。例如repeat(100),即100 ,100 ,100… …
接下来编写一个密码字典的生成脚本,具体步骤如下。
1)写入脚本信息,导入相关模块:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import itertools
2)创建ReadInformationList() 函数,读取用户的个人信息,存入用户信息 列表:
def Read InformationList() :
try:
# 读取个人信息文件,并按行存入lines
informationFile = open( 'person_information ', 'r ')
lines = informationFile .readlines()
for line in lines:
infolist.append(line .strip() .split( ' : ')[1])
except Exception as e:
print(e + "\n")
print("Read person_information error !")
3)创建CreateNumberList() 函数,创建数字内容,存入数字列表: |
|
def CreateNumberList() : # 数字元素 words = "0123456789" # 利用itertools来产生不同数字排列,数字组合长度为3 itertoolsNumberList = itertools .product(words, for number in itertoolsNumberList : # 写入数字列表备用 numberList.append("" .join(number)) |
repeat=3) |
4)创建CreateSpecialList() 函数,创建特殊字符,并写入特殊字符列表: |
|
def CreateSpecial List() : specialWords = "`~ !@#$%^&*()?|/><, ." for i in specialWords: special List.append("" .join(i)) |
|
5)创建AddTopPwd() 函数,读取TopPwd文件的内容,先存入字典文件: |
|
def AddTopPwd() : try: # 读取TopPwd文件,并先存入password字典文件 informationFile = open( 'TopPwd ', 'r ') lines = informationFile .readlines() for line in lines: dictionaryFile .write(line) except Exception as e: print(e + "\n") print("Read TopPwd error !") |
|
6)创建Combination() 函数,字典生成算法主体,读者也可以增加自己的 代码: |
def Combination() :
for a in range(len(infolist)) :
# 把个人信息大于等于8位的直接输出到字典
if (len(infolist[a]) >= 8) :
dictionaryFile .write(infolist[a] + '\n ')
# 对于小于8位的个人信息,利用数字补全到8位输出
else:
needWords = 8 - len(infolist[a])
for b in itertools .permutations("1234567890", needWords) :
dictionaryFile .write(infolist[a] + ' ' .join(b) + '\n ')
# 把个人信息元素两两进行相互拼接,大于等于8位的输出到字典
for c in range(0, len(infolist)) :
if (len(infolist[a] + infolist[c]) >= 8) :
dictionaryFile .write(infolist[a] + infolist[c] + '\n ')
# 在两个个人信息元素中加入特殊字符组合起来,大于等于8位就输出到字典 for d in range(0, len(infolist)) :
for e in range(0, len(special List)) :
if (len(infolist[a] + special List[e] + infolist[d]) >= 8) : # 特殊字符加在尾部
dictionaryFile .write(infolist[a] + infolist[d] +
special List[e] + '\n ')
# 特殊字符加在中部
dictionaryFile .write(infolist[a] + special List[e] +
infolist[d] + '\n ')
# 特殊字符加在头部
dictionaryFile .write(special List[e] + infolist[a] +
infolist[d] + '\n ')
# 关闭字典文件对象
dictionaryFile .close()
7)编写main 函数,创建相关的数据列表: |
if __name__ == '__main__ ' : # 字典文件对象 global dictionaryFile # 创建字典文件 dictionaryFile = open( 'passwords ', 'w ') # 用户信息列表 global infolist infolist = [] # 数字列表 global numberList numberList = [] # 特殊字符列表 global special List special List = [] # 读取个人信息文件dictionaryFile Read InformationList() # 创建数字列表 CreateNumberList() # 创建特殊字符列表 CreateSpecial List() # 把常见密码先写入字典文件 AddTopPwd() # 字典生成主体,将个人信息+数字列表+特殊字符列表进行组合并加入字典 Combination() print( '\n ' + u"字典生成成功!" + '\n ' + '\n ' + u"字典文件名:passwords") |
这样,字典生成脚本的功能函数就完成了。输入以下命令执行字典生成脚 本:
此时,新生成一个名为passwords 的密码字典文件,里面就是生成好的密码, 如下所示:
7.1.2 防御策略
在网络飞速发展的时代,人们的生活越来越离不开网络,网站、网游、App 等时常索要我们的信息,信息泄露的事件也屡见不鲜。我们不能完全确保信息不 泄露,但是可以减少信息泄露以及泄露后带来的危害。防止生成社会工程学密码 字典,需要做到以下几点:
·在丢弃各种快递单、凭据前,将个人信息涂抹掉。
·注册账号、填写个人信息时,对于非关键信息尽量不填或者随意填写。
·减少密码与个人信息的关联程度。
· 社交媒体发送动态时,注意遮盖敏感信息。
· 准备多个手机号、邮箱、账号等,分别用于不同用途。