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, 安全助手, 敏感信息扫描, 无后门, 源代码泄露, 逆向工具