rbnroot/CAPSlock
GitHub: rbnroot/CAPSlock
CAPSlock 是一款基于 roadrecon 数据库的离线 Entra ID 条件访问策略分析工具,帮助安全团队通过场景模拟和排列发现策略执行中的漏洞与绕过风险。
Stars: 93 | Forks: 3
# CAPSlock
**CAPSlock** 是一款基于 `roadrecon` 数据库构建的离线条件访问分析工具。
它旨在帮助防御者、审计人员和红队了解**条件访问策略的实际行动表现**,而不仅仅是它们的配置方式。
与其回答*“存在哪些策略?”*,CAPSlock 更专注于:
- 实际上谁受到了保护
- 在怎样的登录条件下
- 哪里存在执行漏洞或绕过场景
CAPSlock 是只读的,在生产租户上运行是安全的。
## 要求与安装
### 要求
1. Python 3.8+
2. [ROADtools](https://github.com/dirkjanm/ROADtools)
### 选项 1
1. 通过 pipx 安装
```
pipx install git+https://github.com/rbnroot/CAPSlock.git
```
```
capslock --help
capslock-web --help
```
```
pipx upgrade capslock
```
### 选项 2
1. 克隆代码仓库并创建虚拟环境:
```
git clone https://github.com/rbnroot/CAPSlock.git
cd CAPSlock
python3 -m venv venv
source venv/bin/activate
```
2. 安装:
```
pip install -e .
```
`capslock` 和 `capslock-web` 将在虚拟环境中可用。
### 选项 3
1. 创建虚拟环境:
```
python3 -m venv
source /bin/activate
```
2. 安装依赖项:
```
pip install -r requirements.txt
```
3.(可选)安装 Web GUI 依赖项:
```
pip install -r web-gui/requirements.txt
```
## get-policies
### 功能说明
`get-policies` 根据存储在离线 Entra / 条件访问数据中的策略作用域和条件,列出**针对特定用户的所有条件访问策略**。
该命令回答的不是*“租户中存在哪些策略?”*,而是:
每条策略都会根据用户的直接包含情况、组成员身份以及基于角色的目标进行评估。输出结果会清楚地显示某项策略是否:
- 已应用
- 已排除
- 或完全没有针对该用户
对于每项策略,CAPSlock 都会解释其推理过程,并以人类可读的格式总结相关条件。
### 语法
```
python3 CAPSlock.py get-policies -u [options]
```
### 附加参数
- `--app `
可选。将结果筛选为其应用程序条件中包含该应用的策略。
- `--results `
可选。策略输出模式
默认:applied
- `--assume-group [ ...]`
可选。模拟用户作为这些组的成员(适用于测试 PIM 或动态组场景)。接受组 ID 或显示名称。
- `--assume-role [ ...]`
可选。模拟用户拥有这些角色(适用于测试 PIM 角色激活场景)。接受角色对象 ID、模板 ID 或显示名称。
- `--db `
可选。用于解析的 `roadrecon.db` 文件路径。
默认:`roadrecon.db`
## what-if
### 功能说明
`what-if` 用于评估特定用户在**假设登录场景**下的条件访问策略。
该命令不仅仅是展示哪些策略针对该用户,它还会提出以下问题:
这有助于在不同的登录上下文(平台、客户端应用类型、风险信号、受信任位置等)中快速测试执行结果,而无需访问实时登录日志或在租户中运行测试。
由于某些条件访问条件依赖于您可能未提供(或尚未完全建模)的信号,CAPSlock 将结果分为以下几类:
- **已应用(明确)** —— 在给定场景输入下明确适用的策略
- **已应用(信号依赖)** —— *可能*会适用的策略,具体取决于缺失或未建模的信号(例如,未提供的命名位置或风险信号)
### 语法
```
python3 CAPSlock.py what-if -u --resource [options]
python3 CAPSlock.py what-if -u --acr [options]
```
### 附加参数
- `--resource `
如果未提供 `--acr` 则为必填。资源 / 云应用 / 资源集(默认 = `All`)。
- `--acr `
如果未提供 `--resource` 则为必填。用户操作 / ACR(例如:`urn:user:registerdevice`)。
- `--db `
可选。用于解析的 `roadrecon.db` 文件路径。
默认:`roadrecon.db`
- `--trusted-location `
可选。受信任位置标志。
- `--platform `
可选。设备平台(默认 = `windows`)。
- `--client-app `
可选。客户端应用类型。
- `--signin-risk `
可选。登录风险级别。
- `--user-risk `
可选。用户风险级别。
- `--auth-flow `
可选。身份验证流程。
- `--device-filter `
可选。设备过滤器匹配标志。
- `--entra-joined `
可选。设备加入状态标志。
- `--device-compliant `
可选。设备合规性标志。
- `--assume-group [ ...]`
可选。模拟用户作为这些组的成员(适用于测试 PIM 或动态组场景)。接受组 ID 或显示名称。
- `--assume-role [ ...]`
可选。模拟用户拥有这些角色(适用于测试 PIM 角色激活场景)。接受角色对象 ID、模板 ID 或显示名称。
- `--strict`
可选。仅显示明确适用的策略(隐藏依赖信号的策略)。
## 分析
### 功能说明
`analyze` 通过排列给定用户和资源(或用户操作)的登录场景,系统地搜索条件访问执行漏洞。
与 `what-if` 仅评估单个假设登录不同,该命令会提出:
您需要提供一个用户以及一个**资源**或 **ACR**。您指定的任何额外登录属性(平台、受信任位置、风险级别等)都将保持不变。未指定的属性将自动进行排列,直到达到可配置的上限。
对于生成的每个场景,CAPSlock 会离线评估策略,并记录检测到漏洞的场景,例如:
- 没有明确适用的策略
- 执行完全依赖于“仅报告”策略
- 绕过执行的受信任位置场景
### 语法
```
python3 CAPSlock.py analyze -u --resource [options]
python3 CAPSlock.py analyze -u --acr [options]
```
### 附加参数
- `--resource `
如果未提供 `--acr` 则为必填。要评估的资源 / 云应用 / 资源集。
- `--acr `
如果未提供 `--resource` 则为必填。用户操作 / Authentication Context Class Reference(例如:`urn:user:registerdevice`)。
- `--db `
可选。用于解析的 `roadrecon.db` 文件路径。
默认:`roadrecon.db`
- `--trusted-location `
可选。指示登录是否源自受信任位置。
如果提供,该值将被固定;否则将被排列。
- `--platform `
可选。设备平台。
如果未指定,将排列所有平台。
- `--client-app `
可选。客户端应用类型。
如果未指定,将排列所有客户端类型。
- `--signin-risk `
可选。登录风险级别。
如果未指定,将排列所有风险级别。
- `--user-risk `
可选。用户风险级别。
如果未指定,将排列所有风险级别。
- `--auth-flow `
可选。身份验证流程。
如果未指定,将排列所有受支持的流程。
- `--device-filter `
可选。指示是否满足设备过滤条件。
如果未指定,两个值都将被排列。
- `--entra-joined `
可选。设备加入状态标志。
- `--device-compliant `
可选。设备合规性标志。
- `--assume-group [ ...]`
可选。模拟用户作为这些组的成员(适用于测试 PIM 或动态组场景)。接受组 ID 或显示名称。这些成员身份在所有排列场景中保持固定。
- `--assume-role [ ...]`
可选。模拟用户拥有这些角色(适用于测试 PIM 角色激活场景)。接受角色对象 ID、模板 ID 或显示名称。这些角色在所有排列场景中保持固定。
- `--max-scenarios `
可选。要评估的最大场景数。
默认:`1000`。
- `--out `
可选。生成的分析文件的输出文件前缀。
默认:`capslock_analyze`。
## 转换
### 功能说明
`convert` 使用离线 `roadrecon.db` 在**对象 ID (GUID)** 和**人类可读的名称**之间进行转换。
它支持用户、组、目录角色、应用程序和服务主体。
### 语法
```
python3 CAPSlock.py convert (--id | --name ) [options]
```
### 附加参数
- `--db `
可选。用于解析的 `roadrecon.db` 文件路径。
默认:`roadrecon.db`
## web-gui
### 功能说明
`web-gui` 为 CAPSlock 启动交互式 Web 界面,提供基于浏览器的命令行替代方案。
这适用于:
- 交互式探索条件访问策略
- 与偏好 GUI 的团队成员分享结果
- 无需构建 CLI 命令即可运行快速的假设场景
### 语法
```
python3 CAPSlock.py web-gui [options]
```
```
# 如果通过 pipx 安装
capslock-web [options]
```
### 附加参数
- `--host `
可选。Web 服务器绑定的主机地址。
默认:`0.0.0.0`(可从所有网络接口访问)
- `--port `
可选。Web 服务器的端口号。
默认:`8000`
- `--reload`
可选。为开发环境启用自动重载(检测到代码更改时服务器会重启)。
### 示例用法
```
python3 CAPSlock.py web-gui
python3 CAPSlock.py web-gui --port 8080
python3 CAPSlock.py web-gui --host 127.0.0.1 --reload
# 如果通过 pipx 安装
capslock-web --port 08080
```
启动后,在浏览器中打开 `http://localhost:8000`(或配置的 host/port)即可访问该界面。
标签:Azure AD安全, Blue Team, Python, ROADtools, 后端开发, 无后门, 条件访问分析, 逆向工具