使用Python与hashlib对Unix /etc/shadow密码实施字典攻击可行吗?
问题分析与脚本修复:破解SHA512格式的Linux密码
你的思路方向是对的——通过提取shadow中的salt,对比明文密码加盐后的哈希值来破解,但脚本里有几个关键问题导致测试失败,我来帮你拆解并修复:
核心问题:错误的哈希计算方式
Linux系统中/etc/shadow里的SHA512密码不是简单的SHA512哈希,而是通过crypt函数实现的专用算法,它包含了迭代次数(默认5000次)、salt的特殊处理,并且是多次迭代哈希的结果。你直接用hashlib.sha512(salt + word)计算的哈希,和系统生成的完全不匹配,这是最主要的失败原因。
其他逻辑问题
- 循环提前退出:你的脚本在循环里不管密码是否匹配都直接
return,导致字典里第一个密码检查完就退出函数了,根本不会遍历后续的密码。 - Salt提取不完整:如果shadow密码里包含迭代次数(比如
$6$rounds=10000$salt$hash),你提取的salt会丢失rounds参数,导致哈希计算错误。 - 文件操作与格式问题:读取密码文件时没有去掉换行符,可能导致匹配时出现隐形的字符差异。
修复后的脚本(Python2版本,适配你的原代码风格)
import crypt import sys def checkpass(passwd): try: # 拆分shadow格式的密码字段 pwd_parts = passwd.split('$') # 校验shadow格式是否合法($6$开头的SHA512格式) if len(pwd_parts) < 4 or pwd_parts[1] != '6': print "Invalid SHA512 shadow password format" return # 提取完整的salt部分(包含算法标识和可选的rounds参数) salt = '$' + pwd_parts[1] + '$' + pwd_parts[2] + '$' # 提取存储的哈希值部分 stored_hash = pwd_parts[3].split(':')[0] print 'Salt is : ' + salt print 'Stored Hash : ' + stored_hash dictFile = open('dictionary.txt', 'r') for word in dictFile.readlines(): word = word.strip('\n') # 去掉密码末尾的换行符 print 'Testing password: ' + word # 使用系统crypt函数计算正确的哈希值 generated_hash = crypt.crypt(word, salt) # 提取生成的哈希核心部分 generated_hash_part = generated_hash.split('$')[3] if generated_hash_part == stored_hash: print '[+] Found Password : ' + word + '\n' dictFile.close() return word # 遍历完字典都没找到的情况 print '[-] Password not found in dictionary.\n' dictFile.close() return None except Exception, e: print e return None def main(): try: passfile = open('password.txt') passwd = passfile.readline().strip() # 去掉行尾的换行符 passfile.close() semi_c = ':' if semi_c in passwd: user = passwd.split(semi_c)[0] print '[*] Cracking Password for : ' + user checkpass(passwd) else: print "Invalid password file format - expected line like 'user:$6$salt$hash:...'" except Exception, e: print e return if __name__ == '__main__': main()
修复说明
- 改用
crypt.crypt()函数:这个函数完全遵循Linux系统的密码哈希规则,自动处理SHA512的迭代次数、salt格式,生成的哈希和/etc/shadow中的完全一致。 - 修复循环逻辑:只有找到匹配的密码才退出函数,否则遍历完整的字典。
- 完整提取salt:不管shadow密码里是否包含
rounds参数,都完整提取算法标识到下一个$之间的部分,确保哈希计算的参数正确。 - 完善格式处理:读取文件时去掉换行符,避免隐形字符导致的匹配失败。
使用注意事项
- 确保
password.txt里的内容是完整的/etc/shadow行(比如testuser:$6$abc123$xyz...:19000:0:99999:7:::) dictionary.txt每行一个明文密码,不要有多余的空格或空行- 如果用Python3,需要调整语法(比如
print()加括号,异常捕获改为except Exception as e:)
内容的提问来源于stack exchange,提问作者dexray
相关产品推荐
相关产品推荐

