1. 不同操作系統下的密碼爆破攻擊面
0x1:Linux
1. SSH
2. VSFTP
很多Linux發行版本原生默認安裝,且使用Linux系統的account auth認證體系。因此這是一個原生默認的攻擊面。
0x2:Windows
1. RDP
2. SMB
3. IPC
4. NetBIOS
5. WinRM
WinRM(Windows Remote Management)is the Microsoft implementation of WS-Management Protocol, a standard Simple Object Access Protocol (SOAP)-based, firewall-friendly protocol that allows hardware and operating systems, from different vendors, to interoperate.
The WS-Management protocol specification provides a common way for systems to access and exchange management information across an IT infrastructure. WinRM and Intelligent Platform Management Interface (IPMI), along with the Event Collector are components of the Windows Hardware Management features.
因為進行遠程powershell管理必須需要啟用winrm的服務,所以需要在windows平台上啟用winrm服務。winrm service 默認都是未啟用的狀態,先查看狀態,如無返回信息,則是沒有啟動。
WinRM2.0默認端口5985(HTTP端口)或5986(HTTPS端口)
# 針對winrm service 進行基礎配置 winrm quickconfig # 查看winrm service listener: winrm e winrm/config/listener winrm enumerate winrm/config/listener # 為winrm service 配置auth: winrm set winrm/config/service/auth @{Basic="true"} # 為winrm service 配置加密方式為允許非加密: winrm set winrm/config/service @{AllowUnencrypted="true"}
當server端開啟winRM后,遠程client可以借助winRM向遠程server執行指令。
為了能接受winRM指令,遠端機器需要進行一些預配置。
winrm quickconfig y winrm set winrm/config/service/Auth '@{Basic="true"}' winrm set winrm/config/service '@{AllowUnencrypted="true"}' winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="1024"}'
接下來准備winrm-cli,
git clone https://github.com/masterzen/winrm-cli cd winrm-cli make
登錄嘗,
./winrm -hostname remote.domain.com -username "Administrator" -password "secret" "ipconfig /all"
完整代碼如下:
# -*- coding: utf-8 -*- import winrm def winCMD(hostname='hostname', username='username', password='password', cmd='cmd'): wintest = winrm.Session('http://'+hostname+':5985/wsman',auth=(username,password)) ret = wintest.run_cmd(cmd) print ret print ret.std_out.decode() print ret.std_err if __name__ == "__main__": winCMD("120.27.221.55", "xxx", "xxx", "ipconfig")
Relevant Link:
http://en.wikipedia.org/wiki/Brute-force_attack http://en.wikipedia.org/wiki/Dictionary_attack http://en.wikipedia.org/wiki/Rainbow_tables http://lasecwww.epfl.ch/pub/lasec/doc/Oech03.pdf http://www.91ri.org/7593.html http://www.ha97.com/4009.html https://attack.mitre.org/techniques/T1028/ https://blog.51cto.com/jiaszwx/2367499 https://blog.csdn.net/leejeff/article/details/82907773 https://www.ctolib.com/winrm-cli.html https://blog.csdn.net/Together_CZ/article/details/86623977 https://blog.51cto.com/281816327/1395172
2. 密碼破解的分類
0x1:在線破解
在線破解是安全攻防場景中最常見的情況,即通過遠程認證的方式嘗試窮舉目標機器的賬戶密碼。
對於在線破解來說,網絡io和頻度控制是主要的限制。
0x2:離線破解
離線攻擊常見於入侵的中后段,通過hashdump或密碼竊取的方式,拿到加密后的密碼哈希后,通過離線窮舉的方式,猜測原始密碼。
1. Brute-Force-Attack
也就是常說的"暴力破解",這是一種"時間消耗型"的password reverse方式,確定了密文的加密方式的前提下,使用相同的加密算法,計算 M = H(P) P為所有的明文空間 H為加密算法 M為密文 然后將計算得到的M和待破解的密文進行比較,如果匹配成功,則對應的明文P即為待破解密文的明文。值得注意的是,這個枚舉P和比較M的過程往往是在內存中進行的,
也即在計算的過程中一邊產生,一邊比較,這次破解結束后,下一次破解又要重新開始從頭枚舉,效率不太高
2. Directory-Based-Attack
字典破解本質上還是"暴力破解"的一種,我覺得它是"Brute-Force-Attack"的另一個極端,"Brute-Force-Attack"是一種純的"時間消耗型"的攻擊方式,它所有的開銷都是時間,
而"Directory-Based-Attack"是一種純的"空間消耗型"的攻擊方式。 在"Directory-Based-Attack"中,攻擊者是對所有的明文(M)進行預計算(PreConputation),將所有的明文的HASH都事先計算好,並保存起來。典型的MD5字典如下: .... password 5f4dcc3b5aa765d61d8327deb882cf99 admin 21232f297a57a5a743894a0e4a801fc3 cnblog efbc3548e65e7225dcf43d3918d94e6f .... 在進行破解的時候,破解程序將字典映射Mapping到內存中,然后將HASH和待破解的密文進行逐條比較(這點和Brute-Force是一樣的),直到找到某條HASH和待破解的密文相同為止。
值得注意的是,基於字典的暴力破解時間上比單純的內存計算型暴力破解更有效率,只要一次的"字典生成"花費一定的時間,后續的多次破解都可以重復使用這個字典。
注意,這里說的"字典"指的對應某個算法的字典: MD5 Directory、SHA1 Directory、NTLM Directory等等。 總的來說,字典攻擊是對單純的內存型暴力破解的一個改進,它引入了PreComputation的思想,但缺點也很明顯,需要占用及其龐大的磁盤空間,以至於對於長度16以上的密碼字典,
完整存儲根本不可能
3. Rainbow-Table-Attack
這是對"Brute-Force"和"Directory-Base"的一種折中的破解技術,在2003年瑞典的Philippe Oechslin 在Making a Faster Cryptanalytic Time-Memory Trade-Off一文
(文章開頭有給出鏈接)中首次被提出,它有效的利用了PreComputation的優點,同時又克服了Diecretory-Based消耗太空磁盤空間的缺點,在這兩者中找到了一個平衡點。 不過,它也有缺點,即: 1) password+salt: 加鹽 2) key stretching: 密碼擴展,包括輪數擴展和長度擴展 接下來,我們的文章會重點分析這個彩虹表破解的技術原理
3. 密碼破解方式的應用場景
在開始研究Rainbow Table-Attack的技術之前,我們有必要先明白一個問題,雖然說彩虹表破解技術比"Brute-Force-Attack"、"Directory-Based-Attack"都要好,但並不是所有場景下都能使用彩虹表進行破解的。密碼破解有兩種場景:
1) 遠程破解場景 攻擊者面對的是一個遠程的服務器,並且目標服務器存儲密碼的生成算法也不知道,此時,我們只能使用Hydra等工具進行窮舉破解(Brute-Force)、
或者字典破解(Diretory-Attack)
2) 本地破解場景 攻擊者知道遠程服務器的密碼生成算法(常常發生在一些常見的CMS系統后中)、通過hashdump抓到了內存中的HASH密碼(LM、NTLM)、或者已經拿到了密碼的HASH值(脫庫中常見),
攻擊者可以在本地自己的計算機上進行本地計算,這個時候,相比暴力破解(Brute-Force-Attack)、字典破解(Directory-Attacj)來說,彩虹表破解就是一個更好的選擇了。
4. Rainbow Table彩虹表破解技術原理
Rainbow Table相比Directory做的第一個改進就是將龐大的明文密文對"分成"了"明-密文對鏈chain",鏈條的長度越長,空間的縮減效果就越大。為了使用彩虹表技術,需要事先確定兩個
函數: H(HASH函數): 密碼的加密方式,不同的彩虹表對應於不同的加密方式(這點和Directory-Based的道理是一樣的) 常見的H函數有: MD4、MD5、SHA1、
R(Reverse Hash函數): 逆HASH函數,並不是真的對HASH函數求逆(我們都知道HASH函數是不可逆的),這里所謂的R函數,只是一個映射Mapping函數,將H()得到的密文再次映射回一個對應
的明文,不一定是原來的明文,只要是明文就行
0x1:彩虹表生成
要注意,彩虹表的核心思想還是PreComputation的字典思想,所以生成彩虹表就是在生成一個字典,只是這個生成過程不再是單一的H計算,並保存明-密文對那么簡單了。
我們分別看每一條鏈:
H(wikiedia)=ao4kd -> R1(ao4kd)=secret -> H(secret)=9kpmw -> R2(9kpmw)=jimbo -> H(jimbo)=v0d$x -> R3(v0d$x)=rootroot H(abcdefgh)=1vn6s-> R1(1vn6s)=bernie-> H(bernie)=kolscx-> R2(kolscx)=zurich-> H(zurich)=8ntpy -> R3(8ntpy)=myname .... H(passwd)=dlcm4-> R1(dlcm4)=culture-> H(culture)=re3xes-> R2(re3xes)=crypto-> H(crypto)=1tik0-> R3(1tik0)=linux23
有幾個重點要關注:
- 1) 在這個例子中,彩虹表的chain length是3,也就是說一條鏈包含3個節點,也即這種情況可以以原本 1/3 的磁盤空間保存同等規模的字典
- 2) wikiedia稱為"頭結點",rootroot稱為"尾節點"。我們最后需要保存的也就是這個頭-尾節點對,而中間的中間值全都不用保存,這也是彩虹表省空間的原因
- 3) R1、R2、R3....Rk(K代表每條鏈的長度,在這個例子中是3),是K個不同的Reverse Hash函數,它存在的目的是為了避免出現不同的chain中出現重復的節點,我們可以思考一下,如果這個R在一條鏈中的每個節點都是一樣的,那如果假如在兩條鏈中的某兩個節點在進行R()之后,得到了相同的結果,則在這之后,H計算也會得到相同的結果,緊接着R計算又是相同的結果,則造成了重復存儲,浪費了存儲空間,也減低了這套破解系統的明文空間覆蓋度,從而間接影響了破解效果。
假如R是不變的: H(startpoint1)=median1 -> R(median1)=median12 ...... -> R(median1x)=same -> H(same)=same1 -> .... same_end H(startpoint2)=median2 -> R(median1)=same -> H(same)=same1 -> .... same_end ... 注意這個重合一定是發生在不同鏈上的不同位置的節點,因為H的"非碰撞性"保證了這點(思考),這個重合導致的是兩條鏈中的某一段發生了"重合"
會出現這個現象的原因是因為我們選擇的R函數很難保證"非碰撞性",即無法保證不同的輸入在進行R計算不會得到不同的輸出,為了解決這個問題,將一條鏈上的不同節點的每次計算都使用不同的R函數,這樣,即使在不同鏈上的不同位置因為Rk是不一樣的,就不會發生重合了。
回到主題上來,這個鏈式的表生成好之后,我們之保存每條鏈的頭和尾的兩個明文節點,中間的點都是"可計算的",故丟棄,把全部的鏈的頭尾節點保存起來,就成了所謂的彩虹表
0x2:使用彩虹表進行HASH密碼破解
再次回顧這張圖
假如我們要破解的HASH密文為re3xes 1) 對密文re3xes進行Rk(k代表最后一個R函數,這里是R3)運算,得到一個臨時結果 I,將這個臨時結果I和每條鏈的尾節點進行比較,檢測是否是某一條鏈的尾節點 1.1) 如果匹配成功,則破解成功,我們知道了這個待破解的密文屬於某一條鏈,就可以利用這條鏈的頭尾節點重現(再次計算)出這條鏈上的每個明密文對,自然也包括了待破解密文的明文 1.2) 如果匹配失敗,在所有鏈的尾節點上都沒有這個臨時結果 I,則繼續進行(2) 2) 對密文re3xes進行Rk-1(k-1代表倒數第二個R函數,這里是R2),這里又得到一個臨時結果: crypto,再對臨時結果crypto進行H計算,得到: 1tik0,再對1tik0進行Rk
(k代表最后一個R函數,這里是R3)得到一個臨時結果: linux23。將這個臨時結果和每條鏈的尾節點進行比較,檢測是否是某一條鏈的尾節點 1.1) 如果匹配成功,則破解成功,在這個例子中我們知道匹配成功,就可以利用這條鏈的頭節點: passwd重現(再次計算)出這條鏈上的每個明密文對,自然也包括了待破解密文的
明文: culture 2.1) 如果匹配失敗,則繼續調用Rk-2進行搜索,步驟都是類似的 ... 直到完成了R1的搜索,如果還沒有找到匹配的,則宣布本次破解失敗,需要增大彩虹表文件大小、重組字典
0x3:彩虹表的缺點
我們知道,彩虹表的核心思想是"PreComputation預計算",而預計算的一個最大大問題就是"當加密的形式發生變化,這個預生成的字典從某種程度上就無用了"。這么說有些不太准確,我想表達的意思是預計算對算法的變化非常敏感,這也是對抗彩虹表技術的一個思考方式。
因為彩虹表需要針對算法變化的每一種形式都預生成一個對應的字典,如果這個變化空間很大,就會使彩虹表的生成成本變得很大,這樣,彩虹表原本解決的空間成本問題又再次暴露出來。
而要達到"算法變化"的方式非常多,常見的有以下兩種方法
1) 加鹽 saltedhash(password) = hash(password+salt) Or saltedhash(password) = hash(hash(password)+salt) 需要對付這種加密方式,彩虹表就需要針對salt的每一種可能的取值都生成一套字典,當salt的長度很長時,彩虹表的生成成本和破解效率都會大幅下降 2) 密碼增強 key stretching 是加密方式變化除了"加鹽",加密輪數也是一個可變化的點,MD5-Crypt and in bcryp中都使用了Crypt Loop技術,即使用同一個算法,或不同的算法組合對一個明文進行迭代的
多次(1000以上)加密,這樣,加密的輪數和加密方式的組合本身也構成了一個"變化空間" 需要對付這種加密方式,彩虹表就需要針對每一個加密輪數+加密方式的組合都生成一套字典,同樣,彩虹表的生成成本和破解效率都會大幅下降
5. 密碼破解工具
http://files.cnblogs.com/LittleHann/MD5%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7.rar MD5解密器個人加強版 LC5 http://ishare.iask.sina.com.cn/f/8862330.html Ophcrack http://www.objectif-securite.ch/ophcrack.php SAMInside http://www.insidepro.com/eng/saminside.shtml Rainbowcrack http://www.project-rainbowcrack.com/ 彩虹表免費下載 https://www.freerainbowtables.com/en/tables/
6. 新技術
研究一下目前密碼破解的新技術,主要有以下幾個方面
1. 當前密碼破解的方法 目前大規模高速密碼破解技術主要有: 1) CPU破解 通過大規模、高覆蓋率、社工庫類型的明文密碼庫作為輸入字典,對密文進行破解,這里的關鍵就在於字典庫的高高覆蓋率,可以達到很高的破解率 2) GPU破解 關於GPU的告訴運算原理,可以參考這兩篇文章,我目前對硬件的研究並不多,也會也許會考慮寫一些關於GPU硬件方面的研究文章 http://blog.chinaunix.net/uid-9620812-id-3061237.html http://wenku.baidu.com/link?url=j90kB6Vk8KuEA8lITgZNJ4GbHeXgiArFcS3xwXRaEv83LxtqUFaWJLDyxqN6ue1iB-q3zwNTfPL55k2qneDHD3nHc2cqzBW2tktrfMRboDi GPU破解所帶來的變化是計算速度的成倍提升,相當於原本的CPU破解,理論上GPU破解也可以采用字典的方法,但是,因為GPU的超高速性,所以針對GPU破解,我們就可以更多地采用一些時
間消耗型的計算,減少CPU破解中的磁盤IO的瓶頸問題。 也就是說,基於GPU的破解架構,我們采用"暴力窮舉"就成了更好的選擇,但是,單純的使用暴力窮舉也不是很好的辦法,例如: LittleaHann2014china這種類型的密碼,長度極長,但是
卻含有一定的規律性,如果采用純粹的暴力窮舉,破解的效率不會很好。 所以,針對GPU破解,目前采用的"基礎字典"+"詞根衍變"的破解技術,這可以理解為在高速GPU的架構下對時間消耗和磁盤IO消耗的一個折中的優化方案,這個方案中有3個要素 1) 一定規模的明文字典 2) GPU高速運算 3) 某種詞根衍變算法,能根據詞根衍變算法,對基礎的字典進行詞根重組,組合出新的密碼,例如組合出LittleaHann2014china http://hashcat.net/oclhashcat/ hashcat是一款使用GPU加速破解的軟件,具有很好的效果。 2. 分布式的破解技術 1) 利用分布式系統做大規模批量破解 2) 對明文字典進行有效切分 舉例來說,一個明文的MD5值是一個32位的密文,則我們可以根據這個32位密文的每一位的值將原本的一個大的字典切分成不同的部分,並放在不同的子目錄中。 例如: ... 02f521d18b7100ce07cd17c94fe5a89f 03f521d18b7100ce07cd17c94fe5a89f 12f521d18b7100ce07cd17c94fe5a89f 13f521d18b7100ce07cd17c94fe5a89f ... 是一堆MD5值,我們先根據MD5值的第一位進行分類,將第一位為0的MD5對應的明文都放到一個路徑下,將第一位為1的MD5對應的明文放到另一個路徑下。 然后在剛才第一位為0的目錄下,我們繼續進行切分,將第二位為2的放到一個目錄下,將第二位為3的放到另一個目錄下 同時在剛才第一位為1的目錄下,我們繼續進行切分,將第二位為2的放到一個目錄下,將第二位為3的放到另一個目錄下 這個過程會不斷地遞歸下去,直到分到單個明文字典文件的大小在可接受的范圍內,即磁盤IO的壓力能夠取得平衡的時候。 這樣做的好處在於,當你拿到一個待破解的密文,可以根據這個密文的頭部每一位數值,進行對應的路徑定位,這樣,路徑定位的過程從"某種程度上來說"就已經是在進行破解了,而且更重
要的是,這種技術可以有效利用分布式的架構,緩解因為讀寫文件導致的IO瓶頸,是一種非常好的技術
目前密碼破解存在的問題
在密碼破解攻防領域中,加鹽salt依然是一種簡單、而十分有效的方法,對於加鹽的密碼,黑客們要破解存在以下幾個問題 1. 加鹽salt的長度很短,只有幾位的鹽 1) 直接生成字典、彩虹表(在投入-產出比可接受的情況下) 2) 用GPU直接在內存中進行暴力枚舉,因為如果鹽的長度很短,在高速GPU的架構下投入-產出比完全可以接受 2. 加鹽的長度很長,到達12位以上 1) 生成字典(不可行) 2) GPU破解(耗時太大)
我們可以看到,密碼破解的本質是"資源",這個資源包括字典的資源、計算能力的資源,當然加上詞根衍算法,就能將擁有的資源的效果翻倍
接下來待研究的知識點
1. 詞根衍變算法 2. 分布式的、根據指定位的值對文件切分的多級目錄存儲明文詞典 3. GPU破解(需要購買相應的顯卡)