Poellie01/PentestCompanion
GitHub: Poellie01/PentestCompanion
PentestCompanion是一个自托管渗透测试伴侣,用于集中管理测试项目、漏洞和报告。
Stars: 20 | Forks: 2
# ⬡ 渗透测试伴侣
跟踪目标、发现、凭据与时间。运行被动式 Web 扫描。将终端输出直接管道传入以进行日志记录和自动生成发现。
[](LICENSE)





## 这是什么?
一个为渗透测试员、漏洞赏金猎人、OSCP/OSEP/CRTP/PNPT 备考者或 HTB 复盘准备的自托管工作空间。
## 功能
| 领域 | 内容 |
| 项目管理 |
目标 · 端口 · 检查清单阶段(侦察 / Web / SMB / AD / 后渗透) · 攻击步骤 · 凭据库 · 时间线 · 时间追踪 · 归档与恢复 · 完整的 ZIP 导出/导入
|
| 漏洞发现 |
CVSS v3.1 计算 · 评论 · 证据上传 · 状态工作流 · 通过 NVD 查询 CVE · 每个项目的 JSON 导入/导出 · 22 个模板库 · 从 Nessus 和 Burp Suite XML 批量导入
|
| Web 扫描器 |
TLS · 6 个安全头部 · Cookie · CORS · HTTP 方法 · 暴露文件 · 技术栈识别 · HTML 卫生状况 · 扫描差异对比 · SSRF 防护 · 自动晋升至项目 · 深度扫描模式(目录爆破 + JS 端点提取)
|
| 报告生成 |
DOCX + PDF · 品牌封面页(Logo、品牌颜色、页脚) · 执行摘要 · 技术报告 · 按项目可选配置节段/脱敏
|
| 考试模式 |
OSCP / OSEP / OSED / CRTP / PNPT / CPTS / 自定义 · 实时倒计时贯穿所有页面 · 积分跟踪 · 通过/失败徽章 · 截图槽位(初始访问 / 权限提升 / 本地 / root 证明) · 考试风格 DOCX
|
| 终端日志 |
个人 API 令牌 · 通过 Bearer 认证 POST 原始字节 · ANSI 查看器 · 可用于任何管道的即插即用 pclog bash 助手
|
| 团队与认证 |
自助注册 · 角色(查看者 / 操作者 / 所有者 / 管理员) · 邀请链接 · 审计日志 · 禁用/移除成员 · 品牌设置 · 通过邮件重置密码
|
| 工具集 |
哈希识别 · Base64 编解码 · 带占位符替换的命令渲染器 · 带自动解析功能的便签(nmap / ffuf / gobuster…) · 带自动保存的 Markdown 笔记 · Obsidian 知识库导入
|
## 快速开始
需要 Python 3.9+。
```
git clone https://github.com/your-org/pentest-companion.git
cd pentest-companion
python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python app.py
```
首次运行会引导创建一个管理员账户并将其打印出来:
```
============================================================
Bootstrapped admin account.
username: admin
password: changeme
!! CHANGE THIS PASSWORD or set ADMIN_PASSWORD in .env
============================================================
```
访问
,登录后在 **账户 → 更新密码** 处更改密码。
## 快速开始 (Docker)
```
cp .env.example .env
# 生成一个真实的 SECRET_KEY 并将其应用进去
python -c "import secrets; print(secrets.token_hex(32))" \
| xargs -I {} sed -i 's/^SECRET_KEY=$/SECRET_KEY={}/' .env
# 设置 ADMIN_PASSWORD(如需密码重置邮件功能,请同时设置 SMTP)
$EDITOR .env
docker compose up -d
docker compose logs -f app
```
```
# 健康检查
curl -fsS http://localhost:5000/health
# 销毁(volume 保留)
docker compose down
```
## 终端日志 (pclog)

将任何命令的输出管道传入项目会话,并在之后使用完整的 ANSI 颜色重放它。
**步骤 1 — 获取令牌**
**账户 → API 令牌 → 新令牌**。令牌以 `pcsk_` 为前缀,存储时进行哈希处理。
**步骤 2 — 将以下内容放入你的 shell 配置**
```
# ~/.bashrc 或 ~/.zshrc
PCLOG_TOKEN="pcsk_your_token_here"
PCLOG_BASE="http://localhost:5000"
pclog() {
local eid=$1; shift
local name="${*:-$(date +%H:%M:%S)}"
local sid
sid=$(curl -sf -X POST "$PCLOG_BASE/api/v1/terminal/start" \
-H "Authorization: Bearer $PCLOG_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"engagement_id\":$eid,\"name\":\"$name\"}" | python3 -c "import sys,json; print(json.load(sys.stdin)['session_id'])")
while IFS= read -r line; do
printf '%s\n' "$line"
printf '%s\n' "$line" | curl -sf -X POST "$PCLOG_BASE/api/v1/terminal/append/$sid" \
-H "Authorization: Bearer $PCLOG_TOKEN" \
-H "Content-Type: application/octet-stream" --data-binary @- > /dev/null
done
curl -sf -X POST "$PCLOG_BASE/api/v1/terminal/close/$sid" \
-H "Authorization: Bearer $PCLOG_TOKEN" > /dev/null
}
```
**步骤 3**
```
nmap -sV 10.10.10.1 | pclog 42 "nmap initial"
gobuster dir -u http://10.10.10.1 -w /usr/share/wordlists/dirb/common.txt | pclog 42 "gobuster web"
# 或记录一个交互式 shell 会话
script -c bash /dev/null | pclog 42 "interactive shell"
```
会话显示在 **项目管理 → 终端会话** 下。

## Web 扫描器
扫描器是**被动式**的 — 它发送一小批固定的 HTTP 请求(6-12 个,取决于发现内容)。
### 检查项目
| 类别 | 检查项 |
|----------|--------|
| TLS / 传输层 | 证书过期、自签名、TLS 1.0/1.1、HTTP→HTTPS 重定向 |
| 安全头部 | HSTS、CSP、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy |
| Cookie | 每个 `Set-Cookie` 的 Secure / HttpOnly / SameSite 属性 |
| CORS | 通配符、源反射、`null` 源 |
| HTTP 方法 | TRACE / TRACK / PUT / DELETE / CONNECT |
| 暴露文件 | `.git/config`、`.env`、`.DS_Store`、`phpinfo.php`、`/.svn/entries`、`server-status` 等 |
| HTML 卫生状况 | 混合内容、密码自动填充、表单缺少 CSRF 令牌 |
| 技术栈识别 | nginx、Apache、IIS、Cloudflare、PHP、ASP.NET、WordPress、Drupal、Laravel、React、Vue、Angular、jQuery、Bootstrap |
### 深度扫描(可选)
运行前切换 **深度扫描** 以添加:
- **目录枚举** — 探测一个精选的 100 路径列表,报告 200/301/302/401/404 响应及其大小和内容类型
- **JS 端点提取** — 获取最多 5 个同源 `.js` 文件,并从字符串字面量和 `fetch`/`axios`/`$.ajax` 调用中提取 URL 路径
### 其他扫描功能
- **评分** — 0-100 分制,A-F 等级。失败项扣除全部严重性权重,警告项扣除一半。
- **扫描差异对比** — 并排比较两次扫描;高亮显示新增、已解决和未更改的发现。
- **自动晋升** — 一键将扫描发现推送到项目中,自动填充描述、证据和建议。
- **SSRF 防护** — 默认阻止环回地址、链路本地地址、云元数据(`169.254.169.254`)和 RFC1918 地址。设置 `ALLOW_INTERNAL_SCANS=1` 以允许扫描内部目标。
## 考试模式
支持:**OSCP · OSEP · OSED · CRTP · PNPT · CPTS · 自定义**
- 实时倒计时嵌入导航栏。
- 单机跟踪:类型、积分、备注、标志和截图。
- 进度条显示每台机器的证据完整性。
- 随着标志的获取,通过/失败徽章实时更新。
- 点击 **生成考试报告** 以生成 DOCX / PDF。
## 数据导入
### 漏洞发现
| 来源 | 方法 |
|--------|-----|
| Nessus | 项目 → 发现 → 导入 → 上传 `.nessus` XML |
| Burp Suite | 项目 → 发现 → 导入 → 上传 Burp XML 导出文件 |
| JSON 包 | 项目 → 发现 → 导入 → 粘贴或上传 JSON |
| 发现库 | 点击任何模板 → "应用到项目" |
导入时按 IP 匹配目标;自动创建新目标。
### 项目数据包
从 **项目 → 导出** 处将完整项目(数据 + 证据文件)导出为 `.zip`。在任何新实例上通过 **仪表盘 → 导入项目** 导入 —
### Obsidian 知识库
在 **笔记** 页面,导入一个 Obsidian 知识库的 `.zip` 文件。会解析 YAML frontmatter(`title`、`category`、`tags`);子文件夹将成为分类。
## 报告生成
| 报告类型 | 格式 | 备注 |
|--------|--------|-------|
| 技术报告 | DOCX + PDF | 完整发现、证据、CVSS 评分、修复建议 |
| 执行摘要 | DOCX | 风险概述、摘要表格,无原始技术细节 |
| 考试报告 | DOCX | OSCP 风格布局,附带机器证明截图 |
**品牌化:** 在 **团队 → 品牌设置** 中上传你的 Logo,选择品牌颜色,设置页脚文本。封面页、页眉和页脚会自动生成。
**按项目可配置项:**
- 包含/排除证据截图
- 包含/排除凭据和目标附录
- 为交付给客户的副本脱敏凭据值
## 环境变量
| 变量 | 默认值 | 用途 |
|----------|---------|---------|
| `SECRET_KEY` | 自动生成,保存到 `.secret_key` | 会话签名密钥 — 在生产环境中需显式设置 |
| `ADMIN_PASSWORD` | `changeme` | 引导创建的管理员密码(仅首次运行) |
| `ADMIN_EMAIL` | `admin@example.com` | 引导创建的管理员邮箱 |
| `ALLOW_REGISTRATION` | `1` | 设为 `0` 则仅限邀请注册 |
| `ALLOW_INTERNAL_SCANS` | `0` | 允许扫描 RFC1918 / 环回地址 |
| `FORCE_HTTPS` | `0` | 添加 `Secure` Cookie 标志 + HSTS 头部 |
| `MAX_UPLOAD_MB` | `25` | 证据上传大小上限 |
| `DATABASE_PATH` | `pentest.db` | 覆盖 SQLite 文件路径 |
| `UPLOAD_FOLDER` | `static/uploads` | 证据文件和 Logo 存放位置 |
| `HOST_PORT` | `5000` | Docker Compose 宿主机端口 |
| `LOG_LEVEL` | `INFO` | `DEBUG` / `INFO` / `WARNING` / `ERROR` |
### SMTP(密码重置邮件)
若无 SMTP 配置,重置链接将打印到服务器日志 — 适合本地使用。
| 变量 | 默认值 | 用途 |
|----------|---------|---------|
| `SMTP_HOST` | — | 邮件服务器主机名 |
| `SMTP_PORT` | `587` | SMTP 端口 |
| `SMTP_USER` | — | SMTP 用户名 |
| `SMTP_PASS` | — | SMTP 密码 |
| `SMTP_FROM` | `no-reply@pentest-companion.local` | 发件人地址 |
| `SMTP_TLS` | `1` | 设为 `0` 以禁用 STARTTLS |
### 速率限制器(多工作进程)
默认的 `memory://` 速率限制存储是按进程的。使用多个 gunicorn 工作进程时,每个进程有独立的计数器。如有需要可使用 Redis:
```
RATELIMIT_STORAGE_URI=redis://localhost:6379/0
```
## 安全模型
| 控制项 | 实现方式 |
|---------|---------------|
| 会话 | HttpOnly + SameSite=Lax Cookie;`FORCE_HTTPS=1` 添加 `Secure` 标志 |
| 密码 | 通过 `werkzeug.security` 使用 pbkdf2-sha256 哈希 |
| 密码重置 | 一次性时效令牌;防止用户名枚举的安全响应 |
| CSRF | 每个表单使用 Flask-WTF;AJAX 通过 `` 自动包含令牌 |
| 跨团队隔离 | 每个包含 `` 的路由都经过 `require_*` 辅助函数,跨团队访问时返回 404。由 `tests/test_leakage.py` 覆盖 |
| 证据路径遍历 | 路径从数据库查询,仅当项目属于你的团队时才提供服务 |
| 扫描器 SSRF 防护 | 默认阻止环回地址、链路本地地址、云元数据和 RFC1918 地址 |
| 开放重定向 | 登录后的 `next=` 参数经过验证 |
| API 令牌 | `pcsk_` 前缀,SHA-256 哈希存储,支持按令牌撤销 |
| 审计日志 | 与安全相关的事件记录到数据库(登录、角色变更、成员移除…) |
## 项目布局
```
app.py # Flask app — routes, models, init_db, helpers (~7500 loc)
scanner.py # Web security scanner (pure stdlib, no extra deps)
commands.py # Renderable pentest command templates (nmap, ffuf, …)
requirements.txt
Dockerfile # Production image (gunicorn, non-root uid=1000)
docker-compose.yml
.env.example
templates/ # Jinja2 templates
base.html # Master layout (navbar, flash messages, exam timer)
partials/
_eng_subnav.html
engagement.html
findings_eng.html
scanner.html
exam.html
report.html
vault.html
terminal_sessions.html / terminal_session_view.html
# …and 30+ more
static/
style.css # Single stylesheet
app.js # CSRF wrapper, ANSI renderer, timers, tools
tests/
conftest.py # App fixtures, auth helpers
test_auth.py # Login, registration, SSRF guard, session management
test_routes.py # Route smoke tests (every protected route returns 200)
test_leakage.py # Cross-team isolation on every endpoint
test_team.py # Role enforcement, invite flow, member management
```
## 测试
```
pip install pytest
pytest # all 24 tests
pytest tests/test_auth.py -v # single file, verbose
pytest -k leakage # by keyword
```
覆盖范围:认证流程、会话/CSRF、SSRF 防护、密码更改、跨团队数据泄露、角色强制、邀请链接和项目 CRUD。
## 路线图
| 版本 | 重点 |
|---------|-------|
| **v0.2** | Postgres + Alembic 迁移、2FA (TOTP)、考试 DOCX 中嵌入截图 |
| **v0.3** | REST API 扩展、Webhook、签名分享链接客户端门户 |
| **v0.4** | OIDC/SAML SSO、Jira / GitHub / Slack 集成、定时重新扫描 |
完整历史记录见 [CHANGELOG.md](CHANGELOG.md)。
## 许可证
本项目采用 MIT 许可证 - 详情请参阅 [LICENSE](LICENSE) 文件。
玩得开心!
标签:bug bounty, Burp Suite, CVE查找, Docker, GPT, Nessus, OSCP, PPID欺骗, Python, TLS, 代码分析, 代码生成, 凭证管理, 反取证, 发现跟踪, 后端开发, 安全头, 安全扫描, 安全评估, 安全防御评估, 工具管理, 无后门, 时序注入, 时间跟踪, 渗透测试工具, 漏洞管理, 目标管理, 网络安全, 考试准备, 自托管, 请求拦截, 逆向工具, 防御工具, 隐私保护