linux 密碼保存在
/etc/shadow
shadow 文件的保存格式
python:$6$mWSyC6Pv$hpMreQT77R9ML/Xx1QnRAow1tUTDjIowaTssV7bZw9S44FXYd93kfrFQ8Y2vpj/bQfrub/Q.Z6XkYDt4gAUBE0:17514:0:99999:7:::
加密格式:
{用戶名}:{加密后的口令密碼}:{口令最后修改時間距原點(1970-1-1)的天數}:{口令最小修改間隔(防止修改口令,如果時限未到,將恢復至舊口令):{口令最大修改間隔}:{口令失效前的警告天數}:{賬戶不活動天數}:{賬號失效天數}:{保留}
密碼域密文也是由三部分組成的,即:$id$salt$encrypted。
id為1時,采用md5進行加密;
id為5時,采用SHA256進行加密;
id為6時,采用SHA512進行加密。
在python中有一個crypt 模塊可以進行密碼計算,而且不用我們擔心加密方式是什么。
crypt 方法接收兩個參數,第一個是需要加密的明文,第二個參數是 salt.
linux salt 為 $6$mWSyC6Pv$ 形式 其中6表示加密方式 sha512
>>> import crypt >>> crypt.crypt('sdssdd','$6$mWSyC6Pv$') '$6$mWSyC6Pv$8AhSQcqAsoGsMIFHnLhvCRf4cg5gWvPHhWtliw39yIGUYwK5uODO6bzL7GUxD.X.U5N14m3MA0Pikf5fsyO0/' >>> >>>
shadow 只有超級用戶才有權限查看,所以拷貝出來的shadow文件需要修改權限
chmod 755 shadow
代碼實現
import crypt def testPass(cryptPass): salt = cryptPass[0:12] # 獲取加密方式以及密碼鹽 try: dictFile = open('dictionary', 'r') # 打開密碼字典 try: for word in dictFile.readlines(): word = word.strip('\n') cryptWord = crypt.crypt(word, salt) # 將字典中讀取的銘文密碼通過加密與shadow密碼進行判斷 if cryptWord == cryptPass: print('[+] Found Password: ' + word + "\n") return print('[-] Password not Found.\n') return except: dictFile.close() except: print('[-] dictionary 文件無法打開') exit(0) def main(): try: passFile = open('shadow') # 打開shadow文件 try: for line in passFile.readlines(): # 一行一行讀取 if ":" in line: user = line.split(':')[0] # 利用 : 分隔 獲取用戶名 cryptPass = line.split(':')[1].strip(' ') #去掉前后空格 print('[*] Cracking Password For : ' + user) testPass(cryptPass) except: passFile.close() except: print('[-] shadow 文件無法打開') if __name__ == '__main__': main()
