回归最本质的信息安全

从活动目录中获取域管理员权限的6种方法

2017年4月21日发布

19,557
1
0

导语:从活动目录获取域管的方法有很多种,在这篇文章我将对现在最常用的一些方法进行介绍。这是在我们已经进入到域里面,并且已经得到了普通域用户的权限的前提下,进行攻击的方法(又称后渗透阶段)。

通常,在大多数企业当中,攻击者根本不需要太长的时间,就可以将域中普通用户的权限提升到域管理员的权限。公司运维人员会困惑,“这一切都是怎么发生的?”

一次攻击,往往开始于公司中的一个或多个用户打开了恶意邮件,使得攻击者可以在目标网络中的计算机上执行恶意代码。一旦恶意代码被运行,攻击者就会利用恶意代码对企业内网进行侦查,以便于发现有用的资源进行提权,进行持久控制,当然,他们还有可能进行信息掠夺。

虽然整体的细节以及流程大多不同,但是他们的目的几乎是一样的,如:

恶意软件注入(web应用漏洞利用,Spear-Phish网络钓鱼攻击等等)
进行内网信息收集
嗅探密钥
进行攻击以及提权
获取数据
持久控制

我们从攻击者进入内网区域开始讲述,因为这在真实网络环境中,并不是很困难的事情。此外,攻击者从主机普通用户权限提升到本地管理员的权限并不是那么困难,他们可以通过利用主机未修补的提权漏洞进行提权,或者从SYSVOL中找到本地管理员的密码,比如:组策略首选项。

我曾经在会议上分享过许多关于这种攻击的方法,也在文章里中介绍过
下面,我们就开始我们的正文吧~

从域普通用户到域管理员的攻击方法:

1.SYSVOL和组策略首选项中的密码

因为不使用任何工具,所以这种攻击方法是最简单的。攻击者需要做的就是打开windows任务管理器,并搜索名为SYSVOL
DFS的共享XML文档。大多数情况下,以下文档会包含密码:
groups.xml,scheduledtasks.xml以及Services.xml.

SYSVOL是将在域中所有经过身份验证的用户都可以读取权限的活动目录在域中进行共享。SYSVOL包括登录脚本,组策略数据,以及域控需要访问的其他域里面的数据(因为SYSVOL是在所有域控之间自动同步并且共享的)。所有域的组策略都存在于:

<DOMAIN>SYSVOL<DOMAIN>Policies

当新的GPP(组策略选项)创建时,会在SYSVOL中创建一个与相关配置数据相关联的XML文件,如果提供了密码,那么加密方式应该是AES-256。

除了在2012年微软公布了AES加密的私钥外,任何经过身份验证的用户(任何域中用户或者受信任域中的用户)都可以查看SYSVOL中的包含AES加密密码的XML文件。

1491990779816897.png

当进入到这个XML文件当中后,攻击者可以使用上述AES的私钥对组策略选项中的密码进行解密。PowerSploit中的一个模块Get-GPPPassword可以对组策略密码进行破解。下面截图就是类似模块对在SYSVOL的GPP密码进行解密的方法。

1491990797360217.png

一些其他的文件可能也存在已经嵌入的密码,通常是明文,比如vbs,bat文件。

1491990823141515.jpg

你会认为通过发布的补丁,将管理员的信息不放进组策略就可以避免这个问题的发生,但是我现在在对客户进行安全评估时,依旧可以在SYSVOL中找到用户的密码。

解决方法:

在用于管理GPO(组策略对象)的每台计算机上安装KB2962486补丁,以防止新的凭据被放置在组策略首选项中。
删除SYSVOL中存在GPP密码的XML文件。
不要将密码暴露在任何域用户面前。

关于这个攻击方法的更多信息,你可以具体参考这篇文章:https://adsecurity.org/?p=2288

2.在未打补丁的域控上使用MS14-068关于Kerberos的漏洞进行攻击。

自从KB3011780补丁对MS14-068进行修补已经过去一年多了,并且已经有方法可以对MS14-068攻击进行检测和防御,不过这并不意味这所有的域控制器都会对这个漏洞进行检测。大多数的企业都在KB301178发布一个月后对域控上面的漏洞进行修补,但是并不确保新成为域控的服务器都对这个漏洞进行了修复。

感谢@Gavin Millard,让我们可以简单的进行介绍这种攻击。

1491990886314445.png

简单来说,攻击者利用MS14-068可以在5分钟之内重写一个有效的Kerberos
TGT身份验证,并且使他成为域管理员以及目录林管理员。如上图所示,就像采取了有效的登机密码,在登记前,在登机牌上写上”我是飞行员”,然后你就会被安排到驾驶仓,并且还会给你提供咖啡。就好比这种攻击,系统会将普通用户当成了域管理员,然后给予域管理员的权限。
补丁发布两周后,MS14-068漏洞利用的exp第一次公开发布。exp是由Sylvain
Monné编写,被叫做PyKEK.PyKEK是一个可以运行在任何具有Python环境平台上的一个python脚本,当然,这个平台需要能够和未打补丁的域控进行通信。他通过捕获一个ccache文件,然后利用Mimikatz将作为管理员的TGT注入到内存,然后你就可以以域管理员权限进行各种操作。

1491990902587509.jpg

解决方法:使用补丁,或者域控使用windows2012/2012R2

MS14-068利用过程:

普通用户发送一个不包含PAC(Privilege Attribute Certificate 特权属性证书)的kerberos TGT 认证请求,然后域控会回复TGT。
生成伪造的PAC,没有密钥,所以生成的PAC是将域用户的密码数据使用MD5算法加密而不是使用HMAC_MD5“签名”。
将没有PAC的TGT以及作为TGS服务认证请求数据的一部分的伪造PAC发送给域控。
域控被发送过来的数据混淆,所以它将用户发送过来的无PAC的TGT丢弃,同时创建一个新的TGT,将我们的伪造的PAC插入到当中,然后将这个新的TGT发送给用户。
通过伪造的新的TGT将用户设置成域管理员。

Mimikatz的作者Benjamin
Delpy通过改进PyKEK写了一个新的MS14-068的exp,叫做kekeo。这个exp可以发现并且定位存在漏洞的域控,不管在域中是否有补丁,以及是否使用windows2012/2012R2。攻击使用的Exp是和PyKEK相同的,不过他在最后加了一个新的步骤,可以产生一个对任何内网的域控都可以进行访问的TGT。这样就可以在域的任何一处地方执行exp,得到域管权限。

1491990929306023.png

解决方案:

1. 确保DCPromo进程在运行DCPromo之前包括一个补丁查询步骤,以检查KB3011780的安装。可以使用PowerShell命令:get-hotfix 3011780进行快速检查。

2. 此外,实施一个自动化过程,确保在系统在不符合规定的情况下运行时,自动应用关键补丁。即设置自动更新补丁

3.kerberos TGS服务凭证离线爆破(kerberoast)

Kerberoast能够使普通用户在不向目标系统发送任何数据包的情况下从活动目录提取服务账户信息。因为大多数人都会使用比较弱的密码,所以这种攻击是一个很好的攻击方法。之所以很容易攻击成功是因为大多数的服务的密码长度都会和域中设置的最小长度相同,这就意味着爆破也不会花费太长的时间,不会导致超过这个密码的到期时间。大多数的服务不会为密码设置到期时间,所以相同的密码可能会几个月或者几年都会生效。此外,大多数的服务权限都赋予的很高,并且一般都是域管理员权限,具有完整的对活动目录操作的权限.(尽管服务帐户只需要能够修改某些对象类型上的属性或持有特定服务器上的管理员权限)
注意:当目标服务是windows的系统管理服务时,这种攻击不会成功,因为他们会在活动目录中产生128个字符的密钥,这暴力破解起来很困难,并且基本不可能实现。

这种攻击方法是为目标账户的服务主体名称一个Kerberos服务凭证(TGS)。这个请求使用一个有效的域用户凭证(TGT)为目标运行的多个服务请求一个或者多个服务凭证。域控一般不会确认这个用户是不是已经连接到这些资源(甚至不确认它是否有权限访问)。域控会在活动目录中查找SPN,并且使用与SPN相关联的账户对凭证进行加密,以便于服务验证用户的访问权限。请求Kerberos服务凭证加密方式为:RC4_HMAC_MD5,这意味着服务账户的NTLM密码用于了加密服务凭证。这也就意味着Kerberoast可以尝试通过尝试不同的NTLM散列来解密Kerberos凭证,并且当凭证成功解密时,会发现正确的服务帐户密码。
注意:这里没有对权限进行提升,以及没有与目标进行任何通信。

Kerberoast-03.jpg

Tim Medin在DerbyCon 2014上发表了他的“攻击微软Kerberosd的想法”演示文稿(幻灯片视频),以及发布了Kerberoast Python TGS破解者
解决方法:
最有效的防御这种攻击的方法就是将确保服务账户的密码超过25个字符。

使用托管服务帐户和组托管服务帐户是确保服务帐户密码长,复杂以及定期更改的好方法。使用提供密码保管的第三方产品也是管理服务帐户密码的坚实解决方案。

关于这种攻击的详细介绍您可以在这篇文章中可以了解:https://adsecurity.org/?p=2293

4.悄无声息盗窃密码

因为这种方法实在是难以描述,所以我把它叫做了”悄无声息盗窃密码”。将它看成是一次舞蹈演出。先拿下一台简单的服务器,提权,并且将凭证导出。然后通过凭证进入到其他主机中,再进行提权,在进行凭证导出。

由于大多数的活动目录的管理员使用账户登录到他们的主机上面,然后使用RunAs(将其管理员凭据放在本地使用的命令)或者RDP命令连接到远程服务端,所以,这种攻击方法得到域管理员的凭证通常很迅速。

步骤一:拿下一台主机,并且进行提权,得到本地管理员权限,然后运行Mimikatz或者类似导出本地用户信息的工具,得到最近登录的信息以及账户密码。

步骤二:使用步骤一收集的管理员信息,并且尝试这去登陆其他具有管理员权限的机器。一般是会成功的,因为本地的管理员账户很难被设置正确(现在你可以使用微软的LAPS进行配置)。如果你知道了一组管理员的帐号密码,就相当于知道了多个甚至全部主机的账户和密码,这就以为着你有了所有主机的管理员权限。连接到其他主机,并且以同样的方法对这些主机进行本地登录信息的导出,直到得到了域管理员的账户信息。并且,使用本地用户进行登录是一个很隐蔽的方法,这样不需要登录到域管上面,也很少有主机发送安全日志到中央日志记录系统当中(SIEM)。

步骤三:利用被盗取的账户信息收集更多的信息。比如运行一些应用的服务器中,往往具有大量用户信息(更有可能含有域管理员信息)。比如:CAS服务器,OWA服务器,MSSQL服务器,RDP服务器。

步骤四:结束攻击,收尾。
使用被窃取的域管理员的账户,攻击者可以毫无阻碍的得到所有域中的用户信息。

如果域管在所有主机中都在控制着一个服务,那么只要拿下一台机器,就相当于拿下了整个域。

通常PowerShell是一种很好的管理方法,因为通过PowerShell连接到远程系统是一种网络登录(没有凭据存储在远程系统的内存中)。这是理想的,而微软正在通过管理员模式将RDP转变。有一种通过PowerShell远程连接到远程系统的方法,并能够通过CredSSP使用凭据。但是这里的问题是CredSSP不安全。

Joe Bialek在PowershellMagazine.com关于这种连接写到:

“使用PowerShell远程连接时管理员面临的常见问题是“双跳”问题。管理员使用PowerShell远程连接连接到服务器A,然后尝试从服务器A连接到服务器B.不幸的是,在第二步时连接失败。
原因是,默认情况下,PowerShell使用“网络登录”远程处理身份验证。网络登录通过向远程服务器证明您拥有用户凭据而不向该服务器发送凭证(参见KerberosNTLM身份验证)。因为远程服务器不拥有凭据,所以当您尝试进行第二跳(从服务器A到服务器B)时,它会失败,因为服务器A没有凭证到服务器B,进行身份验证失败。

为了解决这个问题,PowerShell提供了CredSSP(Credential Security Support
Provider)选项。使用CredSSP时,PowerShell将执行“网络清除文本登录”而不是“网络登录”。网络清除文本登录通过将用户的明文密码发送到远程服务器。使用CredSSP时,服务器A将发送用户的明文密码,因此能够对服务器B进行身份验证。这样”双跳”连接就会成功。
更新:这次实验是在Windows2012上进行的,微软已经在WIN
server2012R2以及win8.1上做出了更改,不会将明文密码存储在内存里面。这就意味着攻击者即使运行Mimikatz也不会得到明文密码,但是攻击者还是可以看到你的NT密码的hash值以及你的Kerberos
TGT,这两者与得到密码相比,都是一样的。都可用于网络身份验证。
此外,即使您的明文凭据未保存在内存中,仍会发送到远程服务器。攻击者可以在本地安全机构子系统服务(LSASS.exe)中注入恶意代码,并在传输过程中拦截您的密码。所以尽管你可能不会再看到你的密码了,你的密码仍然可以被攻击者得到。
所以,请不要使用CredSSP。类似的一个漏洞是在Powershell远程连接中使用的WinRM中的一个配置问题,这个配置叫做:“AllowUnencrypted”。将这个配置选项改为”True”,就会禁用通过这个系统的任何WinRM通信的加密,使用明文传输。当然也包括Powershell远程链接。

5.hash传递攻击到凭证传递攻击

大部分人都应该听过hash传递攻击(pass-the-hash(PtH)),它是通过找到用户密码的hash值来进行攻击的。(通常是NTLM密码hash),使用PtH进行攻击有趣的地方是,他不需要知道明文密码到底是什么,因为在windows的网络通信中,Hash就是用来对用户身份进行验证的。
微软的产品和工具显然不支持传递哈希攻击,所以需要第三方工具,如Mimikatz。一旦发现密码哈希,Hash传递攻击为攻击者提供了很多途径,但还有其他选择。凭证传递攻击(Pass-the-Ticket(PtT))通过收集已经存在的kerberos凭证,并且使用它进行用户验证。
Mimikatz支持收集当前用户的Kerberos凭证,也可以收集经过系统验证的每个用户的Kerberos凭证(如果配置了Kerberos无约束委托,这可能是一个很大的问题)。一旦获得Kerberos凭证,他们可以使用Mimikatz传递,并用于访问资源(当然是在Kerberos票据生存期内)。

超hash传递攻击(OverPass-the-Hash)又名密钥传递攻击。这种攻击涉及使用获取的密码哈希来获取Kerberos凭证。此技术清除当前用户的所有现有Kerberos密钥(哈希值),并将获取的哈希值注入到Kerberos凭证请求的内存中。下一次需要Kerberos凭证进行资源访问时,注入的散列(现在是内存中的Kerberos密钥)用于请求Kerberos凭证。Mimikatz提供执行OverPass-the-Hash的功能。因为有方法对hash传递攻击进行检测,所以这种方法是相对来说比较好的。

注意:如果获取的散列是NTLM,则Kerberos凭证加密方法是RC4。如果散列加密方法为AES,则Kerberos票使用AES进行的加密。

当然还有很多用来窃取凭证的方法,不过这几种是最常用的:

  • hash传递攻击(PtH):抓住哈希并使用它来访问资源。用户更改帐户密码之前有效。

  • 凭证传递攻击(PtT):抓取Kerberos凭证,并且使用它进行访问资源。攻击有效期是在票证有效期之内(一般为7天)。

  • 超hash传递攻击(OPtH):使用密码哈希来获取Kerberos凭证。用户更改帐户密码之前,哈希才有效。

解决方法:

  • 管理员应该有管理活动的单独管理主机。管理员帐户不应该登录到正在执行用户活动(如电子邮件和网页浏览)的主机。这会大大减少了盗号机会。请注意,智能卡不会阻止用户信息泄漏,因为在访问智能卡时仍会用到账户对应的hash值。智能卡仅确保正在对系统进行登录的用户拥有智能卡。一旦用于对系统进行身份验证,智能卡双因素身份验证会就会成为使用帐户的密码的一个因素,也就是用户密码的hash值。此外,一旦帐户配置为智能卡身份验证,系统会为该帐户生成一个新密码(并且从未更改)。

  • 主机和服务器上的所有本地管理员帐户密码应使用像Microsoft LAPS这样的产品,使用较长,复杂和随机的密码。

  • 配置组策略以防止本地管理员帐户通过网络进行身份验证。以下GPO示例可防止本地帐户通过网络登录(包括RDP),并阻止域管理员和目录林管理员登录。 GPO包括以下设置:

    1. 拒绝以下账户从网络访问此计算机:本地帐户,目录林管理员(Enterprise Admins),域管理员
    2. 拒绝以下账户通过远程桌面服务登录:本地帐户,目录林管理员,域管理员
    3。拒绝本地登录:目录林管理员,域管理员

1491991098901364.jpg

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

活动目录的数据库文件(ntds.dit)包含有关活动目录域中所有对象的所有信息。此数据库中的数据将复制到域中的所有域控制器。该文件还包含所有域用户和计算机帐户的密码哈希值。域控制器(DC)上的ntds.dit文件只能由可以登录到DC的用户访问。很明显,保护这个文件至关重要,因为攻击者访问这个文件会导致整个域沦陷。以下是一个不完整的列表,用于非域管理员情况下,获取NTDS.dit数据方法:

备份路径(备份服务器存储,媒体或网络共享))
攻击者使用备份共享中的ntds.dit文件访问域控备份并且安装后门。确保存储域控备份的任何网络位置已经被保护。只有域管理员才能访问它们。

在成为域控之前服务器上查找NTDS.dit文件
IFM与DCPromo是使用的”从媒体安装”的安装方式,因此正在升级的服务器不需要通过网络从其他域控复制域数据。
IFM集是NTDS.dit文件的副本,可以在共享上分享用来配置新的域控,或者可能在尚未被提升为域控的服务器上找到。并且此服务器可能没有被正确的保护。

通过虚拟机的管理权限,克隆虚拟域控,并且离线获得数据
访问虚拟域控存储数据并访问域凭据。你运行VMWare吗? VCenter Admins是完整的管理员,具有全部权限。所以使用VCenter Admin权限可以克隆域控并将数据复制到本地硬盘。

当VM挂起时,也可以从VM内存中提取LSASS数据。不要低估虚拟管理员对虚拟域控制器的影响。如果你的VCenter管理员组是在域控当中,那么你需要尽快改变这一设置。授予相应组的适当权限,不要通过服务器管理员帐户为攻击者提供后门攻击域控的能力。

攻击有权登录到域控的账户
在活动目录中,有几个组是最不应该对域控制器具有默认登录权限的。

Default-DC-LogOnLocallyGroups.png

这些组可以默认登录到域控制器:

Enterprise Admins (目录林管理员组)
Domain Admins(域管理员组)
Administrators(管理员组)
Backup Operators(备份操作成员)
Account Operators(账户管理组)
Print Operators(打印机操作组)

这意味着如果攻击者可能会损害帐户管理组或打印机操作组中的帐户,则活动目录域可能会受到威胁,因为这些组对域控制器具有登录权限。

解决方案:

  • 限制有权登录到域控制器的组/帐户。

  • 限制具有完整活动目录权限的组/帐户,特别是服务帐户。

  • 保护活动目录数据库的每一个副本,并且不要将它放在比域控信任级别低的主机上面。

那么,当一个帐户具有域控制器的登录权限会怎么样?如果是域控,那当然是先把所有的登录凭证全部获取到本地

1.使用Mimikatz获取所有登录信息
Mimikatz可以从域控上面抓取到所有账户信息:

Mimikatz-LSADump-LSA.png

2.使用Mimikatz转储LSASS内存(获取域管理员凭据)
Mimikatz可用于转储LSASS,然后从不同系统上的LSASS.dmp文件中提取登录凭据。在域控制器上,这几乎总是导致域管理员凭据。

1491991298345260.png

3.使用任务管理器转储LSASS内存(获取域管理员凭据)
一旦LSASS被转储,mimikatz就可以对lsass.dmp进行提取。

1491991317172899.jpg

4.用NTDSUtil创建媒体安装集(IFM) (用于抓取NTDS.dit文件)
NTDSUtil一个本地运行的针对活动目录数据库(ntds.dit)的命令,并且允许为DCPromo准备IFM集。IFM是用于DCPromo命令中”从媒体安装”这一过程的,所以,在配置域控时就不需要通过网络从其他域控拷贝数据。IFM集,并且也会在c:/temp目录下生成的一份NTDS.dit附件。

该文件可能会在新域控上进行共享,或者可能在尚未升级成域控的新服务器上找到该文件。这样的服务器可能未正确保护。

NTDSUtil-CreateIFM.png

5.从NTDS.dit文件(和注册表系统配置单元)转储活动目录域凭据。
一旦攻击者拥有NTDS.dit文件的副本(以及某些注册表项用来解密数据库文件),则可以提取活动目录数据库文件中的凭证数据。
一旦攻击者从注册表和NTDS.dit fie获得系统配置单元,他们就拥有所有的管理员凭据!这个截图来自一个安装了Impacket python工具的Kali。使用Impacket中的secretsdump.py python脚本转储DIT。

IMPacket-Dump-Credentials-NTDSdit.png

截至2015年10月,还有一种Windows方法:利用PowerShell方法从DSInternals.com中的NTDS.dit文件(和注册表系统配置单元)中转储凭据,名为Get-ADDBAccount(尽管它仅适用于Windows 8和Windows Server 2012及更高版本)。

一旦攻击者转储了域数据库,就有很多选择来持久化并保留高级权限,包括创建和使用Golden Tickets,从拿下单个域到控制整个目录群。

参考链接:

本文翻译自https://adsecurity.org/?p=2362,如若转载,请注明原文地址: http://www.4hou.com/technology/4256.html

点赞 0
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

xnianq

xnianq

HFUT,信息安全

发私信

发表评论

    高坂穗乃果
    高坂穗乃果 2017-04-24 17:27

    好厉害~