hash函數(shù)是一類函數(shù)的統(tǒng)稱,這類函數(shù)的輸入是任意的二進(jìn)制數(shù)據(jù),輸出是固定長度的二進(jìn)制數(shù)據(jù),這類函數(shù)具有如下特點:
單向性:由輸入計算得到輸出是簡單迅速的,而由輸出反推出輸入在數(shù)學(xué)上講是不可行的
碰撞約束:尋找到兩個不同的輸入,具有相同的輸出是極為困難的
滿足這些特點的函數(shù)均可稱為hash函數(shù)。將某數(shù)據(jù)作為hash函數(shù)的輸入,計算得到輸出,習(xí)慣上將這一輸出稱為該數(shù)據(jù)的hash值。
hash函數(shù)的一大作用便是安全地存儲密碼,不直接保存密碼(也就是不存儲明文的密碼),而是保存密碼的hash值,驗證時只需再次計算輸入的密碼的hash值,與保存的密碼的hash值相比較便可得知密碼是否正確。由于hash函數(shù)的單向性與碰撞約束的特點,攻擊者即使拿到了密碼的hash值,也難以知道密碼本身。
攻擊者拿到了密碼的hash值,真的沒有辦法知道密碼本身嗎?當(dāng)然不是,雖然由密碼的hash值直接計算密碼本身從數(shù)學(xué)上講就是不可行的,但我們知道hash函數(shù)由輸入計算得到輸出是簡單迅速的,大不了可以試嘛,人類可能設(shè)置的密碼也就那些,一個一個地試,運(yùn)氣好還是可以試出來的。通過不斷嘗試獲得hash值對應(yīng)的輸入的操作就被稱做爆破。
基于這樣的思路,hashcat應(yīng)運(yùn)而生,據(jù)說hashcat的誕生就是為了證明爆破hash是很簡單的事。hashcat自稱是世界上最快的hash爆破工具,它甚至支持GPU和FGPA,如果你有的話。
hashcat不僅速度快,而且專業(yè)支持兩百多種hash函數(shù),使用命令:
hashcat --help
可以看到hashcat支持的所有hash函數(shù)的列表,太多了我這里就不貼出來了。
Kali中默認(rèn)安裝了hashcat,可直接使用。但我的Kali安裝在VirtualBox中,總覺得虛擬機(jī)會慢一些,所以想要在物理主機(jī)中使用hashcat。先到hashchat的官網(wǎng)下載hashcat,截止目前,最新版是v3.5.0,發(fā)布于2017.04.05,從更新日期可見hashchat是充滿活力的。免去編譯的麻煩,直接下載二進(jìn)制包,只有2.7M,與動輒幾十G的游戲相比是很小的。
下載完成后解壓hashcat,看到有:
hashcat32.bin
hashcat32.exe
hashcat64.bin
hashcat64.exe
這樣的文件,分別是32位和64位下的linux中和windows中的可執(zhí)行文件,按自己電腦的情況選擇其中之一即可。我選擇的是hashcat64.bin,為漂亮起見,在~/.bashrc文件中添加一行:
alias hashcat='hashcat64.bin的路徑'
保存后重新打開虛擬終端,使~/.bashrc文件生效,這樣,無論在哪,直接輸入hashcat命令就可以了,不用切換目錄,也不用輸入輸入難看的“64.bin”,如下圖所示。
好了,現(xiàn)在可以開始使用hashcat爆破各種hash了。
md5應(yīng)該是最著名、使用最為廣泛的hash函數(shù)之一了。先用Python生成幾個md5值用于爆破,代碼如下:
import hashlib passwords = ['123123', 'bond007', 'xxxxxx', '*H@&(NT*@BR#^'] for password in passwords: md5 = hashlib.md5() md5.update(password) print md5.hexdigest()
以上代碼分別計算了四個字符串的hash值,輸出的結(jié)果是:
4297f44b13955235245b2497399d7a93 cbdb7e2b1ed566ceb796af2df07205a3 dad3a37aa9d50688b5157698acfd7aee d77db958c179bbffae04b2b908b75c26
將輸出結(jié)果保存在文件md5.hash中,一行一個hahs值。然后用hashcat爆破這幾個hash值,命令如下:
hashcat -w 3 -a 0 -m 0 --remove -o md5.out md5.hash wordlist.dic
參數(shù)-w用于指定工作模式,共有四種,如下表所示:
N | Performance | Runtime | Power Consumption | Desktop Impact |
---|---|---|---|---|
1 | Low | 2 ms | Low | Minimal |
2 | Default | 12 ms | Economic | Noticeable |
3 | High | 96 ms | High | Unresponsive |
4 | Nightmare | 480 ms | Insane | Headless |
參數(shù)-a用于指定攻擊模式,0的含義是直接地、連續(xù)的,也就是用密碼字典爆破,-a的取值共有五種,如下表所示:
N | Mode |
---|---|
0 | Straight |
1 | Combination |
3 | Brute-force |
6 | Hybrid Wordlist + Mask |
7 | Hybrid Mask + Wordlist |
-m用于指定要爆破的hash值的hash函數(shù),0表示hash函數(shù)是md5,其他取值如下表所示:
N | Name | Category |
---|---|---|
0 | MD5 | Raw Hash |
300 | MySQL4.1/MySQL5 | Database Server |
1000 | NTLM | Operating Systems |
1800 | sha512crypt $6$, SHA512 (Unix) | Operating Systems |
2611 | vBulletin < v3.8.5 | Forums, CMS, E-Commerce, Frameworks |
這張表太長了,我這里只展示本文中涉及到的幾種hash函數(shù),用參數(shù)–help可以看到全部。
參數(shù)–remove的含義是若成功爆破某hash值,就將該值從md5.hash中移除。
參數(shù)-o后接一個文件名,指出保存爆破結(jié)果的地方。
最后的兩個參數(shù)md5.hash和wordlist.dic分別是待爆破的hash值和密碼字典,hash值與密碼字典都是一行一個。md5.hash中的內(nèi)容已經(jīng)由Python算,若你手頭沒有合適的密碼字典,可以用命令:
wget -O wordlist.dic https://samsclass.info/123/proj10/500_passwords.txt
下載一個?,F(xiàn)在完事具備,按下回車,結(jié)果華麗地報錯:(
clGetPlatformIDs(): CL_PLATFORM_NOT_FOUND_KHR
大概是缺少什么運(yùn)行環(huán)境,那就安裝唄。我總共安裝了這些東西:
sudo apt-get install gcc make p7zip-full git lsb-core wget http://registrationcenter-download.intel.com/akdlm/irc_nas/9019/opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz tar -xvf opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz cd opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25 sudo ./install.sh
網(wǎng)速好的話一小會就安好了,第一條命令報錯:
/sbin/ldconfig.real: /usr/lib/nvidia-375/libEGL.so.1 is not a symbolic link /sbin/ldconfig.real: /usr/lib32/nvidia-375/libEGL.so.1 is not a symbolic link
但是好像不影響什么,忽略掉好了。安裝完這些后,再次按下回車,運(yùn)行原本報錯的命令,發(fā)現(xiàn)果然沒有再次報錯,且轉(zhuǎn)瞬之間,便執(zhí)行完畢。命令執(zhí)行完畢后查看文件md5.hash和md5.out的內(nèi)容,發(fā)現(xiàn)md5.hash中只剩一個hash,爆破成功的三個hash已經(jīng)被轉(zhuǎn)移到文件md5.out中,md5.out中是三個hash值及其原值,如下圖所示:
Windows的登錄密碼的hash值保存在SAM文件中,SAM是“security account manager”的首字母縮寫。通常,它位于
C:\windows\system32\config\SAM
SAM文件被Windows保護(hù),不能直接讀取,需借助工具,如SAMInside。找一臺Windows7虛擬機(jī),新建一個名為hashcat的管理員用戶,并設(shè)置密碼,在Windows7中下載并解壓SAMInside后以管理員權(quán)限運(yùn)行,然后點擊File->Import Local Users vis Scheduler,如下圖所示:
之后SAMInside可能會“未響應(yīng)”,但不要緊,耐心地等待幾秒,SAMInside不負(fù)所望地讀出了我們想要的hash,如下圖所示:
選中我們想要爆破密碼的用戶“hashcat”,按Ctrl+5復(fù)制NT-hash,然后回到安裝了hashcat的Ubuntu中,用如下命令將復(fù)制出的hash值保存到文件win7.hash中:
echo 356CEAE0C89FB65ED6D6AA7A445C4CE5 > win7.hash
NT-hash便是Windows7保存登錄密碼使用的hash函數(shù),接著用如下命令爆破NT-hash:
hashcat -w 3 -a 0 -m 1000 --remove -o win7.out win7.hash wordlist.dic
片刻后執(zhí)行完畢,查看win7.out文件,發(fā)現(xiàn)爆破成功,用戶hashcat的登錄密碼是rush2112:
werner@Yasser:~/hashcat$ cat win7.out 356ceae0c89fb65ed6d6aa7a445c4ce5:rush2112
怎樣拿到SAM文件可參考《如何導(dǎo)出Windows哈希系列一 》。下面記錄我讀取虛擬機(jī)Windows7中SAM文件的過程。
若是物理機(jī),用Win PE啟動機(jī)器,讀取磁盤上的SAM文件即可。我的是虛擬機(jī),將虛擬磁盤文件掛載到文件系統(tǒng)中就可以讀虛擬磁盤中的文件了。我用的虛擬機(jī)是VirtualBox,使用命令vdfuse可以完成此事。若沒有vdfuse則需先安裝virtualbox-fuse:
sudo apt-get install virtualbox-fuse
也可下載virtualbox-fuse的安裝包自己安裝。
安裝完成后便有了vdfuse命令,可以開始虛擬磁盤映射、掛載了:
mkdir -p ~/vmdisk sudo vdfuse -t VMDK -f Win7Pro32.vmdk ~/vmdisk/
執(zhí)行完這步后查看~/vmdisk目錄,其中有三個文件:EntireDisk、Partition1和Partition2,新建目錄:
mkdir -p ~/vmdisk_en mkdir -p ~/vmdisk_1 mkdir -p ~/vmdisk_2
用mount命令分別掛載EntireDisk、Partition1和Partition2這三個文件:
sudo mount ~/vmdisk/EntireDisk ~/vmdisk_en sudo mount ~/vmdisk/Partition1 ~/vmdisk_1 sudo mount ~/vmdisk/Partition2 ~/vmdisk_2
發(fā)現(xiàn),EntireDisk掛載失敗,Partition1中內(nèi)容不是我想要的,Partition2中是Windows7虛擬機(jī)中的文件,正是我想要的。從vmdisk_fs中復(fù)制出我們的目標(biāo)SAM文件:
cp ~/vmdisk_2/Windows/System32/config/SAM ./
順便把SYSTEM文件也復(fù)制出來:
cp ~/vmdisk_2/Windows/System32/config/SYSTEM ./
查看SAM文件的內(nèi)容,如下圖所示,竟然不是純文本文件,果然是Windows的風(fēng)格,
好吧,雖然成功打開了SAM文件,但我們還是沒有得到hash,接下來改怎么辦?只能借助工具解析SAM文件內(nèi)容了。把SAM文件和SYSTEM文件都搞到Kali中,運(yùn)行命令:
samdump2 -o sam.hash SYSTEM SAM
然后查看sam.hash,也可以看到各個用戶登錄密碼的hash值。sam.hash文件中每行是一個用戶,每一行的格式均為:
用戶名稱:RID:LM-hash值:NTLM-hash值
注意此格式是samdump2命令輸出格式,并不是“Windows下的Hash密碼格式”。
首先,得有一臺運(yùn)行l(wèi)inux系統(tǒng)的電腦,這個好說,虛擬機(jī)就可以了。然后,運(yùn)行如下命令添加新用戶并設(shè)置密碼,以供我們爆破之用:
sudo adduser justforfun
linux中用戶登錄密碼的hash值存放在文件/etc/shadow中(注意:不是/etc/passwd),使用如下命令查看新建用戶的登錄密碼的hash值:
test@test-VirtualBox:~$ sudo tail -n 1 /etc/shadow justforfun:$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0:17373:0:99999:7:::
tail命令用于讀一個文件的最后幾行,默認(rèn)是10行,用參數(shù)-n指定行數(shù)。我們剛剛新建的用戶自然在最后一行,故用tail -n 1讀取。讀到的結(jié)果是以“:”分割的數(shù)據(jù),第一部分是用戶名“justforfun”,第二部分便是密碼的hash值了,其他的部分在本文中不必關(guān)心。我們重點研究第二部分。
開頭的“$6$”指所用hash函數(shù)的類型為SHA-512,除“$6$”外,在linux中,“$1$”指MD5, “$2a$”指Blowfish, “$2y$”指Blowfish(correct handling of 8-bit chars), “$5$”指SHA-256,詳情參見維基百科:passwd。此外,文件/etc/login.defs也對hash算法有所說明。
“$6$”開始到下一個“$”之前的部分“0fokwg59”是鹽(SALT)。什么是鹽呢?百度知道CNB2009對問題“什么是md5鹽值”的回答簡單易懂:
簡單說就是為了使相同的密碼擁有不同的hash值的一種手段,就是鹽化。MD5自身是不可逆的,但是目前網(wǎng)路上有很多數(shù)據(jù)庫支持反查詢,如果用戶密碼數(shù)據(jù)庫不小心被泄露,黑客就可以通過反查詢方式獲得用戶密碼,或者對于數(shù)據(jù)庫中出現(xiàn)頻率較高的hash碼(即很多人使用的)進(jìn)行暴力破解(因為它通常都是弱口令)。鹽值就是在密碼hash過程中添加的額外的隨機(jī)值,比如我的id是癲ω倒④ゞ,密碼是123456,存在數(shù)據(jù)庫中的時候就可以對字符串“123456/癲ω倒④ゞ ”進(jìn)行hash,而驗證密碼的時候也以字符串“(要驗證的密碼)/癲ω倒④ゞ ”進(jìn)行驗證。這樣有另外一個笨蛋密碼是123456的時候,依然能構(gòu)造出不同的hash值,并且能成功的驗證。這時候我的id就作為鹽值 為密碼進(jìn)行復(fù)雜hash了。所以么。。鹽值的作用是減少數(shù)據(jù)庫泄露帶來的損失。如果你RP非常好,猜中了我的密碼是123456,我也阻止不了你啊
該回答針對md5,其他hash函數(shù)同理。鹽之后的部分就是hash值了?,F(xiàn)在復(fù)制整個第二部分到文件linux.hash中,linux.hash中的內(nèi)容應(yīng)為:
$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0
然后用如下命令爆破linux登錄密碼hash:
hashcat -w 3 -a 0 -m 1800 --remove -o linux.out linux.hash wordlist.dic
片刻后,爆破完成,查看結(jié)果:
werner@Yasser:~/hashcat$ cat linux.out $6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0:4321
可見爆破成功。
首先,得有Mysql。剛好我虛擬機(jī)中就有。百度可知Mysql的登錄密碼的hash值保存在文件user.MYD中。文件user.MYD又在哪里?我也不知道啊,就找唄:
test@test-VirtualBox:~$ sudo find / -name user.MYD /var/lib/mysql/mysql/user.MYD
找到了,是在/var/lib/mysql/mysql/user.MYD,查看該文件內(nèi)容:
sudo cat /var/lib/mysql/mysql/user.MYD
不是純文本文件,關(guān)系不大,還是看得出用戶root的登錄密碼的hash值是:
6B825255FB466413D6B1B724644E23428C94BBCB
將此值保存到文件mysql.hash中,用如下命令爆破Mysql登錄密碼hash:
hashcat -w 3 -a 0 -m 300 --remove -o mysql.out mysql.hash wordlist.dic
片刻后,爆破完成,查看結(jié)果:
werner@Yasser:~/hashcat$ cat mysql.out 6b825255fb466413d6b1b724644e23428c94bbcb:viper
可見爆破成功。
Discuz!是我國知名的php論壇程序,使用極為廣泛?,F(xiàn)在我們來爆破下Discuz!用戶密碼的hash值。首先得找到hash值,從哪里找呢?當(dāng)然是從Discuz!的數(shù)據(jù)庫里。
可Discuz!的數(shù)據(jù)庫又在哪里?我是這么解決的,從它的官網(wǎng)下載最新版Discuz!源碼,運(yùn)行安裝,便得到了Discuz!的數(shù)據(jù)庫
Discuz!的默認(rèn)數(shù)據(jù)庫名為ultrax,其中的pre_ucenter_members表中保存著登錄密碼的hash值,“pre_”是默認(rèn)的前綴,在安裝時可以改變,“ucenter_members”是不會變的。用如下sql語句查詢出登錄密碼的hash值:
select password,salt from pre_ucenter_members;
保存hash值和鹽值到文件:
echo 69bcba126b93c6f397983629a0f70553:c13fd9 > discuz.hash
hash值和鹽值在同一行中,以“:”分割。最后,用如下命令爆破Discuz登錄密碼hash:
hashcat -w 3 -a 0 -m 2611 --remove -o discuz.out discuz.hash wordlist.dic
片刻后,爆破完成,查看結(jié)果:
werner@Yasser:~/hashcat$ cat discuz.out 69bcba126b93c6f397983629a0f70553:c13fd9:winter
可見爆破成功。
截止目前,我們使用僅僅500個單詞的小字典,每次都只需片刻,便順利地爆破了各種hash,不覺得奇怪嗎?這是因為我為練習(xí)使用hashcat而故意設(shè)置在字典內(nèi)的弱密碼,否則爆不出來豈不是讓人心情很差。實際中就不可能有這么好的運(yùn)氣了。我們來隨便計算一個不那么弱的密碼的md5值,用大字典爆破,一方面試試運(yùn)氣,另一方面看看hashcat能有多快。
首先計算md5值:
import hashlib md5 = hashlib.md5() md5.update("werner123456!!!") print md5.hexdigest()
輸出為:
b17133f9abff287ed0546c1af2b171f7
然后選擇一個10.5G大小,內(nèi)含9.4億密碼的字典,開始爆破:
hashcat -w 3 -a 0 -m 0 --remove -o big.out b17133f9abff287ed0546c1af2b171f7 big.dic
注意到,只有一個hash值時,不用保存在文件中,直接寫在命令行參數(shù)中也可以。睡覺前開始爆破,第二天起來看結(jié)果,發(fā)現(xiàn):
Started: Wed Jul 26 22:55:27 2017 Stopped: Wed Jul 26 23:02:28 2017
原來只用了7分鐘!我原以為要用7個小時,比我預(yù)想的快了60倍!有點遺憾的是,并沒有成功的爆破出hash值,看來“werner123456!!!”并不在密碼字典中??磥砦倚枰獪?zhǔn)備一個100G的密碼字典,但這么大的字典保存、轉(zhuǎn)移都很不方便,沒有其他辦法嗎?當(dāng)然有,還記得攻擊模式嗎?我們一直在使用“Straight”模式,接下來,研究下其他幾種模式吧。
使用hashcat爆破hash,第一是要找準(zhǔn)hash,不同的系統(tǒng)、不同的軟件,其hash存放的位置不同,需要準(zhǔn)確地找出hash值來;第二是要正確判斷hash類型,確定hashcat是否支持這種hash,選對-m的參數(shù),否則幾乎不可能成功;第三是密碼字典要好,最終能否爆破成功,還是看字典。密碼字典雖不是越大越好,但總歸還是大點的好,hashcat也以速度著稱,大字典對hashcat不是問題。這里記錄一個比較好的字典:歷次泄密門+常用弱口令字典集合.7z,解壓密碼是:anywlan。另外,若是收集了很多小字典,可以將小字典合并、排序、去重,得到一個大字典,以便于hashcat爆破之用。如果小字典在同一個目錄下,使用一條命令就可以搞定:
cat * | sort | uniq > Merge.dic
若是小字典被按類別整理,分布在多層目錄中呢?只用cat命令顯然不行,但其實也只需一條命令就可以了,假設(shè)小字典們均被存放在目錄MyDictionary中,則命令可以這樣寫:
find ./MyDictionary -type f -exec cat {} \; | sort | uniq > Merge.dic