当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 进行 LDAP 侦察的基础知识

作者:精品下载站 日期:2024-12-14 06:16:11 浏览:14 分类:玩电脑

使用 PowerShell 进行 LDAP 侦察的基础知识


在本系列的介绍性文章中,我们回顾了 Active Directory (AD) 服务帐户是什么,解释了为什么这些特权帐户存在严重的安全风险,并承诺在未来的文章中详细介绍针对服务帐户的 4 种类型的攻击。这篇文章探讨了其中的第一个攻击:LDAP 侦察,攻击者可以使用它来发现 IT 环境中的服务帐户,同时避免检测。

具体来说,在这篇文章中,我们将探讨没有特殊权限(例如域管理员甚至本地管理员权限)的攻击者如何使用简单的 PowerShell 查询来查找服务帐户,而无需安装或学习 Bloodhound 等专门工具。

查找特权帐户

Active Directory 提供了许多安全和管理优势,但对于好奇的攻击者来说,事情也变得有点太容易了。由于 AD 的架构,一旦攻击者渗透到任何加入域的计算机,他们就能够查询目录及其对象。由于默认情况下 Active Directory 不提供对可疑活动进行审核和发出警报的机制,因此它们通常可以避免检测。

以下是攻击者通过查询 LDAP 发现服务帐户的一些方法。

服务主体名称 (SPN) 发现

服务帐户利用 SPN 来支持 Kerberos 身份验证。虽然这提高了安全性,但也留下了这些帐户的确切使用地点和用途的痕迹。此信息很容易被攻击者利用。 SPN 通常用于运行服务来支持 Microsoft SQL Server 和 SharePoint 等应用程序。

在另一篇博客文章中,我们演示了如何执行高级 AD 侦察;但是,有更简单的方法可以获取我们所需的信息。使用以下简单的 LDAP 查询,攻击者可以获得已注册 SPN 的 AD 帐户列表,以及它们提供访问权限的计算机、应用程序和数据:

#Build LDAP filters to look for users with SPN values registered for current domain
$ldapFilter = "(&(objectclass=user)(objectcategory=user)(servicePrincipalName=*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"
#Execute Search
$results = $search.FindAll()
#Display SPN values from the returned objects
foreach ($result in $results)
{
  $userEntry = $result.GetDirectoryEntry()
  Write-Host "User Name = " $userEntry.name
  foreach ($SPN in $userEntry.servicePrincipalName)
  {
  Write-Host "SPN = " $SPN
  }
  Write-Host ""
}

结果中的 SPN 值将显示每个帐户的注册位置以及在该系统上注册的服务。例如,以下是 SQL 服务帐户的 SPN 值:

[玩转系统] 使用 PowerShell 进行 LDAP 侦察的基础知识

使用通用对象属性发现服务帐户

虽然 SPN 非常可靠且信息丰富,但它们不会生成完整的服务帐户列表,因为许多帐户不通过 SPN 与 Kerberos 集成,并且不会设置 SPN 值。但是,没有域权限的攻击者通常仍然可以通过其他方式发现服务帐户。特别是,大多数组织使用命名约定,例如让所有服务帐户名称以“SVC”或类似名称开头,并且服务帐户通常放置在自己的组织单位 (OU) 或组中。

根据帐户命名约定查找服务帐户

下面是一个 PowerShell 脚本,它将查找名称中包含“svc”的所有帐户:

#Build LDAP filter to find service accounts based on naming conventions
$ldapFilter = "(&(objectclass=Person)(cn=*svc*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"

#Add list of properties to search for
$objProperties = "name"
Foreach ($i in $objProperties){$search.PropertiesToLoad.Add($i)}

#Execute Search
$results = $search.FindAll()
#Display values from the returned objects
foreach ($result in $results)
{
  $userEntry = $result.GetDirectoryEntry()
  Write-Host "User Name = " $userEntry.name
  Write-Host ""
}

根据OU查找服务帐户

下面是一个 LDAP 过滤器,可以将其替换到前面的脚本中,以查找名称中包含“Service”或“svc”的任何 OU:

$ldapFilter = "(&(objectClass=organizationalUnit)(|name=*Service*)(name=*svc*)))"

然后,攻击者可以在这些 OU 中搜索所有用户对象,以找到您的服务帐户。此脚本重点关注名称中带有“Service”的 OU:

$search = New-Object System,DirecoryServices.DirectorySearcher
$search.SearchRoot = "LDAP://OU=Service Accounts,OU=JEFFLAB,DC=local"
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"

通过用户帐户控制发现服务帐户

在 Active Directory 中搜索服务帐户的另一种偷偷摸摸的方法是调查帐户控制设置,因为服务帐户通常具有与常规用户帐户不同的设置。最好的例子是“密码永不过期”设置——服务帐户的密码可能设置为永不过期,因为重置密码的操作可能很乏味,并会导致应用程序或服务中断。

[玩转系统] 使用 PowerShell 进行 LDAP 侦察的基础知识

使用 PowerShell,可以使用稍微复杂的 LDAP 过滤器找到启用此值的所有帐户:

$ldapFilter = "(&(objectclass=user)(objectcategory=user)(useraccountcontrol:1.2.840.113556.1.4.803:=65536))"

特权发现

虽然本文仅关注在不利用任何特权的情况下查找服务帐户的方法,但如果攻击者确实找到了对网络内的一个或多个系统具有特权的帐户,则还有许多其他有效的方法来发现服务帐户。他们包括:

  • 枚举端点上的服务并提取起始名称帐户
  • 在 web.config、脚本和其他可能对服务帐户进行硬编码的位置中搜索连接字符串
  • 探索授予“作为服务登录”权限的用户的本地策略
  • 提取非交互式登录类型的事件日志
  • 查找应用程序池和其他Web应用程序服务帐户

利用发现的帐户

一旦对手获得了服务帐户列表,他们的下一步就是利用它们。在以下帖子中了解他们的一些选项:

  • 使用 Kerberoasting 提取服务帐户密码
  • 使用银票进行有针对性的服务帐户利用
  • 利用 KRBTGT 服务帐户获取黄金门票

在 Netwrix 攻击目录中了解有关 LDAP 侦察和其他攻击技术的更多信息。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯