AHIOS/qr-authentication-lab
GitHub: AHIOS/qr-authentication-lab
一个用于复现和分析二维码登录工作流中浏览器存储捕获与会话重放的安全研究实验环境。
Stars: 0 | Forks: 0
# 二维码认证实验室
**反向代理** • **Docker** • **浏览器存储** • **会话重放** • **安全研究**
## 概述 现代身份验证已经变得非常强大。 本项目探讨了一个不同的问题: 该实验室在受控环境下复现了完整的基于二维码的身份验证工作流,展示了如何在不攻击加密协议或利用浏览器漏洞的情况下,捕获并重放经过身份验证的浏览器状态。 目标不是破坏身份验证。 目标是为了更好地理解身份验证工作流。 ## 核心亮点 - 完全可复现的 Docker 环境 - 带有选择性响应重写的反向代理 - 浏览器存储捕获(`IndexedDB`、`localStorage`、`sessionStorage`) - 在克隆源上的会话重放 - 操作员仪表盘 - 公共隧道(可替换) - 详细的技术文章 # 演示 ``` User │ ▼ Visits cloned application │ ▼ Scans QR code │ ▼ Authentication succeeds │ ▼ Browser storage captured │ ▼ Storage restored into clean browser profile │ ▼ Authenticated session reproduced ``` 不捕获任何密码。 不利用任何浏览器漏洞。 不破坏任何加密机制。 该研究专门专注于身份验证工作流和浏览器状态。 # 实验室与真实环境部署对比 特意使用 `localtunnel` 以保持项目的独立性和可复现性。 将其替换为 VPS、反向代理、Cloudflare Tunnel 或仿冒域名并不会改变底层技术。 | 实验室 | 真实环境 | |------------|------------| | 随机的 `*.loca.lt` 主机名 | 仿冒域名 | | 隧道管理的 TLS | 标准 HTTPS 证书 | | 本地 Docker 环境 | VPS / 共享主机 | | 临时 URL | 固定主机名 | `localtunnel` 引入的唯一限制是: - 首次访问时的确认页面 - 随机生成的主机名 - 重启后 URL 会发生变化 # 架构 ``` Internet │ ▼ Public HTTPS Endpoint │ ▼ nginx Reverse Proxy │ │ │ ▼ │ Operator Dashboard │ ▼ Upstream Web Application ▲ │ Browser Storage Replay ``` | 组件 | 职责 | |-----------|----------------| | **proxy** | 反向代理、响应重写、JavaScript 注入 | | **localtunnel** | 公共 HTTPS endpoint | | **attacker-dashboard** | 会话捕获和重放 | # 关键结论 在开发过程中最有趣的发现之一是,**仅靠 cookies 已不足以**复现经过身份验证的浏览器会话。 相反,现代 Web 应用程序越来越依赖于浏览器管理的存储,例如: - IndexedDB - localStorage - sessionStorage 了解身份验证状态实际存在的位置,结果比最初的实验本身要有趣得多。 # 仓库布局 ``` . ├── docker-compose.yml ├── proxy/ │ └── nginx.conf.template ├── localtunnel/ │ └── Dockerfile └── attacker-dashboard/ ├── server.js └── exfil.js ``` # Telegram Web 注意事项 Telegram Web K 需要进行一些特定于实现的调整。 | 挑战 | 解决方案 | |-----------|----------| | 在 `/` 提供的传统 UI | 重定向到 `/k/` | | 会话未存储在 cookies 中 | 捕获浏览器存储 | | 主机名验证 | 修补 `domains.includes(location.hostname)` | | `API_ID_INVALID` | 保留 API 选择逻辑 | | SharedWorker 失败 | 仅重写 HTML 和 `index-*.js` | | Docker 网络问题 | 强制 IPv4 上游解析 | | 会话重放 | 在克隆源上恢复浏览器存储 | 有关实现的详细信息,请参阅 **TECHNICAL-WRITEUP.md**。 # 运行实验室 环境要求: - Docker - Docker Compose 启动环境: ``` docker compose up --build -d ``` 获取公共 URL: ``` docker logs qr_authentication_lab_localtunnel 2>&1 | grep "your url is" ``` 打开仪表盘: ``` http://localhost:8080 ``` # 演示流程 ### 用户 - 打开公共 URL - 扫描二维码 - 等待浏览器存储收集 ### 操作员 - 打开仪表盘 - 验证捕获的会话 - 将其恢复到干净的浏览器配置文件中 - 观察已验证的会话 # API | Endpoint | 描述 | |-----------|-------------| | `/__lab/exfil.js` | 浏览器存储收集脚本 | | `/__lab/collect` | 接收浏览器存储快照 | | `/__lab/restore/:id` | 恢复存储并重定向 | # 配置 | 变量 | 默认值 | |-----------|---------| | `TARGET_DOMAIN` | `web.telegram.org` | # 故障排除 | 问题 | 解决方案 | |----------|----------| | 显示注册页面而不是二维码 | 打开 `/k/` | | `API_ID_INVALID` | 在不强制 `isMainDomain` 的情况下重新构建 | | Worker 失败 | 确保 worker 原封不动地通过 | | 没有捕获到会话 | 等待定期存储导出 | | 重放返回登录页面 | 在克隆源上恢复 | | 隧道 URL 已更改 | 从日志中获取新 URL | # 路线图 未来可能的扩展包括: - 支持其他二维码登录提供商 - 改进浏览器兼容性 - 替代的公共暴露机制 - 更丰富的操作员仪表盘 - 额外的监控和遥测功能 # 参考 - Telegram Web K - OWASP – 中间人攻击 - Docker Compose - nginx - IndexedDB - localtunnel # 许可证 在 **MIT License** 下发布。 本项目的存在是为了支持安全研究、教育和防范意识提升。 作者对任何滥用或未经授权的使用不承担任何责任。标签:AiTM钓鱼, Docker, MITM代理, 会话重放, 安全防御评估, 数据可视化, 浏览器存储捕获, 版权保护, 自定义脚本, 请求拦截, 逆向代理