导语:当我们在谈论基于ACL的攻击时,我们特指的是访问控制条目(ACE),它填充了自由访问控制列表(DACL)。访问控制条目描述了Active Directory中针对安全对象的其他主体的允许和拒绝的权限。
简介和背景
2014年,Emmanuel Gras和Lucas Bouillot在“ 信息通信技术研讨会”(Symposium on Information and Communications)上发表了题为“ Chemins decontrôleen environement Active Directory ”(“Active Directory 控制路径”)的安全技术演讲,在演讲中他们使用图论和Active Directory对象权限来回答“谁能成为域管理员”的问题?我强烈建议你查看他们的演示文稿和白皮书,我们从这些资料中为BloodHound项目获得了最初的一些灵感以及我们添加到BloodHound攻击图的对象控制路径的非常有用的和具体的信息。
Rohan Vazarkar(@CptJesus),Will Schroeder(@harmj0y)和我很自豪地宣布BloodHound 1.3的发布,它引入了基于Active Directory对象控制的几种新的边缘类型。此外,Will和Lee(@tifkin_)在开发相应的PowerShell cmdlet方面做了大量的工作,使得pentester或red teamer能够利用这些新的边缘类型。我们认为基于ACL的攻击路径将开辟Active Directory域中的攻击格局的“新大陆”。
什么是ACL?
当我们在谈论基于ACL的攻击时,我们特指的是访问控制条目(ACE),它填充了自由访问控制列表(DACL)。DACL位于安全描述符中,它们位于安全对象内。有关常见安全对象的列表,请参阅这篇文章。值得注意的是,Active Directory用户,组和计算机都是此类安全对象。访问控制条目描述了Active Directory中针对安全对象的其他主体的允许和拒绝的权限。
上图显示的是用户“Jeff Dimmock”的安全描述符。红色突出的部分显示的是由访问控制条目(ACE)组成的自由访问控制列表(DACL)。
最好的例子是当一个对象在另一个对象上是“完全控制”的。例如,考虑“域管理员”组。也就是说,“域管理员”组可以完全控制域中的其他任何对象:
上图显示的是授予了“域管理员”组完全控制“Jeff Dimmock”这个用户的ACE ,图中红色突出显示的部分。
现在, Domain Admins组可以完全控制Active Directory中的其他所有对象; 然而,作为攻击者,我们感兴趣的是我们该如何滥用ACE来控制域管理员,用户或组,使我们更接近我们的目标。此外,对象的所有者具有对象的完全控制权(等效于GenericAll),而不管任何显式拒绝的ACE。
滥用ACE
本次更新为BloodHound攻击图模式添加了七个新的边界,基于我们已验证过的直接对象到对象的控制的情况是可以被滥用的。此外,Will Schroeder(@ harmj0y)和Lee Christensen(@tifkin_)已经付出了相当大的努力来创建易于使用的PowerShell cmdlet来滥用每个相关的ACE:
ForceChangePassword(强制更改密码):能够在不知道当前密码的情况下更改目标用户的密码。滥用方法:Set-DomainUserPassword。
AddMembers(添加成员):将任意用户,组或计算机添加到目标组。滥用方法:Add-DomainGroupMember。
GenericAll:所有对象控制,包括将其他主体添加到组,在不知道当前密码的情况下更改用户密码,使用用户对象注册SPN等。滥用方法:Set-DomainUserPassword或Add-DomainGroupMember。
GenericWrite:更新任何未受保护的目标对象的参数值。例如,更新目标用户对象上的“scriptPath”参数值,可以使该用户在下次登录时运行指定的可执行文件或命令。滥用方法:Set-DomainObject。
WriteOwner:更新目标对象所有者。一旦对象所有者已被更改为攻击者控制的主体,那么攻击者就可以用任何他们认为合适的方式来操纵对象。滥用方法:Set-DomainObjectOwner。
WriteDACL:将新的ACE写入目标对象的DACL。例如,攻击者可能会向目标对象的DACL写入新的ACE,使攻击者“完全控制”目标对象。滥用方法:Add-NewADObjectAccessControlEntry。
AllExtendedRights:执行与对象的扩展Active Directory权限相关联的任何操作。例如,将主体添加到组并强制更改目标用户的密码都是扩展权限的使用示例。滥用方法:Set-DomainUserPassword或Add-DomainGroupMember。
使用BloodHound规划攻击路径
完成BloodHound数据收集活动后(注意:默认情况下,所有经过身份验证的用户都可以读取所有对象上的所有ACE!),我们可以使用BloodHound交互界面来规划攻击路径最终拿下我们的目标。让我们来看一个基于实际环境的真实数据的例子:
上图显示的是由BloodHound识别的ACL攻击路径,目标组是“域管理员”组。
在上图显示的这种情况中,我们有一个相对较低的特权用户在最左边,根据这个用户的ACL确定了控制域管理员组的唯一的攻击路径。不幸的是,从OPSEC的角度来看,我们被迫在攻击路径的第七步中对许多用户中的一个执行了密码重置操作。这一路径上,我们可能会选择我们确定的另外两个用户进行密码重置操; 然而,我们还有其他选择,包括更改用户的scriptPath属性或向目标用户注册SPN,如Will(@harmj0y)在其博客文章“ Targeted Kerberoasting ”中所描述的:
上图显示的是我们攻击路径第1步的细节。左侧的用户是中间这个安全组的成员。该组对右侧的用户具有完全的控制权; 因此,左边的用户对右侧的用户也具有完全的控制权。
上图显示的是攻击路径第二步的细节。左边的用户属于中间的用户组。该用户组通过“GenericAll”和 “ForceChangePassword” (实际上是多余的) 对右侧的用户具有完全的控制权限。
上图显示的是攻击路径的最后两步的细节。左侧的组对应于所有属于右侧组中的几个用户具有“ForceChangePassword”权限。右边的那个用户组对最右边的组具有完全的控制权限,也就是“域管理员”组。
我们的攻击路径中的第二个到最后一个步骤要求我们更改一个活动用户的密码。对此操作的OPSEC注意事项不应该被轻视:如果攻击者更改了服务帐户密码,并且该服务帐户的关联操作开始失败,那么可能会提醒SOC。或者,如果我们更改了管理员用户的密码,并且用户在下次登录时无法登录,他们可能会怀疑他们的密码已经被其他人更改。一个很好的解决方案就是在我们获得DA(域管理员)之后直接将NT哈希值注入到NTDS中,并将用户的密码重置为以前的密码。但是,我还没有找到办法(请@gentilkiwi告诉我吧!)。这将要求你在攻击路径中的某个时间点检索目标用户的NTLM哈希值或明文密码。
另一个选择是更改该用户的密码,转到用户当前正在登录的计算机上,使用mimikatz获取用户登录该机器进行身份验证时的明文密码,并将用户密码重置为这个密码。如果操作得足够快(如果密码更改的操作不会仔细审查的话),那么用户应该是不会察觉到的。这就是域渗透中信息侦察的关键。你对环境,用户行为和监控功能等的了解越多,你越有可能在执行攻击路径中的这一步骤时不会被抓住。
在攻击路径的最后一步,我们可以完全控制我们的目标节点“Domain Admins”组:
请注意,完全控制一个组*不会*自动给你任何控制加入该组的用户的权限。在这种情况下,我们所选择的操作很简单:将我们控制的任意主体添加到域管理员组即可。一旦攻击者完成了这个操作,他们可以利用DCSync同步krbtgt的哈希,从域管理员组中删除他们添加的任意主体,然后使用krbtgt哈希保持权限的持久性。有关更多信息,请参阅Sean Metcalf(@PyroTek3)的博客文章“ Kerberos&KRBTGT:Active Directory的域Kerberos服务帐户”。
为了增添一丢丢乐趣,这里有一个视频显示的是利用YOLO方法执行这个攻击路径。因为我们只是通过LDAP / ADSI来操纵AD对象,所以我们可以以相当快的速度执行这些攻击路径:
用BloodHound审查ACL
Active Directory中进行有效的审查ACL一直是一个令人困惑,令人沮丧和痛苦的过程。BloodHound现在可以快速,轻松地对ACL进行审查,有两个重要的注意事项:首先,我们进行信息收集的唯一的ACL是可以用来控制另一个对象的ACL,我们还有一些工作要做,包括OU,GPO以及可能通过错误配置的ACL导致的其他攻击。其次,我们只关注是“允许”类型的ACE,而不考虑安全性参考监视器按规范顺序读取的ACE所确定的有效访问权限; 然而,在大多数环境中,我们注意到很少会使用到“拒绝”类型的ACE。
例如,通过点击用户组节点,并滚动到用户组信息选项卡的底部,我们看到“ 入站对象控件 ”部分:
“ 显式对象控制器 ”告诉了我们这个对象的第一个程度控制器是谁。请注意,这不同于非继承的权限,可能包括从父对象继承的ACE。通过点击号码,我们可以看到这些对象有哪些都是些什么对象:
“ 展开的对象控制器 ”使每个用户组对此对象都具有特权,并将其展开,通过安全组委托显示具有该权限的有效主体:
最后,“ 传输对象控制器 ”根据收集的ACL数据画出所有可能的攻击路径。如果存在一个唯一的来控制此对象的ACL攻击路径,那么,BloodHound将为你找到这条路径:
这些不同的视图能够使你即时的了解AD中的其他对象是否有能力控制任何其他节点。
未来的一些工作和结论
很快,我们将会更新BloodHound的模式来反映GPO编辑权限的利用,因为它们适用于OU以及这些OU的子对象。我们也在不断的研究,如何在AD中控制对象的方法,而不会触发监控报警。此外,Will和我将会在Black Hat USA 2017上发表演讲,关于在AD中使用ACL设计出非常诡异的后门,所以请在演讲的时候期待这些内容吧。
BloodHound在GitHub上提供了自由的开放源代码,网址为https://github.com/BloodHoundAD/BloodHound
你可以通过点击这里加入我们在Slack官方的BloodHound Gang Slack:https://bloodhoundgang.herokuapp.com/
你可以在Paranoia17中找到我们用来介绍BloodHound 1.3 ACL攻击路径更新的地点:https://www.slideshare.net/AndyRobbins3/bloodhound-13-the-acl-attack-path-update-paranoia17-oslo