
Une preuve de concept pour CVE-2022-30600
Ce dépôt contient 2 implémentations d'une preuve de concept qui exploite CVE-2022-30600.
CVE-2022-30600 est une vulnérabilité de sécurité qui permet à un attaquant de contourner le seuil de verrouillage de compte dans l'application web Moodle.
Comme indiqué par l'entrée suivante dans la base de données NVD https://nvd.nist.gov/vuln/detail/CVE-2022-30600, les versions ci-dessous sont connues pour être vulnérables à cette exploitation.
3.9 - 3.9.13
3.10 - 3.10.10
3.11 - 3.11.6
Comme indiqué dans le commit utilisé pour corriger cette vulnérabilité, le problème réside dans la logique utilisée pour accéder et incrémenter la valeur login_failed_count dans la base de données.
Si plus d'une requête de connexion simultanée se produit, l'application web Moodle peut ne pas réussir à vérifier et mettre à jour correctement la valeur de connexion dans l'application. Cela entraîne que 2 échecs de connexion ou plus ne sont comptabilisés que comme un seul échec de connexion.
Pour mieux comprendre cela, le diagramme ci-dessous est une vue d'ensemble de haut niveau d'une requête de connexion échouée du point de vue du client, de l'application web et de la base de données.
sequenceDiagram
participant C as Client
participant W as Application Web
participant D as Base de données
C->>W: Requête de connexion
W->>D: Demande 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: Échec de connexionLe résultat est que la valeur failed_login_attempt dans la base de données est correcte et que les tentatives de connexion suivantes mettront correctement à jour la valeur.
Si un attaquant envoie un certain nombre de requêtes de connexion simultanées, le problème suivant se produit.
sequenceDiagram
participant C as Client
participant W as Application Web
participant D as Base de données
C->>W: Requête de connexion (session 1)
C->>W: Requête de connexion (session 2)
W->>D: Demande failed_login_attempt (session 1)
W->>D: Demande 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: Échec de connexion (session 1)
W->>C: Échec de connexion (session 2)Le résultat de cette interaction est que la valeur failed_login_attempt dans la base de données n'est incrémentée que de 1 malgré 2 requêtes de connexion échouées. Cela peut être étendu à des centaines de requêtes, les limites étant le nombre de requêtes simultanées que le client peut effectuer et le nombre de requêtes que le serveur web peut gérer simultanément.
De plus, si un attaquant a accès à plusieurs clients (comme un botnet) et est capable de synchroniser le moment où ces requêtes sont effectuées, alors l'attaquant peut surmonter les limitations liées à l'utilisation d'un seul client et rendre l'attaque plus difficile à atténuer.
poc.py est l'implémentation en Python3 de cette attaque. Elle utilise des threads pour effectuer les requêtes simultanées. Bien que cette preuve de concept fonctionne, le verrou global de l'interpréteur (GIL) présent dans Python3 réduit l'avantage d'utiliser plusieurs threads dans ces circonstances. Je recommande vivement l'implémentation C++, car elle fonctionne mieux lorsque l'attaque est réalisée sur un seul client.
poc.py [-h] -u USERNAME -url TARGET -w WORDLIST -t THREADS [-a ATTEMPTS] [-d DELAY]
options:
-h, --help
affiche ce message d'aide
-u USERNAME, --username USERNAME
Le nom d'utilisateur du compte ciblé
-url TARGET, --target TARGET
URL de base de l'application web Moodle ciblée
-w WORDLIST, --wordlist WORDLIST
Le chemin vers le fichier de wordlist utilisé
-t THREADS, --threads THREADS
Le nombre de threads créés pour chaque tentative
-a ATTEMPTS, --attempts ATTEMPTS
Le nombre de tentatives que vous souhaitez effectuer. La valeur par défaut est 1.
-d DELAY, --delay DELAY
Le nombre de secondes entre chaque tentative. La valeur par défaut est 2.
python3 poc.py -u admin -url https://moodle/ -w /usr/share/wordlists/rockyou.txt -t 15 -a 8
ciblage : https://moodle/
nom d'utilisateur du compte : admin
wordlist : /usr/share/wordlists/rockyou.txt
threads : 15 requêtes de connexion seront effectuées à chaque tentative
tentatives : l'attaque sera répétée 8 fois au total.
Dans cet exemple, un total de 120 (8 * 15) requêtes de connexion seront effectuées. Il y aura un délai de 2 secondes entre chaque tentative.
poc.cpp est l'implémentation en C++ de l'attaque, qui utilise la bibliothèque curl pour effectuer l'attaque. Elle nécessite donc certains indicateurs de compilation pour que l'application puisse être compilée. Globalement, cette implémentation fonctionne mieux que la version Python3 car les threads peuvent utiliser tous les cœurs de l'appareil client, permettant ainsi plus de connexions simultanées en moins de temps. Cela signifie que l'exploit fonctionne de manière plus cohérente.
g++ poc.cpp -o poc -lcurl
Usage:
poc [OPTION...]
-a, --attempts
Le nombre de fois que l'attaque est effectuée.
-t, --threads
Le nombre de threads à utiliser à chaque tentative.
-n, --username
Le nom d'utilisateur du compte que vous ciblez.
-u, --URL
URL de base de l'application web Moodle.
-d, --delay
Le délai entre les tentatives. Par défaut : 5.
-v, --version
Affiche la version.
-h, --help
Affiche le message d'aide.
-w, --wordlist arg
Wordlist de mots de passe.
./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/
nom d'utilisateur du compte : admin
tentatives : 3 tentatives seront effectuées
threads : 5 threads seront utilisés à chaque tentative
délai : il y aura un délai de 2 secondes entre chaque tentative
Afin de développer, tester et déboguer ces scripts, j'ai créé une machine virtuelle. Cette machine virtuelle utilisait les logiciels et versions suivants.
Moodle 3.9.0 PHP 7.2.34 MySQL 8.0.30 Ubuntu 5.15.0-41-generic Apache 2.4.52
Je ne cautionne pas l'utilisation de mon code source dans des activités illégales.