上篇文章給大家介紹過 Python腳本破解Linux口令(crypt模塊) 感興趣的朋友點擊查看。
linux密碼破解
這段代碼通過分別讀取兩個文件,一個為加密口令文件(cryptPass),另一個為用于猜測的字典文件(key.txt)。
在testPass()函數中讀取字典文件,并通過crypt.crypt()進行加密,加密時需要一個明文密碼以及兩個字節salt(加密口令的前兩個字母),通過salt和明文密碼加密形成 cryptWord。
最后將cryptWord和cryptPass進行對比,如果相等,則這個word就是該用戶的密碼,否則不是。
先看crypt的示例:
可以看到鹽是添加在密文的前兩位的,所以將加密口令的前兩位提取出來為salt即可。
在Linux系統中,用戶的密碼被加密存儲在了 /etc/shadow 文件中
如下是 /etc/shadow中root用戶的字段
密碼部分的格式為:$id$salt$encrypted
id是指用的哈希算法,id為1是MD5,id為5是SHA-256,id為6是SHA-512
salt 為鹽值
encrypted 為hash值,這里的hash值是密碼和鹽值一起加密之后得到的
編程之前準備:
1、創建密碼字典key.txt 。
2、我們將 /etc/shadow 文件復制到python腳本所在目錄,修改文件名為 shadow.txt
import crypt ##導入Linux口令加密庫 def testPass(cryptPass): salt=cryptPass[cryptPass.find("$"):cryptPass.rfind("$")] ##獲得鹽值,包含$id部分 dictFile=open("key.txt","r") for word in dictFile.readlines(): word=word.strip(" ") cryptWord=crypt.crypt(word,salt) ##將密碼字典中的值和鹽值一起加密 if (cryptWord==cryptPass): ##判斷加密后的數據和密碼字段是否相等 print "[+]Found Password:"+word+" " ##如果相等則打印出來 return print "[-] Password Not Found. " return def main(): passFile=open("shadow.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) main()
參考文章
相關知識
1、split()方法以及關于str.split()[0]等形式內容的詳細講解
str.split(str="", num=string.count(str)).
參數:
str :分隔符,默認為所有的空字符,包括空格、換行( )、制表符( )等。
num : 分割次數。默認為 -1, 即分隔所有。
返回值:
Python split() 通過指定分隔符對字符串進行切片,如果參數 num 有指定值,則分隔 num+1 個子字符串,返回分割后的字符串列表。
代碼示例:
輸入 str = "Line1-abcdef Line2-abc Line4-abcd"; print str.split( ); # 以空格為分隔符,包含 print str.split(" ", 1 ); # 以空格為分隔符,分隔成兩個
輸出 ["Line1-abcdef", "Line2-abc", "Line4-abcd"] ["Line1-abcdef", " Line2-abc Line4-abcd"]
2、關于str.split()[0]等形式內容的詳細講解
•輸入與輸出 >>> str="hello boy<[www.doiido.com]>byebye" >>> str.split("[")[1].split("]")[0] "www.doiido.com" >>> str.split("[")[1].split("]")[0].split(".") ["www", "doiido", "com"]
解析:
str.split("[")[1]. split("]")[0]輸出的是 [ 后的內容以及 ] 前的內容。 str.split("[")[1]. split("]")[0]. split(".") 是先輸出 [ 后的內容以及 ] 前的內容,然后通過 . 作為分隔符對字符串進行切片。
下面再對上面的例子進一步操作加深理解:
str="hello boy<[www.doiido.com]>byebye" str.split("o")[0]
得到:‘hell"
str="hello boy<[www.doiido.com]>byebye" str.split("o")[1]
得到:" b"(這里b的前面有個空格!)
str="hello boy<[www.doiido.com]>byebye" str.split("o")[3]
得到:‘iid"(這里得到的iid是第3個o后和第4個o前之間的內容)
str="hello boy<[www.doiido.com]>byebye" str.split("[")[0]
得到:‘hello boy<"(這里得到的hello boy<是第一個[之前的內容)
解析:
str.split(“o”)[0]得到的是第一個o之前的內容
str.split(“o”)[1]得到的是第一個o和第二個o之間的內容
str.split(“o”)[3]得到的是第三個o后和第四個o前之間的內容
str.split("[")[0]得到的是第一個 [ 之前的內容
[n] 取值范圍(n,n+1)
注意:[ ]內的數值必須小于等于split("")內分隔符的個數,否則會報錯
3、補充
str="hello boy<[www.doiido.com]>byebye" str.split("o")[0:2] 得到的結果: ["hell", " b"]
解析:
str.split(“o”)[0:2]得到的是第一個o之前的內容 + 第一個o和第二個o之間的內容,這里第三個o前內容取不到,是一個左閉右開區間。
[n:m]取值范圍(n,n+1)^(n+1,m)
引申:
str="hello boy<[www.doiido.com]>byebye" print(str.split("o")[0:-1]) print(str.split("o")[0:-2]) print(str.split("o")[0:-3]) 運行結果: ["hell", " b", "y<[www.d", "iid", ".c"] ["hell", " b", "y<[www.d", "iid"] ["hell", " b", "y<[www.d"] `str.split("o")[1:3]`取得的結果為 [" b", "y<[www.d"]
注:注意空格!注意空格!注意空格!
以上就是python滲透測試linux密碼激活的示例的詳細內容,更多關于python滲透測試linux密碼破解的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/weixin_45761101/article/details/117120991