標籤:username blank download bae 資料庫連接 格式 介紹 效果 個數
研究MySQL資料庫的加解密方式,在網路攻防過程中具有重要的意義;試想一旦擷取了網站一定的許可權後,如果能夠擷取MySQL中儲存使用者資料,通過解密後,即可通過正常途徑來訪問資料庫;一方面可以直接操作資料庫中的資料,另一方面可以用來提升許可權。本文對目前常見的MySQL密碼破解方式進行了研究和討論。
本文simeon
1.MySQL資料庫密碼破解
MySQL資料庫使用者密碼跟其它資料庫使用者密碼一樣,在應用系統代碼中都是以明文出現的,在擷取檔案讀取許可權後即可直接從資料庫連接檔案中讀取,例如asp代碼中的conn.asp資料庫連接檔案,在該檔案中一般都包含有資料庫類型,物理位置,使用者名稱和密碼等資訊;而在MySQL中即使擷取了某一個使用者的資料庫使用者(root使用者除外)的密碼,也僅僅只能操作某一個使用者的資料庫中的資料。
在實際攻防過程中,在擷取Webshell的情況下,是可以直下載MySQL資料庫中保留使用者的user.MYD檔案,該檔案中儲存的是MySQL資料庫中所有使用者對應的資料庫密碼,只要能夠破解這些密碼那麼就可以正大光明的操作這些資料,雖然網上有很多修改MySQL資料庫使用者密碼的方法,卻不可取,因為修改使用者密碼的事情很容易被人發現!
1.1MYSQL加密方式
MYSQL資料庫的認證密碼有兩種方式,MYSQL 4.1版本之前是MYSQL323加密,MYSQL 4.1和之後的版本都是MYSQLSHA1加密,MYSQL資料庫中內建Old_Password(str)和Password(str)函數,它們均可以在MYSQL資料庫裡進行查詢,前者是MYSQL323加密,後者是MYSQLSHA1方式加密。
(1)以MYSQL323方式加密
SELECTOld_Password('bbs.antian365.com');
查詢結果MYSQL323= 10c886615b135b38
(2)以MYSQLSHA1方式加密
SELECTPassword('bbs.antian365.com');
查詢結果MYSQLSHA1= *A2EBAE36132928537ADA8E6D1F7C5C5886713CC2
執行結果1所示,MYSQL323加密中產生的是16位字串,而在MYSQLSHA1中生存的是41位字串,其中*是不加入實際的密碼運算中,通過觀察在很多使用者中都攜帶了“*”,在實際破解過程中去掉“*”,也就是說MYSQLSHA1加密的密碼的實際位元是40位。
圖1在MYSQL資料庫中查詢同一密碼的不同SHA值
1.2MYSQL資料庫檔案結構
1.MYSQL資料庫檔案類型
MYSQL資料庫檔案共有“frm”、“MYD”“和MYI”三種檔案,“.frm”是描述表結構的檔案,“.MYD”是表的資料檔案,“.MYI”是表資料檔案中任何索引的資料樹。一般是單獨存在一個檔案夾中,預設是在路徑“C:\Program Files\MYSQL\MYSQL Server 5.0\data”下。
2.MYSQL資料庫使用者密碼檔案
在MYSQL資料庫中所有設定預設都儲存在“C:\Program Files\MYSQL\MYSQL Server 5.0\data\MYSQL”中,也就是安裝程式的data目錄下,2所示,有關使用者一共有三個檔案即user.frm、user.MYD和user.MYI,MYSQL資料庫使用者密碼都儲存在user.MYD檔案中,包括root使用者和其他使用者的密碼。
圖2 MYSQL資料庫使用者密碼檔案
1.3擷取MySQL密碼雜湊值
1.擷取MYSQL資料庫使用者密碼加密字串
使用UltraEdit-32編輯器直接開啟user.MYD檔案,開啟後使用二進位模式進行查看,3所示,可以看到在root使用者後面是一串字串,選中這些字串將其複製到記事本中,這些字串即為使用者加密值,即506D1427F6F61696B4501445C90624897266DAE3。注意:
(1)root後面的“*”不要複製到字串中。
(2)在有些情況下需要往後面看看,否則得到的不是完整的MYSQLSHA1密碼,總之其正確的密碼位元是40位。
(3)如果是在John theRipper password cracker中進行密碼破解,需要帶“*”!
擷取加密的字串
1.4網站線上密碼破解
1.ww.cmd5.com破解。將擷取的MySQL值放在cmd5.com網站中進行查詢,MySQL密碼破解一般都是收費的,成功破解一次0.1元。
2.somd5.com破解。Somd5.com是後面出現的一個免費破解網站,每次破解需要手工選擇圖形碼進行破解,速度快,效果好,只是每次只能破解一個,而且破解一次後需要重新輸入驗證碼。
1.5 hashcat破解hashcat支援很多種破解演算法,免費開源軟體,官方網站https://hashcat.net/hashcat/,破解命令:
hashcat64.exe -m 200 myql.hashpass.dict //破解MySQL323類型
hashcat64.exe -m 300 myql.hashpass.dict //破解MySQL4.1/MySQL5類型
1.6 John the Ripper密碼破解John the Ripper:http://www.openwall.com/john/h/john179w2.zip,John theRipper除了能夠破解linux外,還能破解多種格式的密碼,在kali下測試破解MySQL密碼,4所示。
Echo*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B>hashes.txt
John –format =MySQL-sha1 hashes.txt
john –list=formats | grep MySQL //查看支援MySQL密碼破解的演算法
圖4測試MySQL密碼破解
1.7使用Cain破解Mysql密碼
1.將MYSQL使用者密碼字串加入到Cain破解列表
使用Cain & Abel 來破解MYSQL資料庫使用者密碼,Cain & Abel是一個可以破解屏保、PWL密碼、共用密碼、緩衝口令、遠程共用口令、SMB口令、支援VNC口令解碼、Cisco Type-7口令解碼、Base64口令解碼、SQL Server 7.0/2000口令解碼、Remote Desktop口令解碼、Access Database口令解碼、Cisco PIX Firewall口令解碼、Cisco MD5解碼、NTLM Session Security口令解碼、IKE Aggressive Mode Pre-Shared Keys口令解碼、Dialup口令解碼、遠端桌面口令解碼等綜合工具,還可以遠程破解,可以掛字典以及暴力破解,其sniffer功能極其強大,幾乎可以明文捕獲一切帳號口令,包括FTP、HTTP、IMAP、POP3、SMB、TELNET、VNC、TDS、SMTP、MSKERB5-PREAUTH、MSN、RADIUS-KEYS、RADIUS-USERS、ICQ、IKE Aggressive Mode Pre-Shared Keys authentications等。
Cain & Abel 目前最新版本是4.9.56,軟體:http://www.oxid.it/downloads/ca_setup.exe。下載Cain & Abel 後,直接安裝,然後運行它,在Cain & Abel 主介面中單擊“Cracker”標籤,然後將使用者密碼的加密字串“506D1427F6F61696B4501445C90624897266DAE3”加入到MYSQLHashes破解列表中,5所示,單擊“Add tolist”,6所示,將字串複製到Hash輸入框中。Username可以任意輸入。
圖5使用Cain破解MYSQL密碼主介面
圖6添加MYSQL Hashes
2.使用字典進行破解
7所示,選中剛才添加的需要破解的字串,然後選擇“Dictionary Attack(字典破解)”,在彈出的菜單中選擇“MYSQL SHA1 Hashes”方式進行破解,該方式針對的是MYSQL4.1後續版本,對於MYSQL4.1以前版本則選擇“MYSQL v3.23 Hashes”進行破解。
圖7選擇破解方式
選擇DictionaryAttack(字典破解)”後會出現一個視窗,主要用於選擇字典,8所示,在Dictionary下方按右鍵,可以添加一個或者多個字典檔案,字典選擇完畢後可以在“Options(選項)”中進行選擇,然後單擊“Start”按鈕進行破解。
圖8MYSQL字典破解設定
說明:
在“Options(選項)”中一共有8種方式即:
(1)字串首字母大寫
(2)字串反轉
(3)雙倍字串
(4)字串全部小寫
(5)字串全部大寫
(6)在字串中加入數字
(7)在每個字串中進行大寫輪換
(8)在字串中加入2個數字
破解成功後Cain會給出一些提示資訊,如下所示:
Plaintext of user <none> is databasepassword
Attack stopped!
1 of 1 hashes cracked
表明加密的密碼是“databasepassword”。回到Cain破解主視窗中後,破解的密碼值會自動加入到“Password”列中,9所示,便於查看。
圖9破解密碼成功
3.破解探討
(1)字典破解跟字典強度有關
單擊“開始”-“程式”-“MYSQL”-“MYSQL Server5.0”-“MYSQL Command Line Client”開啟MYSQL Command LineClient,輸入密碼後,輸入以下代碼重新設定一個新密碼:
UseMYSQL
updateuser set password=password("1977-05-05") where user="root";flushprivileges;
本實驗中將原來的密碼修改為“1977-05-05”,其結果10所示。
圖10修改MYSQL使用者密碼
再次使用UltraEdit-32軟體重新開啟“C:\ProgramFiles\MYSQL\MYSQL Server 5.0\data\MYSQL\user.MYD”擷取其新的密碼字串“B046BBAF61FE3BB6F60CA99AF39F5C2702F00D12”,然後重新選擇一個字典,在本例中選擇產生的生日字典,11,圖12所示,僅僅選擇小寫字串進行破解,很快就擷取了破解結果。實際結果表明使用Cain來破解MYSQL密碼,如果是採用字典破解,那麼破解效果跟字典強度有關,只要破解的密碼在字典中,則一定能夠破解。
圖11再次破解MYSQL密碼
圖12修改MYSQL密碼後再次進行破解MYSQL密碼
(2)使用彩虹表進行破解
在Cain中還提供彩虹表破解MYSQL,在破解方式中選擇“CryptanalysisAttack”-“MYSQL SHA1 Hashes via RainbowTables”即可,13,圖14所示,在實際測試過程中由於網路上提供的sha彩虹表格式是RTI,而Cain中使用的是RT,我將下載的所有彩虹表中檔案尾碼由RTI修改為RT,然後進行破解,提示資訊顯示不成功,應該是彩虹表的格式不一樣,Cain中只承認它自己提供的。
圖13使用彩虹表破解方式
圖14使用彩虹表進行破解
(3)Hash計算機
在Cain中提供了各種Hashes的計算,在主介面中單擊電腦表徵圖按鈕,即可彈出Hashes計算機,在“Text tohash”中輸入需要轉換的原始值,例如輸入“12345678”,單擊“Calculate”進行計算,15所示,可以看到14種Hashes值。
圖15計算Hashes值
(4)產生彩虹表
在Cain的安裝目錄C:\ProgramFiles\Cain\Winrtgen中直接運行Winrtgen,16所示,該工具為彩虹表產生器,可以很方便的產生各種類型的彩虹表值。
圖16 Winrtgen彩虹表產生工具
(5)設定彩虹表
在圖17中單擊“Add Table”在“RainbowTable properties”中的Hash中選擇“MYSQLsha1”,然後可以根據實際情況分別設定“Min Len”、“Max Len”、“Index”、“Chain len”、“Chain Count”以及“N oftables”的值,一般情況僅僅需要設定“Min Len”、“Max Len”以及“N oftables”的值。“N of tables”主要用來測試Hashes產生的完整度,輸入不同的值,會在Table properties中顯示百分比,通過嘗試來確定一共需要產生多少個表,然後單擊“Benchmark”進行時間估算,17所示,單擊“OK”完成彩虹表產生設定。
圖17設定彩虹表
在彩虹表產生器中,18單擊“Start”開始產生彩虹表,在Status中會顯示產生的大小和進度。
圖18開始產生彩虹表
由於彩虹表產生的時間比較漫長,在網路上也沒有搜尋到以rt結尾的MYSQL Sha1hashes表,因此本次破解主要以字典破解為主,彩虹表的破解將在全部產生後進行,在伺服器使用權限設定不太嚴格的情況下,通過Webshell完全可以將MYSQL下的user.MYD檔案下載到本地,只要破解了root使用者的密碼,然後藉助Webshell可以做很多事情,本文通過介紹了線上網站、John the Ripper、hashcat解、cain來破解MYSQL密碼,對於設計不太複雜的MYSQL密碼,破解還是較為容易的。
(6)對於16位的MySQL密碼(MYSQL323密碼編譯演算法)還有一種快速破解方式,編譯以下程式,直接進行破解,可以破解8位以下數字、字元等密碼。
使用方法:
./ MySQLfast6294b50f67eda209
破解效果19所示。
/* This program is public domain. Share and enjoy.
* $ gcc -O2 -fomit-frame-pointer MySQLfast.c -o MySQLfast
* $ MySQLfast 6294b50f67eda209
* Hash: 6294b50f67eda209
*/
#include <stdio.h>
typedef unsigned long u32;
/* Allowable characters in password; 33-126 is printable ascii */
#define MIN_CHAR 33
#define MAX_CHAR 126
/* Maximum length of password */
#define MAX_LEN 12
#define MASK 0x7fffffffL
int crack0(int stop, u32 targ1, u32 targ2, int *pass_ary)
{
int i, c;
u32 d, e, sum, step, diff, div, xor1, xor2, state1, state2;
u32 newstate1, newstate2, newstate3;
u32 state1_ary[MAX_LEN-2], state2_ary[MAX_LEN-2];
u32 xor_ary[MAX_LEN-3], step_ary[MAX_LEN-3];
i = -1;
sum = 7;
state1_ary[0] = 1345345333L;
state2_ary[0] = 0x12345671L;
while (1) {
while (i < stop) {
i++;
pass_ary[i] = MIN_CHAR;
step_ary[i] = (state1_ary[i] & 0x3f) + sum;
xor_ary[i] = step_ary[i]*MIN_CHAR + (state1_ary[i] << 8);
sum += MIN_CHAR;
state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
state2_ary[i+1] = state2_ary[i]
+ ((state2_ary[i] << 8) ^ state1_ary[i+1]);
}
state1 = state1_ary[i+1];
state2 = state2_ary[i+1];
step = (state1 & 0x3f) + sum;
xor1 = step*MIN_CHAR + (state1 << 8);
xor2 = (state2 << 8) ^ state1;
for (c = MIN_CHAR; c <= MAX_CHAR; c++, xor1 += step) {
newstate2 = state2 + (xor1 ^ xor2);
newstate1 = state1 ^ xor1;
newstate3 = (targ2 – newstate2) ^ (newstate2 << 8);
div = (newstate1 & 0x3f) + sum + c;
diff = ((newstate3 ^ newstate1) – (newstate1 << 8)) & MASK;
if (diff % div != 0) continue;
d = diff / div;
if (d < MIN_CHAR || d > MAX_CHAR) continue;
div = (newstate3 & 0x3f) + sum + c + d;
diff = ((targ1 ^ newstate3) – (newstate3 << 8)) & MASK;
if (diff % div != 0) continue;
e = diff / div;
if (e < MIN_CHAR || e > MAX_CHAR) continue;
pass_ary[i+1] = c;
pass_ary[i+2] = d;
pass_ary[i+3] = e;
return 1;
}
while (i >= 0 && pass_ary[i] >= MAX_CHAR) {
sum -= MAX_CHAR;
i–;
}
if (i < 0) break;
pass_ary[i]++;
xor_ary[i] += step_ary[i];
sum++;
state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
state2_ary[i+1] = state2_ary[i]
+ ((state2_ary[i] << 8) ^ state1_ary[i+1]);
}
return 0;
}
void crack(char *hash)
{
int i, len;
u32 targ1, targ2, targ3;
int pass[MAX_LEN];
if ( sscanf(hash, "%8lx%lx", &targ1, &targ2) != 2 ) {
printf("Invalid password hash: %s\n", hash);
return;
}
printf("Hash: %08lx%08lx\n", targ1, targ2);
targ3 = targ2 – targ1;
targ3 = targ2 – ((targ3 << 8) ^ targ1);
targ3 = targ2 – ((targ3 << 8) ^ targ1);
targ3 = targ2 – ((targ3 << 8) ^ targ1);
for (len = 3; len <= MAX_LEN; len++) {
printf("Trying length %d\n", len);
if ( crack0(len-4, targ1, targ3, pass) ) {
printf("Found pass: ");
for (i = 0; i < len; i++)
putchar(pass[i]);
putchar('\n');
break;
}
}
if (len > MAX_LEN)
printf("Pass not found\n");
}
int main(int argc, char *argv[])
{
int i;
if (argc <= 1)
printf("usage: %s hash\n", argv[0]);
for (i = 1; i < argc; i++)
crack(argv[i]);
return 0;
}
MySQL資料庫密碼破解