利用Windows域绕过防火墙获取信用卡数据
2019年4月24日
本文详细介绍了如何绕过防火墙访问持卡人数据环境(CDE,用我们时代的术语来说)。最终目标:提取信用卡数据。
在不打算听起来像支付卡行业(PCI)审计员的情况下,如果您存储、传输或处理信用卡数据,则应确保其在网络中的安全。根据PCI数据安全标准(PCI-DSS),持卡人数据可以在内部网络中传输,但如果您实施网络分段,则会省去很多麻烦。这意味着您不必让整个组织都纳入PCI合规范围。这通常可以通过将处理卡数据的网络范围(CDE)与组织网络的其余部分进行防火墙隔离来实现。
希望以上内容概述了典型PCI设置的基础知识,以防您不熟悉。现在进入有趣的部分。
几年前我测试的公司有一个非常大的网络,全部在标准的10.0.0.0/8范围内。持卡人数据在一个单独的192.168.0.0/16范围内,与公司其他部分防火墙隔离。请注意,所有细节,包括范围,都已为本文目的而更改。CDE主要包括呼叫中心操作员接听电话订单,并将支付详细信息输入到外部操作的Web应用程序的表单中。
这是一次内部测试,因此我们连接到公司内部办公网络的10.0.0.0/8范围。从这个网络位置对CDE进行ping和端口扫描没有结果:
|
|
ping扫描基本上与运行ping命令相同,但nmap可以一次扫描整个范围。第二个命令输出中的“hosts up”与我们给nmap的-Pn参数有关,告诉它不要先ping,因此nmap会将范围内的所有主机报告为“up”,即使它们可能不是(nmap的一个怪癖)。
因此,除非存在防火墙规则绕过漏洞,或者防火墙的弱密码可以被猜到,否则直接通过此路由进入似乎不太可能。因此,入侵的第一步是专注于通过获取域管理员权限来控制Active Directory。
成为域管理员
有多种方法可以做到这一点,例如我上一篇文章中的这种方法。
在这种情况下,利用kerberoast来控制域。以下是攻击的逐步过程,从在域上未经身份验证的位置开始。
入侵Active Directory的第一步通常涉及获取任何级别的任何用户帐户的访问权限。只要它能以某种方式向域控制器进行身份验证,我们就没问题。在Windows世界中,所有帐户都应该能够向域控制器进行身份验证,即使它们没有实际在其上执行任何操作的权限。在最基本的层面上,即使用户登录时最低权限的帐户也需要验证密码是否正确,因此这是其工作方式的原因。
在这个客户站点,域控制器上启用了空会话。在这种情况下,我们的域控制器是10.0.12.100,“PETER”。这允许使用enum4linux等工具枚举用户列表,揭示域上每个用户的用户名:
|
|
现在我们有了用户列表,我们可以将其解析为可用格式:
|
|
您可能已经注意到我不喜欢简洁。是的,您可以用awk、grep、sed甚至Perl以更少的字符完成此操作,但是,如果我在进行渗透测试,我倾向于使用任何有效的方法,并将脑力用于实现主要目标。如果我编写一个长期使用的脚本,我可能会尝试优化它,但对于渗透测试,我倾向于敲出命令直到得到所需的内容(双关语意)。
现在进行实际测试。网络巨大,有超过25,000个活跃用户。但是,在我的实验网络中,我们只有少数几个,这应该使演示黑客攻击更容易。
现在我们已经将用户列表解析到文本文件中,我们可以使用CrackMapExec等工具来猜测密码。这里我们将猜测是否有任何用户的密码是“Password1”。令人惊讶的是,这符合Active Directory的默认复杂性规则,因为它包含四种字符类型中的三种(大写、小写和数字)。
|
|
哇,我们有一个命中:
注意,如果我们想继续猜测并找到所有帐户,我们可以指定–continue-on-success标志:
因此,我们已经控制了一个帐户。现在我们可以查询Active Directory并获取服务帐户列表。服务帐户是用于……嗯……服务的用户帐户。想想像Microsoft SQL Server这样的东西。运行时,这需要在用户帐户的上下文中运行。Active Directory的Kerberos身份验证系统可用于提供访问权限,因此Active Directory提供“服务票证”以允许用户进行身份验证。Kerberos身份验证超出了本文的范围,但是,如果您想了解更多,这是一个很好的文章。
无论如何,通过从域控制器请求Kerberos服务帐户列表,我们还为每个帐户获取一个“服务票证”。此服务票证使用服务帐户的密码加密。因此,如果我们能破解它,我们将能够使用该帐户,这通常具有高权限。Impacket工具集可用于请求这些:
|
|
如我们所见,其中一个帐户是域管理员的成员,因此这将是一个很好的密码来破解。
|
|
运行hashcat后,似乎我们找到了明文密码:
为了确认这是一个实际的活动帐户,我们可以再次使用CrackMapExec。
|
|
哇哦,Pwn3d!显示我们对域控制器具有管理员控制权。
好的,如何使用它来获取那些可爱的卡数据?
现在,不幸的是,对于这家公司,呼叫中心代理在CDE内用于接听电话订单的机器在同一个Active Directory域上。虽然我们无法直接连接到这些机器,但我们现在可以告诉域控制器让它们与我们通信。为此,我们需要深入组策略对象(GPO)。GPO允许将全局或部门设置应用于用户和计算机。嗯,实际上不止这些,但是,出于本文的目的,您只需要知道它允许在全局或细粒度级别上控制域中的计算机。
GPO的许多功能用于管理组织IT的设置。例如,设置密码策略甚至设置用户显示的桌面图标(例如,打开公司网站的快捷方式)。另一个GPO允许运行“立即计划任务”。这就是我们在这里做的事情……创建一个脚本,该脚本将在呼叫中心运行,并连接回我们的机器,给我们控制权。以下是实现此目的的步骤:
- 生成有效负载。这里我们使用Veil Evasion。我们的IP地址是10.0.12.1,因此我们将有效负载指向此地址连接回我们。
|
|
-
使用我们从kerberoasting获得的凭据通过远程桌面协议(RDP)登录到域控制器。
-
在Active Directory中找到CDE。根据我们对组织的了解,我们知道呼叫中心代理在2楼工作。我们注意到Active Directory用户和计算机(ADUC)有一个此名称的OU:
-
将我们从Veil制作的脚本放入文件夹中,并在域控制器上共享此文件夹。设置共享和目录的权限,以允许所有域用户读取。
-
在GPO中,我们在此级别创建策略:
-
在编辑此新GPO时找到“计划任务”选项,并创建新的“立即计划任务”:
-
创建任务以指向共享中保存的版本。还在“常见”下设置“在登录用户的安全上下文中运行”。
完成!
我等了15分钟,什么也没发生。我知道组策略可能需要90分钟,加减30分钟来更新,但我认为至少有一台机器现在应该已经获得了新策略(注意,如果在实验室中测试,您可以使用gpupdate /force)。然后我又等了五分钟。我正要放弃并改变策略,然后发生了这种情况:
运行命令截屏,返回了呼叫中心代理当时正在输入的内容……卡数据!:
卡数据被泄露,11.3 PCI渗透测试的目标已完成。
如果我们查看会话列表,我们可以看到原始IP来自192.168.0.0/16 CDE范围:
在实际测试中,shell不断涌来,因为整个二楼都发回了一个shell。打开了大约60-100个Meterpreter shell。
请注意,我的屏幕截图中使用了Amazon,这与我所谈论的组织无关。在真实测试中,设置了一个脚本以便在shell连接时捕获屏幕截图(通过autorunscript),然后我们可以专注于更有趣的会话,例如那些正在进行中并即将进入卡数据输入阶段的会话。
还有其他获取屏幕截图的方法,例如在Meterpreter中使用espia,以及Metasploit的post/windows/gather/screen_spy。
有以编程方式执行GPO的方法,我尚未尝试,例如PowerView中的New-GPOImmediateTask。
对此的缓解措施是始终在单独的Active Directory域上运行CDE。请注意,甚至林也不够。当然,深度防御措施,如关闭空会话、鼓励用户选择强密码以及确保任何服务帐户具有极长的密码(20+字符,完全随机)都是好的。此外,检测是否有用户一次性请求所有服务票证,或者创建蜜罐服务帐户,如果有人请求服务票证则可以标记,也可能有所帮助。如果黑客可以访问组织的其余部分,保护持卡人数据就没有好处。