专栏名称: Ms08067安全实验室
“Ms08067安全实验室”致力于网络安全的普及和培训!
目录
相关文章推荐
高分子科技  ·  长春应化所简忠保研究员团队 Nat. ... ·  2 天前  
高分子科学前沿  ·  海大黄玮/张明鑫团队AM:介孔纳米凝胶喷雾作 ... ·  2 天前  
艾邦高分子  ·  拟建产能超435万吨!尼龙66最新项目及生产 ... ·  2 天前  
南方人物周刊  ·  孩子写作文的坑,我们都替你填上了 ·  3 天前  
51好读  ›  专栏  ›  Ms08067安全实验室

利用MSSQL模拟提权

Ms08067安全实验室  · 公众号  ·  · 2024-06-19 17:12

正文

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

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

扫描二维码五折购书

利用MSSQL模拟提权

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

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

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

set instance dev-dc01.dev.ms08067.cnUSE master;goSELECT 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.cnSELECT SYSTEM_USER;goEXECUTE 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 whoamigo

启用xp_cmdshell

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

xp_cmdshell执行命令







请到「今天看啥」查看全文