从活动目录获取域管理员权限的各种姿势


Author:Sean Metcalf

From:Attack Methods for Gaining Domain Admin Rights in Active Directory

0x00 前言


对于一个攻击者来说,有很多方法能在活动目录中获得域管理员权限。这篇文章旨在介绍一些当下比较流行的方法,这里介绍的方法都基于一个前提——攻击者已经获得内网中一台(或几台)机器的权限并且获得了普通域用户的账户。

0x01 SYSVOL中的密码和组策略


这种方法是最简单的,因为不需要特殊的工具就能实现。攻击者只需要打开文件管理器搜索 SYSVOL DFS 共享中的XML文件。大多数时候,groups.xmlscheduledtasks.xmlServices.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目录中中找到用户凭证。

对策:

  • 在每台电脑上都安装上KB2962486补丁,可以防止新的用户凭证被放到组策略配置文件当中。
  • 删除SYSVOL目录中包含密码的GPP xml文件。
  • 不要把密码放在所有认证用户都有权访问的文件当中。

关于这种攻击方法的更多信息可以参考这篇文章:Finding Passwords in SYSVOL & Exploiting Group Policy Preferences

0x02 针对没打补丁的域控利用MS14-068漏洞


距离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的步骤:

  1. 作为普通用户向域控请求一个没有PAC的Kerberos TGT认证的票据,域控会返回一个TGT(不包含PAC,PAC通常包含有用户组中的成员关系)
  2. 生成一个伪造的PAC,因为没有密钥,所以生成的PAC“被标记”有MD5算法,而不是带有域用户密码数据的HMAC_MD5类型。
  3. 把伪造的PAC结合上TGT构造认证数据,作为TGS服务的一部分发送到域控。
  4. 域控会混淆构造的数据,所以直接丢弃之前用户发送没带有PAC的TGT,然后新构造一个TGT并用自己的认证数据插入到伪造的PAC当中,再把新TGT发送给用户
  5. 这样带有伪造PAC的TGT就能使用户成为有漏洞域控上的域管理员。

Benjamin Delpy(Mimikatz 的作者)写了一个MS14-068的利用工具,叫Kekeo,是PyKEK的升级版。它能够找到并定位有漏洞的域控,在打了补丁和有2012/2012R2域控的情况下仍能奏效。实现的步骤和PyKEK基本相同,不过在最后加了一个步骤,以此获得一个能在域中所有域控利用的TGT。它利用攻击生成的TGT来获取一个到处都能用的TGT。

对策:

  • 确保机器在运行DCPromo命令(被提升为域控)前就安装上了KB3011780补丁。一个快速简单的方法是用PowerShell命令:get-hotfix 3011780
  • 同时,为机器开启自动安装关键补丁的选项。

0x03 Kerberos TGS 服务 Ticket离线破解(Kerberoast)


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

对策:

  • 对付这种攻击最有效的对策其实是保证服务账户的密码在25位以上。
  • 托管服务账户(Managed Service Accounts)和用户组托管服务账户(Group Managed Service Accounts)是能够确保账户密码足够长、足够复杂、并且定期更改。一些第三方的密码管理器也是管理服务账户的不错的解决方案。

关于这种攻击方法的更多信息可以参考这篇文章:Cracking Kerberos TGS Tickets Using Kerberoast – Exploiting Kerberos to Compromise the Active Directory Domain

0x04 “瞒天过海”


我把下面这一部分叫做“瞒天过海”,因为很难把这类攻击进行具体的归类。可以把它比作一种舞蹈。拿下一台机器,提权,导出凭证。然后用凭证跳到另外的机器上,提权,再拿下更多的凭证。

这种攻击在域中通常能很快见效,因为大多数活动目录管理员都是用一个账户登陆到一台机器上,并切会用到RunAs(使得管理员的凭证留在了本地机器上面)或者用RDP连接到一台服务器(凭证就能通过键盘记录器记录下来)。

  • 第一步: 攻下一台机器,通过提权漏洞获取本地管理员权限。用Mimikatz或者其他类似的工具导出最近登陆过本机的用户凭证。
  • 第二步: 用本地管理员的凭证尝试登陆到别的机器上。这常常很有效,因为本地管理员的账户密码曾经很难被配置正确(现在你可以用微软提供的 LAPS)。假如很多(甚至是所有)机器上都用着同样的账户密码,那么得到一组账户密码就相当于拥有了所有机器的管理员权限。你可以用凭证登陆到不同的机器上,直到找到域管理员的凭证。用本地账户登陆到不同机器是一种理想的做法,因为这样的登陆不需要连接到域控上面,也很少有公司机构把机器的安全日志都发送到日志中心系统(SIEM)。
  • 第三步:利用获取的凭证登陆到服务器上以获得更多的凭证。运行着像Microsoft Exchange Client Access Servers(CAS), Microsoft Exchange OWA, Microsoft SQL 和 Terminal Services(RDP)这类服务的服务器,很可能在内存中存留大量用户的凭证(或者是一些有域管理员权限的服务)。
  • 第四步:收网!

有了域管理员的凭证,就没什么能够阻止攻击者导出所有的域凭证,并在内网中维持权限。

如果有服务以域管理员的权限在所有的工作站或服务器上运行,只需要攻下一个台机器就相当与攻下了整个域活动目录。

通常来说,通过PowerShell来进行远程管理是一个很好的方法,因为PowerShell采用的是的是网络登陆(不会有凭证保存在远程机器的内存中)。这很好,微软也把RDP管理模式逐步移向这种模式。还有种方法能够用PowerShell连接到远程系统进行管理,并且能够通过CredSSP调用凭证。问题是CredSSP不够安全。

Joe Bialek 在PowerShellMagazine.com中写道:

管理员用PowerShell远程管理时遇到一个很常见的问题就是“双跃点”问题。管理员用PowerShell远程连接到服务器A上面,并且尝试在从服务器A连接到服务器B。这种情况下第二次连接不会成功。

原因是:默认情况下,PowerShell远程认证的方式是“网络登陆”。网络登陆只需要向服务器证明你拥有登陆的凭证而不需要把凭证发送过去(详情见:KerberosNTLM认证)。既然远程服务器没有你登陆的凭证,那么当你进行一次双跃点登陆(从服务器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的远程操作时的密码加密。

从哈希传递攻击(Pass-the-hash)到凭证传递攻击(Pass-the-Credential)

大多数人都听说过哈希传递攻击(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。

其实还有其他种类的盗取凭证的手段,不过这几种是最常见的:

  • 哈希传递攻击:抓取哈希值并用来访问资源。直到用户改密码哈希值都是有效的。
  • 票据传递攻击:抓取Kerberos票据用来访问资源。在票据有效期限内票据都会有效(一般是7天)。
  • 超-哈希传递攻击:用密码哈希值来获得Kerberos票据。哈希值在用户改密码之前都有效。

对策:

  • 管理员应该为管理事务划分出专门的管理员机器。管理员的账户永远不要登陆到用来收发邮件和上网的普通机器上。这样就能降低凭证被盗取的机会。 需要注意的是智能卡不能够防止凭证被盗取,因为在访问资源的时候仍会用到账户所对应的密码哈希值。智能卡只能保证正在登陆的用户拥有智能卡,一旦被用来登陆系统,智能卡的两个验证因素就会变为一个,就是用户的密码哈希值(被存放在内存里)。还有就是,当账户设置为用智能卡登陆的时候,系统会为账户设置一个新的密码(还永远不会改变)。
  • 在工作机和服务器上的所有本地管理员账户都应该足够长,足够复杂,足够随机,可以用微软 LAPS之类的产品来保证这点
  • 配置组策略来放置本地管理员账户通过网络来认证登陆。下面几条简单的GPO就能阻止本地账户在通过网络登陆(包括RDP),同时也能阻止域管理员和企业管理员登陆到本地。GPO有一些几条: 禁止以下用户组从网络登陆到这台电脑:本地账户,企业管理员,域管理员 禁止以下用户组从远程桌面登陆:本地账户,企业管理员,域管理员 *禁止以下用户组本地登陆:企业管理员,域管理员

获取访问活动目录数据库文件的权限(ntds.dit)

活动目录数据库(ntds.dit)包含了活动目录域中所有对象的所有信息。这个数据库中的数据会被复制到域中的所有域控。这个文件照样包含了所有域用户和计算机账户的密码哈希值。只有能登陆到域控上的用户才能访问到ntds.dit文件。

显然,保护好这个文件是很重要滴,因为攻击者访问它就能导致整个域和目录林(forest)被攻陷。

下面列出了几种不用成为域管理员就能获取ntds.dit数据的方法:

备份路径(备份服务器储存,媒体,网络共享)

攻击者访问到域控的备份并在备份共享的ntds.dit文件安放后门。管理员应该确保所有能通过网络访问的保存域备份的目录都是安全的。只有域管理员可以访问它们,只要有其他人能访问,那个人就能摇身一变成为域管理员。

在准备配置成域控的服务器上找NTDS.dit文件

DCPromo 中会有一个叫IFA的步骤,也就是“从媒体安装”,这个步骤可以使服务器不通过网络来复制域中的数据。这个IFA集是NTDS.dit的拷贝,它可能出现在为新域控准备的共享目录中,也可能在还没配置成域控的服务器上找到,这样的服务器就是不安全的。

有虚拟机的管理权限,就能克隆虚拟的域控并离线获取数据

获得虚拟域控的访问权并获取域中的凭证。你有用VMWare吗?VCenter的管理员是拥有全部权限的。有了VCenter的管理员权限,就能克隆域控直接把数据拷贝到本地。

在VM被挂起的情况下,还可以从虚拟机内存直接提取LSASS数据。不要小看虚拟机管理员在虚拟域控上所拥有的能力。

如果你的VCenter管理员组在活动目录里,你应该考虑改掉它。

对合适的用户组赋予恰当的权限,不要给攻击者提供通过服务器管理员权限给整个活动目录安装后门的能力。

你的虚拟机管理员应该被视作是与管理员(如果有虚拟域控的话)

获取一个有权登陆域控的账户

在活动目录中有几个组不应该有登陆域控的默认权限。

以下是默认有权登陆域控的用户组:

  • Enterprise Admins (目录林管理员组)
  • Domain Admins(域管理员组)
  • Administrators
  • Backup Operators
  • Account Operators
  • Print Operators

这意味着如果一个攻击者能够拿下Account Operators或者Print Operators中的一个账户,整个活动目录就可能被攻陷,因为这些用户组有登陆到域控的权限。

对策:

  • 限制用户组/账户登陆到域控的权限
  • 避免用户组/账户拥有对活动目录的全部权限,尤其是服务账户
  • 保护好每一个活动目录数据库(ntds.dit)的拷贝,不要把它放在信任级别低于域控的任何地方。

那么问题来了,如果一个账户被赋予登陆域控的权限,接下来会发生什么?

如果一个账户有权登陆域控,二话不说当然是把域控的用户凭证拖下来。

用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)进行攻击。

参考链接:

0x05 译后记


drops和zone上已经有很多域渗透相关的资料了,尤其是三好学生发表的一系列文章,在实战中具有很好的参考意义。翻译的这篇文章里面大多数方法的详细利用步骤都能在drops上找到,文章的意义在于给刚进入内网的同学提供思路和方向。

至于工具方面个人也有一些体会,首先Mimikatz是域渗透中必不可少的神器,就像猪猪侠说的:

撸域控,就是先搞定域里面的任何一台机器,想办法弄到SYSTEM权限,mimikataz一上,就收工了。
域渗透,mimikataz出来后,几乎没有新思路了。

其实思路还是有的,就像上面就提供了不少出了Mimikatz之外的思路。一个新趋势就是域渗透逐渐在往PowerShell上做文章,攻防两方都在PowerShell研究出了不少新方法。工具方面一个是PowerTools,集合了很多神奇好用的PowerShell脚本,包括提权,维持权限,还有一些SMB相关的攻击应用等。另一个就是Empire,可谓是PowerShell在后渗透阶段的集大成者。

最后不能不提的当然是以上两个工具作者harmj0y的博客,上面经常会发布很多域渗透相关的猥琐思路。

评论

K

ksss 2016-01-12 17:18:36

域控没有在控制机登陆过,如何用mm收工呢?

X

Xc0d3r 2016-01-16 12:02:38

度过Empire的源码,Empire在实战网络环境的表现不如meterpreter。有个不错的思路就是把Empire的模块,单独提取出来用。

小又又 2016-05-10 09:27:06

@ksss install Thirteen

修码的马修

这个人很懒,没有留下任何介绍

twitter weibo github wechat

随机分类

Ruby安全 文章:2 篇
漏洞分析 文章:212 篇
Python安全 文章:13 篇
APT 文章:6 篇
安全管理 文章:7 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录