lyethar/Sirocco
GitHub: lyethar/Sirocco
Sirocco 是一款面向 Microsoft Online 的 PowerShell 密码喷洒工具,通过 FireProx 实现 IP 轮换并集成用户精炼与 MFA 扫描,专为授权红队评估而设计。
Stars: 1 | Forks: 0
# Sirocco
**Sirocco** 是一款针对 Microsoft Online(Azure / Entra ID / Office 365)的 PowerShell 密码喷洒工具,它通过 **FireProx** API Gateway endpoint 路由每一次身份验证尝试,从而使每个请求看起来都来自不断轮换的源 IP 地址。
它是专为**已授权的**红队演习和安全评估而构建的。核心的身份验证请求/响应处理机制基于 Beau Bullock (@dafthack) 的 [MSOLSpray](https://github.com/dafthack/MSOLSpray) 实现,该参考实现保留在 `MSOLSpray/MSOLSpray.ps1` 中。
## 功能
- **自动配置 FireProx** — 在启动时创建全新的 API Gateway endpoint(或复用通过 `-Url` 传入的 endpoint)。
- **403 禁止访问恢复与续传** — 如果 API Gateway / WAF 返回 `403 Forbidden`,Sirocco 会配置一个**新**的 FireProx endpoint,并**从刚好失败的那个用户开始续传**。喷洒永远不会从头重新开始。
- **完整的文件日志记录** — 每次尝试都会记录时间戳、用户、密码和结果,随时可交付给客户。
- **用户精炼器** — 会检测并剔除 Azure/Entra 中不存在的账户,以便将来的密码喷洒(以及未来的运行)不会在它们身上浪费尝试机会。这降低了锁定风险和噪音。
- **自动 MFA 扫描** — 当提供 `-MFASweepPath` 时,每一个*成功*的凭证都会立即通过 [MFASweep](https://github.com/dafthack/MFASweep) 进行扫描,以识别哪些 Microsoft 服务允许单因素(无 MFA)访问。扫描以非交互方式运行,其结果会按凭证进行记录。
- **感知锁定的结果解析** — 通过 AADSTS 错误代码区分有效凭证、MFA、条件访问、密码过期、已锁定、已禁用、无效用户和无效租户。
- **简洁的进度显示** — 喷洒进度显示在单行原地更新的进度条(`Write-Progress`)上,而不是在控制台中不断滚动。
## 环境要求
- **PowerShell** 5.1+ (Windows) 或 PowerShell 7+。
- 已安装且可访问的 **FireProx** (https://github.com/ustayready/fireprox)。使用 `-FireProxPath` 将 Sirocco 指向你的 `fire.py`(必填)。默认情况下,它通过 **WSL** 启动;如果你是在原生环境下运行,请使用 `-Launcher` 更改启动方式。
- 具有创建/管理 API Gateway endpoint 权限的 **AWS 凭证**(供 FireProx 使用)。
- *(可选)* **MFASweep** (https://github.com/dafthack/MFASweep) — 通过 `-MFASweepPath` 提供 `MFASweep.ps1` 的路径,以启用针对每次成功的 MFA 扫描。
## 生成的文件(默认位于 `.\logs\`)
| 文件 | 内容 |
|------|----------|
| `spray_attempts_.csv` | 每次尝试占一行:`Timestamp, Username, Password, Result, Detail, Endpoint` — 交付给客户的成果。 |
| `valid_creds_.txt` | 仅包含成功的登录(包含 MFA / 条件访问 / 密码过期备注)。 |
| `spray_run_.log` | 带有时间戳的运行记录。 |
| `fireprox_endpoints_.txt` | 创建的每个 FireProx endpoint(`time, api_id, url`)— 用于清理。 |
| `mfa_results_.csv` | MFA 扫描结果:`Timestamp, Username, Password, Service, SingleFactorAccess`(每个成功的凭证对应每个服务占一行)。 |
| `mfa_raw_.log` | 每个凭证捕获的完整原始 MFASweep 控制台输出。 |
| `refinery_removed_.txt` | 被精炼器剔除的用户及其原因。 |
| `userlist_backup_.txt` | 原始用户列表的一次性备份(精炼器会原位重写该列表)。 |
## 用法
### 基础用法 — 自动创建 endpoint
```
.\Sirocco.ps1 `
-UserListPath .\users.txt `
-PasswordListPath .\passwords.txt `
-FireProxPath /path/to/fireprox/fire.py `
-AwsProfile myprofile `
-AccessKey "AKIA..." `
-SecretAccessKey "xxxxx" `
-Region us-east-1
```
### 复用现有的 FireProx URL
```
.\Sirocco.ps1 -UserListPath .\users.txt -PasswordListPath .\passwords.txt `
-FireProxPath /path/to/fireprox/fire.py `
-Url https://abc123.execute-api.us-east-1.amazonaws.com/fireprox `
-AccessKey "AKIA..." -SecretAccessKey "xxxxx" -Region us-east-1
```
### 单一密码,短延迟,不对列表进行精炼
```
.\Sirocco.ps1 -UserListPath .\users.txt -PasswordListPath .\one_password.txt `
-FireProxPath /path/to/fireprox/fire.py `
-AwsProfile myprofile -AccessKey "AKIA..." -SecretAccessKey "xxxxx" `
-SleepSeconds 0 -NoRefine
```
### 对每个有效凭证进行 MFA 扫描
```
.\Sirocco.ps1 -UserListPath .\users.txt -PasswordListPath .\passwords.txt `
-FireProxPath /path/to/fireprox/fire.py `
-AwsProfile myprofile -AccessKey "AKIA..." -SecretAccessKey "xxxxx" `
-MFASweepPath /path/to/MFASweep/MFASweep.ps1 -IncludeADFS
```
## 参数
| 参数 | 默认值 | 描述 |
|-----------|---------|-------------|
| `-UserListPath` *(必填)* | — | 用户名文件,每行一个(`user@domain.com`)。 |
| `-PasswordListPath` *(必填)* | — | 密码文件,每行一个(一次喷洒一个)。 |
| `-Url` | *(自动)* | 现有的 FireProx 基础 URL。如果省略,则会自动创建一个。 |
| `-AwsProfile` | `""` | 用于 FireProx 的 AWS 命名配置。 |
| `-AccessKey` / `-SecretAccessKey` | `""` | AWS 密钥(创建/轮换 endpoint 时必填)。 |
| `-Region` | `us-east-1` | 用于 FireProx 的 AWS 区域。 |
| `-FireProxPath` *(必填)* | — | `fire.py` 的路径(由启动器识别)。 |
| `-TargetUrl` | `https://login.microsoft.com/` | FireProx 代理到的上游 URL。 |
| `-Launcher` | `wsl` | `fire.py` 的启动方式(`wsl`, `python3`, ...)。 |
| `-SleepSeconds` | `7200` (2小时) | 两次密码尝试之间的暂停时间(喷洒限速)。 |
| `-MaxRotations` | `10` | 在中止前,每轮密码可创建的新 endpoint 最大数量。 |
| `-LogDirectory` | `.\logs` | 写入日志的位置。 |
| `-NoRefine` | *(关闭)* | 禁用用户列表精炼。 |
| `-RefineTenants` | *(关闭)* | 同时剔除**租户**不存在的用户。 |
| `-MFASweepPath` | `""` | `MFASweep.ps1` 的路径。设置后,在每次成功的喷洒后运行 MFA 扫描。 |
| `-IncludeADFS` | *(关闭)* | 在 MFA 扫描中包含本地 ADFS 登录尝试。 |
## 用户精炼器的工作原理
当喷洒响应表明用户在 Azure/Entra 中不存在时(`AADSTS50034` → *无效用户*;如果使用了 `-RefineTenants`,还包括 `AADSTS50128` / `AADSTS50059` → *租户不存在*),Sirocco 会:
1. 将该用户添加到内存中的“不存在”集合中。
2. 将移除记录写入 `refinery_removed_.txt`。
3. **原位重写用户列表文件**(在事先进行一次备份后),移除这些不存在的用户。
因此:
- **在当前运行中**,随后的每轮密码喷洒只会针对仍然存在的用户 — 不存在的账户会被立即跳过。
- **未来的运行**如果使用相同的列表文件,会从已经精炼过的用户集开始,因此随着每次演练,列表会变得越来越干净。
你的原始列表永远不会丢失 — 在第一次重写之前,它会被复制到 `logs\userlist_backup_.txt`。使用 `-NoRefine` 可保持列表原样不动。
## MFA 扫描的工作原理
当 `-MFASweepPath` 指向 `MFASweep.ps1` 的副本时,Sirocco 会对它进行 dot-source 以加载其针对特定服务的身份验证函数,然后**以非交互方式驱动它们** — MFASweep 自身的确认/侦察提示会被绕过,因此不会有任何东西阻碍喷洒进程。
对于在喷洒过程中被确认为有效的每个凭证,Sirocco 会针对标准的 Microsoft endpoint 运行扫描(包括 Graph API、Azure Service Management,以及在 Windows/Linux/macOS/Android/iPhone/Windows-Phone 用户代理下的 M365 Web 门户、Exchange Web Services 和 ActiveSync 基本认证;如果使用 `-IncludeADFS` 则还包括 ADFS)。然后,它会按服务记录是否可以进行**单因素访问**:
- `mfa_results_.csv` — 每个凭证的每个服务占一行(`Timestamp, Username, Password, Service, SingleFactorAccess`)。
- `mfa_raw_.log` — 完整的原始 MFASweep 输出,被捕获保存以免控制台充斥噪音。
- 运行日志会获得一行摘要,例如:`MFA sweep user@corp.com : SINGLE-FACTOR access on -> M365 w/ Android UA, Active Sync (BASIC)`。
## 清理 FireProx endpoint
Sirocco 创建的每个 endpoint 都会记录在 `logs\fireprox_endpoints_.txt` 中。完成后请将其删除:
```
python3 fire.py --access_key "AKIA..." --secret_access_key "xxxxx" \
--region us-east-1 --command delete --api_id
```
(使用 `--command list` 列出所有 endpoint。)
## 操作说明与安全提示
- **仅限授权测试。** 仅在你拥有书面评估许可的环境中合法使用 Sirocco。
- **锁定风险。** Microsoft Entra Smart Lockout 可能会在连续失败时触发。请在密码尝试之间保持较高的 `-SleepSeconds`,并留意运行日志中是否出现 `LOCKED` 结果。
- **凭证暴露。** 在命令行中传递 AWS 密钥会导致它们在进程列表中可见。尽可能优先使用 `-AwsProfile` 并将凭证存储在 `~/.aws/credentials` 中,或者使用环境变量。
## 致谢
- 喷洒技术与 AADSTS 处理:[MSOLSpray](https://github.com/dafthack/MSOLSpray) — Beau Bullock (@dafthack),BSD-3-Clause。
- MFA 扫描逻辑:[MFASweep](https://github.com/dafthack/MFASweep) — Beau Bullock (@dafthack),MIT。
- IP 轮换:[FireProx](https://github.com/ustayready/fireprox) — Mike Felch (@ustayready)。
标签:AI合规, IPv6, Libemu, Microsoft 365, PowerShell, 密码喷洒