标签:shadow
linux shadow文件破解程序
解析shadow文件中密码字符串的内容
对于示例的密码域$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.,我们参考了Linux标准源文件passwd.c,在其中的pw_encrypt函数中找到了加密方法。
我们发现所谓的加密算法,其实就是用明文密码和一个叫salt的东西通过函数crypt()完成加密。
而所谓的密码域密文也是由三部分组成的,即:$id$salt$encrypted。
【注】:
id为1时,采用md5进行加密;
id为5时,采用SHA256进行加密;
id为6时,采用SHA512进行加密。
# -*- coding: utf-8 -*- import crypt import sys import hashlib dictionary=sys.argv[1] def enMd5(word,salt): md5_obj=hashlib.md5() md5_obj.update(word+salt) return md5_obj.hexdigest() def enSha512(word,salt): sha512_obj=hashlib.sha512() sha512_obj.update(word+salt) return sha512_obj.hexdigest() def testPass(cryptPass): salt=cryptPass[0:2] dictFile=open(dictionary,‘r‘) for word in dictFile.readlines(): word=word.strip(‘\n‘) if salt==‘$1‘: cryptWord=crypt.crypt(word,salt) elif salt==‘$5‘: cryptWord=enMd5(word,salt) elif salt==‘$6‘: cryptWord=enSha512(word,salt) else: return if (cryptWord==cryptPass): print "[+] Found Password:"+word+"\n" return print "[-] Password Not Found.\n" return def main(): passFile=open(‘/etc/shadow‘) for line in passFile.readlines(): if ":" in line: user=line.split(‘:‘)[0] cryptPass=line.split(‘:‘)[1].strip(‘ ‘) print "[*] Cracking Password For:"+user testPass(cryptPass) if __name__=="__main__": main()
本文出自 “菜鸟学习笔记” 博客,请务必保留此出处http://bohel.blog.51cto.com/6218546/1954113
标签:shadow
原文地址:http://bohel.blog.51cto.com/6218546/1954113