crypt模塊的使用

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爲用戶名,$69jfyOHLosalt9jfyOHLo爲salt(鹽值)。Udprtu5j4I/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()

執行結果如下。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章