Author:Sean Metcalf
From: Attack Methods for Gaining Domain Admin Rights in Active Directory
对于一个攻击者来说,有很多方法能在活动目录中获得域管理员权限。这篇文章旨在介绍一些当下比较流行的方法,这里介绍的方法都基于一个前提——攻击者已经获得内网中一台(或几台)机器的权限并且获得了普通域用户的账户。
这种方法是最简单的,因为不需要特殊的工具就能实现。攻击者只需要打开文件管理器搜索 SYSVOL DFS 共享中的XML文件。大多数时候,groups.xml
、scheduledtasks.xml
、Services.xml
文件中都会含有用户凭证。
SYSVOL 是活动目录中的全域共享文件夹,所有认证用户都拥有读权限。SYSVOL 中包含了登陆脚本,组策略以及其他域控制器需要需要用到的数据(因为SYSVOL会在所有域控之间自动同步和共享)。所有的组策略文件会存放在:\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
当一个GPP(组策略)被新建,就会有相关的组策略文件在SYSVOL中被创建,如果提供了密码,组策略文件中会同时包含AES-256位的加密后的密码数据,这加密似乎是足够安全了。
除了Windows 2012之前的某些系统,微软在MSDN中提供了解密所需要的AES私钥。因为认证用户(信任域中的用户)都具有SYSVOL的读权限,任何人都可以搜索包含“cpassword”字段的XML文件,而里面正好有AES加密后的密码。
有了这类XML的访问权限,攻击者可以用AES私钥解密GPP密码。PowerSploit的Get-GPPPassword
函数被认为最好用的攻击实现,下面的截图展示了一个类似的PowerShell函数正在解密在SYSVOL中找到的XML文件中包含的密码。
其他文件类型,例如.vbs
和.bat
也可能包含嵌入的密码(经常是明文)。
你可能会觉得已经发布的补丁能够防止用户凭证被放置在组策略配置文件中,所以这个问题得到了证明。事实证明,笔者在渗透测试中仍然能在SYSVOL目录中中找到用户凭证。
对策:
关于这种攻击方法的更多信息可以参考这篇文章:Finding Passwords in SYSVOL & Exploiting Group Policy Preferences
距离MS14-068的补丁KB3011780发布已经有超过一年时间了,也出现了很多方法来确保针对MS14-068的攻击被检测和识别出来。然而这并不意味着域控就一定打上了补丁或者配置了监测系统。很多公司机构在补丁发布后的一个月内打上了补丁;但是不能保证每台新上线的域控都在被配置好之前就打上了补丁。
感谢Gavin Milard(@gmillard on Twitter),我们有了以下的图,很好地解释这个漏洞。
简单来讲,通过MS14-048,攻击者可以在五分钟内重写有效的Kerberos TGT 认证票据并且成为域管理员(企业管理员)。攻击原理就像上面的机票一样,随便写上“飞行员”字样就能通过认证,登上飞机就能理所当然地坐到驾驶舱冒充飞行员享受咖啡福利。
第一个EXP在补丁发布后的两周后被公布,叫做PyKEK,作者是Sylvain Monné (@BiDOrD). PyKEK是一个能在所有安装了python的机器(Raspberry Pi?)上运行的脚本,只要机器能连接到一台没打补丁的域控就能发挥作用。它会生成一个ccache文件。用Mimikatz可以把这个生成的ccache文件注入到内存当中,攻击者就能成为域管理员!有了这个票据,就能被允许访问域控上面的admin$共享!
限制条件:打了补丁或者域中有Win2012/2012R2 域控
利用MS14-068的步骤:
Benjamin Delpy(Mimikatz 的作者)写了一个MS14-068的利用工具,叫Kekeo,是PyKEK的升级版。它能够找到并定位有漏洞的域控,在打了补丁和有2012/2012R2域控的情况下仍能奏效。实现的步骤和PyKEK基本相同,不过在最后加了一个步骤,以此获得一个能在域中所有域控利用的TGT。它利用攻击生成的TGT来获取一个到处都能用的TGT。
对策:
get-hotfix 3011780
Kerberoast 能够在不对目标系统发送任何数据的情况下用普通用户身份从活动目录中提取服务的账户凭证。人们总是设置弱口令,所以这种攻击往往能够得逞。这种攻击能够成功的原因是:大多数服务账户的密码都和域的密码最短长度限制一样长(通常是10个或12个字符),这意味着即使是采用暴力破解的方式,所花费的时间也不太可能超过密码过期时限。有的服务账户甚至还没有设置密码过期时限,所以同一个密码能够用个一年半载的也不足为奇。更好玩的是,大多数服务账户都有权限过大的问题,通常还是域管理员组的成员,有着对活动目录的全部权限(尽管有时候服务账户只需要修改某些特定对象的属性或者只需在特定服务上拥有管理权限)。
注意:这种攻击对Windows系统管理的目标服务不会成功,因为这类服务会在活动目录中映射成为一个有着128位长密码的账户,这么长的密码不可能在短时间内破解出来。
攻击的步骤包括为目标的服务账户的服务器主体名称(Service Principle Name—— SPN)请求一个Kerbero服务票据 (TGS) 。这里会采用一个有效的用户认证票据(TGT)来请求一个或几个运行在服务器上的目标服务票据。域控不会检测用户是否真正连接到了这些资源上(即使用户可能真的有权限访问)。域控会在活动目录中查找SPN并且用SPN关联的用户账户把票据进行加密,以此赋予用户访问服务的权限。请求的Kerbero服务票据的加密类型是 RC4_HMAC_MD5, 这意味着服务账户的NTLM密码哈希会被用来加密服务票据。所以Kerberoast能够通过尝试不同的NTLM哈希来解开kerberos票据,一旦票据被成功解开,它的密码也就到手了。
注意:获得服务票据不需要提权,同时也不会发送数据到目标机器。
Tim Medin 在 DerbyCon 2014 上作了相关的报告:“Attacking Microsoft Kerberos Kicking the Guard Dog of Hades” (幻灯片 & 视频),同时也发布了Kerberoast Python TGS cracker。
对策:
关于这种攻击方法的更多信息可以参考这篇文章:Cracking Kerberos TGS Tickets Using Kerberoast – Exploiting Kerberos to Compromise the Active Directory Domain
我把下面这一部分叫做“瞒天过海”,因为很难把这类攻击进行具体的归类。可以把它比作一种舞蹈。拿下一台机器,提权,导出凭证。然后用凭证跳到另外的机器上,提权,再拿下更多的凭证。
这种攻击在域中通常能很快见效,因为大多数活动目录管理员都是用一个账户登陆到一台机器上,并切会用到RunAs(使得管理员的凭证留在了本地机器上面)或者用RDP连接到一台服务器(凭证就能通过键盘记录器记录下来)。
有了域管理员的凭证,就没什么能够阻止攻击者导出所有的域凭证,并在内网中维持权限。
如果有服务以域管理员的权限在所有的工作站或服务器上运行,只需要攻下一个台机器就相当与攻下了整个域活动目录。
通常来说,通过PowerShell来进行远程管理是一个很好的方法,因为PowerShell采用的是的是网络登陆(不会有凭证保存在远程机器的内存中)。这很好,微软也把RDP管理模式逐步移向这种模式。还有种方法能够用PowerShell连接到远程系统进行管理,并且能够通过CredSSP调用凭证。问题是CredSSP不够安全。
Joe Bialek 在PowerShellMagazine.com中写道:
管理员用PowerShell远程管理时遇到一个很常见的问题就是“双跃点”问题。管理员用PowerShell远程连接到服务器A上面,并且尝试在从服务器A连接到服务器B。这种情况下第二次连接不会成功。
原因是:默认情况下,PowerShell远程认证的方式是“网络登陆”。网络登陆只需要向服务器证明你拥有登陆的凭证而不需要把凭证发送过去(详情见:Kerberos 和 NTLM认证)。既然远程服务器没有你登陆的凭证,那么当你进行一次双跃点登陆(从服务器A登陆到服务器B)的时候,结果当然会失败。
为了解决这个问题,PowerShell提供了CredSSP(Credential Security Support Provider)选项。当选择了CredSSP模式,PowerShell不会进行“网络登陆”,而是进行“网络明文登陆”。网络明文登陆的工作原理是直接把用户的密码明文发送到远程服务器上。通过这种方式,服务器A获得了用户的明文密码,所以也能用它来登陆到服务器B,双跃点登陆成功。
更新:以上测试是在Windows Server 2012上面进行的。微软已经在Windows Server 2012R2和Windows8.1中限制了在内存中存放明文凭证。这意味着使用Mimikatz的攻击者们可能将不会直接看到有明文密码。不过攻击者仍能看到NT密码哈希和Kerberos TGT,这两者都能和密码产生同样的效果,可以被用于网络的登陆认证。
另外,即使明文凭证没有被存放在内存当中,它依然被发送到了远程服务器。攻击者能够向本地安全认证子系统服务(LSASS.exe)注入恶意代码并且在传输过程中截获明文密码。所以即使用Mimikatz找不到明文密码了,攻击者还是会有办法获得它。
综上所述,不要用CredSSP就对了。
还有一个类似的问题就是WinRM(PowerShell远程操作用到的东西)的“AllowUnencrypted”配置。把这个值设为“True”会禁用掉系统WinRM连接时的加密,包括PowerShell的远程操作时的密码加密。
大多数人都听说过哈希传递攻击(PtH),它通过找到账户相关的密码哈希(通常是NTLM密码哈希)来进行攻击。有趣的是有了PtH,就不必费时间破解密码的哈希值来获得密码明文了,因为在Windows网络中,哈希值就是用来证明身份的(知道了用户名和密码哈希值就能够通过验证)。微软自家的产品和攻击显然不会支持这种攻击,所以我们需要第三方工具来完成任务,例如:Mimikatz。
一旦攻击者找到了密码哈希,很多大门都会向他们打开,但是他们可不只有PtH这一种选择。
票据传递攻击(Pass-the-Ticket——PtT)是通过抓取现有的Kerberos票据来冒充一个用户。Mimikatz能够抓取当前用户的Kerberos票据,也能抓取每一个通过系统认证的用户的所有票据(如果配置了Kerberos委派机制的不受限访问,这可成了大问题)。一旦获得了Kerberos票据,攻击者就能用Mimikatz来传递它并访问到目标资源(当然是在Kerberos票据的有效时间内)。
超-哈希传递攻击(OverPass-the-Hash)也就是秘钥传递攻击,通过获得的密码哈希来获得Kerberos票据。这种技巧会清除当前用户的所有Kerberos秘钥(哈希值)然后把得到的哈希值注入到内存当中,以此请求获得Kerberos票据。下次访问资源需要用到Kerberos票据的时候,被注入的哈希值(现在是内存中的Kerberos秘钥)会被用来请求Kerberos票据。Mimikatz提供了实现这种攻击的功能,相比起PtH,这是更加隐秘的一种手段,因为现在已经有好几种方法能够检测到PtH。
注意: 如果获得哈希值的类型是NTLM,Kerberos票据的类型是RC4.如果哈希类型是AES,Kerberos票据类型也会是ABS。
其实还有其他种类的盗取凭证的手段,不过这几种是最常见的:
对策:
活动目录数据库(ntds.dit)包含了活动目录域中所有对象的所有信息。这个数据库中的数据会被复制到域中的所有域控。这个文件照样包含了所有域用户和计算机账户的密码哈希值。只有能登陆到域控上的用户才能访问到ntds.dit文件。
显然,保护好这个文件是很重要滴,因为攻击者访问它就能导致整个域和目录林(forest)被攻陷。
下面列出了几种不用成为域管理员就能获取ntds.dit数据的方法:
备份路径(备份服务器储存,媒体,网络共享)
攻击者访问到域控的备份并在备份共享的ntds.dit文件安放后门。管理员应该确保所有能通过网络访问的保存域备份的目录都是安全的。只有域管理员可以访问它们,只要有其他人能访问,那个人就能摇身一变成为域管理员。
在准备配置成域控的服务器上找NTDS.dit文件
DCPromo 中会有一个叫IFA的步骤,也就是“从媒体安装”,这个步骤可以使服务器不通过网络来复制域中的数据。这个IFA集是NTDS.dit的拷贝,它可能出现在为新域控准备的共享目录中,也可能在还没配置成域控的服务器上找到,这样的服务器就是不安全的。
有虚拟机的管理权限,就能克隆虚拟的域控并离线获取数据
获得虚拟域控的访问权并获取域中的凭证。你有用VMWare吗?VCenter的管理员是拥有全部权限的。有了VCenter的管理员权限,就能克隆域控直接把数据拷贝到本地。
在VM被挂起的情况下,还可以从虚拟机内存直接提取LSASS数据。不要小看虚拟机管理员在虚拟域控上所拥有的能力。
如果你的VCenter管理员组在活动目录里,你应该考虑改掉它。
对合适的用户组赋予恰当的权限,不要给攻击者提供通过服务器管理员权限给整个活动目录安装后门的能力。
你的虚拟机管理员应该被视作是与管理员(如果有虚拟域控的话)
获取一个有权登陆域控的账户
在活动目录中有几个组不应该有登陆域控的默认权限。
以下是默认有权登陆域控的用户组:
这意味着如果一个攻击者能够拿下Account Operators或者Print Operators中的一个账户,整个活动目录就可能被攻陷,因为这些用户组有登陆到域控的权限。
对策:
那么问题来了,如果一个账户被赋予登陆域控的权限,接下来会发生什么?
如果一个账户有权登陆域控,二话不说当然是把域控的用户凭证拖下来。
用Mimitaz导出域中所有凭证
神器Mimikatz能够从域控中到存储域中的所有用户凭证。
用Mimitaz导出LSASS内存信息(获得域管理员凭证)
Mimikatz能够在不同系统中的LSASS.dmp
中导出LSASS然后提取出登陆过的用户凭证。在域控上,这样总能拿到域管理员的凭证。
用任务管理器来导出LSASS内存信息(获得域管理员凭证)
一旦LSASS被导出来,Mimikatz就能提取到登陆过的用户凭证。在域控上,这也总能拿到域管理员的凭证。
用NTDSUtil创建媒体安装集(IFM) (抓取NTDS.dit文件)
NTDSUtil一个本地运行的针对活动目录数据库(ntds.dit)的命令,同时允许为DCPromo命令准备IFM集。IFM是用于DCPromo命令中“从媒体安装”的步骤的,有了它配置域控时就不需要通过网络从其他域控拷贝数据。IFM集同时也会在c:\temp
目录下生成的一份NTDS.dit拷贝。
此文件可能出现在为新域控准备的共享目录中,也可能在还没配置成域控的服务器上找到,这样的服务器就是不安全的。
从NTDS.dit文件中提取活动目录域凭证(注册表系统单元)
一旦攻击者有了一份NTDS.dit文件的拷贝(还有指定的注册表键值来解密数据库文件中的加密部分),在活动目录数据库文件中的凭证数据就能被提取出来。
一旦攻击者有了注册表系统单一和NTDS.dit 文件,他就能获取所有的活动目录凭证!下面的截图来自安装有Impacket python工具的Kali系统。DIT通过Impacket中的secrectdump.py
脚本被导出。
在2015年十月,DSInternals.com发布了一个用于从NTDS.dit导出用户凭证(注册表系统单元)的PowerShell方法,叫做Get-ADDBAcount
(尽管只能用于Windows 8和Windows 2012系统以上,因为早前的系统有bug)。
一但攻击者导出了域数据库,就有很多选择来维持保留高级权限,包括创建并使用Golden Tickets,这种方法能在拿下一个域的情况下对整个目录林(forest)进行攻击。
参考链接:
drops和zone上已经有很多域渗透相关的资料了,尤其是三好学生发表的一系列文章,在实战中具有很好的参考意义。翻译的这篇文章里面大多数方法的详细利用步骤都能在drops上找到,文章的意义在于给刚进入内网的同学提供思路和方向。
至于工具方面个人也有一些体会,首先Mimikatz是域渗透中必不可少的神器,就像猪猪侠说的:
撸域控,就是先搞定域里面的任何一台机器,想办法弄到SYSTEM权限,mimikataz一上,就收工了。
域渗透,mimikataz出来后,几乎没有新思路了。
其实思路还是有的,就像上面就提供了不少出了Mimikatz之外的思路。一个新趋势就是域渗透逐渐在往PowerShell上做文章,攻防两方都在PowerShell研究出了不少新方法。工具方面一个是PowerTools,集合了很多神奇好用的PowerShell脚本,包括提权,维持权限,还有一些SMB相关的攻击应用等。另一个就是Empire,可谓是PowerShell在后渗透阶段的集大成者。
最后不能不提的当然是以上两个工具作者harmj0y的博客,上面经常会发布很多域渗透相关的猥琐思路。