
Una prova di concetto per CVE-2022-30600
Questo repository contiene 2 implementazioni per un proof of concept che sfrutta CVE-2022-30600.
CVE-2022-30600 è una vulnerabilità di sicurezza che consente a un attaccante di bypassare la soglia di blocco dell'account all'interno del webapp moodle.
Come indicato dalla seguente voce nel database NVD https://nvd.nist.gov/vuln/detail/CVE-2022-30600, le versioni seguenti sono note per essere vulnerabili a questo exploit.
3.9 - 3.9.13 3.10 - 3.10.10 3.11 - 3.11.6
Come descritto nel commit utilizzato per correggere questa vulnerabilità, il problema risiede nella logica utilizzata per accedere e incrementare il valore login_failed_count nel database.
Se si verifica più di 1 richiesta di login concorrente, il webapp moodle potrebbe non riuscire a controllare e aggiornare correttamente il valore di login all'interno dell'applicazione. Ciò comporta che 2 o più fallimenti di login vengano conteggiati come un solo fallimento.
Per comprendere meglio, il diagramma seguente è una suddivisione ad alto livello di una richiesta di login fallita dal punto di vista del client, del webapp e del database.
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request
W->>D: Requests failed_login_attempt
D->>W: failed_login_attempt = 0
W->>W: local failed_login_attempt = 0
W->>W: local failed_login_attempt = 1
W->>D: failed_login_attempt = 1
W->>C: Login FailedIl risultato è che il valore failed_login_attempt nel database è corretto e i successivi tentativi di login aggiorneranno correttamente il valore.
Se un attaccante invia un numero di richieste di login concorrenti, si verifica il seguente problema.
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request (session 1)
C->>W: Login Request (session 2)
W->>D: Requests failed_login_attempt (session 1)
W->>D: Requests failed_login_attempt (session 2)
D->>W: failed_login_attempt = 0 (session 1)
D->>W: failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 0 (session 1)
W->>W: local failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 1 (session 1)
W->>W: local failed_login_attempt = 1 (session 2)
W->>D: failed_login_attempt = 1 (session 1)
W->>D: failed_login_attempt = 1 (session 2)
W->>C: Login Failed (session 1)
W->>C: Login Failed (session 2)Il risultato di questa interazione è che il valore failed_login_attempt nel database viene incrementato solo di 1 nonostante siano avvenute 2 richieste di login fallite. Questo può essere scalato fino a centinaia di richieste, con i limiti rappresentati da quante richieste concorrenti il client può effettuare e dal numero di richieste che il server web può gestire contemporaneamente.
Inoltre, se un attaccante ha accesso a più client (ad esempio un botnet) ed è in grado di sincronizzare il momento in cui queste richieste vengono effettuate, può superare i limiti dell'utilizzo di un singolo client e rendere l'attacco più difficile da mitigare.
poc.py è l'implementazione python3 di questo attacco. Utilizza i thread per effettuare le richieste concorrenti. Sebbene questo proof of concept funzioni, il global interpreter lock presente in python3 ostacola il vantaggio dell'uso di più thread in queste circostanze. Raccomando vivamente di utilizzare l'implementazione C++ in quanto funziona meglio quando l'attacco viene eseguito da un singolo client.
poc.py [-h] -u USERNAME -url TARGET -w WORDLIST -t THREADS [-a ATTEMPTS] [-d DELAY]
options:
-h, --help
mostra questo messaggio di aiuto
-u USERNAME, --username USERNAME
Il nome utente dell'account preso di mira
-url TARGET, --target TARGET
URL di base del webapp moodle preso di mira
-w WORDLIST, --wordlist WORDLIST
Il percorso del file wordlist utilizzato
-t THREADS, --threads THREADS
Il numero di thread creati per ogni tentativo
-a ATTEMPTS, --attempts ATTEMPTS
Il numero di tentativi che si desidera effettuare. Il valore predefinito è 1
-d DELAY, --delay DELAY
La quantità di secondi tra ogni tentativo. Il valore predefinito è 2
python3 poc.py -u admin -url https://moodle/ -w /usr/share/wordlists/rockyou.txt -t 15 -a 8
targeting : https://moodle/
account username : admin
wordlist : /usr/share/wordlists/rockyou.txt
threads : 15 login requests saranno effettuate in ogni tentativo
attempts : l'attacco si ripeterà 8 volte per un totale.
In questo esempio verranno effettuate un totale di 120 (8 * 15) richieste di login. Ci sarà un ritardo di 2 secondi tra ogni tentativo.
poc.cpp è l'implementazione C++ dell'attacco che utilizza la libreria curl per eseguire l'attacco. Pertanto, necessita di alcune flag del compilatore per poter compilare l'applicazione. In generale, questa implementazione funziona meglio della versione python3 poiché i thread sono in grado di utilizzare tutti i core del dispositivo client, consentendo più connessioni concorrenti in un tempo più breve. Ciò significa che l'exploit può funzionare in modo più consistente.
g++ poc.cpp -o poc -lcurl
Usage:
poc [OPTION...]
-a, --attempts
Il numero di volte in cui viene eseguito l'attacco.
-t, --threads
Il numero di thread da utilizzare in ogni tentativo.
-n, --username
L'utente dell'account che stai prendendo di mira
-u, --URL
URL di base del webapp moodle
-d, --delay
Il ritardo temporale tra i tentativi. Il valore predefinito è 5
-v, --version
Mostra la versione
-h, --help
Mostra il messaggio di aiuto
-w, --wordlist arg
Wordlist delle password.
./poc -w /usr/share/wordlists/rockyou.txt -u https://moodle/ -n admin -a 3 -t 5 -d 2
wordlist : /usr/share/wordlists/rockyou.txt
URL : https://moodle/
account username : admin
attempts : 3 tentativi verranno effettuati
threads : 5 thread verranno utilizzati in ogni tentativo
delay : ci sarà un ritardo di 2 secondi tra ogni tentativo
Per sviluppare, testare e debuggare questi script ho creato una macchina virtuale. Questa macchina virtuale utilizzava il seguente software e versioni.
Moodle 3.9.0 PHP 7.2.34 MySQL 8.0.30 Ubuntu 5.15.0-41-generic Apache 2.4.52
Non approvo l'uso del mio codice sorgente in attività illegali.