crypt模块的使用

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(盐值)。 9jfyOHLosaltUdprtu5j4I/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()

执行结果如下。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值