You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python与hashlib对Unix /etc/shadow密码实施字典攻击可行吗?

问题分析与脚本修复:破解SHA512格式的Linux密码

你的思路方向是对的——通过提取shadow中的salt,对比明文密码加盐后的哈希值来破解,但脚本里有几个关键问题导致测试失败,我来帮你拆解并修复:

核心问题:错误的哈希计算方式

Linux系统中/etc/shadow里的SHA512密码不是简单的SHA512哈希,而是通过crypt函数实现的专用算法,它包含了迭代次数(默认5000次)、salt的特殊处理,并且是多次迭代哈希的结果。你直接用hashlib.sha512(salt + word)计算的哈希,和系统生成的完全不匹配,这是最主要的失败原因。

其他逻辑问题

  1. 循环提前退出:你的脚本在循环里不管密码是否匹配都直接return,导致字典里第一个密码检查完就退出函数了,根本不会遍历后续的密码。
  2. Salt提取不完整:如果shadow密码里包含迭代次数(比如$6$rounds=10000$salt$hash),你提取的salt会丢失rounds参数,导致哈希计算错误。
  3. 文件操作与格式问题:读取密码文件时没有去掉换行符,可能导致匹配时出现隐形的字符差异。

修复后的脚本(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()

修复说明

  1. 改用crypt.crypt()函数:这个函数完全遵循Linux系统的密码哈希规则,自动处理SHA512的迭代次数、salt格式,生成的哈希和/etc/shadow中的完全一致。
  2. 修复循环逻辑:只有找到匹配的密码才退出函数,否则遍历完整的字典。
  3. 完整提取salt:不管shadow密码里是否包含rounds参数,都完整提取算法标识到下一个$之间的部分,确保哈希计算的参数正确。
  4. 完善格式处理:读取文件时去掉换行符,避免隐形字符导致的匹配失败。

使用注意事项

  • 确保password.txt里的内容是完整的/etc/shadow行(比如testuser:$6$abc123$xyz...:19000:0:99999:7:::)
  • dictionary.txt每行一个明文密码,不要有多余的空格或空行
  • 如果用Python3,需要调整语法(比如print()加括号,异常捕获改为except Exception as e:)

内容的提问来源于stack exchange,提问作者dexray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:04:33