apimspray 是一款专为授权安全研究和红队行动设计的 Entra ID 密码喷洒工具包。它利用 Azure API Management (APIM) 网关作为分布式、轮换的代理层,实现 IP 轮换。
阅读博客文章以了解该项目的更多详细信息。
az):旋转脚本需要用于部署资源。(请在已通过 az cli 进行身份验证的 CLI 会话中执行脚本,或使用 Azure Cloud Shell)pip install -r requirements.txt
az login
直接在已身份验证的 Azure 环境中运行 apimspray。
git clone https://github.com/crtvrffnrt/apimspray.git
cd apimspray
python3 apimspray.py --help
将多个 APIM 网关部署到不同区域。
python3 apimspraycreate.py --count 5 --outfile urls.txt
将 33 个 APIM 实例部署到 germanywestcentral 和 westeurope,并保存到 urls.txt。
python3 apimspraycreate.py --location germanywestcentral,westeurope --count 33 --outfile urls.txt
apimspraycreate CLI 参考:
usage: apimspraycreate.py [-h] --outfile OUTFILE [--count COUNT] [--location LOCATION] [--prefix PREFIX] [--realm-prefix REALM_PREFIX] [--delete-old]
apimspraycreate - Azure APIM 部署器
options:
-h, --help 显示此帮助信息并退出
--outfile OUTFILE 用于 URL 的输出文件
--count COUNT 实例数量
--location LOCATION 逗号分隔的 APIM 部署区域。提供此参数时,仅使用这些区域,且第一个区域用于资源组。
--prefix PREFIX API URL 前缀
--realm-prefix REALM_PREFIX
Realm API 前缀
--delete-old 删除旧资源组
重要提示: 对于所有方法,后台必须有一个活跃的 az 会话(az login)。
确保准备好目标列表:
users.txt:用户主体名称列表(例如 [email protected])。passwords.txt:要喷洒的密码列表。如果没有用户列表,可以使用辅助脚本 generate_upns.py。该工具:
users.txt。用法:
# 为特定域或租户 ID 生成 users.txt
python3 generate_upns.py --target example.com
# 或者使用 Tenantid
python3 generate_upns.py --target 00000000-0000-0000-0000-000000000000
generate_upns CLI 参考:
usage: generate_upns.py [-h] --target TARGET
从连接的 Azure 租户和服务帐户生成 UPN。
options:
-h, --help 显示此帮助信息并退出
--target TARGET 目标域(例如 example.com)或租户 UUID
usage: apimspray.py [-h] [--urls URLS] [--users USERS] [--passwords PASSWORDS] [--output OUTPUT] [--tenant TENANT] [--domain DOMAIN] --mode {spray,validate} [--pace {stealth,low,mid,medium,high}]
[--continue-on-success]
apimspray - Entra ID 评估工具
options:
-h, --help 显示此帮助信息并退出
--urls URLS APIM URL 文件路径(来自 apimspraycreate.py 或 apimsprayrotator.sh)
--users USERS 用户文件路径
--passwords PASSWORDS 密码文件路径
--output OUTPUT 输出目录
--tenant TENANT 租户 ID 或域
--domain DOMAIN 如果用户缺少域,则附加域
--mode {spray,validate}
操作模式。'spray' 用所有密码测试所有用户(1:N)。'validate' 进行 1:1 凭据对测试。
--pace {stealth,low,mid,medium,high}
请求和锁定管理的节奏配置:
- high: 15 个工作线程,0.1s 延迟,每个区块 10 次密码尝试,5m 锁定等待,20 个安全阈值
- medium: 5 个工作线程,1.0s 延迟,每个区块 5 次密码尝试,10m 锁定等待,10 个安全阈值,10% 抖动
- low: 2 个工作线程,5.0s 延迟,每个区块 2 次密码尝试,15m 锁定等待,5 个安全阈值,20% 抖动
- stealth: 1 个工作线程,30.0s 延迟,每个区块 1 次密码尝试,20m 锁定等待,1 个安全阈值,40% 抖动
--continue-on-success 即使发现有效凭据,也继续评估。
validate:检查 user:password 对列表。要求两个列表长度相等。
python3 apimspray.py --urls urls.txt --mode validate --users u.txt --passwords p.txt
spray:尝试一个密码针对所有用户,然后等待(如果配置了),再尝试下一个密码。
python3 apimspray.py --urls urls.txt --mode spray --users users.txt --passwords common_passwords.txt --pace medium
--pace 参数控制喷洒的激进程度。这些值是硬编码的,以确保稳定性和安全性。
AADSTS50053),工具将立即中止。结果保存在 results/<timestamp>/ 目录中:
valid_*.txt:成功认证(需要 MFA 或收到令牌)。blocked_*.txt:锁定或条件阻止的帐户。failed_*.txt:无效凭据或用户未找到。| Profile | 工作线程数 | 延迟 | 每个区块密码数 | 锁定等待时间 | 安全阈值 | 抖动 |
|---|
high | 15 | 0.1s | 10 | 5m | 20 个锁定 | 0% |
medium | 5 | 1.0s | 5 | 10m | 10 个锁定 | 10% |
low | 2 | 5.0s | 2 | 15m | 5 个锁定 | 20% |
stealth | 1 | 30.0s | 1 | 20m | 1 个锁定 | 40% |