crypt模块
crypt模块(只适用于Unix)实现了单向的DES加密,Unix系统使用这个加密算法来储存密码。python标准库中自带有crypt库。要计算一个加密的UNIX口令hash,只需要调用函数crypt.crypt(),并将口令和salt(盐)传递给它。该函数会以字符串形式返回hash。
(本人windows下python环境多次尝试crypt库的导入均以失败告终,遂在linux环境下进行本次代码编写与执行)
尝试使用crypt()函数计算口令的hash。将库导入后,我们将口令与盐值传递给函数,该函数会返回口令的hash。
UNIX口令破解机
testPass()函数会以参数形式获得加密口令得hash,并在找到密码或搜遍字典无果后返回。该函数首先将加密的口令hash的前两个字母视为salt,并提取出来。然后打开字典并遍历每个单词,用每个单词和salt计算一个新的加密口令hash。如果计算结果与我们加密口令hash匹配,函数会打印一条消息显示找到密码,并返回。否则,它会在词库中继续对每个单词进行测试。
#!/usr/bin/python3
# UNIX Password Cracking
#Author:Rouzi Date:2019/12/20
import crypt
def testPass(cryptPass): # 定义一个testPass函数
salt = cryptPass[0:2]
dictFile = open('dictionary.txt','r')
for word in dictFile.readlines():
word = word.strip('\n')
cryptWord = crypt.crypt(word,salt)
if (cryptWord == cryptPass):
print("[+]Found Password:"+word+"\n")
return
print ("[-]Password Not Found.\n")
return
def main():
passFile = open('passwords.txt')
for line in passFile.readlines():
if ":" in line:
user = line.split(":")[0]
cryptPass = line.split(":")[1].strip(" ")
print ("[*]Checking Password For:"+user)
testPass(cryptPass) # 调用testPass()函数,尝试用字典中的单词破解口令hash
if __name__ == "__main__":
main()
两个txt文档内容如下:
代码执行结果如下。
在基于*Nix的现代操作系统中,/etc/shadow文件中存储了口令的hash,并能使用更多的安全加密算法。对脚本进行升级可以破解shadow的hash。
先将/etc/shadow文件复制到脚本目录下。
观察其中一条记录如下。
rouzi:$6$9jfyOHLo$Udprtu5j4I/jj5IYj/IVyxkgIokNheugHCrCR4a1blxg3dIuzW/JOUwf6fZhBQfGtuJ32Oto9dMWdkbebRf9j.:18250:0:99999:7:::
其中rouzi为用户名,$6
9
j
f
y
O
H
L
o
为
s
a
l
t
(
盐
值
)
。
9jfyOHLo为salt(盐值)。
9jfyOHLo为salt(盐值)。Udprtu5j4I/jj5IYj/IVyxkgIokNheugHCrCR4a1blxg3dIuzW/JOUwf6fZhBQfGtuJ32Oto9dMWdkbebRf9j.为加密后的hash值。
修改代码如下:
#!/usr/bin/python3
# UNIX Password Cracking
#Author:Rouzi Date:2019/12/20
import crypt
def testPass(cryptPass):
salt = cryptPass[0:11]
dictFile = open('dictionary.txt','r')
for word in dictFile.readlines():
word = word.strip('\n')
cryptWord = crypt.crypt(word,salt)
if (cryptWord == cryptPass):
print("[+]Found Password:"+word+"\n")
return
print ("[-]Password Not Found.\n")
return
def main():
passFile = open('shadow')
for line in passFile.readlines():
if ":" in line:
user = line.split(":")[0]
cryptPass = line.split(":")[1].strip(" ")
print ("[*]Checking Password For:"+user)
testPass(cryptPass)
if __name__ == "__main__":
main()
执行结果如下。