
CVE-2020-13277 Cyber Range: Gitlab-Logikschwachstelle - Unbefugter Zugriff beliebiger Benutzer auf private Repositories
CVE-2020-13277 Übungsfeld: Gitlab Logik-Schwachstelle – Unbefugter Zugriff auf private Repositories durch beliebige Benutzer
CVE-2020-13277
├── README.md ............... [Diese README-Datei]
├── imgs .................... [Bilder zur Unterstützung der README]
├── gitlab .................. [Einhängeverzeichnis des Gitlab-Containers]
│ ├── Dockerfile .......... [Docker-Build-Datei für Gitlab]
│ ├── config .............. [Einhängeverzeichnis für Gitlab-Konfiguration]
│ ├── data ................ [Einhängeverzeichnis für Gitlab-Daten]
│ ├── logs ................ [Einhängeverzeichnis für Gitlab-Logs]
│ ├── keys ................ [Speicherverzeichnis für den geknackten Gitlab-Lizenzschlüssel]
│ └── runner .............. [Einhängeverzeichnis des Runner-Containers]
├── license ................. [Build-Verzeichnis des Containers für die Lizenz]
│ ├── Dockerfile .......... [Docker-Build-Datei für die Lizenz]
│ └── license.rb .......... [Ruby-Skript zum Generieren der geknackten Lizenz]
├── docker-compose.yml ...... [Docker-Build-Konfiguration]
├── keygen.ps1 .............. [Windows: Lizenz mit einem Klick generieren]
├── keygen.sh ............... [Linux: Lizenz mit einem Klick generieren]
├── run.ps1 ................. [Windows: Gitlab-Übungsfeld mit einem Klick starten]
├── run.sh .................. [Linux: Gitlab-Übungsfeld mit einem Klick starten]
├── register.ps1 ............ [Windows: Runner mit einem Klick registrieren]
├── register.sh ............. [Linux: Runner mit einem Klick registrieren]
├── stop.ps1 ................ [Windows: Gitlab-Übungsfeld mit einem Klick stoppen]
└── stop.sh ................. [Linux: Gitlab-Übungsfeld mit einem Klick stoppen]
Diese Schwachstelle nutzt hauptsächlich die Mirror Repository – die Funktion zur Spiegelung und Synchronisation von Repository-Backups.
Die Spiegelungsrichtung von Mirror unterteilt sich in zwei Typen:
Die Schwachstelle nutzt die Mirror-Repository-Pull-Richtung
Es ist bekannt, dass Gitlab in zwei Editionen unterteilt ist: CE (Community Edition, kostenlos) und EE (Enterprise Edition, kostenpflichtig). Gitlab gibt offiziell an, dass diese Schwachstelle die folgenden Versionen von CE und EE betrifft:
>=10.6, <12.9.10>=12.10, <12.10.11>=13.0, <13.0.6Das bedeutet jedoch nicht, dass alle diese Versionen des Gitlab Docker-Images zum Aufbau des Übungsfelds verwendet werden können, da:
Mit anderen Worten: Um das Übungsfeld mit Docker aufzubauen, kann nur die Gitlab-EE-Version verwendet werden, die dann geknackt werden muss (Wohlhabende können auch eine Lizenz kaufen), um die Mirror-Repository-Pull-Funktion zu aktivieren.
Aber selbst nach dem Knacken von Gitlab-EE wird bei den Versionen 10.x, 12.x oder 13.x beim Einfügen einer lokalen Pfad-URL in Mirror Repository - Pull ein Fehler ausgegeben: Import url is blocked: Requests to localhost are not allowed. Obwohl man über Admin area => Settings => Network => Outbound requests die Option Allow requests to the local network from hooks and services aktivieren kann, um lokale URLs zu konfigurieren, tritt beim Synchronisieren des Spiegels der Fehler 2:Fetching remote upstream failed: fatal: unable to access http://127.0.0.1/xxxx/: The requested URL returned error: 301 auf. Das bedeutet, dass nur das Ziehen von Remote-Repositorys funktioniert.
Glücklicherweise sind die Überprüfungsmethoden für lokale URLs in den Versionen 12.x und 13.x sehr streng, aber in der Version 10.x gibt es einen Weg: Bei der Konfiguration der Pull-URL kann man einfach den Namen des lokal eingerichteten DNS-Dienstes verwenden, um eine Umgehung zu erreichen.
Zusammenfassend kann letztendlich nur das Docker-Image der Version gitlab-ee:10.6.0-ee.0 für den Aufbau dieses Übungsfelds verwendet werden.
Aus der vorherigen Beschreibung ist auch ersichtlich, dass die Ausnutzungsbedingungen dieser Schwachstelle relativ streng sind. Grundsätzlich ist es für arme Leute schwierig, von dieser Schwachstelle betroffen zu sein.
./keygen.sh oder ./keygen.ps1./run.sh oder ./run.ps1Beim vorherigen Generieren des geknackten Schlüsselpaars wurde der öffentliche Schlüssel bereits im Hintergrund in den Gitlab-Container geschrieben. Der private Schlüssel muss noch über das Frontend in Gitlab hochgeladen werden, um das Knacken abzuschließen:
./gitlab/keys/ generiert; den Inhalt der darin enthaltenen .gitlab-license (privater Schlüssel) kopierenEnter license key auswählen, den privaten Schlüssel einfügen und auf die Schaltfläche Upload license klicken, um das Knacken abzuschließenDamit ist die Mirror-Repository-Pull-Funktion aktiviert

Outbound requests finden, die Option Allow requests to the local network from hooks and services aktivieren und speichernDamit unterstützt Mirror Repository - Pull nun das Abrufen lokaler Repositorys
