|
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() |
|
|