域权限维持与后渗透密码收集

详细介绍在获得域内最高权限后如何对该高权限进行维持,以及如何利用该高权限获得该用户的凭据

域权限维持

票据传递(PTT)

黄金票据传递攻击

原理

在kerberos认证的AS-REP阶段,经过预认证后,KDC的认证服务返回的TGT中加密部分authorization-data是使用krbtgt密钥加密的,而authorization-data中存放着代表用户身份PAC,并且在这个阶段PAC的PAC_SERVER_CHECKSUM签名和PAC_PRIVSVR_CHECKSUM签名的密钥都是krbtgt密钥。

因此,只要我们能获取krbtgt密钥,就能够伪造高权限的PAC,然后将其封装在TGT中。客户端再利用这个TGT以高权限请求任意服务的服务票据。这个生成TGT的过程是离线的,不需要连接KDC。

需要的信息:

krbtgt账户密钥
域的sid值
域名
要伪造的域用户,一般填写高权限用户,如域管理员

工具

  • Impacket

    使用impacket下的ticketer.py脚本离线生成黄金票据,然后将票据导入,即可使用secretsdump.py、smbexec.py等脚本进行后利用:

    1. 生成黄金票据

2. 导入票据

3. 后利用,如:

  • mimikatz

    使用mimikatz进行利用,可以是域中的普通机器,也可以是域外主机。当利用机器不在域中时,需要将DNS服务器设置成域控。

    1. 生成黄金票据并导入当前内存中

2. 验证是否成功,导出krbtgt的hash

  • CobaltStrike

    控制的机器可以是域中的机器,也可以不是域中的机器。当控制的机器不在域中时,需要将机器的DNS服务器设置为域控,设置DNS服务器的命令如下:

白银票据传递攻击

原理

在kerberos认证过程的TGS-REP阶段,在验证了客户端发来的TGT的真实性和会话安全性后,KDC的"TGS票据授予服务"将返回指定服务的ST, ST中加密部分authorization-data是使用服务密钥加密的,而authorization-data中存放着代表用户身份的PAC,并且在这个阶段的PAC的PAC_SERVER_CHECKSUM签名的密钥也是服务密钥(PAC_PRIVSVR_CHECKSUM是由krbtgt服务密钥加密的)但由于PAC_PRIVSVR_CHECKSUM签名的验证是可选的,并且默认不开启,因此即使攻击者无法伪造PAC_PRIVSVR_CHECKSUM签名,也能利用该ST以高权限进行正常请求。

只要攻击者拥有指定服务的密钥,就能够伪造高权限的PAC,并将其封装在ST中,并对指定的PAC_SERVER_CHECKSUM签名和加密。客户端再利用这个ST以高权限访问指定服务。这个攻击过程被称为白银票据传递攻击。

要创建白银票据,我们需要知道以下信息:

在域环境中,服务哈希(Service Hash)可以是以下类型账户的哈希: 1.机器账户(Machine Account)的哈希:机器账户是表示加入域的计算机或服务器的账户。CIFS服务通常会使用机器账户的哈希作为服务哈希。 2.用户账户(User Account)的哈希:某些服务可能使用用户账户的哈希作为服务哈希。这些服务可能需要特定的用户权限或特权级别来访问资源或执行特定任务。 3.服务账户(Service Account)的哈希:服务账户是为特定服务或应用程序而创建的账户。这些账户通常与特定的服务或应用程序关联,并具有相应的权限和访问权限。 4.虚拟账户(Virtual Account)的哈希:虚拟账户是在Windows Server 2008及更高版本中引入的一种账户类型,用于代表服务和应用程序。某些服务可能会使用虚拟账户的哈希作为服务哈希。

工具

这里以域控机器的服务作为攻击目标,那么可以是LDAP、CIFS、WinRm等,这里的密钥就是域控机器的hash

  • impacket

    在使用前,需要将目标机器的IP添加到Hosts文件中

    1. 生成白银票据

  • mimikatz

    生成白银票据并导入内存中

  • cobalt strike

    控制的机器可以是域中的机器,也可以不是域中的机器。当控制的机器不在域中时,需要将机器的DNS服务器设置为域控,设置DNS服务器的命令如下:

黄金票据和白银票据的联系与区别

  1. 联系

    两者都是基于kerberos认证的攻击方式

    两者都是属于票据传递攻击

    两者常被用来做后渗透权限维持

  2. 区别

    1. 访问权限不同

      黄金票据:通过伪造高权限的TGT,可以以高权限访问任何服务

      白银票据:通过伪造高权限的ST,可以以高权限访问指定服务

    2. 加密密钥不同

      黄金票据:由于TGT是通过krbtgt密钥加密的,因此黄金票据利用需要知道krbtgt的密钥

      白银票据:由于ST是通过服务密钥加密的,因此白银票据利用需要知道指定服务的密钥

    3. 日志不同

      黄金票据:因为只伪造了TGT,所以还需要与KDC进行TGS通信以获得ST,会在KDC上留下日志

      白银票据:可以不与KDC通讯,直接访问指定服务,因此不会再KDC上留下日志,只会在目标服务器上留下日志

委派

利用委派来进行域权限维持。

假设被委派的服务B为krbtgt,而服务A是我们控制的一个服务账户或机器账户。配置服务A到服务B 的约束性委派或者基于资源的约束性委派,那么我们控制的账户就可以获取KDC服务的ST(也就是TGT)。获取KDC服务的ST后,就可以伪造任何权限的用户的TGT,实现一个变种的黄金票据。

选择控制的用户

我们可以控制的服务A可以有以下几种分类:

  1. 已经存在的有SPN的域用户

  2. 新建机器账户,但是要注意机器账户密码的自动更新问题

  3. 新建域用户,然后赋予SPN

在实战中,建议使用第一种已经存在的有SPN的域用户,实现隐蔽性。

  • 已经存在的有SPN的域用户

    使用以下命令查找域内具有SPN且密码永不过期的用户账户

  • 新建机器账户

    使用powermad.ps1脚本执行以下命令新建一个机器账户machine_account,密码为root

  • 新建域用户,然后赋予SPN

    执行以下命令新建一个域用户hack_test,然后赋予SPN权限

委派利用

演示新建域用户并配置SPN成为服务账户并进行权限维持

  1. 新建域用户并配置SPN

2. 配置krbtgt基于资源的约束性委派

  1. 使用impacket进行攻击

DCShadow

该攻击技术,具有域管理员权限或企业管理员权限的恶意攻击者可以创建恶意域控,然后利用域控间正常同步数据的功能将恶意域控上的恶意对象同步到正在运行的正常域控上

漏洞攻击流程如下:

  1. 通过DCShadow更改配置架构和注册SPN,从而实现在目标活动目录内注册一个伪造的域控,并且使得伪造的恶意域控能被其他正常域控认可,能够参与域复制

  2. 在伪造的域控上更改活动目录数据

  3. 强制触发域复制,使得指定的新对象或修改后的属性能够同步进入其他正常域控中

复现

  • 在域内主机上:

    1. 以本地管理员权限打开一个cmd窗口,运行mimikatz执行如下命令

Skeleton Key(万能密码)

攻击者可以在获得域管理员权限或企业管理员权限的情况下,可以在目标域控的lsass内存中注入特定的密码,然后可以使用设置的密码来以任何用户的身份登录,包括域管理员和企业管理员,而用户还可以使用之前正常的密码进行登录。

在域控上使用mimikatz执行如下命令注入skeleton key

注入成功后,会在域控的lsass内存中给所有账户添加万能密码mimikatz,此后就可以使用mimikatz以任何用户身份RDP或进行远程ipc$连接了

  1. ipc$连接

2. RDP登录

SID History

SID History是为了域迁移场景设置的一个属性,他使得账户原本的访问权限能够有效的克隆到另一个账户,对于确保用户从一个域迁移到另一个域时保留访问权限非常有效。

如果将A域中的用户迁移到B域中,那么在B域中的用户的SID会随之改变,进而影响迁移后的用户权限,导致迁移后的用户不能访问原来可以访问的资源。加入了SID History机制后,迁移后的用户SID改变了,系统会将原来的SID添加到迁移后的SID History属性中。用户在访问资源时,SID和SID History都会被添加到用户的访问令牌中,使得迁移后的用户既能拥有现有的权限,又能保持原有权限,能够访问其原来可以访问的资源。

SID History本意是为了域迁移场景而设计的一个属性,但是也给了攻击者可趁之机。攻击者可以利用SID History属性进行隐蔽的域权限维持。

  • 执行以下命令,使用mimikatz将域管理员administrator的SID添加到域普通用户test的SID History属性中

  • 例如,使用用户test创建用户并加入到domain admins组中

重置DSRM密码

目录还原模式(DSRM)是Windows域环境中域控的安全模式启动选项。每个域控都有一个本地管理员administrator账户(也就是DSRM账户)。DSRM的用途是允许管理员在域环境出现故障或奔溃时还原、重建活动目录数据库,使域环境的运行恢复正常。也就是说DSRM账户就是本地administrator账户,默认情况下,DSRM账户是无法用于RDP或者远程连接域控的。

DSRM密码几乎很少会被修改。因此,攻击者在获得域控权限后,可以通过修改DSRM密码并修改DSRM登录方式来进行权限维持。

DSRM攻击

当获得域控权限后,可以通过修改DSRM密码或将DSRM密码修改为指定域用户密码两种手段来达到域权限维持的目的。

修改DSRM密码

  1. 在域控上执行:

2. 修改DSRM的登录方式

0:默认值,只有当域控重启并进入DSRM模式时,才可以使用DSRM管理员账户 1:只有当本地活动目录域服务停止时,才可以使用DSRM管理员账户的登录域控 2:在任何情况下,都可以使用DSRM管理员账户登录域控

为DSRM同步“指定域用户”的密码

设置DSRM密码与指定账户同步功能需要windows server2008以后的系统

当控制了域内一个用户liukaifeng01,密码为Qazx123。现在需要为DSRM设置与liukaifeng01相同的密码。

然后按两次q退出

AdminSDHolder滥用

活动目录域服务使用AdminSDHolder、Protected Groups(受保护组)和Security Descriptor Propagator来保护特权用户和特权组被恶意的修改或利用。这个功能在Windows 2000服务器活动目录的第一个版本中引入,目的是保护特定的对象不会被恶意的修改,但同时攻击者也可以利用其进行隐蔽的域权限维持。

Protected Group(受保护组)

自 Windows 2000 服务器中首次方法活动目录以来,Protected Groups(受保护组)的概念就一直存在。 Protected Groups指活动目录内置的一些特权对象。

Protected Groups的列表由Windows 2000 Server中的4个安全组(Administrators、Domain Admins、Enterprise Admins、Schema Admins)组成。在 Windows 2000 Server SP4 和 Windows Server 2003中还添加了其他几个组,包括管理员和Krbtgt账户。在带有SP1及更高版本的Windows Server 2008、Windows Server 2008 R2、Windows Server 2012 R2、Windows Server 2016 R2的版本中,微软扩展了这个列表,增加了 Read-only Domain Controllers组。在Windows Server 2019 R2 的版本中,微软再次扩展了这个列表,增加了 Key Admins和Enterprise Key Admins 组。

Protected Groups的对象会将admin-inCount值设为1,因此可以用该值来过滤活动目录Protected Groups的对象列表。使用Adfind执行如下的命令查询 Protected Groups对象的列表

也可以使用PowerSplit中的PowerView.ps1脚本执行如下的命令枚举AdminCount值为1的对象

AdminSDHolder

每个活动目录域都有一个名为AdminSDHolder的容器对象,它的存储路径为:CN=AdminSDHolder,CN=System,DC=hack,DC=com

AdminSDHolder对象具有唯一的ACL,用于控制Protected Groups 的安全主体的权限,以避免这些特权对象被恶意修改或滥用。可以理解为AdminSDHolder的ACL配置是一个安全的配置模板。AdminSDHolder对象默认情况下禁用继承,确保不继承父级权限。默认情况下,只有Administrators、Domain Admins 和 Enterprise Admins 组拥有对AdminSDHoler对象属性的修改权限。

Security Descriptor Propagater

默认情况下,每隔一小时在持有模拟器操作主角色的域控上运行一个SDProp(Security Descriptor Propagation)后台进程。SDProp进程并不知道哪些对象是在Protected Groups中,它只能根据目标对象的AdminCount属性是否为1来判断目标对象是否受保护的,然后将这些对象的ACL与AdminSDHolder对象的ACL进行比较。如果是受保护对象的ACL配置与AdminSDHolder容器的ACL配置不一致,SDProp进程将重写该收保护对象的ACL,使其恢复与AdminSDHolder容器相同的ACL配置。

利用AdminSDHolder实现权限维持

  1. 修改AdminSDHolder对象的ACL配置,使得普通域用户sdholder对其拥有完全控制的权限

    可以使用Empire下的powerview.ps1脚本执行如下的命令进行修改

2. 等待SDProp进程运行,或者也可以使用Invoke-ADSDPropagation.ps1脚本手动触发SDProp进程运行

3. SDProp进程运行完成后,使用Adfind执行如下的命令查询用户sdholder是否对Domain Admins组、Enterprise Admins 组和域管理员administrator 等受保护对象的具有完全控制权限

ACL滥用

伪造域控

漏洞原理

新建一个机器账户,然后修改机器账户的UserAccountControl属性为8192。活动目录就会认为这个机器账户是域控,就可以使用这个机器账户进行DCSync的操作了。修改机器账户的UserAccountControl属性需要高权限,因此其可以用来进行域权限维持。

其与DCShadow不同的是,DCShadow是通过域复制向域内添加恶意对象。而伪造域控则是通过DCSync导出域内任意用户的hash

伪造域控攻击

  1. 使用addcomputer.py脚本执行如下命令

    创建一个普通机器账户computer$,密码为root

2. 修改该机器账户的UserAccountControl属性

3. 通过DCSync导出域内任意用户的hash

后渗透密码收集

Hook PasswordChangeNotify

在域控上安装密码过滤DLL,当用户修改密码并在系统中进行同步时,攻击者可以利用该功能获取用户修改密码时输入的明文密码并保存在本地,同时用户可以正常更改密码。

因为没有编译成功dll,所以没法做复现。。。。。

将Hookpasswordchange.dll反射注入lsass.exe内存中

只要用户修改了密码,在C:\Windows\Temp\password.txt中就可以看到修改后的密码

注入SSP

SSP(Security Support Provider)是Windows操作系统安全机制的提供者。简单地说,SSP是个DLL文件,主要用来实现Windows操作系统的身份认证功能。当攻击者获取了机器的最高权限,可以编写一个SSP,将其注册到操作系统中。当用户登录时,就可以捕捉到用户输入的明文密码,也不影响用户的正常登录。

mimikatz注入伪造的SSP

mimiaktz支持两种方法在目标机器注入恶意的SSP

  1. 内存注入SSP

    好处是不会在目标机器留下二进制文件,弊端就是机器重启后该SSP失效

2. 注册表添加SSP

最后更新于

这有帮助吗?