0x01
前言:
今天拿了個linux的主機,提下來了,以前提成root之后就沒深入過,這次想着先把root密碼破解出來;
以前交洞的時候只是單純證明存在/etc/passwd和/etc/shadow,但從沒管過里面的hash;
看網上教程也很多,我也記錄一下我的學習成果吧。
0x02
大家都知道,linux系統中有一個用戶密碼配置文件 /etc/shadow ,里面存放着用戶名以及一串密文:
形如:
1
2
|
root:$6$7vXyCOws$Hp/xoGf50Kov51cy83h6CTYoQerInkAFWWYZL22640N6P0kgy9Gfy4NVndDa1hNUevqR122E7ykmA1BIIOg0C.:16821:0:99999:7:::
用戶名
:加密密碼:上次更改密碼的時間:最小更改密碼間隔:密碼有效期限:密碼過期提示時間:密碼鎖定期:賬戶有效期:保留字段
|
另外一個 /etc/passwd 文件是用戶賬戶配置文件,只保存用戶賬戶的基本信息,並不保存密碼信息。
形如:
1
2
|
root:x:0:0:root:/root:/bin/bash
用戶名
:密碼:用戶id:組ID:GECOS:主目錄:默認Shell
|
0x03
由於咱們要破解是root密碼,則只需要把/etc/shadow的root的加密密碼拿出來即可;
1
|
$6$7vXyCOws$Hp/xoGf50Kov51cy83h6CTYoQerInkAFWWYZL22640N6P0kgy9Gfy4NVndDa1hNUevqR122E7ykmA1BIIOg0C.
|
最后小數點不要漏掉,因為這些文件內容格式都是:分割的,其余的都是內容;
這里來解釋一下$分割的各個部分的含義:
1
2
3
4
|
6:表示一種類型標記為6的密碼散列;
7vXyCOws:加鹽(Salt)值;
Hp/xoGf50Kov51cy83h6CTYoQerInkAFWWYZL22640N6P0kgy9Gfy4NVndDa1hNUevqR122E7ykmA1BIIOg0C.:hash值;
!具體也就是
magic、salt、password
|
將這段加密密碼保存到一個文件里,文件后綴.hash;
咱們這里保存為1.hash。
0x04
kali下的一款hash破解工具 hashcat ,網上說的天花亂墜,我這直接記錄關於咱們破解root密碼的具體用法,其他用法類似,具體百度吧;
hashcat據官網說牛逼得很,每秒最快可爆破80億數據;
咱們這里利用他的暴力破解,就是常說的爆破,這也是得看字典;
具體命令:
1
|
hashcat -m 1800 -a 0 -o found.txt 1.hash 1.txt
|
解釋一下:
1
2
3
4
5
|
-m 是指定那種加密類型,1800是SHA-512(Unix)的代號,具體--help來查看;
-a 是指定攻擊模式,0代表Straight模式,使用字典進行破解嘗試;
-o 是破解出來的信息輸出結果文件,輸出到found.txt文件中;
1.hash 是我們上面保存的加密密碼文件;
1.txt 是我們的爆破密碼,越大越精越好;
|
這里碰到了一點小問題,hash-identifier 來看root密碼檢查是 SHA-256 加密,但這個並不是我這台機子linux的加密方式,使用這個是不能開始爆破的;
但這可以先記住一點:
1
2
3
|
linux 的/etc/shadow文件中hash算法包括缺省的DES經典算法、MD5哈希算法($1)、Blowfish加密算法($2或$2a)和SHA哈希算法($5或$6)。
因此利用
hashcat進行破解的參數也不同,比如MD5哈希算法($1),使用hashcat -m 500參數;
SHA哈希算法($5或$6),使用hashcat -m 1800 參數。
|
具體標記如下:
1
2
3
4
5
|
1. $0 = DES
2. $1 = MD5
3. $2a(2y) = Blowfish
4. $5 = SHA-256
5. $6 = SHA-512
|
這里可以直接看magic標記值來直接判斷,這里是6,所以是SHA-512的magic值1800;
回車開始爆破。
0x05
拿本地操作一下,放了個6000小字典,里面放上了虛擬機root的密碼;
可以看到,很快就爆破出來了,每秒近700次,還是挺快的;
結果會在當前目錄生產兩個文件found.txt和hashcat.pot;
里面內容一樣,都是爆破出來的結果;
0x06
1.hashcat支持市面上存在的近乎全部的hash加密,–help可以看到;
2.在並不知道密文的情況下,我們可以先使用hash-identifier來幫助檢測下,雖然有的不准確;
3.各種加鹽(salt)的順序,以及hash值的具體得來的方式不同,也會導致加密的類型產生差別;
如同:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
0 = MD5
10 = md5($pass.$salt)
20 = md5($salt.$pass)
300= md5(unicode($pass).$salt)
40 = md5($salt.unicode($pass))
3300 = MD5(Sun)
3500 = md5(md5(md5($pass)))
3610 = md5(md5($salt).$pass)
3710 = md5($salt.md5($pass))
3720 = md5($pass.md5($salt))
3800 = md5($salt.$pass.$salt)
3910 = md5(md5($pass).md5($salt))
4010 = md5($salt.md5($salt.$pass))
4110 = md5($salt.md5($pass.$salt))
4210 = md5($username.0.$pass)
4300 = md5(strtoupper(md5($pass)))
4400 = md5(sha1($pass))
....
|
4.這里linux的密碼只看$分割,其余字符都是內容,有點 . 也得帶上。