1. 程式人生 > >linux shadow文件破解

linux shadow文件破解

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

linux shadow文件破解