本文会详细介绍如何在Active Directory环境中快速地对配置了过多权限的网络共享进行梳理、利用和修复。过多的共享权限可能导致企业环境中的数据暴露、权限提升和勒索软件攻击。另外,我们还将深入探讨在主流漏洞管理和渗透测试20年之后,为什么环境网络共享配置权限不当还一直困扰着用户。

最后,我将分享一个名为PowerHuntShares的新开源工具,它可以帮助简化共享查找和纠正Active Directory环境中过多的SMB共享权限。

下面总结了在大多数Active Directory环境中经常导致大规模网络共享暴露的根本原因。

资产管理

跟踪企业环境中的动态系统非常困难,跟踪不断变化的共享库存和所有者则更加困难。即使身份和访问管理(IAM)团队通过发现找到一个网络共享,它也会产生以下问题:

1.谁拥有它?它支持哪些应用程序或业务流程?我们可以删除高风险访问控制条目(ACE)吗?我们可以一起删除共享吗?

2.如果你有一个正常运行的配置管理数据库(CMDB),则可以回答大多数问题。不幸的是,并不是每个人都这样做。

损坏的漏洞管理

许多漏洞管理程序从未被构建来识别那些向经过身份验证的域用户提供未经授权访问的网络共享配置。他们的重点是识别经典的漏洞(缺失的补丁、弱密码和应用程序问题),并优先处理不需要身份验证的漏洞,当然这并不都是坏事。

但是,根据我的观察,业界只是在过去五年中才对Active Directory生态系统产生了浓厚的兴趣。这似乎很大程度上是因为越来越多的暴露和意识到Active Directory(AD)攻击,这些攻击严重依赖于配置,而不是缺少补丁。

我也不是说IAM团队没有努力完成他们的工作,但在许多情况下这是团队管理的困境。

渗透测试人员一直都知道共享是一种风险,但在Active Directory环境中实施、管理和评估最小权限是一项不小的挑战。即使对安全社区越来越感兴趣,也很少有解决方案可以有效地清点和评估整个Active Directory域或多个域的共享访问权限。

根据我的经验,很少有组织一开始就执行经过身份验证的漏洞扫描,但即使是那些确实缺少常见的过度权限、继承权限和对环境的总结数据的发现的组织,这些环境提供了大多数IAM团队做出良好决策所需的洞见。很长一段时间以来,人们一直过度依赖这些类型的工具,因为许多公司有这样的印象,即它们提供了比它们在网络共享权限方面更多的覆盖范围。

边界不清

大多数大型环境都有主机、网络和Active Directory域边界,在执行任何类型的身份验证扫描或代理部署时都需要考虑这些边界。试图准确盘点和评估网络份额的公司经常错过一些事情,因为他们没有考虑隔离其资产的边界。在评估资产时,请确保在这些边界内工作。

大量使用云

云技术地出现,并不意味着网络共享会消失。公司需要花上十年的时间才能将大部分的文件存储基础设施迁移到云。

理解NTFS和共享权限

在过去的几年里,有许多与共享权限管理相关的糟糕实践已经被吸收到IT文化中,只是因为人们不了解它们是如何工作的。造成过多共享权限的最大原因之一是通过本机嵌套组成员关系继承权限。此问题也不限于网络共享。十多年来,我们一直在滥用相同的权限继承问题来访问SQLServer实例。在下一节中,我将仔细分析这个问题。

网络共享权限继承盲点

网络共享只是使网络上的远程用户可以使用本地文件的一种媒介,但是两组权限控制着远程用户对共享文件的访问。要了解权限继承问题,我们可以快速回顾一下NTFS和共享权限在Windows系统上是如何协同工作的。

NTFS权限

1.用于控制对本地NTFS文件系统的访问;

2.会影响本地和远程用户;

共享权限

1.用于控制对共享文件和文件夹的访问;

2.只影响远程用户;

简而言之,从远程用户的角度来看,首先审查网络共享权限(远程),然后审查NTFS权限(本地),但无论如何,最严格的权限总是胜出。下面是一个简单示例,显示John对共享具有完全控制权限,但对关联的本地文件夹只有读取权限。大多数限制性会发挥作用,所以John只能通过共享文件夹对远程可用的文件提供读访问。

所以这些是基础,最重要的想法是限制性最强的ACL获胜。但是,有一些细微差别与继承域组的本地组有关。为了弄清楚这一点,让我们简要介绍一下受影响的当地组织。

大众

大众组织在大多数配置中为所有经过身份验证和匿名的用户提供访问权限。这个组在许多环境中被过度使用,并且经常导致过度的权限。

内置\用户

默认情况下会添加新的本地用户。当系统未加入域时,它会按照你的预期运行。

认证用户

该组嵌套在内置\用户组中。当系统未加入域时,它不会在影响访问方面做太多事情。但是,当系统加入Active Directory域时,AuthenticatedUsers隐含地包括“域用户”和“域计算机”组。例如,IT管理员可能认为他们只提供对内置\用户组的远程共享访问权限,而实际上他们将其提供给域中的每个人。下图有助于说明这种情况。

这里的教训是,对本地和域组关系的一个小小的误解可能会导致未经授权的访问和潜在的风险。下一节将介绍如何梳理共享及其访问控制列表(ACL),以便我们可以定位和修复它们。

网络共享库存

事实证明,由于一些本地和开源工具,获得域计算机和相关共享的快速库存并不难。关键在于获取足够的信息来回答那些修复工作所需的人员、内容、地点、时间和方式等问题。

共享和权限的发现需要4步:

1.通过轻量级目录访问协议(LDAP)查询Active Directory以获取域计算机列表。PowerShell命令如Get-AdComputer(Active DirectoryPowerShell模块)和Get-DomainComputer(PowerSploit)。

2.可以在这里提供很大的帮助。确认TCP端口445上与这些计算机的连接。Nmap是用于此目的的免费且易于使用的工具。如果你想坚持使用PowerShell,还有几个开源TCP端口扫描脚本。

3.使用你喜欢的方法查询共享、共享权限和其他信息。Get-SMBShare、Get-SmbShareAccess、Get-ACL和Get-ObjectAcl(PowerSploit)等PowerShell工具非常有用。

4.其他有助于稍后进行补救的信息包括文件夹所有者、文件计数、文件列表、文件列表哈希和计算机IP地址。你还可以在贵公司的CMDB中找到其中一些信息。Get-ChildItem和Resolve-DnsNameSome等PowerShell命令也可以帮助收集其中的一些信息。

PowerHuntShares可用于自动执行上述任务(在最后一节中介绍),但无论你使用什么方法,了解未经授权的共享访问如何被滥用将有助于你的团队确定补救工作的优先级。

网络共享开发

配置有过多权限的网络共享可以通过多种方式被利用,但共享的性质和特定的共享权限将最终决定可以执行哪些攻击。下面,我概述了一些最常见的攻击,这些攻击利用对共享的读写入访问来帮助你入门。

读取访问权限滥用

勒索软件和其他攻击者经常利用对共享的过度读取权限来访问敏感数据,如个人可识别信息(PII)或知识产权(源代码、工程设计、投资策略、专有公式、收购信息等),他们可以利用这些数据开发、出售或勒索你的公司。此外,我们在渗透测试中发现,密码通常以明文形式存储,可以用于登录数据库和服务器。这意味着在某些情况下,对共享的读取访问权限可以在RCE中结束。

下面是一个简单的例子,说明对网络共享的过多读访问如何导致RCE:

攻击者入侵域用户。攻击者识别web根目录、代码备份目录或dev ops目录的共享目录。攻击者识别以明文形式存储的密码(通常是数据库连接字符串)。攻击者使用数据库密码连接数据库服务器。攻击者使用本机数据库功能来获得数据库服务器操作系统的本地管理权限。攻击者利用共享数据库服务帐号访问其他数据库服务器。

具体示例如下:

写入访问权限滥用

写入访问权限提供了读取访问的所有好处,并且能够添加、删除、修改和加密文件(如勒索软件攻击者)。写入访问还提供了将共享访问转变为RCE的更多潜力。以下是十个更常见的RCE选项的列表:

1.将web shell写入web根文件夹,可以通过web服务器访问。

2.替换或修改应用程序EXE和DLL文件以包含后门。

3.将EXE或DLL文件写入未引用的应用程序和服务使用的路径。

4.编写DLL到应用程序文件夹以执行DLL劫持。你可以使用由NetSPI自己的研究总监NickLanders编写的Koppeling。

5.将DLL和配置文件写入应用程序文件夹以执行.net应用程序的appdomain劫持。

6.在“所有用户”启动文件夹中写入可执行文件或脚本,以便在下次登录时启动它们。

7.修改计划任务执行的文件。

8.修改PowerShell启动配置文件以包含后门。

9.修改MicrosoftOffice模板以包含后门。

10.编写恶意LNK文件以捕获或中继NetNTLM哈希。

你可能已经注意到,我列出的许多技术也常用于持久性和横向移动,这很好地提醒了旧技术可以有多个攻击。

下图是个基本的web shell示例:

1.攻击者破坏了域用户。

2.攻击者扫描共享,找到wwwroot目录,并上传web shell。wwwroot目录存储目标IIS服务器上托管的Web应用程序使用的所有文件。因此,你可以将web shell视为扩展已发布Web应用程序功能的东西。

3.使用标准Web浏览器,攻击者现在可以访问目标IISWeb服务器托管的上传web shell文件。4.攻击者使用web shell访问以作为Web服务器服务帐户在操作系统上执行命令。

5.Web服务器服务帐户可能具有访问网络上其他资源的额外权限。

下面是另一个简化的图表,显示了可用于执行我列出的前10种攻击的一般步骤。让我们关注一下被滥用的C$部分。C$共享是Windows中的默认隐藏共享,标准域用户不应访问。它映射到C驱动器,该驱动器通常包括系统上的所有文件。不幸的是,devOops、应用程序部署和单用户错误配置意外或故意使C$共享在比你想象的更多环境中可供所有域用户使用。在我们的渗透测试中,我们对加入域的系统执行了完整的SMB共享审计,并且我们发现超过一半的时间我们最终对C$共享进行写访问。

网络共享修复

在过度的共享修复工作中追踪系统所有者、应用程序和有效的业务案例对于IAM团队来说可能是一个巨大的痛苦。对于大型企业而言,这可能意味着对数十万个共享ACL进行分类。因此,在该工作期间有办法对共享进行分组和优先级排序可以节省大量时间。

我发现成功分组的诀窍是收集正确的数据。为了确定要收集哪些数据,我们要先设置一些标准,然后确定我可以从哪里获得这些数据。

哪些共享有暴露风险?

共享名称:有时,仅共享名称就可以表明暴露的数据类型,包括C$、ADMIN$和wwwroot等高风险共享。

共享文件计数:当你可能首先尝试优先考虑高风险共享时,没有文件的目录可以成为优先共享修复的一种方式。

目录列表:与共享名称类似,共享目录中的文件夹和文件通常可以告诉你很多有关上下文的信息。

目录列表哈希:这只是目录列表的哈希。虽然不是硬性要求,但它可以使识别和比较相同的目录列表更容易一些。

谁有访问权限?

共享ACL:这将有助于显示用户拥有哪些访问权限,并且可以针对已知的高风险组或大型内部组织进行过滤。

NTFSACL:这将有助于显示用户拥有哪些访问权限,并且可以针对已知的高风险组或大型内部组进行过滤。

它们是什么时候创建的?

文件夹创建日期:对创建日期进行分组或聚类可以揭示与过去可能引入过多共享权限的业务部门、应用程序和流程相关的趋势。

谁创建了它们?

文件夹所有者:文件夹所有者有时可以将你带到拥有创建/使用共享的系统、应用程序或流程的部门或业务单位。

主机名:如果使用标准化命名约定,主机名可以指示位置和所有权。

他们在哪里?

计算机名称:如果使用标准化命名约定,主机共享的计算机名称通常可用于确定部门和位置等大量信息。

IP地址:与计算机名称类似,子网通常也分配给执行特定操作的计算机。在许多环境中,该分配记录在Active Directory中并且可以交叉引用。

如果我们在发现过程中收集了所有这些信息,我们可以使用它来根据共享名称、所有者、子网、文件夹列表和文件夹列表哈希执行分组,以便我们可以识别大量可以立即修复的相关共享。

过多的权限

过多的读写共享权限已被定义为任何网络共享ACL,其中包含针对“所有人”、“经过身份验证的用户”、“内置\用户”、“域用户”或“域计算机”的显式ACE(访问控制条目)组织。由于权限继承问题,它们都为域用户提供了对受影响共享的访问权限。

高风险共享

如上所述,高风险共享被定义为提供对系统或应用程序的未经授权的远程访问的共享。默认情况下,这包括wwwroot、inetpub、c和c$共享。但是,可能存在其他未提及的风险。