doyensec/maSSO
GitHub: doyensec/maSSO
一个武器化的 SSO 身份提供者,支持 OIDC、SAML 2.0 和 SCIM 协议,可通过拦截和篡改重签令牌/断言来深度测试服务提供者的认证安全性。
Stars: 2 | Forks: 0
# maSSO - 恶意 Auth SSO 实用程序
[](https://doyensec.com/research.html)

一个武器化的单点登录 (SSO) 身份提供者 (IdP),用于 OIDC 和 SAML 2.0 服务提供者的安全测试,同时支持 SCIM 协议。
为什么选择 maSSO?
- 作为目标 SP 信任的**完全符合规范的 OIDC IdP** 和 **SAML 2.0 IdP** 运行
- 包含可选的 **SCIM 客户端** 用于测试,同时支持从目标服务提供者拉取用户
- 允许通过本地仪表盘独立将每个端点设置为**透传**、**模拟**、**拦截** 或 **签名前拦截** 模式
- **OIDC 和 SAML 签名拦截**:对于 OIDC,捕获上游发出的 `id_token`,编辑 JSON,并使用 maSSO 的 RSA 密钥重新签名。对于 SAML,捕获未签名的断言 XML,在结构化表单和原始 XML 面板中编辑它,然后对编辑后的版本进行签名
- 支持 **Cloudflare Quick Tunnels** (`--cloudflared`) 实现零配置的公共网络暴露
基于 [`zitadel/oidc`](https://github.com/zitadel/oidc) (OIDC IdP) 和 [`mcguinness/node-samlp`](https://github.com/mcguinness/saml-idp) (SAML IdP) 构建。
## 安装说明
### 使用 Docker(推荐大多数用户使用)
不需要本地的 Go 或 Node.js。使用带有 **oidc** 或 **saml** 配置文件的 Docker Compose,并映射 IdP 和(仅限 localhost 的)仪表盘端口。容器内的 **Cloudflare Quick Tunnel** 是**可选的**(`MASSO_CLOUDFLARED=1`),类似于在本地的 `./masso --cloudflared`。所有命令、环境变量表、卷布局以及 entrypoint 如何传递标志都在 **[USE_AS_DOCKER.md](USE_AS_DOCKER.md)** 中。
### 手动构建
**前置条件**
| 需求 | 说明 |
|-------------|--------|
| **Go** | 1.25 或更高版本 |
| **Node.js** | 18+(仅限 SAML 模式;`saml-engine` 依赖项) |
| **cloudflared** | 本地 `go build` / `./masso --cloudflared` 的可选项 - 从 [Cloudflare](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/) 安装。容器内的 `cloudflared`,请参阅 [USE_AS_DOCKER.md](USE_AS_DOCKER.md)。 |
需要时安装 **cloudflared**:
- **文档(所有平台):** [安装 cloudflared](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/)(选择您的操作系统;包含 Linux `.deb` / `.rpm` 和直接的二进制文件)。
- **macOS (Homebrew):** `brew install cloudflared`
- **验证:** `cloudflared --version`
然后运行 maSSO,例如 `./masso oidc --cloudflared`(有关 Quick Tunnel 和手动 issuer,请参阅 [ADVANCED_USAGE.md 中的隧道功能](ADVANCED_USAGE.md#tunneling))。
```
git clone https://github.com/doyensec/maSSO
cd masso
go build -o masso .
cd saml-engine && npm install && cd ..
```
## 使用方法
```
./masso
[flags]
```
IdP 和仪表盘在**独立的端口**上运行。只有 IdP 端口 (`--port`) 应该暴露在互联网上。仪表盘 (`--dash-port`) 必须保持本地访问。
### 快速示例
```
# OIDC - 指向真实 SP callback
./masso oidc --redirect-uri https://app.example.com/auth/callback
# SAML - 针对真实 SP 运行
./masso saml --acs https://app.example.com/saml/acs --audience https://app.example.com
# 带有 Cloudflare tunnel 的 OIDC(自动检测 public URL)
./masso oidc --cloudflared
# 带有 Cloudflare tunnel 的 SAML
./masso saml --cloudflared --acs https://sp.com/acs --audience https://sp.com
# 带有手动管理 tunnel 的 OIDC
./masso oidc --issuer https://my-tunnel.example.com/
```
### 选项标志
#### OIDC 模式
```
./masso oidc [flags]
```
| 标志 | 默认值 | 描述 |
|---|---|---|
| `--port` | `8081` | IdP 监听端口(通过隧道暴露) |
| `--dash-port` | `8082` | 仪表盘端口(保持本地) |
| `--issuer` | `http://localhost:/` | 公共 issuer URL - 远程 SP 必需 |
| `--client-id` | `web` | OIDC Client ID |
| `--client-secret` | `secret` | OIDC Client Secret |
| `--redirect-uri` | `http://localhost:9999/callback` | SP 回调 URL - 支持精确、glob 匹配或 `re:` 正则表达式(见下文) |
| `--any-redirect` | `false` | 允许任何回调 URL (`*`),而无需在 shell 中转义 `*` |
| `--db` | `data.db` | SQLite 数据库路径 |
| `--cloudflared` | `false` | 通过 Cloudflare 自动隧道并使用其 URL 作为 issuer |
**配置您的 SP:**
| 字段 | 值 |
|---|---|
| Discovery URL | `.well-known/openid-configuration` |
| Client ID | `web`(或 `--client-id`) |
| Client Secret | `secret`(或 `--client-secret`) |
| Scopes | `openid profile email` |
| Grant Type | `authorization_code` |
| Token Auth Method | `client_secret_basic` |
##### 重定向 URI 匹配
| 语法 | 模式 | 示例 |
|---|---|---|
| 纯字符串 | 精确匹配 | `https://app.example.com/callback` |
| 包含 `*` 或 `?` | Glob 匹配 ([doublestar](https://github.com/bmatcuk/doublestar)) | `https://app.example.com/*` |
| `re:` 前缀 | Go 正则表达式 | `re:https://app\.example\.com/(callback\|auth/cb)` |
**持久化的客户端配置:** `--client-id`、`--client-secret`、`--redirect-uri` 和 `--any-redirect` 在每次运行时都会写回 SQLite,因此隧道运行和后续运行可以保持一致,无需删除 `data.db`。
#### SAML 模式
```
./masso saml [flags]
```
| 标志 | 默认值 | 描述 |
|---|---|---|
| `--port` | `8081` | IdP 监听端口(通过隧道暴露) |
| `--dash-port` | `8082` | 仪表盘端口(保持本地) |
| `--issuer` | `http://localhost:/` | 公共 issuer URL |
| `--acs` | _(空)_ | SP ACS URL - 如果省略,则从 AuthnRequest 动态获取 |
| `--audience` | _(空)_ | SP Entity ID / Audience |
| `--node-port` | `7070` | Node.js SAML 引擎的内部端口 |
| `--db` | `data.db` | SQLite 数据库路径 |
| `--cloudflared` | `false` | 通过 Cloudflare 自动隧道并使用其 URL 作为 issuer |
**配置您的 SP:**
| 字段 | 值 |
|---|---|
| IdP Metadata URL | `metadata` |
| IdP SSO URL | `saml/sso` |
| IdP Entity ID | `` |
| IdP Certificate | `saml-engine/idp-public-cert.pem` |
| NameID Format | `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress` |
| Binding | `urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST` |
#### SCIM 客户端
maSSO 作为 SCIM 客户端向目标 SP 推送用户或从中拉取用户。
```
./masso [oidc|saml] --scim-url https://sp.example.com/scim/v2 [flags]
```
| 标志 | 默认值 | 描述 |
|---|---|---|
| `--scim-url` | _(空)_ | 目标 SP SCIM 基础 URL(在仪表盘中启用 SCIM 标签页) |
| `--scim-token` | _(空)_ | API token |
| `--scim-token-type` | `Bearer` | 认证方案:`Bearer`、`Basic` 或自定义标头名称 |
| `--scim-tls-skip-verify` | `false` | 跳过 SCIM 请求的 TLS 验证 |
#### 高级使用文档
**[ADVANCED_USAGE.md](ADVANCED_USAGE.md)** - 关于隧道/issuer、拦截模式和端点表的更多细节。
**[USE_AS_DOCKER.md](USE_AS_DOCKER.md)** - Docker 和 Docker Compose(配置文件、端口、环境变量、容器内的 Quick Tunnel)。
## :handshake: 贡献指南
maSSO 的繁荣离不开社区的贡献。无论您是开发人员、研究人员还是漏洞猎人,您的反馈和 Pull Request 都有助于为每个人改进该项目。请使用 [GitHub issue 跟踪器](https://github.com/doyensec/maSSO/issues) 进行报告和讨论。
本项目由 [Doyensec](https://doyensec.com/research.html) 支持开发。
标签:Doyensec, EVTX分析, IdP, MITM代理, OIDC, OpenID Connect, SAML 2.0, SCIM协议, SSO, 单点登录, 安全测试, 恶意IdP, 攻击性安全, 数据展示, 日志审计, 武器化, 红队, 认证绕过, 请求拦截, 身份安全, 身份提供商, 身份联邦