crypt模塊
crypt模塊(只適用於Unix)實現了單向的DES加密,Unix系統使用這個加密算法來儲存密碼。python標準庫中自帶有crypt庫。要計算一個加密的UNIX口令hash,只需要調用函數crypt.crypt(),並將口令和salt(鹽)傳遞給它。該函數會以字符串形式返回hash。
(本人windows下python環境多次嘗試crypt庫的導入均以失敗告終,遂在linux環境下進行本次代碼編寫與執行)
嘗試使用crypt()函數計算口令的hash。將庫導入後,我們將口令與鹽值傳遞給函數,該函數會返回口令的hash。
UNIX口令破解機
testPass()函數會以參數形式獲得加密口令得hash,並在找到密碼或搜遍字典無果後返回。該函數首先將加密的口令hash的前兩個字母視爲salt,並提取出來。然後打開字典並遍歷每個單詞,用每個單詞和salt計算一個新的加密口令hash。如果計算結果與我們加密口令hash匹配,函數會打印一條消息顯示找到密碼,並返回。否則,它會在詞庫中繼續對每個單詞進行測試。
#!/usr/bin/python3
# UNIX Password Cracking
#Author:Rouzi Date:2019/12/20
import crypt
def testPass(cryptPass): # 定義一個testPass函數
salt = cryptPass[0:2]
dictFile = open('dictionary.txt','r')
for word in dictFile.readlines():
word = word.strip('\n')
cryptWord = crypt.crypt(word,salt)
if (cryptWord == cryptPass):
print("[+]Found Password:"+word+"\n")
return
print ("[-]Password Not Found.\n")
return
def main():
passFile = open('passwords.txt')
for line in passFile.readlines():
if ":" in line:
user = line.split(":")[0]
cryptPass = line.split(":")[1].strip(" ")
print ("[*]Checking Password For:"+user)
testPass(cryptPass) # 調用testPass()函數,嘗試用字典中的單詞破解口令hash
if __name__ == "__main__":
main()
兩個txt文檔內容如下:
代碼執行結果如下。
在基於*Nix的現代操作系統中,/etc/shadow文件中存儲了口令的hash,並能使用更多的安全加密算法。對腳本進行升級可以破解shadow的hash。
先將/etc/shadow文件複製到腳本目錄下。
觀察其中一條記錄如下。
rouzi:$6$9jfyOHLo$Udprtu5j4I/jj5IYj/IVyxkgIokNheugHCrCR4a1blxg3dIuzW/JOUwf6fZhBQfGtuJ32Oto9dMWdkbebRf9j.:18250:0:99999:7:::
其中rouzi爲用戶名,$6Udprtu5j4I/jj5IYj/IVyxkgIokNheugHCrCR4a1blxg3dIuzW/JOUwf6fZhBQfGtuJ32Oto9dMWdkbebRf9j.爲加密後的hash值。
修改代碼如下:
#!/usr/bin/python3
# UNIX Password Cracking
#Author:Rouzi Date:2019/12/20
import crypt
def testPass(cryptPass):
salt = cryptPass[0:11]
dictFile = open('dictionary.txt','r')
for word in dictFile.readlines():
word = word.strip('\n')
cryptWord = crypt.crypt(word,salt)
if (cryptWord == cryptPass):
print("[+]Found Password:"+word+"\n")
return
print ("[-]Password Not Found.\n")
return
def main():
passFile = open('shadow')
for line in passFile.readlines():
if ":" in line:
user = line.split(":")[0]
cryptPass = line.split(":")[1].strip(" ")
print ("[*]Checking Password For:"+user)
testPass(cryptPass)
if __name__ == "__main__":
main()
執行結果如下。