1amrahul/GitSheriff
GitHub: 1amrahul/GitSheriff
一款用于检测 .git 目录泄露、自动下载并恢复源代码,同时对敏感凭证和密钥进行深度扫描的综合安全工具包。
Stars: 0 | Forks: 0
# GitSheriff
一个综合性的 `.git` 泄露检测、下载、恢复及敏感数据扫描工具包。
**作者:** [Rahul](https://github.com/1amrahul) | **网站:** [rahulms.qzz.io](https://rahulms.qzz.io)
## 功能
- **查找** - 扫描 URL 以发现暴露的 `.git` 目录和敏感文件
- **下载** - 通过递归获取 object 下载暴露的 `.git` 仓库
- **提取** - 从下载的 `.git` 目录中恢复源代码
- **扫描** - 扫描恢复的文件以查找敏感数据(API 密钥、私钥、密码、token、`.env` 密钥以及 100 多种模式类别)
- **集成工作流** - 通过带有交互式提示的单一命令实现下载、提取和扫描
## 安装
```
git clone https://github.com/1amrahul/GitSheriff.git
cd GitSheriff
pip install .
```
### 前置条件
- Python 3.8+
- `requests` 库
```
pip install -r requirements.txt
```
## 快速开始 - 集成工作流
使用 GitSheriff 最快的方式是使用集成的“下载-提取-扫描”工作流。只需一个命令:
```
gitsheriff dump https://example.com/.git
```
这将:
1. **下载**暴露的 `.git` 仓库
2. **询问**您是否要提取/恢复文件
3. 自动**提取**源代码
4. **询问**您是否要扫描敏感数据
5. **扫描**所有提取的文件以查找密钥、密码和凭证
### 完整示例输出
```
$ gitsheriff dump https://example.com/.git
--- Git Repository Dump ---
Target: https://example.com/.git
Output: dumped/example_com
Files: [####################################] 27/27 (100%) ETA: 0s
Checking for pack files...
No pack files found
Discovering objects from references...
Objects: [########] 8/8 (100%) ETA: 0s
--- Dump Summary ---
Output directory: dumped/example_com
Time elapsed: 2.3s
? Do you want to extract/recover files from the dumped .git? [Y/n]:
--- Git Repository Extraction ---
Git directory: dumped/example_com/.git
Output directory: dumped/example_com
HEAD: a1b2c3d4e5f6...
Files extracted: 15
--- Extraction Summary ---
Files extracted: 15
Output directory: dumped/example_com
Time elapsed: 0.5s
? Do you want to scan for sensitive data? [Y/n]:
--- Sensitive Data Scan ---
Scanning: dumped/example_com
Files scanned: 15
Findings: 3
CRITICAL [line 12] config/database.yml
Ruby DATABASE_PASSWORD: ********
HIGH [line 3] .env
AWS_SECRET_ACCESS_KEY: ********
MEDIUM [line 5] docker-compose.yml
Docker Hub token detected
--- Scan Summary ---
Total findings: 3
CRITICAL: 1 | HIGH: 1 | MEDIUM: 1 | LOW: 0
Results saved to: dumped/example_com/scan_results.json
Complete! Extracted files are in the 'extracted' subdirectory.
```
### 跳过提取和扫描(仅下载)
```
gitsheriff dump https://example.com/.git --yes
```
### 稍后提取(从之前的下载中)
```
gitsheriff extract ./dumped/example_com/.git
```
### 扫描目录以查找敏感数据
```
# 扫描目录
gitsheriff scan ./dumped/example_com
# 使用最低严重性过滤器进行扫描
gitsheriff scan ./dumped/example_com --severity HIGH
# 将结果保存为 JSON
gitsheriff scan ./dumped/example_com --output results.json
```
## 独立命令
### 查找 - 扫描 .git 泄露
```
# 扫描单个 URL
gitsheriff find https://example.com
# 扫描多个 URL
gitsheriff find https://site1.com https://site2.com
# 从文件扫描
cat urls.txt | gitsheriff find
# 将结果保存到文件
gitsheriff find https://example.com --output found.txt
```
### 下载 - 下载暴露的 .git
```
# Dump 并使用提取和扫描提示(默认)
gitsheriff dump https://example.com/.git
# 自定义输出目录
gitsheriff dump https://example.com/.git --output ./my_dump
# 跳过 object 下载(更快)
gitsheriff dump https://example.com/.git --skip-objects
# 跳过所有提示(自动执行 dump + extract + scan)
gitsheriff dump https://example.com/.git --yes
```
### 提取 - 恢复源文件
```
# 从已 dump 的 .git 目录中提取
gitsheriff extract ./dumped/example_com/.git
# 提取到特定目录
gitsheriff extract ./dumped/example_com/.git --output ./recovered
```
### 扫描 - 检测敏感数据
```
# 扫描目录(报告所有严重性)
gitsheriff scan ./dumped/example_com
# 仅报告 HIGH 和 CRITICAL 结果
gitsheriff scan ./dumped/example_com --severity HIGH
# 将结果保存到 JSON 文件
gitsheriff scan ./dumped/example_com --output scan_results.json
```
## 命令行选项
### 全局选项
| 选项 | 描述 |
|--------|-------------|
| `--version`, `-v` | 显示版本信息 |
| `--help`, `-h` | 显示帮助信息 |
### 查找命令
| 选项 | 描述 |
|--------|-------------|
| `urls` | 要扫描的 URL(位置参数) |
| `--urls`, `-u` | 要扫描的 URL(标志) |
| `--output`, `-o` | 将找到的 URL 保存到文件 |
| `--threads`, `-t` | 并发线程数(默认:10) |
| `--timeout` | HTTP 超时时间(秒)(默认:10) |
| `--no-verify-ssl` | 禁用 SSL 验证 |
### 下载命令
| 选项 | 描述 |
|--------|-------------|
| `url` | 暴露的 .git 目录的 URL |
| `--output`, `-o` | 输出目录(默认:`dumped/`) |
| `--threads`, `-t` | 并发线程数(默认:10) |
| `--timeout` | HTTP 超时时间(秒)(默认:10) |
| `--no-verify-ssl` | 禁用 SSL 验证 |
| `--skip-objects` | 跳过下载单个 object |
| `--yes`, `-y` | 跳过所有确认提示 |
### 提取命令
| 选项 | 描述 |
|--------|-------------|
| `git_dir` | 已下载的 .git 目录的路径 |
| `--output`, `-o` | 输出目录(默认:git_dir 的父目录) |
### 扫描命令
| 选项 | 描述 |
|--------|-------------|
| `scan_dir` | 要扫描敏感数据的目录 |
| `--output`, `-o` | 将扫描结果保存到 JSON 文件 |
| `--severity`, `-s` | 最低严重级别:`CRITICAL`、`HIGH`、`MEDIUM`、`LOW`(默认:`LOW`) |
## GitSheriff 能检测到什么
### .git 泄露检测
- 暴露的 `.git/HEAD` 文件
- 暴露的 `.git/config` 文件
- 暴露的 `.git/index` 文件
- 暴露的 `.git/objects` 目录
- 暴露的 `.git/refs` 目录
- 暴露的 `.git/packed-refs` 文件
- 暴露的 `.git/FETCH_HEAD` 文件
- 暴露的 `.git/MERGE_HEAD` 文件
### 敏感数据模式(100+ 种模式)
#### CRITICAL - 私钥与顶级机密
| 模式 | 示例 |
|---------|---------|
| RSA Private Key | `-----BEGIN RSA PRIVATE KEY-----` |
| EC Private Key | `-----BEGIN EC PRIVATE KEY-----` |
| DSA Private Key | `-----BEGIN DSA PRIVATE KEY-----` |
| PGP Private Key | `-----BEGIN PGP PRIVATE KEY BLOCK-----` |
| OpenSSH Private Key | `-----BEGIN OPENSSH PRIVATE KEY-----` |
| Generic Private Key | `-----BEGIN PRIVATE KEY-----` |
| .env SECRET_KEY | `SECRET_KEY=django-insecure-...` |
| .env DATABASE_PASSWORD | `DATABASE_PASSWORD=mysecretpass` |
| .env API_SECRET | `API_SECRET=abc123...` |
| .env ENCRYPTION_KEY | `ENCRYPTION_KEY=a1b2c3...` |
| .env PRIVATE_KEY | `PRIVATE_KEY=-----BEGIN...` |
| .env JWT_SECRET | `JWT_SECRET=myjwtsecret...` |
#### HIGH - 云凭证与服务 token
| 模式 | 示例 |
|---------|---------|
| AWS Secret Access Key | `aws_secret_access_key=wJalrXUtnFEMI...` |
| AWS Session Token | `aws_session_token=FwoGZXIvYXdz...` |
| AWS MWS Key | `amzn.mws.9ea900df-...` |
| GitHub Token | `ghp_ABCDEFGHIJKLMNOP...` |
| GitHub OAuth | `gho_ABCDEFGHIJKLMNOP...` |
| GitLab Token | `glpat-ABCDEF.GHIJKLMN...` |
| Slack Bot Token | `xoxb-0000000000-...` |
| Slack User Token | `xoxp-0000000000-...` |
| Slack Webhook | `https://hooks.slack.com/services/T...` |
| Stripe Live Key | `sk_live_ABCDEFGHI...` |
| Stripe Publishable | `pk_live_ABCDEFGHI...` |
| Google API Key | `AIzaSyA1B2C3D4...` |
| Google OAuth | `client_secret:GOCSPX-...` |
| Google Service Account | `"type": "service_account"` |
| Azure Client Secret | `AZURE_CLIENT_SECRET=abc123...` |
| Azure AD Token | `eyJhbGciOiJSUzI1NiIs...` |
| GCP Service Account Key | `GCP_SERVICE_ACCOUNT_KEY={...}` |
| DigitalOcean Token | `DO_TOKEN=dop_v1_abc...` |
| Cloudflare Token | `CLOUDFLARE_TOKEN=abc123...` |
| Fastly Token | `FASTLY_TOKEN=abc123...` |
| npm Token | `npm_ABCDEFGHIJKLMN...` |
| PyPI Token | `pypi-AgEI...` |
| RubyGems Token | `rubygems_abc123...` |
| Heroku API Key | `HEROKU_API_KEY=abc123...` |
| Twilio Account SID | `TWILIO_ACCOUNT_SID=AC...` |
| Twilio Auth Token | `TWILIO_AUTH_TOKEN=abc...` |
| SendGrid API Key | `SG.abc123...` |
| Mailgun API Key | `key-abc123...` |
| NPM Token | `NPM_TOKEN=npm_abc...` |
| npm Automation Token | `NPM_TOKEN=npm_abc123...` |
| Atlassian Token | `atlassian_abcd...` |
| Confluence Token | `CONFLUENCE_TOKEN=abc...` |
| Jira Token | `JIRA_TOKEN=abc...` |
| Zendesk Token | `ZENDESK_TOKEN=abc...` |
| Intercom Token | `INTERCOM_TOKEN=abc...` |
| Algolia Key | `ALGOLIA_API_KEY=abc...` |
| RapidAPI Key | `RAPIDAPI_KEY=abc...` |
| Cloudinary URL | `cloudinary://abc...` |
| Firebase Key | `FIREBASE_KEY=abc...` |
| Sentry DSN | `SENTRY_DSN=https://abc...` |
| Datadog Key | `DD_API_KEY=abc...` |
| New Relic Key | `NEW_RELIC_KEY=abc...` |
| PagerDuty Key | `PAGERDUTY_TOKEN=abc...` |
| Vault Token | `VAULT_TOKEN=abc...` |
| MongoDB URL | `mongodb+srv://user:pass@...` |
| MySQL URL | `mysql://user:pass@...` |
| PostgreSQL URL | `postgres://user:pass@...` |
| Redis URL | `redis://user:pass@...` |
#### HIGH - 数据库与服务密码(.env 格式)
| 模式 | 示例 |
|---------|---------|
| REDIS_PASSWORD | `REDIS_PASSWORD=abc123` |
| SMTP_PASSWORD | `SMTP_PASSWORD=abc123` |
| FTP_PASSWORD | `FTP_PASSWORD=abc123` |
| SSH_PASSWORD | `SSH_PASSWORD=abc123` |
| STORAGE_PASSWORD | `STORAGE_PASSWORD=abc123` |
| ELASTICSEARCH_PASSWORD | `ELASTICSEARCH_PASSWORD=abc123` |
| MONGODB_PASSWORD | `MONGODB_PASSWORD=abc123` |
| MYSQL_ROOT_PASSWORD | `MYSQL_ROOT_PASSWORD=abc123` |
| POSTGRES_PASSWORD | `POSTGRES_PASSWORD=abc123` |
| NGINX_PASSWORD | `NGINX_PASSWORD=abc123` |
| KAFKA_PASSWORD | `KAFKA_PASSWORD=abc123` |
#### MEDIUM - API 密钥与认证 token
| 模式 | 示例 |
|---------|---------|
| Generic API Key | `api_key = "abc123..."` |
| Generic API Secret | `api_secret: "abc123..."` |
| Access Token | `access_token = "abc123..."` |
| Bearer Token | `Authorization: Bearer abc...` |
| Basic Auth | `Authorization: Basic base64...` |
| Auth Token | `auth_token: "abc123..."` |
| Private Key (inline) | `private_key = "abc123..."` |
#### MEDIUM - .env 变量名模式
| 模式 | 示例 |
|---------|---------|
| PASSWORD variable | `DB_PASSWORD=abc123` |
| SECRET variable | `APP_SECRET=abc123` |
| TOKEN variable | `API_TOKEN=abc123` |
| CREDENTIAL variable | `AWS_CREDENTIAL=abc123` |
| AUTH variable | `AUTH_KEY=abc123` |
| KEY variable | `ENCRYPTION_KEY=abc123` |
#### MEDIUM - Docker / CI-CD 密钥
| 模式 | 示例 |
|---------|---------|
| Docker Hub Token | `DOCKER_PASSWORD=abc...` |
| Docker Config | `"auth": "base64..."` |
| Jenkins Token | `JENKINS_TOKEN=abc...` |
| CircleCI Token | `CIRCLE_TOKEN=abc...` |
| Travis CI Token | `TRAVIS_TOKEN=abc...` |
| GitHub Actions Secret | `SECRET_KEY: abc...` |
#### MEDIUM - Kubernetes / Helm / IaC
| 模式 | 示例 |
|---------|---------|
| K8s Token | `K8S_TOKEN=abc...` |
| Kubeconfig | `password: abc123` |
| Helm Secret | `HELM_SECRET=abc...` |
| Ansible Vault | `$ANSIBLE_VAULT;1.1` |
| Terraform Cloud | `TF_TOKEN=abc...` |
| Terraform S3 Backend | `secret_key = "abc..."` |
| Pulumi Token | `PULUMI_ACCESS_TOKEN=abc...` |
#### MEDIUM - 加密与密码短语
| 模式 | 示例 |
|---------|---------|
| SSH Passphrase | `SSH_PASSPHRASE=abc...` |
| PGP Passphrase | `PGP_PASSPHRASE=abc...` |
| SSL Certificate Password | `SSL_PASSWORD=abc...` |
| Key Passphrase | `KEY_PASSPHRASE=abc...` |
| Keystore Password | `KEYSTORE_PASSWORD=abc...` |
#### MEDIUM - 社交媒体与支付
| 模式 | 示例 |
|---------|---------|
| Facebook Token | `FB_TOKEN=abc...` |
| Twitter/X Token | `TWITTER_TOKEN=abc...` |
| Instagram Token | `INSTAGRAM_TOKEN=abc...` |
| LinkedIn Token | `LINKEDIN=abc...` |
| Microsoft Graph | `MS_GRAPH_TOKEN=abc...` |
| PayPal Client ID | `PAYPAL_CLIENT_ID=abc...` |
| Square Access Token | `SQUARE_ACCESS_TOKEN=abc...` |
| Braintree Token | `BRAINTREE_TOKEN=abc...` |
#### LOW - 信息性
| 模式 | 示例 |
|---------|---------|
| Email addresses | `user@example.com` |
| Hardcoded IPs | `192.168.1.1:8080` |
| Internal hostnames | `db.internal.corp` |
| Debug mode | `DEBUG=True` |
| Default credentials | `admin:admin` |
| Base64 encoded secrets | `key="base64encoded..."` |
## 工作原理
### 检测
GitSheriff 会检查那些本不应公开访问的常见 `.git` 文件:
- `/` - 根 `.git` 目录
- `/HEAD` - 指向当前分支
- `/config` - 仓库配置
- `/index` - 暂存区索引
- `/objects/` - Git object 数据库
### 下载
下载器会递归下载:
- 标准 git 文件(HEAD、config、index、refs)
- Pack 文件(`.pack` 和 `.idx`)
- 从引用中发现的松散 object
- 二进制文件哈希提取
- 支持并发多线程下载
### 提取
提取器会恢复:
- 来自 HEAD 和其他分支的源代码
- 文件权限和可执行位
- 软链接
- 目录结构
### 敏感数据扫描
扫描器会:
- 递归扫描提取目录中的所有文件
- 应用 100+ 个按严重级别组织的正则表达式模式
- 自动跳过二进制文件
- 为了性能限制文件大小(1MB)和行长度(2000 字符)
- 输出包含文件路径、行号和匹配值的发现结果
- 将结果保存为 JSON 以供进一步分析
- 按严重级别和模式对发现结果进行分组和计数
## 项目结构
```
GitSheriff/
├── gitsheriff/
│ ├── __init__.py # Version and metadata
│ ├── __main__.py # Entry point
│ ├── cli.py # Command line interface
│ ├── utils.py # UI helpers and utilities
│ ├── finder.py # .git exposure detection
│ ├── dumper.py # .git repository dumper
│ ├── extractor.py # File recovery from .git
│ └── scanner.py # Sensitive data detection (100+ patterns)
├── setup.py # Package setup
├── requirements.txt # Dependencies
├── LICENSE # MIT License
└── README.md # This file
```
## 错误处理
GitSheriff 包含针对以下情况的全面错误处理:
- 网络超时和连接错误
- SSL/TLS 证书问题
- 文件权限错误
- 磁盘空间问题
- 损坏的 git object
- 无效的仓库结构
- 二进制文件检测(在扫描期间跳过)
- 大文件处理(强制执行大小限制)
## 许可证
该项目基于 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 免责声明
此工具仅供教育和授权的安全测试目的使用。作者不对任何滥用此工具的行为负责。在扫描或下载您不拥有的仓库之前,请务必获得适当的授权。
**作者:** [Rahul](https://github.com/1amrahul) | **网站:** [rahulms.qzz.io](https://rahulms.qzz.io)
标签:Git泄露利用, Python, 安全助手, 敏感信息扫描, 无后门, 源代码泄露, 逆向工具