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

修码的马修 · 2016/01/12 12:38python

Author:Sean Metcalfgit

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

0x00 前言


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

0x01 SYSVOL中的密码和组策略


这种方法是最简单的,由于不须要特殊的工具就能实现。攻击者只须要打开文件管理器搜索 SYSVOL DFS 共享中的XML文件。大多数时候,groups.xmlscheduledtasks.xmlServices.xml文件中都会含有用户凭证。shell

SYSVOL 是活动目录中的全域共享文件夹,全部认证用户都拥有读权限。SYSVOL 中包含了登录脚本,组策略以及其余域控制器须要须要用到的数据(由于SYSVOL会在全部域控之间自动同步和共享)。全部的组策略文件会存放在:\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\数据库

当一个GPP(组策略)被新建,就会有相关的组策略文件在SYSVOL中被建立,若是提供了密码,组策略文件中会同时包含AES-256位的加密后的密码数据,这加密彷佛是足够安全了。windows

除了Windows 2012以前的某些系统,微软在MSDN中提供了解密所须要的AES私钥。由于认证用户(信任域中的用户)都具备SYSVOL的读权限,任何人均可以搜索包含“cpassword”字段的XML文件,而里面正好有AES加密后的密码。promise

GroupPolicyPreferences-Password-XMLFileContents

有了这类XML的访问权限,攻击者能够用AES私钥解密GPP密码。PowerSploit的Get-GPPPassword函数被认为最好用的攻击实现,下面的截图展现了一个相似的PowerShell函数正在解密在SYSVOL中找到的XML文件中包含的密码。安全

GroupPolicyPreferences-Decrypted-Password

其余文件类型,例如.vbs.bat也可能包含嵌入的密码(常常是明文)。服务器

VBS-Scripts-In-SYSVOL

你可能会以为已经发布的补丁可以防止用户凭证被放置在组策略配置文件中,因此这个问题获得了证实。事实证实,笔者在渗透测试中仍然能在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),咱们有了如下的图,很好地解释这个漏洞。

Kerb-MS14-068-twitterpic-BoardingPass-Pilot

简单来说,经过MS14-048,攻击者能够在五分钟内重写有效的Kerberos TGT 认证票据而且成为域管理员(企业管理员)。攻击原理就像上面的机票同样,随便写上“飞行员”字样就能经过认证,登上飞机就能理所固然地坐到驾驶舱冒充飞行员享受咖啡福利。

第一个EXP在补丁发布后的两周后被公布,叫作PyKEK,做者是Sylvain Monné (@BiDOrD). PyKEK是一个能在全部安装了python的机器(Raspberry Pi?)上运行的脚本,只要机器能链接到一台没打补丁的域控就能发挥做用。它会生成一个ccache文件。用Mimikatz能够把这个生成的ccache文件注入到内存当中,攻击者就能成为域管理员!有了这个票据,就能被容许访问域控上面的admin$共享!

Mimikatz-PTC-PyKEK-ccacheFile

限制条件:打了补丁或者域中有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。

MS14068-01

对策:

  • 确保机器在运行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票据,一旦票据被成功解开,它的密码也就到手了。

注意:得到服务票据不须要提权,同时也不会发送数据到目标机器。

Kerberoast-03

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有一些几条: *禁止如下用户组从网络登录到这台电脑:本地帐户,企业管理员,域管理员 *禁止如下用户组从远程桌面登录:本地帐户,企业管理员,域管理员 *禁止如下用户组本地登录:企业管理员,域管理员

GroupPolicy-Prevent-LocalAccount-LogonOverNetwork

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

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

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

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

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

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

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

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

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

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

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

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

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

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

获取一个有权登录域控的帐户

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

Default-DC-LogOnLocallyGroups

如下是默认有权登录域控的用户组:

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

这意味着若是一个攻击者可以拿下Account Operators或者Print Operators中的一个帐户,整个活动目录就可能被攻陷,由于这些用户组有登录到域控的权限。

对策:

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

那么问题来了,若是一个帐户被赋予登录域控的权限,接下来会发生什么?

若是一个帐户有权登录域控,二话不说固然是把域控的用户凭证拖下来。

用Mimitaz导出域中全部凭证

神器Mimikatz可以从域控中到存储域中的全部用户凭证。

Mimikatz-LSADump-LSA

用Mimitaz导出LSASS内存信息(得到域管理员凭证)

Mimikatz可以在不一样系统中的LSASS.dmp中导出LSASS而后提取出登录过的用户凭证。在域控上,这样总能拿到域管理员的凭证。

Mimikatz-Sekurlsa-Minidump

用任务管理器来导出LSASS内存信息(得到域管理员凭证)

一旦LSASS被导出来,Mimikatz就能提取到登录过的用户凭证。在域控上,这也总能拿到域管理员的凭证。

TaskManager-DumpLSASS

用NTDSUtil建立媒体安装集(IFM) (抓取NTDS.dit文件)

NTDSUtil一个本地运行的针对活动目录数据库(ntds.dit)的命令,同时容许为DCPromo命令准备IFM集。IFM是用于DCPromo命令中“从媒体安装”的步骤的,有了它配置域控时就不须要经过网络从其余域控拷贝数据。IFM集同时也会在c:\temp目录下生成的一份NTDS.dit拷贝。

此文件可能出如今为新域控准备的共享目录中,也可能在还没配置成域控的服务器上找到,这样的服务器就是不安全的。

NTDSUtil-CreateIFM

从NTDS.dit文件中提取活动目录域凭证(注册表系统单元)

一旦攻击者有了一份NTDS.dit文件的拷贝(还有指定的注册表键值来解密数据库文件中的加密部分),在活动目录数据库文件中的凭证数据就能被提取出来。

一旦攻击者有了注册表系统单一和NTDS.dit 文件,他就能获取全部的活动目录凭证!下面的截图来自安装有Impacket python工具的Kali系统。DIT经过Impacket中的secrectdump.py脚本被导出。

IMPacket-Dump-Credentials-NTDSdit

在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的博客,上面常常会发布不少域渗透相关的猥琐思路。

相关文章
相关标签/搜索